Repository: pinterf/AviSynthPlus Branch: master Commit: 23f0e3fa2c37 Files: 622 Total size: 13.5 MB Directory structure: gitextract_jlxsglop/ ├── .editorconfig ├── .gitattributes ├── .github/ │ └── workflows/ │ └── build.yml ├── .gitignore ├── .gitmodules ├── .readthedocs.yaml ├── CMakeLists.txt ├── README.md ├── avs_core/ │ ├── CMakeLists.txt │ ├── Files.cmake │ ├── TargetArch.cmake │ ├── Version.cmake │ ├── avisynth.pc.in │ ├── avisynth_conf.h.in │ ├── convert/ │ │ ├── convert.cpp │ │ ├── convert.h │ │ ├── convert_audio.cpp │ │ ├── convert_audio.h │ │ ├── convert_audio_c.cpp │ │ ├── convert_bits.cpp │ │ ├── convert_bits.h │ │ ├── convert_helper.cpp │ │ ├── convert_helper.h │ │ ├── convert_matrix.cpp │ │ ├── convert_matrix.h │ │ ├── convert_planar.cpp │ │ ├── convert_planar.h │ │ ├── convert_rgb.cpp │ │ ├── convert_rgb.h │ │ └── intel/ │ │ ├── convert_audio_avx2.cpp │ │ ├── convert_audio_sse.cpp │ │ ├── convert_bits_avx2.cpp │ │ ├── convert_bits_avx2.h │ │ ├── convert_bits_sse.cpp │ │ ├── convert_bits_sse.h │ │ ├── convert_planar_avx2.cpp │ │ ├── convert_planar_avx2.h │ │ ├── convert_planar_sse.cpp │ │ ├── convert_planar_sse.h │ │ ├── convert_rgb_avx2.cpp │ │ ├── convert_rgb_avx2.h │ │ ├── convert_rgb_avx512.cpp │ │ ├── convert_rgb_avx512.h │ │ ├── convert_rgb_sse.cpp │ │ └── convert_rgb_sse.h │ ├── core/ │ │ ├── AVSMap.h │ │ ├── AviHelper.cpp │ │ ├── AviHelper.h │ │ ├── BufferPool.cpp │ │ ├── BufferPool.h │ │ ├── CompatEnvironment.h │ │ ├── DeviceManager.cpp │ │ ├── DeviceManager.h │ │ ├── FilterConstructor.cpp │ │ ├── FilterConstructor.h │ │ ├── FilterGraph.cpp │ │ ├── FilterGraph.h │ │ ├── InternalEnvironment.h │ │ ├── LruCache.h │ │ ├── MTGuard.cpp │ │ ├── MTGuard.h │ │ ├── MappedList.h │ │ ├── ObjectPool.h │ │ ├── PluginManager.cpp │ │ ├── PluginManager.h │ │ ├── Prefetcher.cpp │ │ ├── Prefetcher.h │ │ ├── ScriptEnvironmentTLS.h │ │ ├── SimpleLruCache.h │ │ ├── ThreadPool.cpp │ │ ├── ThreadPool.h │ │ ├── alignplanar.cpp │ │ ├── alignplanar.h │ │ ├── arch.h.in │ │ ├── audio.cpp │ │ ├── audio.h │ │ ├── avisynth.cpp │ │ ├── avisynth.def │ │ ├── avisynth.rc │ │ ├── avisynth64.def │ │ ├── avisynth_c.cpp │ │ ├── avs_simd_c.h │ │ ├── bitblt.cpp │ │ ├── bitblt.h │ │ ├── cache.cpp │ │ ├── cache.h │ │ ├── clip_info.h │ │ ├── cpuid.cpp │ │ ├── exception.cpp │ │ ├── exception.h │ │ ├── findfirst.h │ │ ├── fonts/ │ │ │ ├── fixedfonts.cpp │ │ │ └── fixedfonts.h │ │ ├── function.h │ │ ├── info.cpp │ │ ├── info.h │ │ ├── initguid.cpp │ │ ├── interface.cpp │ │ ├── internal.h │ │ ├── main.cpp │ │ ├── memcpy_amd.cpp │ │ ├── memcpy_amd.h │ │ ├── mpmc_bounded_queue.h │ │ ├── parser/ │ │ │ ├── expression.cpp │ │ │ ├── expression.h │ │ │ ├── os/ │ │ │ │ ├── win32_string_compat.cpp │ │ │ │ └── win32_string_compat.h │ │ │ ├── script.cpp │ │ │ ├── script.h │ │ │ ├── scriptparser.cpp │ │ │ ├── scriptparser.h │ │ │ ├── tokenizer.cpp │ │ │ └── tokenizer.h │ │ ├── strings.cpp │ │ ├── strings.h │ │ ├── vartable.h │ │ └── version.h.in │ ├── filters/ │ │ ├── AviSource/ │ │ │ ├── AVIIndex.cpp │ │ │ ├── AVIIndex.h │ │ │ ├── AVIReadHandler.cpp │ │ │ ├── AVIReadHandler.h │ │ │ ├── AudioSource.cpp │ │ │ ├── AudioSource.h │ │ │ ├── DubSource.cpp │ │ │ ├── DubSource.h │ │ │ ├── Error.h │ │ │ ├── FastReadStream.cpp │ │ │ ├── FastReadStream.h │ │ │ ├── File64.cpp │ │ │ ├── File64.h │ │ │ ├── Fixes.h │ │ │ ├── VD_Audio.cpp │ │ │ ├── VD_Audio.h │ │ │ ├── avi_source.cpp │ │ │ ├── avi_source.h │ │ │ ├── clip_info.h │ │ │ ├── list.cpp │ │ │ └── list.h │ │ ├── aarch64/ │ │ │ ├── turn_neon.cpp │ │ │ └── turn_neon.h │ │ ├── color.cpp │ │ ├── color.h │ │ ├── colorbars_const.h │ │ ├── combine.cpp │ │ ├── combine.h │ │ ├── conditional/ │ │ │ ├── conditional.cpp │ │ │ ├── conditional.h │ │ │ ├── conditional_functions.cpp │ │ │ ├── conditional_functions.h │ │ │ ├── conditional_reader.cpp │ │ │ ├── conditional_reader.h │ │ │ └── intel/ │ │ │ ├── conditional_functions_sse.cpp │ │ │ └── conditional_functions_sse.h │ │ ├── convolution.cpp │ │ ├── convolution.h │ │ ├── debug.cpp │ │ ├── debug.h │ │ ├── edit.cpp │ │ ├── edit.h │ │ ├── exprfilter/ │ │ │ ├── exprfilter.cpp │ │ │ ├── exprfilter.h │ │ │ └── jitasm.h │ │ ├── field.cpp │ │ ├── field.h │ │ ├── focus.cpp │ │ ├── focus.h │ │ ├── fps.cpp │ │ ├── fps.h │ │ ├── greyscale.cpp │ │ ├── greyscale.h │ │ ├── histogram.cpp │ │ ├── histogram.h │ │ ├── intel/ │ │ │ ├── check_avx512.h │ │ │ ├── focus_avx2.cpp │ │ │ ├── focus_avx2.h │ │ │ ├── focus_sse.cpp │ │ │ ├── focus_sse.h │ │ │ ├── greyscale_sse.cpp │ │ │ ├── greyscale_sse.h │ │ │ ├── layer_avx2.cpp │ │ │ ├── layer_avx2.h │ │ │ ├── layer_sse.cpp │ │ │ ├── layer_sse.h │ │ │ ├── limiter_sse.cpp │ │ │ ├── limiter_sse.h │ │ │ ├── merge_avx2.cpp │ │ │ ├── merge_avx2.h │ │ │ ├── merge_sse.cpp │ │ │ ├── merge_sse.h │ │ │ ├── planeswap_sse.cpp │ │ │ ├── planeswap_sse.h │ │ │ ├── resample_avx2.cpp │ │ │ ├── resample_avx2.h │ │ │ ├── resample_avx512.cpp │ │ │ ├── resample_avx512.h │ │ │ ├── resample_avx512.hpp │ │ │ ├── resample_avx512b.cpp │ │ │ ├── resample_sse.cpp │ │ │ ├── resample_sse.h │ │ │ ├── resize_sse.cpp │ │ │ ├── resize_sse.h │ │ │ ├── text-overlay_sse.cpp │ │ │ ├── text-overlay_sse.h │ │ │ ├── turn_avx2.cpp │ │ │ ├── turn_avx2.h │ │ │ ├── turn_sse.cpp │ │ │ └── turn_sse.h │ │ ├── layer.cpp │ │ ├── layer.h │ │ ├── layer.hpp │ │ ├── levels.cpp │ │ ├── levels.h │ │ ├── limiter.cpp │ │ ├── limiter.h │ │ ├── merge.cpp │ │ ├── merge.h │ │ ├── misc.cpp │ │ ├── misc.h │ │ ├── overlay/ │ │ │ ├── 444convert.cpp │ │ │ ├── 444convert.h │ │ │ ├── OF_add.cpp │ │ │ ├── OF_blend.cpp │ │ │ ├── OF_darken.cpp │ │ │ ├── OF_difference.cpp │ │ │ ├── OF_exclusion.cpp │ │ │ ├── OF_multiply.cpp │ │ │ ├── OF_softhardlight.cpp │ │ │ ├── aarch64/ │ │ │ │ ├── blend_common_neon.cpp │ │ │ │ └── blend_common_neon.h │ │ │ ├── blend_common.cpp │ │ │ ├── blend_common.h │ │ │ ├── imghelpers.h │ │ │ ├── intel/ │ │ │ │ ├── 444convert_sse.cpp │ │ │ │ ├── 444convert_sse.h │ │ │ │ ├── OF_multiply_avx2.cpp │ │ │ │ ├── OF_multiply_avx2.h │ │ │ │ ├── OF_multiply_sse.cpp │ │ │ │ ├── OF_multiply_sse.h │ │ │ │ ├── blend_common_avx2.cpp │ │ │ │ ├── blend_common_avx2.h │ │ │ │ ├── blend_common_sse.cpp │ │ │ │ └── blend_common_sse.h │ │ │ ├── overlay.cpp │ │ │ ├── overlay.h │ │ │ └── overlayfunctions.h │ │ ├── planeswap.cpp │ │ ├── planeswap.h │ │ ├── resample.cpp │ │ ├── resample.h │ │ ├── resample_functions.cpp │ │ ├── resample_functions.h │ │ ├── resize.cpp │ │ ├── resize.h │ │ ├── source.cpp │ │ ├── text-overlay.cpp │ │ ├── text-overlay.h │ │ ├── transform.cpp │ │ ├── transform.h │ │ ├── turn.cpp │ │ └── turn.h │ └── include/ │ ├── avisynth.h │ ├── avisynth_c.h │ └── avs/ │ ├── alignment.h │ ├── capi.h │ ├── config.h │ ├── cpuid.h │ ├── filesystem.h │ ├── minmax.h │ ├── posix.h │ ├── types.h │ └── win.h ├── cmake_uninstall.cmake.in ├── distrib/ │ ├── AviSynth_Template.reg │ ├── ColorPresets/ │ │ ├── colors_rgb.avsi │ │ └── colors_rgb.txt │ ├── Examples/ │ │ ├── Audio.avs │ │ ├── Authors.avs │ │ ├── Editing.avs │ │ ├── Equalizer Presets/ │ │ │ ├── 1965.feq │ │ │ ├── Air.feq │ │ │ ├── Brittle.feq │ │ │ ├── Car Stereo.feq │ │ │ ├── Classic V.feq │ │ │ ├── Clear.feq │ │ │ ├── DEATH.feq │ │ │ ├── Dark.feq │ │ │ ├── Drums.feq │ │ │ ├── Flat.feq │ │ │ ├── Home Theater.feq │ │ │ ├── Loudness.feq │ │ │ ├── Pop.feq │ │ │ ├── Premaster.feq │ │ │ ├── Presence.feq │ │ │ ├── Punch & Sparkle.feq │ │ │ ├── Shimmer.feq │ │ │ ├── Soft Bass.feq │ │ │ └── Strings.feq │ │ ├── Processing.avs │ │ ├── Syntax.avs │ │ └── Version.avs │ ├── OFL.TXT │ ├── Prerequisites/ │ │ └── keep.me │ ├── Readme/ │ │ └── readme_history.txt │ ├── WinInstaller/ │ │ ├── Translations/ │ │ │ ├── cs.isl │ │ │ ├── de.isl │ │ │ ├── en.isl │ │ │ ├── fr.isl │ │ │ ├── it.isl │ │ │ ├── ja.isl │ │ │ ├── pl.isl │ │ │ ├── pt.isl │ │ │ ├── pt_br.isl │ │ │ └── ru.isl │ │ ├── avisynth+.iss │ │ ├── avisynth+_arm64.iss │ │ └── update_git_rev.ps1 │ ├── docs/ │ │ └── english/ │ │ ├── make.bat │ │ └── source/ │ │ ├── avisynthdoc/ │ │ │ ├── FilterSDK/ │ │ │ │ ├── AMDOptimizationGuide.rst │ │ │ │ ├── AVSLinkage.rst │ │ │ │ ├── AssemblerOptimizing.rst │ │ │ │ ├── AviSynthInterfaceVersion.rst │ │ │ │ ├── AviSynthTwoFiveAudio.rst │ │ │ │ ├── AviSynthTwoFivePixelType.rst │ │ │ │ ├── AviSynthTwoFiveSDK.rst │ │ │ │ ├── BensAviSynthDocs.rst │ │ │ │ ├── C_api.rst │ │ │ │ ├── ChangeFrameSize.rst │ │ │ │ ├── ColorSpaces.rst │ │ │ │ ├── ColorspaceProperties.rst │ │ │ │ ├── CompilingAvisynthPlugins.rst │ │ │ │ ├── Cplusplus_api.rst │ │ │ │ ├── DataAlignment.rst │ │ │ │ ├── DataStorageInAviSynth.rst │ │ │ │ ├── DebuggingAvisynthPlugins.rst │ │ │ │ ├── DualPlugins.rst │ │ │ │ ├── EnvInvoke.rst │ │ │ │ ├── EnvSaveString.rst │ │ │ │ ├── FilterSDK.rst │ │ │ │ ├── GeneralPurposeToMMXRegisters.rst │ │ │ │ ├── GettingStartedWithAudio.rst │ │ │ │ ├── GradientMask.rst │ │ │ │ ├── InstructionPairing.rst │ │ │ │ ├── IntegerSSE.rst │ │ │ │ ├── IntelOptimizationGuide.rst │ │ │ │ ├── InterleavedImageFormat.rst │ │ │ │ ├── IntermediateMmxOptimization.rst │ │ │ │ ├── InternalFunctions.rst │ │ │ │ ├── InvertNeg.rst │ │ │ │ ├── IsMovntqFaster.rst │ │ │ │ ├── MMX.rst │ │ │ │ ├── Non-ClipSample.rst │ │ │ │ ├── PlanarImageFormat.rst │ │ │ │ ├── SDKHistory.rst │ │ │ │ ├── SDKLicense.rst │ │ │ │ ├── SDKNecessaries.rst │ │ │ │ ├── SimpleMmxOptimization.rst │ │ │ │ ├── SimpleSample.rst │ │ │ │ ├── SimpleSample10b.rst │ │ │ │ ├── SimpleSample11.rst │ │ │ │ ├── SimpleSample12.rst │ │ │ │ ├── SimpleSample13a.rst │ │ │ │ ├── SimpleSample14.rst │ │ │ │ ├── SimpleSample15a.rst │ │ │ │ ├── SimpleSample16.rst │ │ │ │ ├── SimpleSample17.rst │ │ │ │ ├── SimpleSample26.rst │ │ │ │ ├── SimpleSampleClass.rst │ │ │ │ ├── TwoFiveFastInvert.rst │ │ │ │ ├── TwoFiveInvert.rst │ │ │ │ ├── VideoInfo.rst │ │ │ │ ├── WorkingWithImages.rst │ │ │ │ ├── WorkingWithPlanarImages.rst │ │ │ │ ├── avs2pcm.rst │ │ │ │ └── avs2yuv.rst │ │ │ ├── advancedtopics/ │ │ │ │ ├── color_conversions.rst │ │ │ │ ├── colorimetry.rst │ │ │ │ ├── hybrid_video.rst │ │ │ │ ├── importing_media.rst │ │ │ │ ├── interlaced_fieldbased.rst │ │ │ │ ├── luminance_levels.rst │ │ │ │ └── sampling.rst │ │ │ ├── advancedtopics.rst │ │ │ ├── avisynthplus.rst │ │ │ ├── changelist.rst │ │ │ ├── changelist26.rst │ │ │ ├── changelist34.rst │ │ │ ├── changelist34pre.rst │ │ │ ├── changelist35.rst │ │ │ ├── changelist36.rst │ │ │ ├── changelist37.rst │ │ │ ├── changelist371.rst │ │ │ ├── changelist372.rst │ │ │ ├── changelist373.rst │ │ │ ├── changelist374.rst │ │ │ ├── changelist375.rst │ │ │ ├── changelist376.rst │ │ │ ├── contributing/ │ │ │ │ ├── avsplus_external_deps_guide_manual.rst │ │ │ │ ├── avsplus_external_deps_guide_manual_arm.rst │ │ │ │ ├── compiling_avsplus.rst │ │ │ │ ├── contributing_with_git.rst │ │ │ │ └── posix.rst │ │ │ ├── corefilters/ │ │ │ │ ├── addborders.rst │ │ │ │ ├── adjust.rst │ │ │ │ ├── amplify.rst │ │ │ │ ├── animate.rst │ │ │ │ ├── assumerate.rst │ │ │ │ ├── audiodub.rst │ │ │ │ ├── avisource.rst │ │ │ │ ├── blankclip.rst │ │ │ │ ├── blur.rst │ │ │ │ ├── bob.rst │ │ │ │ ├── colorbars.rst │ │ │ │ ├── colorbarsuhd.rst │ │ │ │ ├── coloryuv.rst │ │ │ │ ├── combineplanes.rst │ │ │ │ ├── compare.rst │ │ │ │ ├── conditionalfilter.rst │ │ │ │ ├── conditionalreader.rst │ │ │ │ ├── convert.rst │ │ │ │ ├── convertaudio.rst │ │ │ │ ├── convertbits.rst │ │ │ │ ├── convertstacked.rst │ │ │ │ ├── converttomono.rst │ │ │ │ ├── convolution.rst │ │ │ │ ├── crop.rst │ │ │ │ ├── delayaudio.rst │ │ │ │ ├── deleteframe.rst │ │ │ │ ├── directshowsource.rst │ │ │ │ ├── dissolve.rst │ │ │ │ ├── doubleweave.rst │ │ │ │ ├── duplicateframe.rst │ │ │ │ ├── echo.rst │ │ │ │ ├── ensuresync.rst │ │ │ │ ├── expr.rst │ │ │ │ ├── extract.rst │ │ │ │ ├── fade.rst │ │ │ │ ├── fixbrokenchromaupsampling.rst │ │ │ │ ├── fixluminance.rst │ │ │ │ ├── flip.rst │ │ │ │ ├── fps.rst │ │ │ │ ├── freezeframe.rst │ │ │ │ ├── getchannel.rst │ │ │ │ ├── greyscale.rst │ │ │ │ ├── histogram.rst │ │ │ │ ├── imagesource.rst │ │ │ │ ├── imagewriter.rst │ │ │ │ ├── import.rst │ │ │ │ ├── info.rst │ │ │ │ ├── interleave.rst │ │ │ │ ├── invert.rst │ │ │ │ ├── killaudio.rst │ │ │ │ ├── layer.rst │ │ │ │ ├── letterbox.rst │ │ │ │ ├── levels.rst │ │ │ │ ├── limiter.rst │ │ │ │ ├── loop.rst │ │ │ │ ├── mask.rst │ │ │ │ ├── maskhs.rst │ │ │ │ ├── merge.rst │ │ │ │ ├── mergechannels.rst │ │ │ │ ├── mergergb.rst │ │ │ │ ├── message.rst │ │ │ │ ├── mixaudio.rst │ │ │ │ ├── monotostereo.rst │ │ │ │ ├── multioverlay.rst │ │ │ │ ├── normalize.rst │ │ │ │ ├── overlay.rst │ │ │ │ ├── parity.rst │ │ │ │ ├── peculiar.rst │ │ │ │ ├── preroll.rst │ │ │ │ ├── propShow.rst │ │ │ │ ├── pulldown.rst │ │ │ │ ├── reduceby2.rst │ │ │ │ ├── resampleaudio.rst │ │ │ │ ├── resize.rst │ │ │ │ ├── reverse.rst │ │ │ │ ├── segmentedsource.rst │ │ │ │ ├── select.rst │ │ │ │ ├── selectevery.rst │ │ │ │ ├── selectrangeevery.rst │ │ │ │ ├── separatefields.rst │ │ │ │ ├── setchannelmask.rst │ │ │ │ ├── setfilterprop.rst │ │ │ │ ├── showalpha.rst │ │ │ │ ├── showfive.rst │ │ │ │ ├── showframes.rst │ │ │ │ ├── skewrows.rst │ │ │ │ ├── soften.rst │ │ │ │ ├── soundout.rst │ │ │ │ ├── splice.rst │ │ │ │ ├── ssrc.rst │ │ │ │ ├── stack.rst │ │ │ │ ├── subtitle.rst │ │ │ │ ├── subtract.rst │ │ │ │ ├── supereq.rst │ │ │ │ ├── swap.rst │ │ │ │ ├── swapfields.rst │ │ │ │ ├── tcpdeliver.rst │ │ │ │ ├── timestretch.rst │ │ │ │ ├── tone.rst │ │ │ │ ├── trim.rst │ │ │ │ ├── turn.rst │ │ │ │ ├── tweak.rst │ │ │ │ ├── version.rst │ │ │ │ ├── weave.rst │ │ │ │ └── write.rst │ │ │ ├── corefilters.rst │ │ │ ├── externalplugins.rst │ │ │ ├── faq/ │ │ │ │ ├── faq.rst │ │ │ │ ├── faq_common_errors.rst │ │ │ │ ├── faq_different_types_content.rst │ │ │ │ ├── faq_frameserving.rst │ │ │ │ ├── faq_general_info.rst │ │ │ │ ├── faq_loading_clips.rst │ │ │ │ ├── faq_sections.rst │ │ │ │ ├── faq_using_virtualdub_plugins.rst │ │ │ │ ├── faq_yv12.rst │ │ │ │ └── troubleshooting.rst │ │ │ ├── filters_mult_input_clips.rst │ │ │ ├── getting_started.rst │ │ │ ├── index.rst │ │ │ ├── license.rst │ │ │ ├── links.rst │ │ │ ├── overview.rst │ │ │ ├── quick_ref.rst │ │ │ ├── releasenotes.rst │ │ │ ├── script_ref/ │ │ │ │ ├── script_ref.rst │ │ │ │ ├── script_ref_arrays.rst │ │ │ │ ├── script_ref_block_statements.rst │ │ │ │ ├── script_ref_execution_model.rst │ │ │ │ ├── script_ref_execution_model_eval_scripts.rst │ │ │ │ ├── script_ref_execution_model_fetching_frames.rst │ │ │ │ ├── script_ref_execution_model_filter_graph.rst │ │ │ │ ├── script_ref_execution_model_lifetime_variables.rst │ │ │ │ ├── script_ref_execution_model_perf_cons.rst │ │ │ │ ├── script_ref_execution_model_sequence_events.rst │ │ │ │ └── script_ref_user_functions.rst │ │ │ ├── syntax/ │ │ │ │ ├── syntax.rst │ │ │ │ ├── syntax_clip_properties.rst │ │ │ │ ├── syntax_colors.rst │ │ │ │ ├── syntax_control_structures.rst │ │ │ │ ├── syntax_formal_avisynth_grammar.rst │ │ │ │ ├── syntax_function_objects.rst │ │ │ │ ├── syntax_internal_functions.rst │ │ │ │ ├── syntax_internal_functions_bit.rst │ │ │ │ ├── syntax_internal_functions_boolean.rst │ │ │ │ ├── syntax_internal_functions_control.rst │ │ │ │ ├── syntax_internal_functions_conversion.rst │ │ │ │ ├── syntax_internal_functions_debug.rst │ │ │ │ ├── syntax_internal_functions_frame_properties.rst │ │ │ │ ├── syntax_internal_functions_function_object.rst │ │ │ │ ├── syntax_internal_functions_global_options.rst │ │ │ │ ├── syntax_internal_functions_multithreading.rst │ │ │ │ ├── syntax_internal_functions_multithreading_new.rst │ │ │ │ ├── syntax_internal_functions_numeric.rst │ │ │ │ ├── syntax_internal_functions_runtime.rst │ │ │ │ ├── syntax_internal_functions_script.rst │ │ │ │ ├── syntax_internal_functions_string.rst │ │ │ │ ├── syntax_internal_functions_trig.rst │ │ │ │ ├── syntax_internal_functions_version.rst │ │ │ │ ├── syntax_operators.rst │ │ │ │ ├── syntax_plugins.rst │ │ │ │ ├── syntax_ref.rst │ │ │ │ ├── syntax_runtime_environment.rst │ │ │ │ ├── syntax_script_variables.rst │ │ │ │ ├── syntax_sections.rst │ │ │ │ ├── syntax_the_full_grammar.rst │ │ │ │ └── syntax_userdefined_scriptfunctions.rst │ │ │ ├── twopointfive.rst │ │ │ └── twopointsix.rst │ │ ├── conf.py │ │ └── index.rst │ ├── gpl-cs.txt │ ├── gpl-de.txt │ ├── gpl-el.txt │ ├── gpl-fr.txt │ ├── gpl-it.txt │ ├── gpl-ja.txt │ ├── gpl-pl.txt │ ├── gpl-pt.txt │ ├── gpl-pt_br.txt │ ├── gpl-ru.txt │ ├── gpl.txt │ ├── lgpl_for_used_libs.txt │ └── rst_migration_notes.txt └── plugins/ ├── CMakeLists.txt ├── ConvertStacked/ │ ├── CMakeLists.txt │ └── ConvertStacked.cpp ├── DirectShowSource/ │ ├── CMakeLists.txt │ ├── directshow_source.cpp │ └── directshow_source.h ├── ImageSeq/ │ ├── CMakeLists.txt │ ├── ImageReader.cpp │ ├── ImageSeq.cpp │ ├── ImageSeq.h │ └── ImageWriter.cpp ├── Shibatch/ │ ├── CMakeLists.txt │ ├── dbesi0.c │ ├── fft.h │ ├── mem_block.cpp │ ├── mem_block.h │ ├── paramlist.h │ ├── shibatch.cpp │ ├── ssrc-convert.cpp │ ├── ssrc-convert.h │ ├── ssrc.cpp │ ├── ssrc.h │ ├── supereq.cpp │ ├── supereq.h │ └── whence.txt ├── TimeStretch/ │ ├── CMakeLists.txt │ └── TimeStretch.cpp ├── VDubFilter/ │ ├── CMakeLists.txt │ ├── GetCPUFlags.cpp │ ├── ScriptInterpreter.h │ ├── ScriptValue.h │ ├── VBitmap.h │ ├── VDubFilter.cpp │ ├── vdplugin.h │ └── vdvideofilt.h └── VFAPIFilter/ ├── CMakeLists.txt └── VFAPIFilter.cpp ================================================ FILE CONTENTS ================================================ ================================================ FILE: .editorconfig ================================================ root = true # NOTE: editorconfig-core-c has a hardcoded limitation of 50 chars per .ini section name [*.{cpp,h,hpp,c,asm}] indent_style = space indent_size = 2 trim_trailing_whitespace = true end_of_line = lf insert_final_newline = true charset = utf-8 [*.md] indent_style = space trim_trailing_whitespace = false charset = utf-8 ================================================ FILE: .gitattributes ================================================ # Set the default behavior, in case people don't have core.autocrlf set. * text eol=lf distrib/**/*.css linguist-documentation distrib/**/*.htm linguist-documentation distrib/**/*.html linguist-documentation # Denote all files that are truly binary and should not be modified. *.bmp binary *.dll binary *.exe binary *.gif binary *.ico binary *.jpg binary *.lib binary *.png binary *.ps1 binary *.svg binary ================================================ FILE: .github/workflows/build.yml ================================================ name: Build AviSynth+ on: [push] jobs: build: name: ${{ matrix.config.name }} runs-on: ${{ matrix.config.os }} strategy: matrix: config: - {name: "Windows Latest x64", os: windows-latest, cmake-parameters: "-A x64"} - {name: "Windows Latest x86", os: windows-latest, cmake-parameters: "-A Win32"} - {name: "Ubuntu 22.04 x64", os: ubuntu-22.04} - {name: "Ubuntu 24.04 x64", os: ubuntu-24.04} - {name: "macOS Latest x64", os: macos-latest} steps: - uses: actions/checkout@v3 with: submodules: ${{ matrix.config.checkout-submodules }} fetch-depth: 0 - name: configure run: | cmake -S . -B avisynth-build ${{ matrix.config.cmake-parameters }} - name: build run: | cmake --build avisynth-build --config Release -j 2 ================================================ FILE: .gitignore ================================================ avisynth-build/* CMakeCache.txt CMakeFiles/* distrib/docs/english/build/ distrib/WinInstaller/git_rev.ini distrib/WinInstaller/*.exe distrib/WinInstaller/*.bak distrib/WinInstaller/x86/* distrib/WinInstaller/x64/* distrib/Prerequisites/VC_redist.x64.exe distrib/Prerequisites/VC_redist.x86.exe distrib/Prerequisites/vcredist_x64.exe distrib/Prerequisites/vcredist_x86.exe distrib/Prerequisites/VC_redist_14.27.29114.0.x86.exe distrib/Prerequisites/VC_redist_14.27.29114.0.x64.exe avs_core/CMakeCache.txt avs_core/CMakeFiles/* # Intel Profiler avs_core/VTune Profiler Results/* GPUCache/* *.db3 avs_core/core/version.h plugins/CMakeCache.txt plugins/CMakeFiles/* plugins/ConvertStacked/CMakeCache.txt plugins/ConvertStacked/CMakeFiles/* plugins/ConvertStacked/debug/* plugins/ConvertStacked/release/* plugins/DirectShowSource/CMakeCache.txt plugins/DirectShowSource/CMakeFiles/* plugins/DirectShowSource/debug/* plugins/DirectShowSource/release/* plugins/ImageSeq/CMakeCache.txt plugins/ImageSeq/CMakeFiles/* plugins/ImageSeq/debug/* plugins/ImageSeq/release/* plugins/Shibatch/CMakeCache.txt plugins/Shibatch/CMakeFiles/* plugins/Shibatch/debug/* plugins/Shibatch/release/* plugins/Shibatch/PFC/CMakeCache.txt plugins/Shibatch/PFC/CMakeFiles/* plugins/Shibatch/PFC/debug/* plugins/Shibatch/PFC/release/* plugins/TimeStretch/CMakeCache.txt plugins/TimeStretch/CMakeFiles/* plugins/TimeStretch/debug/* plugins/TimeStretch/release/* plugins/TimeStretch/SoundTouch/CMakeCache.txt plugins/TimeStretch/SoundTouch/CMakeFiles/* plugins/TimeStretch/SoundTouch/debug/* plugins/TimeStretch/SoundTouch/release/* plugins/VDubFilter/CMakeCache.txt plugins/VDubFilter/CMakeFiles/* plugins/VDubFilter/debug/* plugins/VDubFilter/release/* plugins/VFAPIFilter/CMakeCache.txt plugins/VFAPIFilter/CMakeFiles/* plugins/VFAPIFilter/debug/* plugins/VFAPIFilter/release/* #cmake generated files *.sln *.slnx *.vcxproj *.vcxproj.filters arch.c avs_core/arch.h avs_core/avisynth_conf.h avs_core/version.h avs_core/avisynth.pc cmake_install.cmake generate.stamp generate.stamp.depend out/* debug/* output/* release/* win32/* x64/* avscore/debug avscore/release/* avscore/win32/* avscore/x64/* # User-specific files *.suo *.user *.userosscache *.sln.docstates # Build results [Dd]ebug/ [Dd]ebugPublic/ [Rr]elease/ [Rr]eleases/ [Rr]elWithDebInfo/ x64/ x86/ bld/ [Bb]in/ [Oo]bj/ [Ll]og/ # Visual C++ cache files ipch/ *.aps *.ncb *.opendb *.opensdf *.sdf *.cachefile *.VC.db *.VC.VC.opendb *.VC.db-shm *.VC.db-wal # Visual Studio profiler *.psess *.vsp *.vspx *.sap #Visual Studio other .vs/ *.rej *.orig *_BACKUP_* *_BASE_* *_LOCAL_* *_REMOTE_* # Assorted build generator files Makefile build.ninja rules.ninja .ninja_deps .ninja_log cmake_uninstall.cmake *.pc *.so ================================================ FILE: .gitmodules ================================================ [submodule "filesystem"] path = filesystem url = https://github.com/gulrak/filesystem ================================================ FILE: .readthedocs.yaml ================================================ # Read the Docs configuration file for Sphinx projects # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details # Required version: 2 # Set the OS, Python version and other tools you might need build: os: ubuntu-22.04 tools: python: "3.12" # You can also specify other tool versions: # nodejs: "20" # rust: "1.70" # golang: "1.20" # Build documentation in the "docs/" directory with Sphinx sphinx: configuration: distrib/docs/english/source/conf.py # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs # builder: "dirhtml" # Fail on all warnings to avoid broken references # fail_on_warning: true # Optionally build your docs in additional formats such as PDF and ePub formats: all # - pdf # - epub # Optional but recommended, declare the Python requirements required # to build your documentation # See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html # python: # install: # - requirements: docs/requirements.txt ================================================ FILE: CMakeLists.txt ================================================ # Tested generators: # Command line makefile generator # "MinGW Makefiles": MSYS2/Mingw32 GCC 8.3, 10.3 build # IDE project file generators # "Visual Studio 15 2017" optional platform generator Win32 and x64 # "Visual Studio 16 2019" optional platform generator Win32 and x64. optional toolset "v141_xp" # "Visual Studio 17 2022" optional platform generator Win32 and x64. optional toolset "v141_xp" or "clangcl" # "Visual Studio 18 2026" optional platform generator Win32 and x64. optional toolset "v141_xp" or "clangcl" # Intel C++ Compilers # Minimum Cmake version for Intel C++ Compiler 2023: 3.22.3 (Win) 3.20 (Linux) # Howto: https://www.intel.com/content/www/us/en/developer/articles/technical/using-oneapi-compilers-with-cmake-in-visual-studio.html # "Intel(R) oneAPI DPC++ Compiler", two flavours. DPCPP is not compatible with Avisynth. # - Intel® NextGen Compiler (in base kit, LLVM based): TOOLSET = "Intel C++ Compiler 2023", COMPILER EXE NAME = icx.exe # - Intel® Classic Compiler (in extra HPC kit): TOOLSET = "Intel C++ Compiler 19.2", COMPILER EXE NAME = icl.exe # CMake support files. # - Info from: c:\Program Files (x86)\Intel\oneAPI\compiler\latest\windows\IntelDPCPP\ReadMe.txt # - copy c:\Program Files (x86)\Intel\oneAPI\compiler\latest\windows\IntelDPCPP\IntelDPCPPConfig.cmake to c:\Program Files\CMake\share\cmake-3.20\Modules\ # CMake GUI: # - Generator: "Visual Studio 17 2022" # - Optional toolset to use (-T option): # For LLVM based icx: Intel C++ Compiler 2023 (or earlier 2022, 2021) # For classic icl: Intel C++ Compiler 19.2 # - Specify native compilers: browse for the appropriate compiler executable path. # icx: C:\Program Files (x86)\Intel\oneAPI\compiler\latest\windows\bin\icx.exe # icl: C:\Program Files (x86)\Intel\oneAPI\compiler\latest\windows\bin\intel64\icl.exe # If you have errors like "xilink: : error : Assertion failed (shared/driver/drvutils.c, line 312" then # as a workaround you must copy clang.exe (by default it is located in C:\Program Files (x86)\Intel\oneAPI\compiler\latest\windows\bin) # to the folder beside xilink (for x64 configuration it is in C:\Program Files (x86)\Intel\oneAPI\compiler\latest\windows\bin\intel64). # Successful log looks like: # The CXX compiler identification is IntelLLVM 2023.0.0 with MSVC-like command-line # Check for working CXX compiler: C:/Program Files (x86)/Intel/oneAPI/compiler/2023.0.0/windows/bin/icx.exe - skipped # or # The CXX compiler identification is IntelLLVM 2021.4.0 with MSVC-like command-line # Check for working CXX compiler: C:/Program Files (x86)/Intel/oneAPI/compiler/2021.4.0/windows/bin/icx.exe # or # The CXX compiler identification is Intel 2021.4.0.20210910 # Check for working CXX compiler: C:/Program Files (x86)/Intel/oneAPI/compiler/2021.4.0/windows/bin/intel64/icl.exe # # command line: # run "C:\Program Files (x86)\Intel\oneAPI\setvars.bat" to configure the environment # cmake -T "Intel C++ Compiler 2023" -DCMAKE_CXX_COMPILER="icx.exe" ../ # or # cmake -T "Intel C++ Compiler 19.2" -DCMAKE_CXX_COMPILER="icl.exe" ../ # "Visual Studio 16 2019" + LLVM 8.0 (clang) optional platform generator Win32 and x64 CMAKE_MINIMUM_REQUIRED( VERSION 3.6.2...3.11 ) # VS2019: 3.14.1 # Intel 2023: 3.22.3 (Win) 3.20 (Linux) # VS2022: 3.21 # VS2026: 4.2 # Get PROJECT_VERSION property from 'avs_core/core/version.h.in' file(READ "avs_core/core/version.h.in" versioning) string(REGEX MATCH "AVS_MAJOR_VER[ \\t]+([0-9]*)" _ ${versioning}) set(version_major ${CMAKE_MATCH_1}) string(REGEX MATCH "AVS_MINOR_VER[ \\t]+([0-9]*)" _ ${versioning}) set(version_minor ${CMAKE_MATCH_1}) string(REGEX MATCH "AVS_BUGFIX_VER[ \\t]+([0-9]*)" _ ${versioning}) set(version_bugfix ${CMAKE_MATCH_1}) # Combine version variables for use in the project command set(PROJECT_VERSION_STRING "${version_major}.${version_minor}.${version_bugfix}") # Get AVISYNTH_INTERFACE_VERSION from avs_core/include/avisynth.h file(READ "avs_core/include/avisynth.h" versioning) string(REGEX MATCH "AVISYNTH_INTERFACE_VERSION = ([0-9]*)" _ ${versioning}) set(AVISYNTH_INTERFACE_VERSION ${CMAKE_MATCH_1}) option(BUILD_SHARED_LIBS "Build shared libraries instead of static ones." ON) if(NOT ${BUILD_SHARED_LIBS}) message(WARNING "You must satisfy the conditions of the GPL license when linking against the AviSynth library.") endif() option(HEADERS_ONLY "Install only the Headers" ${INSTALL_ONLY_HEADER}) if(${INSTALL_ONLY_HEADER}) set(INSTALL_ONLY_HEADER OFF) endif() if(NOT HEADERS_ONLY) project("AviSynth+" VERSION ${PROJECT_VERSION_STRING} LANGUAGES CXX) # message("Compiler ID: ${CMAKE_CXX_COMPILER_ID} ") include(GNUInstallDirs) # Avoid uselessly linking to unused libraries set(CMAKE_STANDARD_LIBRARIES "" CACHE STRING "" FORCE) set(CMAKE_C_STANDARD_LIBRARIES "" CACHE STRING "" FORCE) set(CMAKE_CXX_STANDARD_LIBRARIES "" CACHE STRING "" FORCE) # We require C++17 or higher. if(CMAKE_VERSION VERSION_GREATER 3.7) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED TRUE) set(CMAKE_CXX_EXTENSIONS FALSE) endif() # Detect Intel processors and turn Intel SIMD on or off automatically. # Detect AArch64 processors and turn AArch64 NEON SIMD on or off automatically. # Old logic relied on the host processor: ${CMAKE_SYSTEM_PROCESSOR} set(INTEL_SIMD "OFF") set(NEON_SIMD "OFF") # Use a list of known Intel-compatible/aarch64 architecture names for the default ON state. set(INTEL_ARCH_NAMES "win32" "x64" "x86" "i386" "amd64" "x86_64" "i686") set(ARM_ARCH_NAMES "arm64" "aarch64") # Check the TARGET architecture using the most reliable variables (CMAKE_GENERATOR_PLATFORM and PLATFORMID_LOWER) string(TOLOWER "${PLATFORMID}" PLATFORMID_LOWER) string(TOLOWER "${CMAKE_GENERATOR_PLATFORM}" GEN_PLATFORM_LOWER) # Often holds x64, ARM64, etc. string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" HOST_ARCH_LOWER) # ninja with ative aarch64 gcc: probably only this exists # --- DEBUG OUTPUT START --- # message(STATUS "--- SIMD Detection Variables ---") # message(STATUS "CMAKE_SYSTEM_PROCESSOR (Host Arch): ${CMAKE_SYSTEM_PROCESSOR}") # message(STATUS "Host Arch Lower: ${HOST_ARCH_LOWER}") # message(STATUS "PLATFORMID_LOWER (VS Target Platform): ${PLATFORMID_LOWER}") # message(STATUS "CMAKE_GENERATOR_PLATFORM (Generator Target): ${CMAKE_GENERATOR_PLATFORM}") # message(STATUS "INTEL_ARCH_NAMES: ${INTEL_ARCH_NAMES}") # message(STATUS "------------------------------------") # --- DEBUG OUTPUT END --- # e.g. ARM64 cross-compile on x64 machine: # CMAKE_SYSTEM_PROCESSOR (Host Arch): AMD64 # Host Arch Lower: amd64 # PLATFORMID_LOWER (VS Target Platform): # CMAKE_GENERATOR_PLATFORM (Generator Target): ARM64 # check aarch64 variants list(FIND ARM_ARCH_NAMES "${HOST_ARCH_LOWER}" _found_arm_host) # New check list(FIND ARM_ARCH_NAMES "${PLATFORMID_LOWER}" _found_arm_platform_id) list(FIND ARM_ARCH_NAMES "${GEN_PLATFORM_LOWER}" _found_arm_gen) # check intel variants list(FIND INTEL_ARCH_NAMES "${HOST_ARCH_LOWER}" _found_arch) list(FIND INTEL_ARCH_NAMES "${PLATFORMID_LOWER}" _found_target_platform_id) list(FIND INTEL_ARCH_NAMES "${GEN_PLATFORM_LOWER}" _found_target_gen) # 1. Check if the target platform is explicitly known non-Intel (ARM64, AARCH64) if(_found_arm_platform_id GREATER -1 OR _found_arm_gen GREATER -1 OR _found_arm_host GREATER -1) set(INTEL_SIMD "OFF") set(NEON_SIMD "ON") message(STATUS "Target is aarch64, turn NEON_SIMD ON.") else() # 2. Inclusion Check: We are NOT targeting ARM64. # Define a boolean check: Did we find a match in the explicit target variables OR the host architecture? if(_found_target_gen GREATER -1 OR _found_target_platform_id GREATER -1) # Found a match in a generator-set variable (e.g., Win32, x64 when explicitly chosen) set(INTEL_SIMD "ON") message(STATUS "Target architecture is explicitly set and Intel-compatible, INTEL_SIMD set ON.") elseif(_found_arch GREATER -1 AND "${GEN_PLATFORM_LOWER}" STREQUAL "") # FALLBACK: Target platform is NOT set (Default Configuration), but the Host is Intel-compatible. # The default target platform for a multi-config generator on a bare x64 host is x64. set(INTEL_SIMD "ON") message(STATUS "Target platform not specified; defaulting to Host (${CMAKE_SYSTEM_PROCESSOR}), INTEL_SIMD set ON.") endif() endif() # message(STATUS "Final INTEL_SIMD initial assumption: ${INTEL_SIMD}") option(ENABLE_INTEL_SIMD "Enable SIMD intrinsics for Intel processors" "${INTEL_SIMD}") option(ENABLE_NEON_SIMD "Enable SIMD intrinsics for AArch64 processors" "${NEON_SIMD}") option(ENABLE_PLUGINS "Build set of default external plugins" ON) set(USER_AVS_PLUGINDIR_LOCATION ".local/lib/avisynth" CACHE STRING "Override path for user-local plugins, with $HOME omitted (default: .local/lib/avisynth)") option(ENABLE_CUDA "Enable CUDA support" OFF) set(CORE_PLUGIN_INSTALL_PATH "${CMAKE_INSTALL_FULL_LIBDIR}" CACHE STRING "Set system plugin install parent directory (default: value of CMAKE_INSTALL_FULL_LIBDIR)") if(CMAKE_VERSION VERSION_GREATER 3.9) get_cmake_property(MULTI_CONFIG GENERATOR_IS_MULTI_CONFIG) if(MULTI_CONFIG) if(CMAKE_CONFIGURATION_TYPES) set(CMAKE_CONFIGURATION_TYPES Debug Release RelWithDebInfo) set(CMAKE_CONFIGURATION_TYPES "${CMAKE_CONFIGURATION_TYPES}" CACHE STRING "Reset the configurations to what we need" FORCE) endif() message("-- Build type: Multi-configuration (${CMAKE_CONFIGURATION_TYPES})") else() # When CMAKE_BUILD_TYPE is not defined, CMake defaults to a simple -O0 configuration, no compiler optimizations # and no debug symbols. For single-configuration generators (Makefiles, Ninja, etc.) we can make Release the # assumed default if it isn't explicitly set by the user. Multi-config generators like Visual Studio ignore # CMAKE_BUILD_TYPE. # Unfortunately, this is not visible in CMakeCache, but it can be seen to take effect in build.ninja or running # make with VERBOSE=1 adding the appropriate Release flags. if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release") endif() message("-- Build type: ${CMAKE_BUILD_TYPE}") endif() endif() # Use this one to be safe: # Check for the Visual Studio generator OR the MSVC compiler/toolchain on Windows # (which includes Ninja with cl.exe). # We use the MSVC variable to ensure the configuration block runs when cl.exe is detected. if( CMAKE_GENERATOR MATCHES "Visual Studio" OR (MSVC AND WIN32) ) ## IF( MSVC ) # Check for Visual Studio #1910-1919 = VS 15.0 (v141 toolset) Visual Studio 2017 #1920-1929 = VS 16.0 (v142 toolset) Visual Studio 2019 #1930-1949 = VS 17.x (v143 toolset) Visual Studio 2022 # ( 1940-1949 = VS v17.10+: Toolset v143 (Still!) | Compiler 19.4x) #1950-1959 = VS 18.0 (v145 toolset) Visual Studio 2026 # --- Determine MSVC target platform, Ninja makes a bit more work for us # Since CMAKE_VS_PLATFORM_NAME is empty, only valid for Visual Studio generators. # Detect the target platform based on the most reliable variables for MSVC/Ninja: # 1. start with the VS Generator's specific variable. If it's not set, it will be empty. set(TARGET_PLATFORM_TO_CHECK "${CMAKE_VS_PLATFORM_NAME}") # message(STATUS "DEBUG: CMAKE_VS_PLATFORM_NAME = '${CMAKE_VS_PLATFORM_NAME}'") # message(STATUS "DEBUG: CMAKE_GENERATOR_PLATFORM = '${CMAKE_GENERATOR_PLATFORM}'") # message(STATUS "DEBUG: CMAKE_SIZEOF_VOID_P = '${CMAKE_SIZEOF_VOID_P}'") # 2. If CMAKE_VS_PLATFORM_NAME is empty (e.g., Ninja generator), try to infer from pointer size. if(NOT TARGET_PLATFORM_TO_CHECK) # 3. Check the pointer size (most reliable indicator for x64/Win32) if(CMAKE_SIZEOF_VOID_P EQUAL 8) # 64-bit target set(TARGET_PLATFORM_TO_CHECK "x64") elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) # 32-bit target set(TARGET_PLATFORM_TO_CHECK "Win32") endif() endif() # 4. final attempt: If CMAKE_GENERATOR_PLATFORM has a value and TARGET_PLATFORM_TO_CHECK is still empty if(NOT TARGET_PLATFORM_TO_CHECK AND CMAKE_GENERATOR_PLATFORM) set(TARGET_PLATFORM_TO_CHECK "${CMAKE_GENERATOR_PLATFORM}") endif() # detect if the target is for x86 # PLATFORMID_LOWER is just a lowercase copy of CMAKE_VS_PLATFORM_NAME string(TOLOWER "${TARGET_PLATFORM_TO_CHECK}" PLATFORMID_LOWER) # message("-- PLATFORMID_LOWER: ${PLATFORMID_LOWER}") if(("${PLATFORMID_LOWER}" STREQUAL "win32") OR ("${PLATFORMID_LOWER}" STREQUAL "x64") OR ("${PLATFORMID_LOWER}" STREQUAL "arm64")) # allow arm64 targets set(SUPPORTED_MSVC_PLATFORM "ON") else() set(SUPPORTED_MSVC_PLATFORM "OFF") endif() if(SUPPORTED_MSVC_PLATFORM STREQUAL "OFF") message(FATAL_ERROR "MSVC/ClangCL only supported on Win32, x64, or ARM64 targets. Use MinGW (llvm-mingw or gcc). Unsupported target: ${CMAKE_VS_PLATFORM_NAME}.") endif() #[[ # check to disable ARM64 by default # PF: re-allowed; VS2026 can build ARM64 even with LLVM if(("${PLATFORMID_LOWER}" STREQUAL "arm64") AND (NOT DEFINED ENABLE_ARM64_WITH_MSVC_TESTING)) # This FATAL_ERROR can be commented out or protected by the ENABLE_ARM64_TESTING cache variable. # To enable the build, define -DENABLE_ARM64_TESTING=ON when running cmake. message(FATAL_ERROR "MSVC ARM64 platform is currently disabled by default. Define ENABLE_ARM64_WITH_MSVC_TESTING=ON to proceed or use MinGW (llvm-mingw or gcc).") endif() #]] IF( MSVC_VERSION VERSION_LESS 1910 ) MESSAGE(FATAL_ERROR "Visual C++ 2017 or newer required.") ENDIF() # Milestones # C++17 COMPLETENESS: Compiler versions 19.10-19.19 (VS 2017) had incomplete C++17 support. # Full C++17 support: starting with compiler version 19.20 (VS 2019 RTM). # C++20 COMPLETENESS: Compiler version 19.29 (VS 2019 v16.10+): full C++20 standard library support. # VS 2022 (v19.30+) is generally recommended for best C++20 stability and language feature compliance. # Damn XP support prevents defining a minimum. # When v141_xp toolset is used, MSVC_VERSION is 1916 # So we temporarily inactivate the minimum version check: IF(FALSE) IF( MSVC_VERSION VERSION_LESS 1929 ) message("--MSVC_VERSION is (${MSVC_VERSION})") MESSAGE(FATAL_ERROR "Visual C++ 2019 (v16.10+) or newer is required for C++20 support. Recommended: Visual Studio 2022.") ENDIF() ENDIF() file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/Output/plugins") file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/Output/system") file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/Output/c_api") IF(MSVC_IDE) message("MSVC_IDE support found, reported CMAKE_GENERATOR_TOOLSET is: ${CMAKE_GENERATOR_TOOLSET}") string( TOLOWER "${CMAKE_GENERATOR_TOOLSET}" cmake_gentoolset_lower) IF(cmake_gentoolset_lower STREQUAL "intel c++ compiler 2021" OR cmake_gentoolset_lower STREQUAL "intel c++ compiler 2022" OR cmake_gentoolset_lower STREQUAL "intel c++ compiler 2023" OR cmake_gentoolset_lower STREQUAL "intel c++ compiler 2024" OR cmake_gentoolset_lower STREQUAL "intel c++ compiler 2025" OR cmake_gentoolset_lower STREQUAL "intel c++ compiler 2026" ) # IntelLLVM set(IntelLLVM_IN_VS "1") ELSEIF(cmake_gentoolset_lower STREQUAL "intel c++ compiler 19.2") # Intel Classic set(IntelClassic_IN_VS "1") ELSEIF(cmake_gentoolset_lower MATCHES "intel") MESSAGE(FATAL_ERROR "Possibly unknown or unsupported Intel compiler") # version update needed in the above lines ELSEIF(cmake_gentoolset_lower STREQUAL "llvm" OR cmake_gentoolset_lower STREQUAL "clangcl") if(${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") # hope: always message("LLVM toolset was specified via -T. Compiler ID is: ${CMAKE_CXX_COMPILER_ID}; CMAKE_CXX_COMPILER_VERSION is: ${CMAKE_CXX_COMPILER_VERSION}") # Clang; 9.0.0 # These are probably not supported when clang is downloaded as a ready-made binary: CLANG_VERSION_MAJOR CLANG_VERSION_MINOR CLANG_VERSION_STRING # string (REGEX REPLACE ".*clang version ([0-9]+\\.[0-9]+).*" "\\1" CLANG_VERSION_STRING ${clang_full_version_string}) if( CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0.1 ) MESSAGE(FATAL_ERROR "Clang 7.0.1 or newer required") # as of November 2021 actually we are using 12.0 endif() endif() set(CLANG_IN_VS "1") ELSEIF(cmake_gentoolset_lower STREQUAL "v141_clang_c2") #1900 is reported message("v141_clang_c2 toolset was specified via -T. Reported MSVC_VERSION is: ${MSVC_VERSION}") message("May not work, try clangcl or LLVM") set(CLANG_IN_VS "1") # For LLVM Clang installed separately, specify llvm # Since Visual Studio 2019 v16.4, LLVM 9.0 or newer is integrated, for this use Toolset: clangcl ENDIF() option(WINXP_SUPPORT "Make binaries compatible with Windows XP and Vista" OFF) if(WINXP_SUPPORT) # We want our project to also run on Windows XP # Not for LLVM: Clang stopped XP support in 2016 IF(NOT CLANG_IN_VS STREQUAL "1") # Setting CMAKE_GENERATOR_TOOLSET here has no effect, only when passed (-T option) or set directly, so we just check it IF(CMAKE_GENERATOR_TOOLSET STREQUAL "v141_xp") # v141_xp is still available in Visual Studio 2022 and 2026. message("CMAKE_GENERATOR_TOOLSET is XP compatible: ${CMAKE_GENERATOR_TOOLSET}, extra XP options added") # https://connect.microsoft.com/VisualStudio/feedback/details/1789709/visual-c-2015-runtime-broken-on-windows-server-2003-c-11-magic-statics # later done: add_definitions("/Zc:threadSafeInit-") ELSE() message(FATAL_ERROR "For XP you must specify v141_xp toolset with -T option (or 'Optional toolset to use' in CMake GUI)!") ENDIF() ENDIF() endif() ENDIF() if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC") set(CLANG_IN_VS "1") elseif(CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM" AND CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC") set(IntelLLVM_IN_VS "1") elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Intel" AND CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC") set(IntelClassic_IN_VS "1") endif() IF(IntelClassic_IN_VS STREQUAL "1") # Intel C++ Compiler 19.2 message("Intel Classic chosen, setting additional flags") set(DELETE_THIS "/std:c++17") # if it would co-exist with /Qstd=c++17 STRING( REPLACE "${DELETE_THIS}" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") STRING( REPLACE "${DELETE_THIS}" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") # Workaround as of 19.2: # Statically link with /MT instead of /MD against linker error message # "unresolved external symbol wmemcmp referenced in function std::filesystem ... lexically_normal" # Linker bug? set(CompilerFlags CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO ) foreach(CompilerFlag ${CompilerFlags}) string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}") set(${CompilerFlag} "${${CompilerFlag}}" CACHE STRING "msvc compiler flags" FORCE) message("MSVC flags: ${CompilerFlag}:${${CompilerFlag}}") endforeach() ELSE() # Plain MSVC branch continues; per-target options are applied later ENDIF() # CPU_ARCH can be overridden with the corresponding values when using MSVC: # IA32 (disabled), # SSE (Pentium III and higher, 1999), # SSE2 (Pentium 4 and higher, 2000/2001), # AVX (Sandy Bridge and higher, 2011), # AVX2 (Haswell and higher, 2013) if(CMAKE_SIZEOF_VOID_P EQUAL 4) set(MSVC_CPU_ARCH "SSE2" CACHE STRING "Set MSVC architecture optimization level (default: SSE2)") # /arch: applied later per-target endif() ELSE() # not MS Visual Studio IDE if(WIN32) SET( CMAKE_SHARED_LINKER_FLAGS "-Wl,--enable-stdcall-fixup" ) # __CRT__NO_INLINE: moved to per-target definitions elseif(APPLE) # macOS uses Clang's linker, doesn't like --no-undefined SET( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-undefined,error" ) elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") # make sure there are no undefined symbols SET( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined" ) endif() ENDIF() add_subdirectory("avs_core") # Start tracking targets before the plugins subdirectory is processed get_property(_targets_before_plugins GLOBAL PROPERTY BUILT_TARGETS) if(ENABLE_PLUGINS) add_subdirectory("plugins") endif() # End tracking targets and apply fixes here get_property(_targets_after_plugins GLOBAL PROPERTY BUILT_TARGETS) # Calculate targets added in the plugins subdirectory list(REMOVE_ITEM _targets_after_plugins ${_targets_before_plugins}) set(NEW_PLUGIN_TARGETS ${_targets_after_plugins}) # Combine AvsCore and the newly discovered plugins into one list for fixing set(ALL_AFFECTED_TARGETS) if(TARGET AvsCore) list(APPEND ALL_AFFECTED_TARGETS AvsCore) endif() list(APPEND ALL_AFFECTED_TARGETS ${NEW_PLUGIN_TARGETS}) # ----------------------------------------------------------------------- # Per-target, modern & safe application of options/defines (CORE and PLUGINS) # ----------------------------------------------------------------------- foreach(AFFECTED_TARGET ${ALL_AFFECTED_TARGETS}) if(TARGET ${AFFECTED_TARGET}) message(STATUS "Applying compiler fixes to target: ${AFFECTED_TARGET}") # Check if the target is a library or executable (exclude INTERFACE targets) get_target_property(_target_type ${AFFECTED_TARGET} TYPE) if(NOT ( ${_target_type} STREQUAL "SHARED_LIBRARY" OR ${_target_type} STREQUAL "STATIC_LIBRARY" OR ${_target_type} STREQUAL "MODULE_LIBRARY" )) # Skip if it's not a compileable target (e.g., if it was an interface target) continue() endif() # Use a compound check: If the generator is Visual Studio, or the compiler ID # is MSVC AND we are on Windows, run the MSVC-specific logic. if( CMAKE_GENERATOR MATCHES "Visual Studio" OR (MSVC AND WIN32) ) # Using only if(MSVC) will fail with MinGW if the compiler ID is MSVC but the generator is not VS. # This robust check ensures that the MSVC block only runs in an MSVC environment. # Handle ARM64 soft intrinsics if requested (for AvsCore logic) # Was experimental, never true if("${PLATFORMID}" STREQUAL "ARM64" AND ENABLE_INTEL_SIMD) target_compile_definitions(${AFFECTED_TARGET} PRIVATE USE_SOFT_INTRINSICS) endif() # Needed to properly handle __has_include() in avs_core/filesystem.h # See note in filesystem/README.md target_compile_options(${AFFECTED_TARGET} PRIVATE /Zc:__cplusplus) # Prevent VC++ secure CRT warnings, and add __SSE2__ flag. (Why?) target_compile_definitions(${AFFECTED_TARGET} PRIVATE _CRT_SECURE_NO_WARNINGS _SECURE_SCL=0 _CRTDBG_MAP_ALLOC __SSE2__ ) # INTEL intrinsics master switch (if enabled) if(ENABLE_INTEL_SIMD) target_compile_definitions(${AFFECTED_TARGET} PRIVATE INTEL_INTRINSICS) endif() # NEON intrinsics master switch (if enabled) if(ENABLE_NEON_SIMD) target_compile_definitions(${AFFECTED_TARGET} PRIVATE NEON_INTRINSICS) endif() # FIXME: With Ninja, we can see cl : Command line warning D9025 : overriding '/EHs' with '/EHa' # Compiler-specific options for IntelLLVM / Clang if(CLANG_IN_VS STREQUAL "1") target_compile_options(${AFFECTED_TARGET} PRIVATE /EHa -Wno-inconsistent-missing-override) target_compile_options(${AFFECTED_TARGET} PRIVATE -Wno-unused-function -Wno-reorder -Wno-unused-value -Wno-gcc-compat) elseif(IntelLLVM_IN_VS STREQUAL "1") target_compile_options(${AFFECTED_TARGET} PRIVATE -Wno-inconsistent-missing-override /EHa /fp:precise) target_compile_options(${AFFECTED_TARGET} PRIVATE -Wno-unused-function -Wno-reorder -Wno-unused-value -Wno-gcc-compat) elseif(IntelClassic_IN_VS STREQUAL "1") target_compile_options(${AFFECTED_TARGET} PRIVATE /EHa) else() # Plain MSVC target_compile_options(${AFFECTED_TARGET} PRIVATE /EHa) if (NOT (MSVC_VERSION LESS 1930)) # VS2022+ target_compile_options(${AFFECTED_TARGET} PRIVATE /fp:contract) endif() endif() # Enable standards-conformance mode for MSVC compilers that support this # flag (Visual C++ 2017 and later). Default. DirectShowSource will remove if needed. # The headers in the XP-side SDK also have errors if built in conformance mode, # so if we're building for XP, don't turn that on. # Plus check: Skip /permissive- if the target (e.g. DirectShowSource) requests it. # Filled in plugin's CMakeLists.txt get_target_property(_skip_permissive ${AFFECTED_TARGET} SKIP_PERMISSIVE_FLAG) if(NOT _skip_permissive) # old DirectShowSource if (NOT WINXP_SUPPORT) if (NOT (MSVC_VERSION LESS 1910)) target_compile_options(${AFFECTED_TARGET} PRIVATE /permissive-) endif() endif() endif() # Check if XP support is enabled AND if the XP toolset is used (v141_xp) if (WINXP_SUPPORT) if (CMAKE_GENERATOR_TOOLSET STREQUAL "v141_xp") # C++11 static initialization fix for XP/Server 2003 target_compile_options(${AFFECTED_TARGET} PRIVATE "/Zc:threadSafeInit-") endif() endif() # 32-bit arch tuning if(CMAKE_SIZEOF_VOID_P EQUAL 4) target_compile_options(${AFFECTED_TARGET} PRIVATE /arch:${MSVC_CPU_ARCH}) endif() else() # CMAKE_CXX_STANDARD doesn't cover the use-case of pre-final C++17 support, # but I'd assume most setups with a new enough version of CMake to use # CMAKE_CXX_STANDARD 17 would also be running a version of GCC/Clang new enough # to not need this. So this will most likely only ever be used by setups running # older versions of CMake; regardless, it shouldn't be necessary to force a # CMAKE_VERSION check on this part unless the mere presence of CMAKE_CXX_STANDARD 17 # ends up causing problems for the older compilers here. # Legacy C++17 support for older GCC/Clang if( ((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") AND (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8)) OR ((CMAKE_CXX_COMPILER_ID STREQUAL "Clang") AND (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5)) ) target_compile_options(${AFFECTED_TARGET} PRIVATE -std=c++1z) endif() if(ENABLE_INTEL_SIMD) target_compile_options(${AFFECTED_TARGET} PRIVATE -msse2) target_compile_definitions(${AFFECTED_TARGET} PRIVATE INTEL_INTRINSICS) endif() if(ENABLE_NEON_SIMD) target_compile_definitions(${AFFECTED_TARGET} PRIVATE NEON_INTRINSICS) endif() if(WIN32) target_compile_definitions(${AFFECTED_TARGET} PRIVATE __CRT__NO_INLINE=1) endif() endif() endif() endforeach() else() # HEADERS_ONLY is ON project(AviSynth-Headers VERSION ${PROJECT_VERSION_STRING} LANGUAGES CXX) message(STATUS "Install Only Headers: ON") add_library(${PROJECT_NAME} INTERFACE) target_include_directories(${PROJECT_NAME} INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/avs_core/include") add_library(AviSynth::Headers ALIAS ${PROJECT_NAME}) # Determine target architecture include("${CMAKE_CURRENT_LIST_DIR}/avs_core/TargetArch.cmake") target_architecture(AVS_ARCH) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/avs_core/core/arch.h.in ${CMAKE_CURRENT_BINARY_DIR}/arch.h @ONLY) # Dynamically generate the sequential version info from Git # Based on the example here: http://www.cmake.org/pipermail/cmake/2010-July/038015.html FIND_PACKAGE(Git) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) ADD_CUSTOM_TARGET( VersionGen ALL ${CMAKE_COMMAND} -D SRC=${CMAKE_CURRENT_SOURCE_DIR}/avs_core/core/version.h.in -D DST=${CMAKE_CURRENT_BINARY_DIR}/version.h -D GIT=${GIT_EXECUTABLE} -D REPO=${CMAKE_SOURCE_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/avs_core/Version.cmake ) include(GNUInstallDirs) install( FILES ${CMAKE_CURRENT_SOURCE_DIR}/avs_core/include/avisynth.h ${CMAKE_CURRENT_SOURCE_DIR}/avs_core/include/avisynth_c.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/avisynth ) install( DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/avs_core/include/avs DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/avisynth ) install( FILES "${CMAKE_CURRENT_BINARY_DIR}/version.h" "${CMAKE_CURRENT_BINARY_DIR}/arch.h" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/avisynth/avs" ) endif() # uninstall target configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY) add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake) ================================================ FILE: README.md ================================================ AviSynth+ ========= **AviSynth+** is an improved version of the [AviSynth frameserver](http://avisynth.nl/index.php/Main_Page), with improved features and developer friendliness. Visit our [forum thread](http://forum.doom9.org/showthread.php?t=181351) for compilation instructions and support. Platform availability --------------------- | Supported OSes | |----------------| | Windows | | macOS | | Linux | | *BSD | | Haiku | | Supported CPU architectures | |-----------------------------| | x86(-64) | | ARM | | PowerPC | | SPARC | | RISC-V | | MIPS | | LoongArch | | z/Architecture | Not all OS/CPU combinations possible from either the OS' standpoint or AviSynth+'s. MIPS, LoongArch, and z/Architecture enabled by request to allow source compilation to succeed, but not tested on either hardware or VM Packaging status ---------------- [![Packaging status](https://repology.org/badge/vertical-allrepos/avisynthplus.svg)](https://repology.org/project/avisynthplus/versions) Headers for applications which dynamically load AviSynth+: ---------------------------------------------------------- The expected use-case of AviSynth+ is as a dynamically loaded library (using LoadLibrary on Windows or dlopen everywhere else). Due to this, it's not actually necessary to build the AviSynth+ library itself in order for applications using it this way to find it. To facilitate this, we support using CMake to do a limited, headers-only install. ### Using CMake: #### To install: > mkdir avisynth-build && cd avisynth-build >
cmake ../ -DHEADERS_ONLY:bool=on >
make install `-DCMAKE_INSTALL_PREFIX` can be used to override the install location if need be. #### To uninstall: >make uninstall Building the documentation: --------------------------- (Note: the bundled documentation lags behind the descriptions found in the wiki. You can always check the online documentation at http://avisynth.nl/index.php/Main_Page) AviSynth+'s documentation can be generated into HTML by using Sphinx. ### Set-up: Make sure that Sphinx is installed. This requires that Python is already installed and the pip tool is available. >pip install sphinx For various Linux distributions, a Sphinx package should be available in the distro's repositories. Often under the name 'python-sphinx' (as it is in Ubuntu's repositories). ### Building the documentation Once Sphinx is installed, we can build the documentation. > cd distrib/docs/english >
make html ================================================ FILE: avs_core/CMakeLists.txt ================================================ CMAKE_MINIMUM_REQUIRED( VERSION 3.6.2...3.11 ) if (WIN32) if(BUILD_SHARED_LIBS) set(CoreName "AviSynth") else() set(CoreName "avisynth") endif() else() set(CoreName "avisynth") endif() # Create library project("AvsCore" VERSION "${PROJECT_VERSION}" LANGUAGES CXX) Include("Files.cmake") # Initialize a variable to control INTEL_INTRINSICS_AVX512 definition # AVX512 support is only available on Intel architectures and 64-bit builds and specific compilers set(DEFINE_AVX512 FALSE) if(ENABLE_INTEL_SIMD) if(CMAKE_SIZEOF_VOID_P EQUAL 8) # 64-bit build if(MSVC_IDE AND NOT CLANG_IN_VS AND NOT IntelLLVM_IN_VS AND NOT IntelClassic_IN_VS) # Native MSVC, need to check version string(REGEX MATCH "^19\\.([0-9]+)\\.([0-9]+)" MSVC_VERSION_MATCH "${CMAKE_CXX_COMPILER_VERSION}") if(MSVC_VERSION_MATCH) set(MSVC_MAJOR 19) set(MSVC_MINOR ${CMAKE_MATCH_1}) set(MSVC_PATCH ${CMAKE_MATCH_2}) if(MSVC_MAJOR GREATER_EQUAL 19 AND MSVC_MINOR GREATER_EQUAL 22) # MSVC 2019 16.2 (19.22) or newer set(DEFINE_AVX512 TRUE) else() # set(DEFINE_AVX512 TRUE) # perhaps compiles but not recommended message(STATUS "Disabling AVX-512: MSVC version ${CMAKE_CXX_COMPILER_VERSION} is too old (MSVC 2019 16.2 (19.22) or newer).") endif() else() message(WARNING "Could not parse native 64-bit MSVC version. AVX-512 support might be incomplete.") endif() else() # Not native old MSVC (likely GCC, Clang, or newer MSVC via Clang/IntelLLVM) if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") # GCC 9.0 is a reasonable safe minimum for VNNI/VBMI/VBMI2/BITALG if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 9.0) set(DEFINE_AVX512 TRUE) else() message(STATUS "Disabling AVX-512: GCC version ${CMAKE_CXX_COMPILER_VERSION} is too old (requires 9.0+).") endif() elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") # Clang 9.0 is a reasonable safe minimum for VNNI/VBMI/VBMI2/BITALG if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 9.0) set(DEFINE_AVX512 TRUE) else() message(STATUS "Disabling AVX-512: Clang version ${CMAKE_CXX_COMPILER_VERSION} is too old (requires 9.0+).") endif() elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel") # Assume modern Intel compilers (icc, icx) support it set(DEFINE_AVX512 TRUE) else() # Default case for unknown/other compilers (like Clang/Intel in VS) # Since we exclude native MSVC, we assume modern compiler support. set(DEFINE_AVX512 TRUE) endif() endif() endif() # Note: AVX512 related source must be guarded with #ifdef INTEL_INTRINSICS_AVX512 within the # already existing #ifdef INTEL_INTRINSICS # Though INTEL_INTRINSICS conditional directive can exist for 32 bit and old compiler versions, # but INTEL_INTRINSICS_AVX512 exists only on x64 platforms for compilers supporting AVX512 features required by Avisynth endif() if(NOT DEFINE_AVX512) # Remove AVX512 specific files if it's a 32-bit build # or not supported compiler version list(FILTER AvsCore_Sources EXCLUDE REGEX ".*_avx512\\.(cpp|hpp|h)$") list(FILTER AvsCore_Sources EXCLUDE REGEX ".*_avx512b\\.(cpp|hpp|h)$") endif() add_library("AvsCore" ${AvsCore_Sources}) if(DEFINE_AVX512) # dont' use add_definitions(-DINTEL_INTRINSICS_AVX512) target_compile_definitions("AvsCore" PRIVATE INTEL_INTRINSICS_AVX512) endif() set_target_properties("AvsCore" PROPERTIES "OUTPUT_NAME" "${CoreName}") if (NOT WIN32) set_target_properties("AvsCore" PROPERTIES VERSION "${PROJECT_VERSION}" SOVERSION "${AVISYNTH_INTERFACE_VERSION}") endif() if (MINGW) if(BUILD_SHARED_LIBS) set_target_properties("AvsCore" PROPERTIES PREFIX "") set_target_properties("AvsCore" PROPERTIES IMPORT_PREFIX "") endif() endif() # Automatically group source files according to directory structure foreach(FILE ${AvsCore_Sources}) get_filename_component(PARENT_DIR "${FILE}" PATH) string(REGEX REPLACE "(\\./)" "" GROUP "${PARENT_DIR}") string(REPLACE "/" "\\" GROUP "${GROUP}") # group into "Source Files" and "Header Files" if ("${FILE}" MATCHES ".*\\.cpp") set(GROUP "Source Files\\${GROUP}") elseif("${FILE}" MATCHES ".*\\.(h|hpp)$") set(GROUP "Header Files\\${GROUP}") endif() source_group("${GROUP}" FILES "${FILE}") endforeach() function(handle_arch_flags ARCH_SUFFIX GCC_FLAGS MSVC_FLAGS) string(TOLOWER "${ARCH_SUFFIX}" ARCH_SUFFIX_LOWER) file(GLOB_RECURSE SRCS_${ARCH_SUFFIX} "*_${ARCH_SUFFIX_LOWER}.cpp") if(SRCS_${ARCH_SUFFIX}) # Check for any MSVC-based toolchain (VS IDE or cl.exe with Ninja) on Windows. if (MSVC) # MSVC can do Win32 and ARM64 as well. # not this: if (MSVC_IDE), Ninja leaves MSVC_IDE off # Check for MSVC-frontends that use GCC/Clang-like flags (e.g., ClangCL, IntelLLVM) IF(CLANG_IN_VS STREQUAL "1" OR IntelLLVM_IN_VS STREQUAL "1" OR IntelClassic_IN_VS STREQUAL "1") set_source_files_properties(${SRCS_${ARCH_SUFFIX}} PROPERTIES COMPILE_FLAGS "${GCC_FLAGS}") ELSE() # Native MSVC (cl.exe, including when used with Ninja) IF(WIN32) # MSVC gives warning in x64 when SSE2 flag is added, it's just required as a minimum if(NOT (CMAKE_SIZEOF_VOID_P EQUAL 8 AND "${MSVC_FLAGS}" STREQUAL " /arch:SSE2 ")) set_source_files_properties(${SRCS_${ARCH_SUFFIX}} PROPERTIES COMPILE_FLAGS "${MSVC_FLAGS}") endif() endif() ENDIF() else() # Fallback for all non-MSVC compilers (GCC, Clang on Linux/macOS, MinGW) set_source_files_properties(${SRCS_${ARCH_SUFFIX}} PROPERTIES COMPILE_FLAGS "${GCC_FLAGS}") endif() list(APPEND AvsCore_Sources ${SRCS_${ARCH_SUFFIX}}) endif() endfunction() if(ENABLE_NEON_SIMD) # ========================================================================= # AArch64 (ARM64) SIMD Flags # ========================================================================= # See: Arch64 SIMD Compilation and Source Code Rules # Files must be located in 'aarch64' subdirectory. # Baseline NEON (ASIMD) # GCC/Clang: Implicit (or -march=armv8-a) MSVC: /arch:armv8.0 # asm output debug, leave it here pls.: handle_arch_flags(NEON " -march=armv8-a -S -g -fverbose-asm -Wa,-adhln " " /arch:armv8.0 ") handle_arch_flags(NEON " -march=armv8-a " " /arch:armv8.0 ") # Dot Product (FEAT_DotProd / ARMv8.1-A) compulsory from ARMv8.4-A handle_arch_flags(DP " -march=armv8.1-a+dotprod " " /arch:armv8.1 ") # Int8 Matrix Multiply (FEAT_I8MM / ARMv8.2-A) Compulsory from ARMv8.6-A # Use the base arch flag to enable the features, relying on modern toolchain support. handle_arch_flags(I8MM " -march=armv8.2-a+i8mm " " /arch:armv8.2 ") # SVE2 (Scalable Vector Extension 2) (FEAT_SVE2 / ARMv8.5-A) Compulsory from ARMv9.0-A handle_arch_flags(SVE2 " -march=armv8.5-a+sve2 " " /arch:armv8.5 ") # SVE2.1 (FEAT_SVE2p1 / ARMv9.1-A) handle_arch_flags(SVE2_1 " -march=armv9.1-a+sve2.1 " " /arch:armv9.1 ") else() # ========================================================================= # Intel (x86/x64) SIMD Flags # ========================================================================= # gcc/llvm/clang-like flags, MSVC flags handle_arch_flags(SSSE3 " -mssse3 " " /arch:SSE2 ") # no special SSSE3 option in MSVC handle_arch_flags(SSE41 " -msse4.1 " " /arch:SSE2 ") # no special SSE4.1 option in MSVC handle_arch_flags(AVX " -mavx " " /arch:AVX ") handle_arch_flags(AVX2 " -mavx2 -mfma " " /arch:AVX2 ") if(DEFINE_AVX512) # Similar to AVX2, FMA must be added explicitly for GCC/Clang. # We also enable BMI2, as it is standard since AVX2 and useful for # AVX-512 mask operations like _bzhi_u64/u32. # The core subsets (F, CD, BW, DQ, VL) comprising the CPUF_AVX512_BASE # flag are present on all AVX-512-capable architectures. # # Note: Early Xeon (e.g., Skylake-X/Cascadelake) may exhibit severe # thermal throttling even on a single thread. In AviSynth+, AVX512_BASE # must be manually enabled in-script unless CPUF_AVX512_FAST is also detected. # Functions in *_avx512b.cpp should be dispatched on CPUF_AVX512_BASE. set(AVX512_BASE_GCC_FLAGS " -mfma -mbmi2 -mavx512f -mavx512cd -mavx512bw -mavx512dq -mavx512vl " ) # CPUF_AVX512_FAST indicates a modern, low-throttling architecture (ICL/RKL/AVX10.x). # This set represents the intersection of Icelake and AVX10.1 features: # (F, CD, BW, DQ, VL, VNNI, VBMI, VBMI2, BITALG, VPOPCNTDQ). # Functions in *_avx512.cpp should be dispatched on CPUF_AVX512_FAST. set(AVX512_FAST_GCC_FLAGS #" -march=icelake-client " # PF test #" -march=graniterapids " # PF test avx10.1 " -mfma -mbmi2 -mavx512f -mavx512cd -mavx512bw -mavx512dq -mavx512vl -mavx512vnni -mavx512vbmi -mavx512vbmi2 -mavx512bitalg -mavx512vpopcntdq " ) # Note: MSVC's /arch:AVX512 enables the basic subset (F, CD, BW, DQ, VL). # Unlike GCC/Clang, MSVC does not require individual flags for extensions # like VBMI or VNNI; if the intrinsic is used, it is compiled directly. # GCC/Clang require either file-level flags (set here) or function-level # target attributes. # GCC/Clang/Intel compilers will use -mavx512... flags via handle_arch_flags # even when running within the MSVC_IDE. handle_arch_flags(AVX512B "${AVX512_BASE_GCC_FLAGS}" " /arch:AVX512 ") # *_avx512b.cpp handle_arch_flags(AVX512 "${AVX512_FAST_GCC_FLAGS}" " /arch:AVX512 ") # *_avx512.cpp endif() ENDIF() # Specify include directories target_include_directories("AvsCore" PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) # Specify preprocessor definitions target_compile_definitions("AvsCore" PRIVATE BUILDING_AVSCORE) if(NOT ${BUILD_SHARED_LIBS}) target_compile_definitions("AvsCore" PRIVATE AVS_STATIC_LIB) endif() # If checked out with compat filesystem submodule, add that to system include directories get_filename_component( GHS_FILESYSTEM_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../filesystem/include ABSOLUTE ) if (EXISTS ${GHS_FILESYSTEM_INCLUDE_DIR}) target_include_directories("AvsCore" SYSTEM PRIVATE ${GHS_FILESYSTEM_INCLUDE_DIR}) endif() if (CMAKE_SYSTEM_NAME STREQUAL "Haiku") set(SYSLIB "root") elseif(CMAKE_SYSTEM_NAME STREQUAL "OpenBSD") set(SYSLIB "pthread") elseif(MSVC OR MINGW) set(SYSLIB "uuid" "winmm" "vfw32" "msacm32" "gdi32" "user32" "advapi32" "ole32" "imagehlp") else() set(SYSLIB "pthread" "dl" "m") endif() if(MINGW) set(CMAKE_THREAD_PREFER_PTHREAD TRUE) set(THREADS_PREFER_PTHREAD_FLAG TRUE) find_package(Threads REQUIRED) list(APPEND SYSLIB "pthread") endif() if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") list(APPEND SYSLIB "stdc++") # stdc++fs was mainlined into stdc++ in GCC 9, but GCC 8 can build it too if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9) list(APPEND SYSLIB "stdc++fs") endif() elseif(NOT MSVC AND CMAKE_CXX_COMPILER_ID MATCHES "Clang") list(APPEND SYSLIB "c++") endif() target_link_libraries("AvsCore" ${SYSLIB}) if(ENABLE_CUDA) if(${CMAKE_VERSION} VERSION_LESS "3.19.5") # deprecated since 3.10 but works find_package(CUDA) if(CUDA_FOUND) target_include_directories("AvsCore" PRIVATE ${CUDA_INCLUDE_DIRS}) #target_link_libraries ("AvsCore" ${CUDA_LIBRARIES}) target_link_libraries ("AvsCore" ${CUDA_cudart_static_LIBRARY}) target_compile_definitions("AvsCore" PUBLIC ENABLE_CUDA) list(APPEND SYSLIB "cudart_static") endif() else() # Fixed in 3.19.5: https://gitlab.kitware.com/cmake/cmake/-/issues/21740 include(FindCUDAToolkit) # FIXME: check supported compiler/platform/CUDA SDK version combinations if(CUDAToolkit_FOUND) target_include_directories("AvsCore" PRIVATE ${CUDAToolkit_INCLUDE_DIRS}) target_link_libraries ("AvsCore" CUDA::cudart_static) target_compile_definitions("AvsCore" PUBLIC ENABLE_CUDA) list(APPEND SYSLIB "cudart_static") endif() endif() endif() if (MSVC_IDE) # Copy output to a common folder for easy deployment add_custom_command( TARGET AvsCore POST_BUILD COMMAND xcopy /Y \"$(TargetPath)\" \"${CMAKE_BINARY_DIR}/Output\" ) IF(NOT CLANG_IN_VS STREQUAL "1" AND NOT IntelLLVM_IN_VS STREQUAL "1" AND NOT IntelClassic_IN_VS STREQUAL "1") # LLVM does not generate exp or don't know how to do it add_custom_command( TARGET AvsCore POST_BUILD COMMAND xcopy /Y \"$(TargetDir)AviSynth.exp\" \"${CMAKE_BINARY_DIR}/Output/c_api\" ) ENDIF() add_custom_command( TARGET AvsCore POST_BUILD COMMAND xcopy /Y \"$(TargetDir)AviSynth.lib\" \"${CMAKE_BINARY_DIR}/Output/c_api\" ) add_custom_command( TARGET AvsCore POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_BINARY_DIR}/Output/include ) endif() # Determine target architecture include("${CMAKE_CURRENT_LIST_DIR}/TargetArch.cmake") target_architecture(AVS_ARCH) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/core/arch.h.in ${CMAKE_CURRENT_BINARY_DIR}/arch.h @ONLY) # Dynamically generate the sequential version info from Git # Based on the example here: http://www.cmake.org/pipermail/cmake/2010-July/038015.html FIND_PACKAGE(Git) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) ADD_CUSTOM_TARGET( VersionGen ${CMAKE_COMMAND} -D SRC=${CMAKE_CURRENT_SOURCE_DIR}/core/version.h.in -D DST=${CMAKE_CURRENT_BINARY_DIR}/version.h -D GIT=${GIT_EXECUTABLE} -D REPO=${CMAKE_SOURCE_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/Version.cmake ) ADD_DEPENDENCIES("AvsCore" VersionGen) IF(MSVC_IDE) add_custom_command( TARGET AvsCore POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/avs_core/version.h ${CMAKE_BINARY_DIR}/avs_core/arch.h ${CMAKE_BINARY_DIR}/Output/include/avs ) endif() if (NOT EXISTS "${CMAKE_SOURCE_DIR}/.git" OR NOT GIT_FOUND) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DRELEASE_TARBALL") endif() # Generate pkg-config file get_target_property(LIB_NAME AvsCore OUTPUT_NAME) set(LIBS "-l${LIB_NAME}") set(_SYSLIBS_ITEMS ${SYSLIB}) list(TRANSFORM _SYSLIBS_ITEMS PREPEND "-l") list(JOIN _SYSLIBS_ITEMS " " SYSLIBS) if(MINGW) set(SYSLIBS "${SYSLIBS} -static") endif() CONFIGURE_FILE("avisynth.pc.in" "avisynth.pc" @ONLY) # Generate avisynth.conf CONFIGURE_FILE("avisynth_conf.h.in" "avisynth_conf.h" @ONLY) INSTALL(TARGETS AvsCore RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}") INSTALL(DIRECTORY "include/" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/avisynth") INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/version.h" "${CMAKE_CURRENT_BINARY_DIR}/arch.h" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/avisynth/avs") INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/avisynth.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") ================================================ FILE: avs_core/Files.cmake ================================================ FILE(GLOB AvsCore_Sources RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "*.c" "*.cpp" "*.h" "include/*.h" "include/avs/*.h" "convert/*.c" "convert/*.cpp" "convert/*.h" "core/*.c" "core/*.cpp" "core/*.h" "core/parser/*.c" "core/parser/*.cpp" "core/parser/*.h" "core/fonts/*.cpp" "core/fonts/*.h" "filters/*.c" "filters/*.cpp" "filters/*.h" "filters/conditional/*.c" "filters/conditional/*.cpp" "filters/conditional/*.h" "filters/overlay/*.c" "filters/overlay/*.cpp" "filters/overlay/*.h" "filters/exprfilter/*.cpp" "filters/exprfilter/*.h" ) IF(ENABLE_NEON_SIMD) FILE(GLOB Conditional_Filter_Cpu_Sources RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "filters/conditional/aarch64/*.cpp" "filters/conditional/aarch64/*.h") LIST(APPEND AvsCore_Sources "${Conditional_Filter_Cpu_Sources}") FILE(GLOB Convert_Cpu_Sources RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "convert/aarch64/*.cpp" "convert/aarch64/*.h") LIST(APPEND AvsCore_Sources "${Convert_Cpu_Sources}") FILE(GLOB Filters_Cpu_Sources RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "filters/aarch64/*.cpp" "filters/aarch64/*.h") LIST(REMOVE_ITEM AvsCore_Sources "") LIST(APPEND AvsCore_Sources "${Filters_Cpu_Sources}") FILE(GLOB Overlay_Cpu_Sources RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "filters/overlay/aarch64/*.cpp" "filters/overlay/aarch64/*.h") #not removing yet, unlike for Intel, no SIMD replacement #LIST(REMOVE_ITEM AvsCore_Sources "filters/overlay/444convert.cpp" # "filters/overlay/444convert.h") LIST(APPEND AvsCore_Sources "${Overlay_Cpu_Sources}") ENDIF() IF(ENABLE_INTEL_SIMD) FILE(GLOB Conditional_Filter_Cpu_Sources RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "filters/conditional/intel/*.cpp" "filters/conditional/intel/*.hpp" "filters/conditional/intel/*.h") LIST(APPEND AvsCore_Sources "${Conditional_Filter_Cpu_Sources}") FILE(GLOB Convert_Cpu_Sources RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "convert/intel/*.cpp" "convert/intel/*.hpp" "convert/intel/*.h") LIST(APPEND AvsCore_Sources "${Convert_Cpu_Sources}") FILE(GLOB Filters_Cpu_Sources RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "filters/intel/*.cpp" "filters/intel/*.hpp" "filters/intel/*.h") LIST(REMOVE_ITEM AvsCore_Sources "") LIST(APPEND AvsCore_Sources "${Filters_Cpu_Sources}") FILE(GLOB Overlay_Cpu_Sources RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "filters/overlay/intel/*.cpp" "filters/overlay/intel/*.hpp" "filters/overlay/intel/*.h") LIST(REMOVE_ITEM AvsCore_Sources "filters/overlay/444convert.cpp" "filters/overlay/444convert.h") LIST(APPEND AvsCore_Sources "${Overlay_Cpu_Sources}") ENDIF() IF( MSVC OR MINGW ) # AviSource is Windows-only, because it depends on Video for Windows FILE(GLOB AvsCore_Sources_AviSource RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "filters/AviSource/*.c" "filters/AviSource/*.cpp" "filters/AviSource/*.h") LIST(APPEND AvsCore_Sources "${AvsCore_Sources_AviSource}") ELSE() LIST(APPEND AvsCore_Sources "core/parser/os/win32_string_compat.cpp") LIST(APPEND AvsCore_Sources "core/parser/os/win32_string_compat.h") ENDIF() IF( MSVC ) # Export definitions in general are not needed on x64 and only cause warnings, # unfortunately we still must need a .def file for some COM functions. if(CMAKE_SIZEOF_VOID_P EQUAL 8) LIST(APPEND AvsCore_Sources "core/avisynth64.def") else() LIST(APPEND AvsCore_Sources "core/avisynth.def") endif() ENDIF() IF( MSVC_IDE ) # Ninja, unfortunately, seems to have some issues with using rc.exe LIST(APPEND AvsCore_Sources "core/avisynth.rc") ENDIF() ================================================ FILE: avs_core/TargetArch.cmake ================================================ # http://stackoverflow.com/questions/11944060/how-to-detect-target-architecture-using-cmake # https://github.com/petroules/solar-cmake/blob/master/TargetArch.cmake # Based on the Qt 5 processor detection code, so should be very accurate # https://qt.gitorious.org/qt/qtbase/blobs/master/src/corelib/global/qprocessordetection.h # Currently handles arm (v5, v6, v7), x86 (32/64), ia64, and ppc (32/64) # Regarding POWER/PowerPC, just as is noted in the Qt source, # "There are many more known variants/revisions that we do not handle/detect." set(archdetect_c_code " #if defined(__arm__) || defined(__TARGET_ARCH_ARM) || defined(_M_ARM) || defined(_M_ARM64) || defined(__aarch64__) || defined(__ARM64__) #if defined(__ARM64_ARCH_8__) \ || defined(__aarch64__) \ || defined(__ARMv8__) \ || defined(__ARMv8_A__) \ || defined(_M_ARM64) #error cmake_ARCH aarch64 #elif defined(__ARM_ARCH_7__) \\ || defined(__ARM_ARCH_7A__) \\ || defined(__ARM_ARCH_7R__) \\ || defined(__ARM_ARCH_7M__) \\ || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 7) #error cmake_ARCH armv7 #elif defined(__ARM_ARCH_6__) \\ || defined(__ARM_ARCH_6J__) \\ || defined(__ARM_ARCH_6T2__) \\ || defined(__ARM_ARCH_6Z__) \\ || defined(__ARM_ARCH_6K__) \\ || defined(__ARM_ARCH_6ZK__) \\ || defined(__ARM_ARCH_6M__) \\ || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 6) #error cmake_ARCH armv6 #elif defined(__ARM_ARCH_5TEJ__) \\ || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 5) #error cmake_ARCH armv5 #else #error cmake_ARCH arm #endif #elif defined(__i386) || defined(__i386__) || defined(_M_IX86) #error cmake_ARCH i386 #elif defined(__x86_64) || defined(__x86_64__) || defined(__amd64) || defined(_M_X64) #error cmake_ARCH x86_64 #elif defined(__ia64) || defined(__ia64__) || defined(_M_IA64) #error cmake_ARCH ia64 #elif defined(__ppc__) || defined(__ppc) || defined(__powerpc__) \\ || defined(_ARCH_COM) || defined(_ARCH_PWR) || defined(_ARCH_PPC) \\ || defined(_M_MPPC) || defined(_M_PPC) #if defined(__ppc64__) || defined(__powerpc64__) || defined(__64BIT__) #error cmake_ARCH ppc64 #else #error cmake_ARCH ppc #endif #elif defined(__riscv) #error cmake_ARCH riscv #elif defined(__sparc_v9__) #error cmake_ARCH sparc #elif defined(__mips__) #error cmake_ARCH mips #elif defined(__s390x__) #error cmake_ARCH s390x #endif #error cmake_ARCH unknown ") # Set ppc_support to TRUE before including this file or ppc and ppc64 # will be treated as invalid architectures since they are no longer supported by Apple function(target_architecture output_var) if(APPLE AND CMAKE_OSX_ARCHITECTURES) # On OS X we use CMAKE_OSX_ARCHITECTURES *if* it was set # First let's normalize the order of the values # Note that it's not possible to compile PowerPC applications if you are using # the OS X SDK version 10.6 or later - you'll need 10.4/10.5 for that, so we # disable it by default # See this page for more information: # http://stackoverflow.com/questions/5333490/how-can-we-restore-ppc-ppc64-as-well-as-full-10-4-10-5-sdk-support-to-xcode-4 # Architecture defaults to i386 or ppc on OS X 10.5 and earlier, depending on the CPU type detected at runtime. # On OS X 10.6+ the default is x86_64 if the CPU supports it, i386 otherwise. foreach(osx_arch ${CMAKE_OSX_ARCHITECTURES}) if("${osx_arch}" STREQUAL "ppc" AND ppc_support) set(osx_arch_ppc TRUE) elseif("${osx_arch}" STREQUAL "i386") set(osx_arch_i386 TRUE) elseif("${osx_arch}" STREQUAL "x86_64") set(osx_arch_x86_64 TRUE) elseif("${osx_arch}" STREQUAL "ppc64" AND ppc_support) set(osx_arch_ppc64 TRUE) elseif("${osx_arch}" STREQUAL "arm64") set(osx_arch_arm64 TRUE) else() message(FATAL_ERROR "Invalid OS X arch name: ${osx_arch}") endif() endforeach() # Now add all the architectures in our normalized order if(osx_arch_ppc) list(APPEND ARCH ppc) endif() if(osx_arch_i386) list(APPEND ARCH i386) endif() if(osx_arch_x86_64) list(APPEND ARCH x86_64) endif() if(osx_arch_ppc64) list(APPEND ARCH ppc64) endif() if(osx_arch_arm64) list(APPEND ARCH arm64) endif() else() file(WRITE "${CMAKE_BINARY_DIR}/arch.c" "${archdetect_c_code}") enable_language(C) # Detect the architecture in a rather creative way... # This compiles a small C program which is a series of ifdefs that selects a # particular #error preprocessor directive whose message string contains the # target architecture. The program will always fail to compile (both because # file is not a valid C program, and obviously because of the presence of the # #error preprocessor directives... but by exploiting the preprocessor in this # way, we can detect the correct target architecture even when cross-compiling, # since the program itself never needs to be run (only the compiler/preprocessor) try_run( run_result_unused compile_result_unused "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/arch.c" COMPILE_OUTPUT_VARIABLE ARCH CMAKE_FLAGS CMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES} ) # Parse the architecture name from the compiler output string(REGEX MATCH "cmake_ARCH ([a-zA-Z0-9_]+)" ARCH "${ARCH}") # Get rid of the value marker leaving just the architecture name string(REPLACE "cmake_ARCH " "" ARCH "${ARCH}") # If we are compiling with an unknown architecture this variable should # already be set to "unknown" but in the case that it's empty (i.e. due # to a typo in the code), then set it to unknown if (NOT ARCH) set(ARCH unknown) endif() endif() set(${output_var} "${ARCH}" PARENT_SCOPE) endfunction() ================================================ FILE: avs_core/Version.cmake ================================================ FIND_PACKAGE(Git) if (EXISTS "${REPO}/.git" AND GIT_FOUND) EXECUTE_PROCESS( COMMAND "${GIT}" --git-dir=${REPO}/.git rev-list --count HEAD OUTPUT_VARIABLE AVS_SEQREV OUTPUT_STRIP_TRAILING_WHITESPACE ) EXECUTE_PROCESS( COMMAND "${GIT}" --git-dir=${REPO}/.git rev-parse --abbrev-ref HEAD OUTPUT_VARIABLE AVS_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE ) # find the newest created tag, which will hopefully only be relevant to # release tags (which themselves only apply to the release branches) EXECUTE_PROCESS( COMMAND "${GIT}" --git-dir=${REPO}/.git describe --tags --abbrev=0 OUTPUT_VARIABLE AVS_NEWEST_TAG ) string(STRIP ${AVS_NEWEST_TAG} AVS_NEWEST_TAG) # count the number of commits since the most recently created tag. # if an older-than-tag commit has been checked out as HEAD, then this # will report '0', which shouldn't be a problem because this is entirely # intended for the purposes of current development and not as an # arbitrary meter between release tags. EXECUTE_PROCESS( COMMAND "${GIT}" --git-dir=${REPO}/.git rev-list --count ${AVS_NEWEST_TAG}..HEAD OUTPUT_VARIABLE AVS_DEVNEXT_REV OUTPUT_STRIP_TRAILING_WHITESPACE ) # date of last git commit to branch EXECUTE_PROCESS( COMMAND "${GIT}" --git-dir=${REPO}/.git log -1 HEAD --format=%cd --date=unix OUTPUT_VARIABLE AVS_DEV_REVDATE OUTPUT_STRIP_TRAILING_WHITESPACE ) set(ENV{SOURCE_DATE_EPOCH} ${AVS_DEV_REVDATE}) string(TIMESTAMP AVS_DEV_REVDATE %Y-%m-%d UTC) unset(ENV{SOURCE_DATE_EPOCH}) # abbreviated git commit hash EXECUTE_PROCESS( COMMAND "${GIT}" --git-dir=${REPO}/.git describe --tags OUTPUT_VARIABLE AVS_DEV_GITHASH OUTPUT_STRIP_TRAILING_WHITESPACE ) endif() CONFIGURE_FILE(${SRC} ${DST} @ONLY) ================================================ FILE: avs_core/avisynth.pc.in ================================================ prefix=@CMAKE_INSTALL_PREFIX@ exec_prefix=@CMAKE_INSTALL_PREFIX@ libdir=@CMAKE_INSTALL_FULL_LIBDIR@ includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@/avisynth Name: AviSynth+ Description: A powerful nonlinear scripting language for video. Version: @PROJECT_VERSION@ Libs: -L${libdir} @LIBS@ Libs.private: @SYSLIBS@ Cflags: -I${includedir} Cflags.private: -DAVS_STATIC_LIB ================================================ FILE: avs_core/avisynth_conf.h.in ================================================ #ifndef _AVS_CONF_H_ #define _AVS_CONF_H_ #include #ifdef AVS_POSIX #define user_avs_plugindir_configurable "@USER_AVS_PLUGINDIR_LOCATION@" #define system_avs_plugindir "@CORE_PLUGIN_INSTALL_PATH@/avisynth" #endif #endif // _AVS_CONF_H_ ================================================ FILE: avs_core/convert/convert.cpp ================================================ // Avisynth v2.5. Copyright 2002-2009 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include "convert.h" #include "convert_matrix.h" #include "convert_helper.h" #include "convert_bits.h" #include "convert_planar.h" #include "convert_rgb.h" #include #include #include #include #include #include #include #ifdef AVS_WINDOWS #include #else #include #endif /******************************************************************** ***** Declare index of new filters for Avisynth's filter engine ***** ********************************************************************/ extern const AVSFunction Convert_filters[] = { { "ConvertToRGB", BUILTIN_FUNC_PREFIX, "c[matrix]s[interlaced]b[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f[bits]i[quality]b", CreateConvertToAdaptivePackedRGB, (void *)0 }, { "ConvertToRGB24", BUILTIN_FUNC_PREFIX, "c[matrix]s[interlaced]b[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f[bits]i[quality]b", CreateConvertToPackedRGB, (void *)24 }, { "ConvertToRGB32", BUILTIN_FUNC_PREFIX, "c[matrix]s[interlaced]b[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f[bits]i[quality]b", CreateConvertToPackedRGB, (void *)32 }, { "ConvertToRGB48", BUILTIN_FUNC_PREFIX, "c[matrix]s[interlaced]b[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f[bits]i[quality]b", CreateConvertToPackedRGB, (void *)48 }, { "ConvertToRGB64", BUILTIN_FUNC_PREFIX, "c[matrix]s[interlaced]b[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f[bits]i[quality]b", CreateConvertToPackedRGB, (void *)64 }, { "ConvertToPlanarRGB", BUILTIN_FUNC_PREFIX, "c[matrix]s[interlaced]b[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f[bits]i[quality]b", CreateConvertToRGB, (void *)-1 }, { "ConvertToPlanarRGBA", BUILTIN_FUNC_PREFIX, "c[matrix]s[interlaced]b[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f[bits]i[quality]b", CreateConvertToRGB, (void *)-2 }, { "ConvertToY8", BUILTIN_FUNC_PREFIX, "c[matrix]s[bits]i[quality]b", ConvertToPlanarGeneric::CreateY, (void*)0 }, // user_data == 0 -> only 8 bit sources { "ConvertToYV12", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[ChromaOutPlacement]s[param1]f[param2]f[param3]f[bits]i[quality]b", ConvertToPlanarGeneric::CreateYUV420, (void*)0 }, { "ConvertToYV24", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f[bits]i[quality]b", ConvertToPlanarGeneric::CreateYUV444, (void*)0}, { "ConvertToYV16", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[ChromaOutPlacement]s[param1]f[param2]f[param3]f[bits]i[quality]b", ConvertToPlanarGeneric::CreateYUV422, (void*)0}, { "ConvertToYV411", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f[bits]i[quality]b", ConvertToPlanarGeneric::CreateYV411, (void*)0}, { "ConvertToYUY2", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[ChromaOutPlacement]s[param1]f[param2]f[param3]f[bits]i[quality]b", ConvertToPlanarGeneric::CreateConvertToYUY2 }, { "ConvertBackToYUY2", BUILTIN_FUNC_PREFIX, "c[matrix]s", ConvertToPlanarGeneric::CreateConvertBackToYUY2 }, { "ConvertToY", BUILTIN_FUNC_PREFIX, "c[matrix]s[bits]i[quality]b", ConvertToPlanarGeneric::CreateY, (void*)1 }, // user_data == 1 -> any bit depth sources { "ConvertToYUV411", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f[bits]i[quality]b", ConvertToPlanarGeneric::CreateYV411, (void*)1}, // alias for ConvertToYV411, 8 bit check later { "ConvertToYUV420", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[ChromaOutPlacement]s[param1]f[param2]f[param3]f[bits]i[quality]b", ConvertToPlanarGeneric::CreateYUV420, (void*)1}, { "ConvertToYUV422", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[ChromaOutPlacement]s[param1]f[param2]f[param3]f[bits]i[quality]b", ConvertToPlanarGeneric::CreateYUV422, (void*)1}, { "ConvertToYUV444", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f[bits]i[quality]b", ConvertToPlanarGeneric::CreateYUV444, (void*)1}, { "ConvertToYUVA420", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[ChromaOutPlacement]s[param1]f[param2]f[param3]f[bits]i[quality]b", ConvertToPlanarGeneric::CreateYUV420, (void*)2}, { "ConvertToYUVA422", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[ChromaOutPlacement]s[param1]f[param2]f[param3]f[bits]i[quality]b", ConvertToPlanarGeneric::CreateYUV422, (void*)2}, { "ConvertToYUVA444", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f[bits]i[quality]b", ConvertToPlanarGeneric::CreateYUV444, (void*)2}, { "ConvertTo8bit", BUILTIN_FUNC_PREFIX, "c[bits]i[truerange]b[dither]i[dither_bits]i[fulls]b[fulld]b", ConvertBits::Create, (void *)8 }, { "ConvertTo16bit", BUILTIN_FUNC_PREFIX, "c[bits]i[truerange]b[dither]i[dither_bits]i[fulls]b[fulld]b", ConvertBits::Create, (void *)16 }, { "ConvertToFloat", BUILTIN_FUNC_PREFIX, "c[bits]i[truerange]b[dither]i[dither_bits]i[fulls]b[fulld]b", ConvertBits::Create, (void *)32 }, { "ConvertBits", BUILTIN_FUNC_PREFIX, "c[bits]i[truerange]b[dither]i[dither_bits]i[fulls]b[fulld]b", ConvertBits::Create, (void *)0 }, { "AddAlphaPlane", BUILTIN_FUNC_PREFIX, "c[mask].[opacity]f", AddAlphaPlane::Create}, { "RemoveAlphaPlane", BUILTIN_FUNC_PREFIX, "c", RemoveAlphaPlane::Create}, { 0 } }; /**************************************** ******* Convert to RGB / RGBA ****** ***************************************/ // 0 1 2 3 4 5 6 7 8 9 // c[matrix]s[interlaced]b[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f[bits]i[quality]b // Special syntax: adaptive packed target format: ConvertToRGB AVSValue __cdecl CreateConvertToAdaptivePackedRGB(AVSValue args, void* user_data, IScriptEnvironment* env) { const PClip clip = args[0].AsClip(); const VideoInfo& vi = clip->GetVideoInfo(); // bits= if given must be 8 or 16 (only valid packed RGB channel depths) int target_bits_per_channel; if (args[8].Defined()) { target_bits_per_channel = args[8].AsInt(); if (target_bits_per_channel != 8 && target_bits_per_channel != 16) env->ThrowError("ConvertToRGB: bits must be 8 or 16 if specified. " "Use ConvertToPlanarRGB for other bit depths."); } else { const int src_bits = vi.BitsPerComponent(); if (src_bits != 8 && src_bits != 16) env->ThrowError("ConvertToRGB: source bit depth must be 8 or 16. " "Use ConvertToPlanarRGB or ConvertBits(8)/ConvertBits(16) first."); target_bits_per_channel = src_bits; } // Decide target format based on source type and alpha capability (and the optional bits= override): // - YUV/YUY2 source: always alpha-capable (RGB32 or RGB64) // - RGB-like source: preserve alpha capability of source format // RGB32/RGB64/PlanarRGBA -> RGB32/RGB64 (with alpha) // RGB24/RGB48/PlanarRGB -> RGB24/RGB48 (without alpha) const bool hasAlpha = vi.IsYUV() || vi.IsYUVA() // YUV always gets alpha target || vi.IsRGB32() || vi.IsRGB64() || vi.IsPlanarRGBA(); // 8-bit: RGB24 or RGB32, 16-bit: RGB48 or RGB64 const intptr_t target_rgbtype = (target_bits_per_channel == 8) ? (hasAlpha ? 32 : 24) : (hasAlpha ? 64 : 48); return CreateConvertToPackedRGB(args, reinterpret_cast(target_rgbtype), env); } // Registration names with implied fixed bit depth: // ConvertToRGB24 -> 24-bit only (bits must be 24 if specified) // ConvertToRGB32 -> 32-bit only (bits must be 32 if specified) // ConvertToRGB48 -> 48-bit only (bits must be 48 if specified) // ConvertToRGB64 -> 64-bit only (bits must be 64 if specified) AVSValue __cdecl CreateConvertToPackedRGB(AVSValue args, void* user_data, IScriptEnvironment* env) { const int target_bits = (int)reinterpret_cast(user_data); // 24, 32, 48, 64 const int target_bytes = target_bits / 8; // 3, 4, 6, 8 const int bits_per_channel = (target_bytes <= 4) ? 8 : 16; // RGB24/32=8bit, RGB48/64=16bit // bits= must match the implied depth if specified if (args[8].Defined() && args[8].AsInt() != bits_per_channel) env->ThrowError("ConvertToRGB%d: bits must be %d if specified.", target_bits, bits_per_channel); // Rebuild args with bits forced to the correct value AVSValue new_args[10] = { args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], AVSValue(bits_per_channel), // bits forced args[9] // quality }; AVSValue new_args_val(new_args, 10); return CreateConvertToRGB(new_args_val, user_data, env); } // Dispatch hub for all ConvertToRGB variants. // Since 3.7.6 YUY2 is pre-converted to YV16 before dispatch, so no class is needed. // Called from ConvertToRGB24/32/48/64 and ConvertToPlanarRGB(A) registrations, // and from any internal env->Invoke("ConvertToRGB",...) calls. // All ToRGB variants has bits and quality parameters, bit the quality=true and on-the-fly bit depth // conversion logic is only implemented for YUV->PlanarRGB path. // Note: when you add new parameters, find all places env->Invoke("ConvertToRGB",...) // and check parameter count! AVSValue __cdecl CreateConvertToRGB(AVSValue args, void* user_data, IScriptEnvironment* env) { PClip clip = args[0].AsClip(); VideoInfo vi = clip->GetVideoInfo(); // Before any conversions, convert YUY2 to YV16 if (vi.IsYUY2()) { clip = new ConvertYUY2ToYV16_or_Y(clip, false /*to_y*/, env); vi = clip->GetVideoInfo(); } const char* const matrix_name = args[1].AsString(0); const bool haveOpts = args[3].Defined() || args[4].Defined(); // common Create for all CreateRGB24/32/48/64/Planar(RGBP:-1, RGPAP:-2) using user_data int target_rgbtype = (int)reinterpret_cast(user_data); // can be overridden later // -1,-2: Planar RGB(A) // 24,32,48,64: RGB24/32/48/64 const bool original_target_is_packed = target_rgbtype > 0; // 24,32,48,64 const int target_bits_per_pixel = args[8].AsInt(vi.BitsPerComponent()); // for legacy packed formats it's 8 for target_rgbtype==24,32, and 16 for target_rgbtype==48,64 // for planar RGB(A) target, it can be any bit depth supported by the source and the conversion logic (8,10,12,14,16,32) const bool quality = args[9].AsBool(false); // yuv-planarrgb float workflow // planar YUV-like source if (vi.IsPlanar() && (vi.IsYUV() || vi.IsYUVA())) { // here we keep the bit depth, later, the RGB conversion will take target_bits_per_pixel into account AVSValue new_args[10] = { clip, args[2], args[1], args[3], args[4], args[5], args[6], args[7], vi.BitsPerComponent(), quality }; // conversion to planar or packed RGB is always from 444 // clip, interlaced, matrix, chromainplacement, chromaresample, param1, param2, param3, bits, quality Check for ConvertToYUV444 param list!!!! Count must match! clip = ConvertToPlanarGeneric::CreateYUV444(AVSValue(new_args, 10), (void*)1, env).AsClip(); // (void *)1: not restricted to 8 bits // planar RGB(A) target or packed needing intermediate: set finalBitdepth if conversion needed // also: when quality==true, we need to use the float workflow which requires a planar RGB(A) intermediate if (target_rgbtype > 0) { // packed RGB target: redirect to planar rgb(a) intermediate if bit-depth mismatch or quality mode const bool hasAlpha = (target_rgbtype == 32 || target_rgbtype == 64); if (vi.BitsPerComponent() != target_bits_per_pixel || quality) target_rgbtype = hasAlpha ? -2 : -1; } if (target_rgbtype == 48 || target_rgbtype == 64) { // Unlike parameter-less RGB24/32, 16 bit packed format have no direct conversions at all. // 1.) YUV->PlanarRGB first (recursive call), // 2.) then fall through to the planar RGB->packed RGB path below for the final repack // So instead of unoptimized code of YUV(A)444P16->RGB48/64 we convert to PlanarRGB(A) then to RGB48/64 // Also: when quality=true or bit-depth conversion is needed, the planar RGB intermediate is required anyway AVSValue new_args2[10] = { clip, args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8]/*bits*/, args[9]/*quality*/ }; const intptr_t target_planar_rgb_type = (target_rgbtype == 24 || target_rgbtype == 48) ? -1 : // no-alpha target: skip alpha even if source has it vi.IsYUVA() ? -2 : // alpha target + alpha source: preserve it -1; // alpha target + no alpha source: no alpha to copy // Note: target_rgbtype == 24 is currently never reached here (24/32 use direct conversion path), // but kept for when 24/32-bit packed is also redirected to the planar intermediate path in the future. clip = CreateConvertToRGB(AVSValue(new_args2, 10), (void*)target_planar_rgb_type, env).AsClip(); vi = clip->GetVideoInfo(); // must update vi for fall-through // Fall through to planar RGB source path below to do the final pack // reuses the same PlanarRGBtoPackedRGB logic. } else { // Direct YUV444->RGB conversion path bool bitdepthConverted = false; const int finalBitdepth = (vi.BitsPerComponent() != target_bits_per_pixel) ? target_bits_per_pixel : -1; // -1 means: no need to convert // Optional bit-depth conversion in PackedRGBtoPlanarRGB. // Note: all formats are bit-depth-converted if finalBitdepth != -1 // (historically there were cases and bit-depths which were not implemented to have in-line bit-depth conversion) // pass -1 as finalBitdepth, signing that no bit-depth conversion required const int rgbtype_param = (target_rgbtype == -1 || target_rgbtype == -2) ? target_rgbtype : // planar RGB(A) target_rgbtype == 24 ? 3 : 4; // RGB24 or RGB32 "pixel_step" parameter for legacy direct YUV444->RGB24/32 conversion clip = new ConvertYUV444ToRGB(clip, matrix_name, rgbtype_param, finalBitdepth, // -1 if no conversion needed quality, /*ref*/bitdepthConverted, env); vi = clip->GetVideoInfo(); // When direct YUV-RGB24/32 conversion happens, the result is not planar! const bool needConvertFinalBitdepth = finalBitdepth != -1; if (needConvertFinalBitdepth && !bitdepthConverted) { AVSValue new_args[] = { clip, finalBitdepth }; clip = env->Invoke("ConvertBits", AVSValue(new_args, 2)).AsClip(); vi = clip->GetVideoInfo(); } // We can still have RGB24/32 here, YV24->24/32 is still valid if (original_target_is_packed && vi.IsPlanar()) { // from any planar rgb(a) -> rgb24/32/48/64 // source here is always a 8/16bit planar RGB(A), but we used // planar intermediate. // finally it has to be converted to RGB24/32/48/64 clip = new PlanarRGBtoPackedRGB(clip, target_rgbtype == -2); vi = clip->GetVideoInfo(); } return clip; } } // end of YUV->RGB path else { if (haveOpts) env->ThrowError("ConvertToRGB: ChromaPlacement and ChromaResample options are not supported."); } // This part can fallthrough from the YUV path when target is packed RGB // RGB->RGB paths (planar or packed) do not support ChromaPlacement and ChromaResample options, as they are meaningless for RGB formats. // Planar RGB(A) source if (vi.IsPlanarRGB() || vi.IsPlanarRGBA()) { // Handle alpha channel add/remove for planar-to-planar if (target_rgbtype < 0) { if (vi.IsPlanarRGB() && target_rgbtype == -2) clip = new AddAlphaPlane(clip, nullptr, 0.0f, false, env); else if (vi.IsPlanarRGBA() && target_rgbtype == -1) clip = new RemoveAlphaPlane(clip, env); } // Convert bit depth if needed if (vi.BitsPerComponent() != target_bits_per_pixel) { AVSValue args[] = { clip, target_bits_per_pixel }; // plain Invoke instead of "new ConvertBits", this detects and keeps source and target ranges clip = env->Invoke("ConvertBits", AVSValue(args, 2)).AsClip(); } // Convert planar to packed if (target_rgbtype >= 0) { bool hasAlpha = (target_rgbtype == 32 || target_rgbtype == 64); clip = new PlanarRGBtoPackedRGB(clip, hasAlpha); } return clip; } // Planar RGB(A) source // YUV source is done // Planar RGB(A) source is done // Now remains packed RGB source // Conversions from packed RGB // Packed to Packed if (target_rgbtype >= 0) { // target bit depth (8-bit for 24/32, 16-bit for 48/64) // target_bits_per_pixel is same as target_rgbtype if (vi.BitsPerComponent() != target_bits_per_pixel) { AVSValue args[] = { clip, target_bits_per_pixel }; // using Invoke instead of new ConvertBits, this detects and keeps source and target ranges clip = env->Invoke("ConvertBits", AVSValue(args, 2)).AsClip(); vi = clip->GetVideoInfo(); } bool target_has_alpha = (target_rgbtype == 32 || target_rgbtype == 64); bool source_has_alpha = (vi.IsRGB32() || vi.IsRGB64()); // between packed RGB types, alpha add/remove if (target_has_alpha && !source_has_alpha) return new RGBtoRGBA(clip); if (!target_has_alpha && source_has_alpha) return new RGBAtoRGB(clip); return clip; } // Packed to Planar // RGB24/32/48/64 -> const bool isSrcRGBA = vi.IsRGB32() || vi.IsRGB64(); const bool isTargetRGBA = target_rgbtype == -2; // -2 planar RGBA, -1 planar RGB clip = new PackedRGBtoPlanarRGB(clip, isSrcRGBA, isTargetRGBA); vi = clip->GetVideoInfo(); // new format // no embedded bitdepth conversion in PackedRGBtoPlanarRGB if (target_bits_per_pixel != vi.BitsPerComponent()) { AVSValue new_args[2] = { clip, target_bits_per_pixel }; clip = env->Invoke("ConvertBits", AVSValue(new_args, 2)).AsClip(); vi = clip->GetVideoInfo(); // new format } return clip; } AVSValue AddAlphaPlane::Create(AVSValue args, void*, IScriptEnvironment* env) { bool isMaskDefined = args[1].Defined(); bool isOpacityDefined = args[2].Defined(); bool maskIsClip = false; // if mask is not defined and videoformat has Alpha then we return if (isMaskDefined && !args[1].IsClip() && !args[1].IsFloat()) env->ThrowError("AddAlphaPlane: mask parameter should be clip or number"); if (isOpacityDefined && !args[2].IsFloat()) env->ThrowError("AddAlphaPlane: opacity parameter should be a number"); if (isMaskDefined && isOpacityDefined) env->ThrowError("AddAlphaPlane: cannot specify both mask and opacity parameters"); const VideoInfo& vi = args[0].AsClip()->GetVideoInfo(); if (!isMaskDefined && !isOpacityDefined && (vi.IsPlanarRGBA() || vi.IsYUVA() || vi.IsRGB32() || vi.IsRGB64())) return args[0].AsClip(); PClip alphaClip = nullptr; if (isMaskDefined && args[1].IsClip()) { const VideoInfo& viAlphaClip = args[1].AsClip()->GetVideoInfo(); maskIsClip = true; if (viAlphaClip.BitsPerComponent() != vi.BitsPerComponent()) env->ThrowError("AddAlphaPlane: alpha clip is of different bit depth"); if (viAlphaClip.width != vi.width || viAlphaClip.height != vi.height) env->ThrowError("AddAlphaPlane: alpha clip is of different size"); if (viAlphaClip.IsY()) alphaClip = args[1].AsClip(); else if (viAlphaClip.NumComponents() == 4) { AVSValue new_args[1] = { args[1].AsClip() }; alphaClip = env->Invoke("ExtractA", AVSValue(new_args, 1)).AsClip(); } else { env->ThrowError("AddAlphaPlane: alpha clip should be greyscale or should have alpha plane"); } // alphaClip is always greyscale here } float maskAsFloat = -1.0f; if (!maskIsClip) { if (isOpacityDefined) { // Handle opacity parameter (0.0 to 1.0) float opacity = args[2].AsFloatf(1.0f); if (opacity < 0.0f || opacity > 1.0f) env->ThrowError("AddAlphaPlane: opacity must be between 0.0 and 1.0"); if (vi.BitsPerComponent() <= 16) { int max_pixel_value = (1 << vi.BitsPerComponent()) - 1; maskAsFloat = opacity * max_pixel_value; } else { maskAsFloat = opacity; } } else { // Handle mask parameter (direct value) maskAsFloat = (float)args[1].AsFloat(-1.0f); } } if (vi.IsRGB24()) { AVSValue new_args[1] = { args[0].AsClip() }; PClip child = env->Invoke("ConvertToRGB32", AVSValue(new_args, 1)).AsClip(); return new AddAlphaPlane(child, alphaClip, maskAsFloat, isMaskDefined || isOpacityDefined, env); } else if (vi.IsRGB48()) { AVSValue new_args[1] = { args[0].AsClip() }; PClip child = env->Invoke("ConvertToRGB64", AVSValue(new_args, 1)).AsClip(); return new AddAlphaPlane(child, alphaClip, maskAsFloat, isMaskDefined || isOpacityDefined, env); } return new AddAlphaPlane(args[0].AsClip(), alphaClip, maskAsFloat, isMaskDefined || isOpacityDefined, env); } AddAlphaPlane::AddAlphaPlane(PClip _child, PClip _alphaClip, float _mask_f, bool isMaskDefined, IScriptEnvironment* env) : GenericVideoFilter(_child), alphaClip(_alphaClip) , mask(0), mask_f(0.0f), pixelsize(0), bits_per_pixel(0) { if(vi.IsYUY2()) env->ThrowError("AddAlphaPlane: YUY2 is not allowed"); if(vi.IsY()) env->ThrowError("AddAlphaPlane: greyscale source is not allowed"); if(vi.IsYUV() && !vi.Is420() && !vi.Is422() && !vi.Is444()) // e.g. 410 env->ThrowError("AddAlphaPlane: YUV format not supported, must be 420, 422 or 444"); if(!vi.IsYUV() && !vi.IsYUVA() && !vi.IsRGB()) env->ThrowError("AddAlphaPlane: format not supported"); pixelsize = vi.ComponentSize(); bits_per_pixel = vi.BitsPerComponent(); if (vi.IsYUV()) { int pixel_type = vi.pixel_type; if (vi.IsYV12()) pixel_type = VideoInfo::CS_YV12; int new_pixel_type = (pixel_type & ~VideoInfo::CS_YUV) | VideoInfo::CS_YUVA; vi.pixel_type = new_pixel_type; } else if(vi.IsPlanarRGB()) { int pixel_type = vi.pixel_type; int new_pixel_type = (pixel_type & ~VideoInfo::CS_RGB_TYPE) | VideoInfo::CS_RGBA_TYPE; vi.pixel_type = new_pixel_type; } // RGB24 and RGB48 already converted to 32/64 // RGB32, RGB64, YUVA and RGBA: no change // mask parameter. If none->max opacity if (!alphaClip) { int max_pixel_value = (1 << bits_per_pixel) - 1; // n/a for float if (!isMaskDefined) { mask_f = 1.0f; mask = max_pixel_value; } else { mask_f = _mask_f; mask = (mask_f < 0) ? 0 : (mask_f > max_pixel_value) ? max_pixel_value : (int)(mask_f + 0.5f); mask = clamp(mask, 0, max_pixel_value); // no clamp for float } } } PVideoFrame AddAlphaPlane::GetFrame(int n, IScriptEnvironment* env) { PVideoFrame src = child->GetFrame(n, env); PVideoFrame dst = env->NewVideoFrameP(vi, &src); if(vi.IsPlanar()) { int planes_y[4] = { PLANAR_Y, PLANAR_U, PLANAR_V, PLANAR_A }; int planes_r[4] = { PLANAR_G, PLANAR_B, PLANAR_R, PLANAR_A }; int *planes = (vi.IsYUV() || vi.IsYUVA()) ? planes_y : planes_r; // copy existing 3 planes for (int p = 0; p < 3; ++p) { const int plane = planes[p]; env->BitBlt(dst->GetWritePtr(plane), dst->GetPitch(plane), src->GetReadPtr(plane), src->GetPitch(plane), src->GetRowSize(plane), src->GetHeight(plane)); } } else { // Packed RGB, already converted to RGB32 or RGB64 env->BitBlt(dst->GetWritePtr(), dst->GetPitch(), src->GetReadPtr(), src->GetPitch(), src->GetRowSize(), src->GetHeight()); } if (vi.IsPlanarRGBA() || vi.IsYUVA()) { if (alphaClip) { PVideoFrame srcAlpha = alphaClip->GetFrame(n, env); env->BitBlt(dst->GetWritePtr(PLANAR_A), dst->GetPitch(PLANAR_A), srcAlpha->GetReadPtr(PLANAR_Y), srcAlpha->GetPitch(PLANAR_Y), srcAlpha->GetRowSize(PLANAR_Y), srcAlpha->GetHeight(PLANAR_Y)); } else { // default constant const int rowsizeA = dst->GetRowSize(PLANAR_A); const int dst_pitchA = dst->GetPitch(PLANAR_A); BYTE* dstp_a = dst->GetWritePtr(PLANAR_A); const int heightA = dst->GetHeight(PLANAR_A); switch (vi.ComponentSize()) { case 1: fill_plane(dstp_a, heightA, rowsizeA, dst_pitchA, mask); break; case 2: fill_plane(dstp_a, heightA, rowsizeA, dst_pitchA, mask); break; case 4: fill_plane(dstp_a, heightA, rowsizeA, dst_pitchA, mask_f); break; } } return dst; } // RGB32 and RGB64 BYTE* pf = dst->GetWritePtr(); int pitch = dst->GetPitch(); int rowsize = dst->GetRowSize(); int height = dst->GetHeight(); int width = vi.width; if (alphaClip) { // fill by alpha clip already converted to grey-only PVideoFrame srcAlpha = alphaClip->GetFrame(n, env); const BYTE* srcp_a = srcAlpha->GetReadPtr(PLANAR_Y); size_t pitch_a = srcAlpha->GetPitch(PLANAR_Y); pf += pitch * (vi.height - 1); // start from bottom: packed RGB is upside down if (vi.IsRGB32()) { for (int y = 0; y < height; y++) { for (int x = 0; x < width; x ++) { pf[x*4+3] = srcp_a[x]; } pf -= pitch; // packed RGB is upside down srcp_a += pitch_a; } } else if (vi.IsRGB64()) { rowsize /= sizeof(uint16_t); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x ++) { reinterpret_cast(pf)[x*4+3] = reinterpret_cast(srcp_a)[x]; } pf -= pitch; // packed RGB is upside down srcp_a += pitch_a; } } } else { // fill with constant if (vi.IsRGB32()) { for (int y = 0; y < height; y++) { for (int x = 3; x < rowsize; x += 4) { pf[x] = mask; } pf += pitch; } } else if (vi.IsRGB64()) { rowsize /= sizeof(uint16_t); for (int y = 0; y < height; y++) { for (int x = 3; x < rowsize; x += 4) { reinterpret_cast(pf)[x] = mask; } pf += pitch; } } } return dst; } AVSValue RemoveAlphaPlane::Create(AVSValue args, void*, IScriptEnvironment* env) { // if videoformat has no Alpha then we return const VideoInfo& vi = args[0].AsClip()->GetVideoInfo(); if(vi.IsPlanar() && (vi.IsYUV() || vi.IsPlanarRGB())) // planar and no alpha return args[0].AsClip(); if (vi.IsYUY2()) // YUY2: no alpha return args[0].AsClip(); if(vi.IsRGB24() || vi.IsRGB48()) // packed RGB and no alpha return args[0].AsClip(); if (vi.IsRGB32()) { AVSValue new_args[1] = { args[0].AsClip() }; return env->Invoke("ConvertToRGB24", AVSValue(new_args, 1)).AsClip(); } if (vi.IsRGB64()) { AVSValue new_args[1] = { args[0].AsClip() }; return env->Invoke("ConvertToRGB48", AVSValue(new_args, 1)).AsClip(); } return new RemoveAlphaPlane(args[0].AsClip(), env); } RemoveAlphaPlane::RemoveAlphaPlane(PClip _child, IScriptEnvironment* env) : GenericVideoFilter(_child) { if(vi.IsYUY2()) env->ThrowError("RemoveAlphaPlane: YUY2 is not allowed"); if(vi.IsY()) env->ThrowError("RemoveAlphaPlane: greyscale source is not allowed"); if (vi.IsYUVA()) { int pixel_type = vi.pixel_type; int new_pixel_type = (pixel_type & ~VideoInfo::CS_YUVA) | VideoInfo::CS_YUV; vi.pixel_type = new_pixel_type; } else if(vi.IsPlanarRGBA()) { int pixel_type = vi.pixel_type; int new_pixel_type = (pixel_type & ~VideoInfo::CS_RGBA_TYPE) | VideoInfo::CS_RGB_TYPE; vi.pixel_type = new_pixel_type; } } PVideoFrame RemoveAlphaPlane::GetFrame(int n, IScriptEnvironment* env) { PVideoFrame src = child->GetFrame(n, env); // Packed RGB: already handled in ::Create through Invoke 32->24 or 64->48 conversion // only planar here int planes_y[4] = { PLANAR_Y, PLANAR_U, PLANAR_V, PLANAR_A }; int planes_r[4] = { PLANAR_G, PLANAR_B, PLANAR_R, PLANAR_A }; int *planes = (vi.IsYUV() || vi.IsYUVA()) ? planes_y : planes_r; // Abuse Subframe to snatch the YUV/GBR planes return env->SubframePlanar(src, 0, src->GetPitch(planes[0]), src->GetRowSize(planes[0]), src->GetHeight(planes[0]), 0, 0, src->GetPitch(planes[1])); #if 0 // BitBlt version. Kept for reference PVideoFrame dst = env->NewVideoFrameP(vi, &src); // copy 3 planes w/o alpha for (int p = 0; p < 3; ++p) { const int plane = planes[p]; env->BitBlt(dst->GetWritePtr(plane), dst->GetPitch(plane), src->GetReadPtr(plane), src->GetPitch(plane), src->GetRowSize(plane), src->GetHeight(plane)); } return dst; #endif } ================================================ FILE: avs_core/convert/convert.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __Convert_H__ #define __Convert_H__ #include AVSValue __cdecl CreateConvertToAdaptivePackedRGB(AVSValue args, void* user_data, IScriptEnvironment* env); AVSValue __cdecl CreateConvertToPackedRGB(AVSValue args, void* user_data, IScriptEnvironment* env); AVSValue __cdecl CreateConvertToRGB(AVSValue args, void* user_data, IScriptEnvironment* env); #endif // __Convert_H__ ================================================ FILE: avs_core/convert/convert_audio.cpp ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. // ConvertAudio classes // Copyright (c) Klaus Post 2001 - 2004 // Copyright (c) Ian Brabham 2005 // Copyright (c) 2020 Xinyue Lu // Copyright (c) 2021 pinterf #include #include #include "convert_audio.h" #if defined(AVS_BSD) || defined(AVS_MACOS) #include #else #include #endif // There are two type parameters. Acceptable sample types and a prefered sample type. // If the current clip is already one of the defined types in sampletype, this will be returned. // If not, the current clip will be converted to the prefered type. PClip ConvertAudio::Create(PClip clip, int sample_type, int prefered_type) { if ((!clip->GetVideoInfo().HasAudio()) || clip->GetVideoInfo().SampleType() & (sample_type | prefered_type)) { // Sample type is already ok! return clip; } else return new ConvertAudio(clip, prefered_type); } int __stdcall ConvertAudio::SetCacheHints(int cachehints, int frame_range) { // We do pass cache requests upwards, to the next filter. return child->SetCacheHints(cachehints, frame_range); } ConvertAudio::ConvertAudio(PClip _clip, int _sample_type) : GenericVideoFilter(_clip) { dst_format = _sample_type; src_format = vi.SampleType(); // Set up convertion matrix src_bps = vi.BytesPerChannelSample(); // Store old size vi.sample_type = dst_format; tempbuffer_size = 0; #define PAIR(src, dst) ((src << 16) | dst) switch(PAIR(src_format, dst_format)) { case PAIR(SAMPLE_INT32, SAMPLE_INT16): convert_c = convert32To16; break; case PAIR(SAMPLE_INT16, SAMPLE_INT32): convert_c = convert16To32; break; case PAIR(SAMPLE_INT32, SAMPLE_INT8 ): convert_c = convert32To8; break; case PAIR(SAMPLE_INT8 , SAMPLE_INT32): convert_c = convert8To32; break; case PAIR(SAMPLE_INT16, SAMPLE_INT8 ): convert_c = convert16To8; break; case PAIR(SAMPLE_INT8 , SAMPLE_INT16): convert_c = convert8To16; break; case PAIR(SAMPLE_FLOAT, SAMPLE_INT24): two_stage = true; // no-break; case PAIR(SAMPLE_INT32, SAMPLE_INT24): convert_c = convert32To24; break; case PAIR(SAMPLE_INT24, SAMPLE_FLOAT): two_stage = true; // no-break; case PAIR(SAMPLE_INT24, SAMPLE_INT32): convert_c = convert24To32; break; case PAIR(SAMPLE_INT24, SAMPLE_INT16): convert_c = convert24To16; break; case PAIR(SAMPLE_INT16, SAMPLE_INT24): convert_c = convert16To24; break; case PAIR(SAMPLE_INT24, SAMPLE_INT8 ): convert_c = convert24To8; break; case PAIR(SAMPLE_INT8 , SAMPLE_INT24): convert_c = convert8To24; break; case PAIR(SAMPLE_INT8 , SAMPLE_FLOAT): convert_c = convert8ToFLT; break; case PAIR(SAMPLE_FLOAT, SAMPLE_INT8): convert_c = convertFLTTo8; break; case PAIR(SAMPLE_INT16, SAMPLE_FLOAT): convert_c = convert16ToFLT; break; case PAIR(SAMPLE_FLOAT, SAMPLE_INT16): convert_c = convertFLTTo16; break; case PAIR(SAMPLE_INT32, SAMPLE_FLOAT): convert_c = convert32ToFLT; break; case PAIR(SAMPLE_FLOAT, SAMPLE_INT32): convert_c = convertFLTTo32; break; } #ifdef INTEL_INTRINSICS switch(PAIR(src_format, dst_format)) { case PAIR(SAMPLE_INT32, SAMPLE_INT16): convert_sse2 = convert32To16_SSE2; convert_avx2 = convert32To16_AVX2; break; case PAIR(SAMPLE_INT16, SAMPLE_INT32): convert_sse2 = convert16To32_SSE2; convert_avx2 = convert16To32_AVX2; break; case PAIR(SAMPLE_INT32, SAMPLE_INT8 ): convert_sse2 = convert32To8_SSE2; break; case PAIR(SAMPLE_INT8 , SAMPLE_INT32): convert_sse2 = convert8To32_SSE2; break; case PAIR(SAMPLE_INT16, SAMPLE_INT8 ): convert_sse2 = convert16To8_SSE2; break; case PAIR(SAMPLE_INT8 , SAMPLE_INT16): convert_sse2 = convert8To16_SSE2; break; case PAIR(SAMPLE_FLOAT, SAMPLE_INT24): case PAIR(SAMPLE_INT32, SAMPLE_INT24): convert_ssse3 = convert32To24_SSSE3; break; case PAIR(SAMPLE_INT24, SAMPLE_FLOAT): case PAIR(SAMPLE_INT24, SAMPLE_INT32): convert_ssse3 = convert24To32_SSSE3; break; case PAIR(SAMPLE_INT24, SAMPLE_INT16): convert_ssse3 = convert24To16_SSSE3; break; case PAIR(SAMPLE_INT16, SAMPLE_INT24): convert_ssse3 = convert16To24_SSSE3; break; case PAIR(SAMPLE_INT24, SAMPLE_INT8 ): convert_ssse3 = convert24To8_SSSE3; break; case PAIR(SAMPLE_INT8 , SAMPLE_INT24): convert_ssse3 = convert8To24_SSSE3; break; case PAIR(SAMPLE_INT8 , SAMPLE_FLOAT): convert_sse41 = convert8ToFLT_SSE41; convert_avx2 = convert8ToFLT_AVX2; break; case PAIR(SAMPLE_FLOAT, SAMPLE_INT8) : convert_sse2 = convertFLTTo8_SSE2; convert_avx2 = convertFLTTo8_AVX2; break; case PAIR(SAMPLE_INT16, SAMPLE_FLOAT): convert_sse41 = convert16ToFLT_SSE41; convert_avx2 = convert16ToFLT_AVX2; break; case PAIR(SAMPLE_FLOAT, SAMPLE_INT16): convert_sse2 = convertFLTTo16_SSE2; convert_avx2 = convertFLTTo16_AVX2; break; case PAIR(SAMPLE_INT32, SAMPLE_FLOAT): convert_sse2 = convert32ToFLT_SSE2; convert_avx2 = convert32ToFLT_AVX2; break; case PAIR(SAMPLE_FLOAT, SAMPLE_INT32): convert_sse41 = convertFLTTo32_SSE41; convert_avx2 = convertFLTTo32_AVX2; break; } #endif #undef PAIR } ConvertAudio::~ConvertAudio() { if (tempbuffer_size) { avs_free(tempbuffer); tempbuffer_size = 0; } } void __stdcall ConvertAudio::GetAudio(void *buf, int64_t start, int64_t count, IScriptEnvironment *env) { if (src_format == dst_format) { // Shouldn't happen, but just in case child->GetAudio(buf, start, count, env); return; } int channels = vi.AudioChannels(); if (tempbuffer_size < count) { if (tempbuffer_size) avs_free(tempbuffer); tempbuffer = (char *)avs_malloc((int)count * src_bps * channels, 16); tempbuffer_size = (int)count; } child->GetAudio(tempbuffer, start, count, env); if (convert == nullptr) { convert = convert_c; convert_float = src_format == SAMPLE_FLOAT ? convertFLTTo32 : convert32ToFLT; // for two-stage #ifdef INTEL_INTRINSICS int cpu_flags = env->GetCPUFlags(); if ((cpu_flags & CPUF_SSE2)) { if (convert_sse2) convert = convert_sse2; if (src_format != SAMPLE_FLOAT) convert_float = convert32ToFLT_SSE2; } if ((cpu_flags & CPUF_SSSE3)) { if (convert_ssse3) convert = convert_ssse3; } if ((cpu_flags & CPUF_SSE4_1)) { if (convert_sse41) convert = convert_sse41; if (src_format == SAMPLE_FLOAT) convert_float = convertFLTTo32_SSE41; } if ((cpu_flags & CPUF_AVX2)) { if (convert_avx2) convert = convert_avx2; convert_float = src_format == SAMPLE_FLOAT ? convertFLTTo32_AVX2 : convert32ToFLT_AVX2; } #endif } int sample_count = static_cast(count * channels); // Direct conversion cases if (!two_stage) { convert(tempbuffer, buf, sample_count); return; } // Floating point cases if (src_format == SAMPLE_FLOAT) { convert_float(tempbuffer, tempbuffer, sample_count); convert(tempbuffer, buf, sample_count); return; } if (dst_format == SAMPLE_FLOAT) { convert(tempbuffer, buf, sample_count); convert_float(buf, buf, sample_count); return; } } ================================================ FILE: avs_core/convert/convert_audio.h ================================================ // Avisynth v2.5. Copyright 2009 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __Convert_Audio_H__ #define __Convert_Audio_H__ #include #define CONVERT_DECLARE(func) void (func)(void *, void *, int); typedef CONVERT_DECLARE(*convert_proc); CONVERT_DECLARE(convert32To16); CONVERT_DECLARE(convert16To32); CONVERT_DECLARE(convert32To8); CONVERT_DECLARE(convert8To32); CONVERT_DECLARE(convert16To8); CONVERT_DECLARE(convert8To16); CONVERT_DECLARE(convert32To24); CONVERT_DECLARE(convert24To32); CONVERT_DECLARE(convert24To16); CONVERT_DECLARE(convert16To24); CONVERT_DECLARE(convert24To8); CONVERT_DECLARE(convert8To24); CONVERT_DECLARE(convert8ToFLT); CONVERT_DECLARE(convertFLTTo8); CONVERT_DECLARE(convert16ToFLT); CONVERT_DECLARE(convertFLTTo16); CONVERT_DECLARE(convert32ToFLT); CONVERT_DECLARE(convertFLTTo32); #ifdef INTEL_INTRINSICS CONVERT_DECLARE(convert32To16_SSE2); CONVERT_DECLARE(convert16To32_SSE2); CONVERT_DECLARE(convert32To8_SSE2); CONVERT_DECLARE(convert8To32_SSE2); CONVERT_DECLARE(convert16To8_SSE2); CONVERT_DECLARE(convert8To16_SSE2); CONVERT_DECLARE(convert32To24_SSSE3); CONVERT_DECLARE(convert24To32_SSSE3); CONVERT_DECLARE(convert24To16_SSSE3); CONVERT_DECLARE(convert16To24_SSSE3); CONVERT_DECLARE(convert24To8_SSSE3); CONVERT_DECLARE(convert8To24_SSSE3); CONVERT_DECLARE(convert8ToFLT_SSE41); CONVERT_DECLARE(convertFLTTo8_SSE2); CONVERT_DECLARE(convert16ToFLT_SSE41); CONVERT_DECLARE(convertFLTTo16_SSE2); CONVERT_DECLARE(convert32ToFLT_SSE2); CONVERT_DECLARE(convertFLTTo32_SSE41); CONVERT_DECLARE(convert32To16_AVX2); CONVERT_DECLARE(convert16To32_AVX2); CONVERT_DECLARE(convert8ToFLT_AVX2); CONVERT_DECLARE(convertFLTTo8_AVX2); CONVERT_DECLARE(convert16ToFLT_AVX2); CONVERT_DECLARE(convertFLTTo16_AVX2); CONVERT_DECLARE(convert32ToFLT_AVX2); CONVERT_DECLARE(convertFLTTo32_AVX2); #endif #undef CONVERT_DECLARE class ConvertAudio : public GenericVideoFilter /** * Helper class to convert audio to any format **/ { public: ConvertAudio(PClip _clip, int prefered_format); void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env); int __stdcall SetCacheHints(int cachehints,int frame_range); // We do pass cache requests upwards, to the cache! static PClip Create(PClip clip, int sample_type, int prefered_type); static AVSValue __cdecl Create_float(AVSValue args, void*, IScriptEnvironment*); static AVSValue __cdecl Create_32bit(AVSValue args, void*, IScriptEnvironment*); static AVSValue __cdecl Create_24bit(AVSValue args, void*, IScriptEnvironment*); static AVSValue __cdecl Create_16bit(AVSValue args, void*, IScriptEnvironment*); static AVSValue __cdecl Create_8bit (AVSValue args, void*, IScriptEnvironment*); static AVSValue __cdecl Create_Any (AVSValue args, void*, IScriptEnvironment*); virtual ~ConvertAudio(); private: int src_format; int dst_format; int src_bps; int tempbuffer_size {0}; char *tempbuffer {nullptr}; bool two_stage {false}; convert_proc convert {nullptr}; convert_proc convert_float {nullptr}; convert_proc convert_c {nullptr}; #ifdef INTEL_INTRINSICS convert_proc convert_sse2 {nullptr}; convert_proc convert_ssse3 {nullptr}; convert_proc convert_sse41 { nullptr }; convert_proc convert_avx2 {nullptr}; #endif }; #endif //__Convert_Audio_H__ ================================================ FILE: avs_core/convert/convert_audio_c.cpp ================================================ // Avisynth+ // https://avs-plus.net // // This file is part of Avisynth+ which is released under GPL2+ with exception. // Convert Audio helper functions (Pure C) // Copyright (c) 2020 Xinyue Lu, (c) 2021 pinterf #include /* Supported fast route conversions: * * | From: | U 8 | S16 | S24 | S32 | FLT | * | To: | | | | | | * | U 8 | - | CS | CS | CS | CSA | * | S16 | CS | - | CS | CSA | CSA | * | S24 | CS | CS | - | CS | | * | S32 | CS | CSA | CS | - | CSA | * | FLT | CSA | CSA | | CSA | - | * * * C = C, S = SSE2+, A = AVX2 */ /* 8 bit: unsigned (middle point 128) 16,24,32 bit: signed 32 bit float: -1.0 .. 1.0 Assymetric range considerations. Android: It is implementation dependent whether the positive maximum of 1.0 is included in the interval when converting to integer representation Method 1 (e.g. Android): smallest number is full scale, 1.0 is clamped to 1.0 minus one LSB -0x8000 - 0x7FFF is valid, nominally +1.0 (top of range) is not part of the range [-1.0..1.0) Method 2: largest number is full scale -0x7FFF - 0x7FFF, while -8000 exceeds lower limit. [-1.0..1.0] + smallest value is theoretically invalid */ // until 3.6.1: S16 = (S32 + 0x8000) >> 16 (plain round-before shift) // Actual: S16 = S32 >> 16 void convert32To16(void *inbuf, void *outbuf, int count) { auto in16 = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); for (int i = 0; i < count; i++) out[i] = in16[i * 2 + 1]; } // until 3.6.1: S32 = (S16 << 16) + (unsigned short)(S16 + 32768) // 0x7fff -> 0x7fffffff, 0x8000 -> 0x80000000 // Actual: S32 = S16 << 16 void convert16To32(void *inbuf, void *outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out16 = reinterpret_cast(outbuf); for (int i = 0; i < count; i++) { out16[i * 2] = 0; out16[i * 2 + 1] = in[i]; } } void convert32To8(void* inbuf, void* outbuf, int count) { auto in8 = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); for (int i = 0; i < count; i++) out[i] = in8[i * 4 + 3] + 128; } void convert8To32(void *inbuf, void *outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out8 = reinterpret_cast(outbuf); for (int i = 0; i < count; i++) { out8[i * 4] = 0; out8[i * 4 + 1] = 0; out8[i * 4 + 2] = 0; out8[i * 4 + 3] = in[i] - 128; } } void convert16To8(void *inbuf, void *outbuf, int count) { auto in8 = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); for (int i = 0; i < count; i++) out[i] = in8[i * 2 + 1] + 128; } // until 3.6.1: S16 = (S8 << 8) + (unsigned short)(S8 + 128) // This make 0x7f(255-128) -> 0x7fff & 0x80(0-128) -> 0x8000 // Actual: S16 = (U8-128) << 8 void convert8To16(void *inbuf, void *outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out8 = reinterpret_cast(outbuf); for (int i = 0; i < count; i++) { out8[i * 2] = 0; out8[i * 2 + 1] = in[i] - 128; } } void convert32To24(void *inbuf, void *outbuf, int count) { auto in8 = reinterpret_cast(inbuf); auto out8 = reinterpret_cast(outbuf); for (int i = 0; i < count; i++) { out8[i * 3 + 0] = in8[i * 4 + 1]; out8[i * 3 + 1] = in8[i * 4 + 2]; out8[i * 3 + 2] = in8[i * 4 + 3]; } } void convert24To32(void *inbuf, void *outbuf, int count) { auto in8 = reinterpret_cast(inbuf); auto out8 = reinterpret_cast(outbuf); for (int i = 0; i < count; i++) { out8[i * 4] = 0; out8[i * 4 + 1] = in8[i * 3 + 0]; out8[i * 4 + 2] = in8[i * 3 + 1]; out8[i * 4 + 3] = in8[i * 3 + 2]; } } void convert24To16(void *inbuf, void *outbuf, int count) { auto in8 = reinterpret_cast(inbuf); auto out8 = reinterpret_cast(outbuf); for (int i = 0; i < count; i++) { out8[i * 2 + 0] = in8[i * 3 + 1]; out8[i * 2 + 1] = in8[i * 3 + 2]; } } void convert16To24(void *inbuf, void *outbuf, int count) { auto in8 = reinterpret_cast(inbuf); auto out8 = reinterpret_cast(outbuf); for (int i = 0; i < count; i++) { out8[i * 3] = 0; out8[i * 3 + 1] = in8[i * 2 + 0]; out8[i * 3 + 2] = in8[i * 2 + 1]; } } void convert24To8(void *inbuf, void *outbuf, int count) { auto in8 = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); for (int i = 0; i < count; i++) out[i] = in8[i * 3 + 2] + 128; } void convert8To24(void *inbuf, void *outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out8 = reinterpret_cast(outbuf); for (int i = 0; i < count; i++) { out8[i * 3] = 0; out8[i * 3 + 1] = 0; out8[i * 3 + 2] = in[i] - 128; } } void convert8ToFLT(void* inbuf, void* outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); constexpr float divisor = 1.0f / 128.f; // 1 << 7 for (int i = 0; i < count; i++) out[i] = (in[i] - 128) * divisor; } void convertFLTTo8(void* inbuf, void* outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); constexpr float multiplier = 128.f; constexpr float max8 = 127.f; constexpr float min8 = -128.f; for (int i = 0; i < count; i++) { float val = in[i] * multiplier; uint8_t result; if (val >= max8) result = 255; else if (val <= min8) result = 0; else result = static_cast(val) + 128; out[i] = result; } } void convert16ToFLT(void* inbuf, void* outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); constexpr float divisor = 1.0f / 32768.f; // 1 << 15 for (int i = 0; i < count; i++) out[i] = in[i] * divisor; } void convertFLTTo16(void* inbuf, void* outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); constexpr float multiplier = 32768.f; constexpr float max16 = 32767.f; constexpr float min16 = -32768.f; for (int i = 0; i < count; i++) { float val = in[i] * multiplier; int16_t result; if (val >= max16) result = 32767; else if (val <= min16) result = (int16_t)-32768; else result = static_cast(val); out[i] = result; } } // not yet used directly, 24 bit has 32 bit 2nd stage void convert24ToFLT(void* inbuf, void* outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); constexpr float divisor = 1.0f / 8388608.f; // 1 << 23 for (int i = 0; i < count; i++) out[i] = (in[i * 3] | (in[i * 3 + 1] << 8) | (in[i * 3 + 2] << 16)) * divisor; } // not yet used directly, 24 bit has 32 bit 2nd stage void convertFLTTo24(void* inbuf, void* outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); constexpr float multiplier = 8388608.f; constexpr float max24 = 8388607.f; constexpr float min24 = -8388608.f; for (int i = 0; i < count; i++) { float val = in[i] * multiplier; int32_t result; if (val >= max24) result = 0x7FFFFF; // 8388607 else if (val <= min24) result = 0x800000; // -8388608 else result = static_cast(val); out[i * 3 + 0] = result & 0xFF; out[i * 3 + 1] = (result >> 8) & 0xFF; out[i * 3 + 2] = (result >> 16) & 0xFF; } } // note for 32 bit conversions: 32 bit integer cannot be represented in float // 2147483647.0f is 2147483648.0f in reality void convert32ToFLT(void *inbuf, void *outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); constexpr float divisor = 1.0f/2147483648.0f; for (int i = 0; i < count; i++) out[i] = in[i] * divisor; } void convertFLTTo32(void *inbuf, void *outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); constexpr float multiplier = 2147483648.0f; constexpr float max32 = 2147483647.0f; constexpr float min32 = -2147483648.0f; for (int i = 0; i < count; i++) { float val = in[i] * multiplier; int32_t result; if (val >= max32) result = 0x7FFFFFFF; // 2147483647 else if (val <= min32) result = 0x80000000; // -2147483648 else result = static_cast(val); out[i] = result; } } ================================================ FILE: avs_core/convert/convert_bits.cpp ================================================ // Avisynth v2.5. Copyright 2002-2009 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include "convert_bits.h" #ifdef INTEL_INTRINSICS #include "intel/convert_bits_sse.h" #include "intel/convert_bits_avx2.h" #endif #include "convert_helper.h" #include #include #include #include #include #include #include #ifdef AVS_WINDOWS #include #else #include #endif // for odd dither bit differences, we still take even size but // correction values are halved (shifted by 1) // repeated 8x for sse size 16 const BYTE dither2x2a_data[4] = { 0, 1, 1, 0, }; // cycle: 2 alignas(16) const BYTE dither2x2a_data_sse2[2 * 16] = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 }; // e.g. 10->8 bits // repeated 8x for sse size 16 const BYTE dither2x2_data[4] = { 0, 2, 3, 1, }; // cycle: 2 alignas(16) const BYTE dither2x2_data_sse2[2 * 16] = { 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1 }; // e.g. 8->5 bits const BYTE dither4x4a_data[16] = { 0, 4, 1, 5, 6, 2, 7, 3, 1, 5, 0, 4, 7, 3, 6, 2 }; // cycle: 4 alignas(16) const BYTE dither4x4a_data_sse2[4 * 16] = { 0, 4, 1, 5, 0, 4, 1, 5, 0, 4, 1, 5, 0, 4, 1, 5, 6, 2, 7, 3, 6, 2, 7, 3, 6, 2, 7, 3, 6, 2, 7, 3, 1, 5, 0, 4, 1, 5, 0, 4, 1, 5, 0, 4, 1, 5, 0, 4, 7, 3, 6, 2, 7, 3, 6, 2, 7, 3, 6, 2, 7, 3, 6, 2, }; // e.g. 12->8 bits const BYTE dither4x4_data[16] = { 0, 8, 2, 10, 12, 4, 14, 6, 3, 11, 1, 9, 15, 7, 13, 5 }; // cycle: 4 alignas(16) const BYTE dither4x4_data_sse2[4 * 16] = { 0, 8, 2, 10, 0, 8, 2, 10, 0, 8, 2, 10, 0, 8, 2, 10, 12, 4, 14, 6, 12, 4, 14, 6, 12, 4, 14, 6, 12, 4, 14, 6, 3, 11, 1, 9, 3, 11, 1, 9, 3, 11, 1, 9, 3, 11, 1, 9, 15, 7, 13, 5, 15, 7, 13, 5, 15, 7, 13, 5, 15, 7, 13, 5 }; // e.g. 14->9 bits extern const BYTE dither8x8a_data[8][8] = { { 0, 16, 4, 20, 1, 17, 5, 21}, /* 8x8 Bayer ordered dithering pattern */ {24, 8, 28, 12, 25, 9, 29, 13}, { 6, 22, 2, 18, 7, 23, 3, 19}, {30, 14, 26, 10, 31, 15, 27, 11}, { 1, 17, 5, 21, 0, 16, 4, 20}, {25, 9, 29, 13, 24, 8, 28, 12}, { 7, 23, 3, 19, 6, 22, 2, 18}, {31, 15, 27, 11, 30, 14, 26, 10} }; // cycle: 8 alignas(16) const BYTE dither8x8a_data_sse2[8][16] = { { 0, 16, 4, 20, 1, 17, 5, 21, 0, 16, 4, 20, 1, 17, 5, 21 }, { 24, 8, 28, 12, 25, 9, 29, 13, 24, 8, 28, 12, 25, 9, 29, 13 }, { 6, 22, 2, 18, 7, 23, 3, 19, 6, 22, 2, 18, 7, 23, 3, 19 }, { 30, 14, 26, 10, 31, 15, 27, 11, 30, 14, 26, 10, 31, 15, 27, 11 }, { 1, 17, 5, 21, 0, 16, 4, 20, 1, 17, 5, 21, 0, 16, 4, 20 }, { 25, 9, 29, 13, 24, 8, 28, 12, 25, 9, 29, 13, 24, 8, 28, 12 }, { 7, 23, 3, 19, 6, 22, 2, 18, 7, 23, 3, 19, 6, 22, 2, 18 }, { 31, 15, 27, 11, 30, 14, 26, 10, 31, 15, 27, 11, 30, 14, 26, 10 } }; // e.g. 14->8 bits extern const BYTE dither8x8_data[8][8] = { { 0, 32, 8, 40, 2, 34, 10, 42}, {48, 16, 56, 24, 50, 18, 58, 26}, {12, 44, 4, 36, 14, 46, 6, 38}, {60, 28, 52, 20, 62, 30, 54, 22}, { 3, 35, 11, 43, 1, 33, 9, 41}, {51, 19, 59, 27, 49, 17, 57, 25}, {15, 47, 7, 39, 13, 45, 5, 37}, {63, 31, 55, 23, 61, 29, 53, 21} }; // cycle: 8 alignas(16) const BYTE dither8x8_data_sse2[8][16] = { { 0, 32, 8, 40, 2, 34, 10, 42, 0, 32, 8, 40, 2, 34, 10, 42 }, { 48, 16, 56, 24, 50, 18, 58, 26, 48, 16, 56, 24, 50, 18, 58, 26 }, { 12, 44, 4, 36, 14, 46, 6, 38, 12, 44, 4, 36, 14, 46, 6, 38 }, { 60, 28, 52, 20, 62, 30, 54, 22, 60, 28, 52, 20, 62, 30, 54, 22 }, { 3, 35, 11, 43, 1, 33, 9, 41, 3, 35, 11, 43, 1, 33, 9, 41 }, { 51, 19, 59, 27, 49, 17, 57, 25, 51, 19, 59, 27, 49, 17, 57, 25 }, { 15, 47, 7, 39, 13, 45, 5, 37, 15, 47, 7, 39, 13, 45, 5, 37 }, { 63, 31, 55, 23, 61, 29, 53, 21, 63, 31, 55, 23, 61, 29, 53, 21 } }; // e.g. 16->9 or 8->1 bits // cycle: 16x. No special 16 byte sse2 alignas(16) const BYTE dither16x16a_data[16][16] = { { 0, 96, 24,120, 6,102, 30,126, 1, 97, 25,121, 7,103, 31,127 }, { 64, 32, 88, 56, 70, 38, 94, 62, 65, 33, 89, 57, 71, 39, 95, 63 }, { 16,112, 8,104, 22,118, 14,110, 17,113, 9,105, 23,119, 15,111 }, { 80, 48, 72, 40, 86, 54, 78, 46, 81, 49, 73, 41, 87, 55, 79, 47 }, { 4,100, 28,124, 2, 98, 26,122, 5,101, 29,125, 3, 99, 27,123 }, { 68, 36, 92, 60, 66, 34, 90, 58, 69, 37, 93, 61, 67, 35, 91, 59 }, { 20,116, 12,108, 18,114, 10,106, 21,117, 13,109, 19,115, 11,107 }, { 84, 52, 76, 44, 82, 50, 74, 42, 85, 53, 77, 45, 83, 51, 75, 43 }, { 1, 97, 25,121, 7,103, 31,127, 0, 96, 24,120, 6,102, 30,126 }, { 75, 33, 89, 57, 71, 39, 95, 63, 64, 32, 88, 56, 70, 38, 94, 62 }, { 17,113, 9,105, 23,119, 15,111, 16,112, 8,104, 22,118, 14,110 }, { 81, 49, 73, 41, 87, 55, 79, 47, 80, 48, 72, 40, 86, 54, 78, 46 }, { 5,101, 29,125, 3, 99, 27,123, 4,100, 28,124, 2, 98, 26,122 }, { 69, 37, 93, 61, 67, 35, 91, 59, 68, 36, 92, 60, 66, 34, 90, 58 }, { 21,117, 13,109, 19,115, 11,107, 20,116, 12,108, 18,114, 10,106 }, { 85, 53, 77, 45, 83, 51, 75, 43, 84, 52, 76, 44, 82, 50, 74, 42 } }; // 16->8 // cycle: 16x. No special 16 byte sse2 alignas(16) const BYTE dither16x16_data[16][16] = { { 0,192, 48,240, 12,204, 60,252, 3,195, 51,243, 15,207, 63,255 }, { 128, 64,176,112,140, 76,188,124,131, 67,179,115,143, 79,191,127 }, { 32,224, 16,208, 44,236, 28,220, 35,227, 19,211, 47,239, 31,223 }, { 160, 96,144, 80,172,108,156, 92,163, 99,147, 83,175,111,159, 95 }, { 8,200, 56,248, 4,196, 52,244, 11,203, 59,251, 7,199, 55,247 }, { 136, 72,184,120,132, 68,180,116,139, 75,187,123,135, 71,183,119 }, { 40,232, 24,216, 36,228, 20,212, 43,235, 27,219, 39,231, 23,215 }, { 168,104,152, 88,164,100,148, 84,171,107,155, 91,167,103,151, 87 }, { 2,194, 50,242, 14,206, 62,254, 1,193, 49,241, 13,205, 61,253 }, { 130, 66,178,114,142, 78,190,126,129, 65,177,113,141, 77,189,125 }, { 34,226, 18,210, 46,238, 30,222, 33,225, 17,209, 45,237, 29,221 }, { 162, 98,146, 82,174,110,158, 94,161, 97,145, 81,173,109,157, 93 }, { 10,202, 58,250, 6,198, 54,246, 9,201, 57,249, 5,197, 53,245 }, { 138, 74,186,122,134, 70,182,118,137, 73,185,121,133, 69,181,117 }, { 42,234, 26,218, 38,230, 22,214, 41,233, 25,217, 37,229, 21,213 }, { 170,106,154, 90,166,102,150, 86,169,105,153, 89,165,101,149, 85 } }; template static void do_convert_ordered_dither_uint_c(const BYTE* srcp8, BYTE* dstp8, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth) { const pixel_t_s* srcp = reinterpret_cast(srcp8); pixel_t_d* dstp = reinterpret_cast(dstp8); dst_pitch = dst_pitch / sizeof(pixel_t_d); src_pitch = src_pitch / sizeof(pixel_t_s); const int src_width = src_rowsize / sizeof(pixel_t_s); // helps compiler optimization if constexpr (sizeof(pixel_t_s) == 1) source_bitdepth = 8; if constexpr (sizeof(pixel_t_d) == 1) { target_bitdepth = 8; if (!TEMPLATE_NEED_BACKSCALE) { dither_target_bitdepth = 8; } } const int max_pixel_value_target = (1 << target_bitdepth) - 1; const int max_pixel_value_dithered = (1 << dither_target_bitdepth) - 1; // precheck ensures: // target_bitdepth >= dither_target_bitdepth // source_bitdepth - dither_target_bitdepth <= 8 (max precalculated table is 16x16) const bool odd_diff = (source_bitdepth - dither_target_bitdepth) & 1; const int dither_bit_diff = (source_bitdepth - dither_target_bitdepth); const int dither_order = (dither_bit_diff + 1) / 2; const int dither_mask = (1 << dither_order) - 1; // 9,10=2 11,12=4 13,14=8 15,16=16 // 10->8: 0x01 (2x2) // 11->8: 0x03 (4x4) // 12->8: 0x03 (4x4) // 14->8: 0x07 (8x8) // 16->8: 0x0F (16x16) const BYTE* matrix; switch (dither_order) { case 1: matrix = reinterpret_cast(odd_diff ? dither2x2a_data : dither2x2_data); break; case 2: matrix = reinterpret_cast(odd_diff ? dither4x4a_data : dither4x4_data); break; case 3: matrix = reinterpret_cast(odd_diff ? dither8x8a_data : dither8x8_data); break; case 4: matrix = reinterpret_cast(odd_diff ? dither16x16a_data : dither16x16_data); break; default: return; // n/a } const int bitdiff_between_dither_and_target = target_bitdepth - dither_target_bitdepth; assert(TEMPLATE_NEED_BACKSCALE == (target_bitdepth != dither_target_bitdepth)); // dither to x, target to y assert(TEMPLATE_LOW_DITHER_BITDEPTH == (dither_target_bitdepth < 8)); // e.g. instead of 0,1 => -0.5,+0.5; 0,1,2,3 => -1.5,-0.5,0.5,1.5 const float half_maxcorr_value = ((1 << dither_bit_diff) - 1) / 2.0f; const int source_max = (1 << source_bitdepth) - 1; //----------------------- // When calculating src_pixel, src and dst are of the same bit depth bits_conv_constants d; get_bits_conv_constants(d, chroma, fulls, fulld, source_bitdepth, source_bitdepth); auto dst_offset_plus_round = d.dst_offset + 0.5f; constexpr auto src_pixel_min = 0; const auto src_pixel_max = source_max; const float mul_factor_backfromlowdither = (float)max_pixel_value_target / max_pixel_value_dithered; //----------------------- for (int y = 0; y < src_height; y++) { int _y = (y & dither_mask) << dither_order; // ordered dither for (int x = 0; x < src_width; x++) { const int corr = matrix[_y | (x & dither_mask)]; int src_pixel = srcp[x]; if constexpr(fulls != fulld) { const float val = (srcp[x] - d.src_offset_i) * d.mul_factor + dst_offset_plus_round; src_pixel = clamp((int)val, src_pixel_min, src_pixel_max); } int new_pixel; if (TEMPLATE_LOW_DITHER_BITDEPTH) { // accurate dither: +/- // accurately positioned to the center const float corr_f = corr - half_maxcorr_value; new_pixel = (int)(src_pixel + corr_f) >> dither_bit_diff; } else new_pixel = ((src_pixel + corr) >> dither_bit_diff); // scale back to the required bit depth if constexpr (TEMPLATE_NEED_BACKSCALE) { // dither to x, target to y new_pixel = min(new_pixel, max_pixel_value_dithered); // Interesting problem of dither_bits==1 (or in general at small dither_bits) // After simple slli 0,1 becomes 0,128, we'd expect 0,255 instead. So we make cosmetics. if (TEMPLATE_LOW_DITHER_BITDEPTH) { new_pixel = (int)(new_pixel * mul_factor_backfromlowdither + 0.5f); } else { new_pixel = new_pixel << bitdiff_between_dither_and_target; } // dither_bits // 1 0,1 => 0,128 => 0,255 // 2 0,1,2,3 => 0,64,128,192 => 0,?,?,255 // 3 0,...,7 => 0,32,...,224 => 0,?,?,255 // 4 0,..,15 => 0,16,...,240 => 0,?,?,255 // 5 0,..,31 => 0,8,....,248 => 0,?,?,255 // 6 0,..,63 => 0,4,....,252 => 0,?,?,255 // 7 0,.,127 => 0,2. ..,254 => 0,?,?,255 } dstp[x] = (pixel_t_d)(max(min((int)new_pixel, max_pixel_value_target),0)); } dstp += dst_pitch; srcp += src_pitch; } } template static void convert_ordered_dither_uint_c(const BYTE* srcp8, BYTE* dstp8, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth) { const bool need_backscale = target_bitdepth != dither_target_bitdepth; // dither to x, target to y const bool low_dither_bitdepth = dither_target_bitdepth < 8; // 1-7 bits dither targets, need_backscale is always true, since 8 bit format is the minimum if (need_backscale) { if (low_dither_bitdepth) do_convert_ordered_dither_uint_c(srcp8, dstp8, src_rowsize, src_height, src_pitch, dst_pitch, source_bitdepth, target_bitdepth, dither_target_bitdepth); else do_convert_ordered_dither_uint_c(srcp8, dstp8, src_rowsize, src_height, src_pitch, dst_pitch, source_bitdepth, target_bitdepth, dither_target_bitdepth); } else { do_convert_ordered_dither_uint_c(srcp8, dstp8, src_rowsize, src_height, src_pitch, dst_pitch, source_bitdepth, target_bitdepth, dither_target_bitdepth); } } // idea borrowed from fmtConv #define FS_OPTIMIZED_SERPENTINE_COEF template static AVS_FORCEINLINE void diffuse_floyd(int err, int &nextError, int *error_ptr) { #if defined (FS_OPTIMIZED_SERPENTINE_COEF) const int e1 = 0; const int e3 = (err * 4 + 8) >> 4; #else const int e1 = (err + 8) >> 4; const int e3 = (err * 3 + 8) >> 4; #endif const int e5 = (err * 5 + 8) >> 4; const int e7 = err - e1 - e3 - e5; nextError = error_ptr[direction]; error_ptr[-direction] += e3; error_ptr[0] += e5; error_ptr[direction] = e1; nextError += e7; } #if 0 template static AVS_FORCEINLINE void diffuse_floyd_f(float err, float& nextError, float* error_ptr) { #if defined (FS_OPTIMIZED_SERPENTINE_COEF) const float e1 = 0; const float e3 = err * (4.0f / 16); #else const float e1 = err * (1.0f / 16); const float e3 = err * (3.0f / 16); #endif const float e5 = err * (5.0f / 16); const float e7 = err * (7.0f / 16); nextError = error_ptr[direction]; error_ptr[-direction] += e3; error_ptr[0] += e5; error_ptr[direction] = e1; nextError += e7; } #endif // optimization helper: TEMPLATE_DITHER_BIT_DIFF if not <0 then hold value for frequently used differences from 16->8 // 2nd helper: TEMPLATE_LOW_DITHER_BITDEPTH // 3rd helper: source_bitdepth_special template static void do_convert_uint_floyd_c(const BYTE* srcp8, BYTE* dstp8, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth) { if constexpr (SOURCE_BITDEPTH_SPECIAL > 0) { // called with >0 values only for special cases like 16 to 8, 16 to 10 and 10 to 8 // Hugely helps the optimizers source_bitdepth = SOURCE_BITDEPTH_SPECIAL; } if constexpr (TEMPLATE_DITHER_BIT_DIFF > 0) { assert(TEMPLATE_DITHER_BIT_DIFF == (source_bitdepth - dither_target_bitdepth)); assert(target_bitdepth == dither_target_bitdepth); dither_target_bitdepth = source_bitdepth - TEMPLATE_DITHER_BIT_DIFF; target_bitdepth = dither_target_bitdepth; // seems that direct shift with known constant bits is really quicker than shift by 'cl'. // Dithering from 16 to 10 bit: 109 vs 101 fps // PF note: experienced the same with SIMD _mm_srl and _mm_srli in the other bit converter } const int DITHER_BIT_DIFF = TEMPLATE_DITHER_BIT_DIFF > 0 ? TEMPLATE_DITHER_BIT_DIFF : (source_bitdepth - dither_target_bitdepth); assert(TEMPLATE_LOW_DITHER_BITDEPTH == (dither_target_bitdepth < 8)); // must match with dispatcher const pixel_t_s* srcp = reinterpret_cast(srcp8); src_pitch = src_pitch / sizeof(pixel_t_s); const int src_width = src_rowsize / sizeof(pixel_t_s); pixel_t_d* dstp = reinterpret_cast(dstp8); dst_pitch = dst_pitch / sizeof(pixel_t_d); // perhaps helps compiler to optimize if constexpr (sizeof(pixel_t_s) == 1) source_bitdepth = 8; if constexpr (sizeof(pixel_t_d) == 1) target_bitdepth = 8; const int max_pixel_value_target = (1 << target_bitdepth) - 1; const int BITDIFF_BETWEEN_DITHER_AND_TARGET = DITHER_BIT_DIFF - (source_bitdepth - target_bitdepth); const int max_pixel_value_dithered = (1 << dither_target_bitdepth) - 1; std::vector error_ptr_safe(1 + src_width + 1); // accumulated errors int *error_ptr = &error_ptr_safe[1]; const int ROUNDER = 1 << (DITHER_BIT_DIFF - 1); // rounding const int source_max = (1 << source_bitdepth) - 1; //----------------------- bits_conv_constants d; get_bits_conv_constants(d, chroma, fulls, fulld, source_bitdepth, source_bitdepth); auto dst_offset_plus_round = d.dst_offset + 0.5f; constexpr auto src_pixel_min = 0; const auto src_pixel_max = source_max; const float mul_factor_backfromlowdither = (float)max_pixel_value_target / max_pixel_value_dithered; int nextError = 0; // zero for (int y = 0; y < src_height; y++) { // serpentine forward if ((y & 1) == 0) { for (int x = 0; x < src_width; x++) { int err = nextError; int src_pixel = srcp[x]; if constexpr (fulls != fulld) { const float val = (src_pixel - d.src_offset_i) * d.mul_factor + dst_offset_plus_round; src_pixel = clamp((int)val, src_pixel_min, src_pixel_max); } if (TEMPLATE_LOW_DITHER_BITDEPTH) { // accurate dither: +/- // accurately positioned to the center err = err - (1 << (DITHER_BIT_DIFF - 1)); // signed } int sum = src_pixel + err; int quantized = (sum + ROUNDER) >> (DITHER_BIT_DIFF); err = sum - (quantized << DITHER_BIT_DIFF); // Interesting problem of dither_bits==1 (or in general at small dither_bits) // After simple slli 0,1 becomes 0,128, we'd expect 0,255 instead. So we make cosmetics. if (TEMPLATE_LOW_DITHER_BITDEPTH) { quantized = min(quantized, max_pixel_value_dithered); quantized = (int)(quantized * mul_factor_backfromlowdither + 0.5f); } else { quantized <<= BITDIFF_BETWEEN_DITHER_AND_TARGET; } int pix = max(min(max_pixel_value_target, quantized), 0); // clamp to target bit dstp[x] = (pixel_t_d)pix; diffuse_floyd<1>(err, nextError, &error_ptr[x]); } } else { // serpentine backward for (int x = src_width - 1; x >= 0; --x) { int err = nextError; int src_pixel = srcp[x]; if constexpr (fulls != fulld) { const float val = (src_pixel - d.src_offset_i) * d.mul_factor + dst_offset_plus_round; src_pixel = clamp((int)val, src_pixel_min, src_pixel_max); } if (TEMPLATE_LOW_DITHER_BITDEPTH) { // accurate dither: +/- // accurately positioned to the center err = err - (1 << (DITHER_BIT_DIFF - 1)); // signed } int sum = src_pixel + err; int quantized = (sum + ROUNDER) >> (DITHER_BIT_DIFF); err = sum - (quantized << DITHER_BIT_DIFF); // Interesting problem of dither_bits==1 (or in general at small dither_bits) // After simple slli 0,1 becomes 0,128, we'd expect 0,255 instead. So we make cosmetics. if (TEMPLATE_LOW_DITHER_BITDEPTH) { quantized = min(quantized, max_pixel_value_dithered); quantized = (int)(quantized * mul_factor_backfromlowdither + 0.5f); } else { quantized <<= BITDIFF_BETWEEN_DITHER_AND_TARGET; } int pix = max(min(max_pixel_value_target, quantized), 0); // clamp to target bit dstp[x] = (pixel_t_d)pix; diffuse_floyd<-1>(err, nextError, &error_ptr[x]); } } dstp += dst_pitch; srcp += src_pitch; } } template static void convert_uint_floyd_c(const BYTE* srcp8, BYTE* dstp8, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth) { const int dither_bit_diff = source_bitdepth - dither_target_bitdepth; const bool low_dither_bitdepth = dither_target_bitdepth < 8; // extra internal template makes it quicker for ordinary non-artistic cases // do not make templates for all 1-16 target bit combinations if (low_dither_bitdepth) { do_convert_uint_floyd_c(srcp8, dstp8, src_rowsize, src_height, src_pitch, dst_pitch, source_bitdepth, target_bitdepth, dither_target_bitdepth); } else { if (target_bitdepth == dither_target_bitdepth) { // Specifically when source_bitdepth is known as well, it hugely helps optimization // We treat special use cases 10->8, 16->10 and 16->8 switch (dither_bit_diff) { case 2: // e.g. 10->8 if (source_bitdepth == 10) do_convert_uint_floyd_c(srcp8, dstp8, src_rowsize, src_height, src_pitch, dst_pitch, source_bitdepth, target_bitdepth, dither_target_bitdepth); else do_convert_uint_floyd_c(srcp8, dstp8, src_rowsize, src_height, src_pitch, dst_pitch, source_bitdepth, target_bitdepth, dither_target_bitdepth); break; case 4: // e.g. 12->8 do_convert_uint_floyd_c(srcp8, dstp8, src_rowsize, src_height, src_pitch, dst_pitch, source_bitdepth, target_bitdepth, dither_target_bitdepth); break; case 6: // e.g. 16->10, 14->8 // prevent invalid templates to generate // like do_convert_uint_floyd_c which would do 16->8 but dither to 10 bit. if constexpr (sizeof(pixel_t_s) == 2 && sizeof(pixel_t_d) == 2) { if (source_bitdepth == 16) do_convert_uint_floyd_c(srcp8, dstp8, src_rowsize, src_height, src_pitch, dst_pitch, source_bitdepth, target_bitdepth, dither_target_bitdepth); else do_convert_uint_floyd_c(srcp8, dstp8, src_rowsize, src_height, src_pitch, dst_pitch, source_bitdepth, target_bitdepth, dither_target_bitdepth); } else do_convert_uint_floyd_c(srcp8, dstp8, src_rowsize, src_height, src_pitch, dst_pitch, source_bitdepth, target_bitdepth, dither_target_bitdepth); break; case 8: // e.g. 16->8 if (sizeof(pixel_t_s) == 2 && source_bitdepth == 16) do_convert_uint_floyd_c(srcp8, dstp8, src_rowsize, src_height, src_pitch, dst_pitch, source_bitdepth, target_bitdepth, dither_target_bitdepth); else do_convert_uint_floyd_c(srcp8, dstp8, src_rowsize, src_height, src_pitch, dst_pitch, source_bitdepth, target_bitdepth, dither_target_bitdepth); break; default: // difference is more than 8 or exotic dither to less than 8 bits, we accept 10-15% speed minus do_convert_uint_floyd_c(srcp8, dstp8, src_rowsize, src_height, src_pitch, dst_pitch, source_bitdepth, target_bitdepth, dither_target_bitdepth); } } else { do_convert_uint_floyd_c(srcp8, dstp8, src_rowsize, src_height, src_pitch, dst_pitch, source_bitdepth, target_bitdepth, dither_target_bitdepth); } } } // float to 8-16 bits template static void convert_32_to_uintN_c(const BYTE *srcp, BYTE *dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth) { const float *srcp0 = reinterpret_cast(srcp); pixel_t *dstp0 = reinterpret_cast(dstp); src_pitch = src_pitch / sizeof(float); dst_pitch = dst_pitch / sizeof(pixel_t); const int src_width = src_rowsize / sizeof(float); //----------------------- bits_conv_constants d; get_bits_conv_constants(d, chroma, fulls, fulld, source_bitdepth, target_bitdepth); auto dst_offset_plus_round = d.dst_offset + 0.5f; constexpr auto dst_pixel_min = 0; const auto dst_pixel_max = (1 << target_bitdepth) - 1; for(int y=0; y 8-16 bits // shift right or left, depending on expandrange template static void convert_uint_limited_c(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth) { const pixel_t_s* srcp0 = reinterpret_cast(srcp); pixel_t_d* dstp0 = reinterpret_cast(dstp); src_pitch = src_pitch / sizeof(pixel_t_s); dst_pitch = dst_pitch / sizeof(pixel_t_d); const int src_width = src_rowsize / sizeof(pixel_t_s); if (target_bitdepth > source_bitdepth) // expandrange { const int shift_bits = target_bitdepth - source_bitdepth; for (int y = 0; y < src_height; y++) { for (int x = 0; x < src_width; x++) { dstp0[x] = (pixel_t_d)(srcp0[x]) << shift_bits; // expand range. No clamp before, source is assumed to have valid range } dstp0 += dst_pitch; srcp0 += src_pitch; } } else { // reduce range const int shift_bits = source_bitdepth - target_bitdepth; const int round = 1 << (shift_bits - 1); const int target_max = (1 << target_bitdepth) - 1; constexpr auto target_min = 0; for (int y = 0; y < src_height; y++) { for (int x = 0; x < src_width; x++) { dstp0[x] = clamp((srcp0[x] + round) >> shift_bits, target_min, target_max);; // reduce range } dstp0 += dst_pitch; srcp0 += src_pitch; } } } // chroma is special in full range template static void convert_uint_c(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth) { // limited to limited is bitshift, see in other function if constexpr (!fulls && !fulld) { convert_uint_limited_c< pixel_t_s, pixel_t_d>(srcp, dstp, src_rowsize, src_height, src_pitch, dst_pitch, source_bitdepth, target_bitdepth, dither_target_bitdepth); return; } const pixel_t_s* srcp0 = reinterpret_cast(srcp); pixel_t_d* dstp0 = reinterpret_cast(dstp); src_pitch = src_pitch / sizeof(pixel_t_s); dst_pitch = dst_pitch / sizeof(pixel_t_d); const int src_width = src_rowsize / sizeof(pixel_t_s); if constexpr (sizeof(pixel_t_s) == 1 && sizeof(pixel_t_d) == 2) { if (fulls && fulld && !chroma && source_bitdepth == 8 && target_bitdepth == 16) { // special case * 65535 / 255 = *257 exactly for (int y = 0; y < src_height; y++) { for (int x = 0; x < src_width; x++) { dstp0[x] = (pixel_t_d)(srcp0[x] * 257); } dstp0 += dst_pitch; srcp0 += src_pitch; } return; } } const int target_max = (1 << target_bitdepth) - 1; bits_conv_constants d; get_bits_conv_constants(d, chroma, fulls, fulld, source_bitdepth, target_bitdepth); auto dst_offset_plus_round = d.dst_offset + 0.5f; constexpr auto target_min = 0; for (int y = 0; y < src_height; y++) { for (int x = 0; x < src_width; x++) { const float val = (srcp0[x] - d.src_offset_i) * d.mul_factor + dst_offset_plus_round; dstp0[x] = clamp((int)val, target_min, target_max); } dstp0 += dst_pitch; srcp0 += src_pitch; } } // 8 bit to float, 16/14/12/10 bits to float template static void convert_uintN_to_float_c(const BYTE *srcp, BYTE *dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth) { const pixel_t *srcp0 = reinterpret_cast(srcp); float *dstp0 = reinterpret_cast(dstp); src_pitch = src_pitch / sizeof(pixel_t); dst_pitch = dst_pitch / sizeof(float); const int src_width = src_rowsize / sizeof(pixel_t); //----------------------- bits_conv_constants d; get_bits_conv_constants(d, chroma, fulls, fulld, source_bitdepth, target_bitdepth); for (int y = 0; y < src_height; y++) { for (int x = 0; x < src_width; x++) { const float pixel = (srcp0[x] - d.src_offset_i) * d.mul_factor + d.dst_offset; dstp0[x] = pixel; // no clamp } dstp0 += dst_pitch; srcp0 += src_pitch; } } // float to float template static void convert_float_to_float_c(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth) { // float is good if always full range. For historical reasons Avisynth has "limited" range float, // which is simply a /255.0 reduction of original byte pixels const float* srcp0 = reinterpret_cast(srcp); float* dstp0 = reinterpret_cast(dstp); src_pitch = src_pitch / sizeof(float); dst_pitch = dst_pitch / sizeof(float); const int src_width = src_rowsize / sizeof(float); //----------------------- bits_conv_constants d; get_bits_conv_constants(d, chroma, fulls, fulld, source_bitdepth, target_bitdepth); for (int y = 0; y < src_height; y++) { for (int x = 0; x < src_width; x++) { const float pixel = (srcp0[x] - d.src_offset) * d.mul_factor + d.dst_offset; dstp0[x] = pixel; // no clamp } dstp0 += dst_pitch; srcp0 += src_pitch; } } static void get_convert_32_to_uintN_functions(int target_bitdepth, bool fulls, bool fulld, #ifdef INTEL_INTRINSICS bool sse2, bool sse4, bool avx2, #endif BitDepthConvFuncPtr& conv_function, BitDepthConvFuncPtr& conv_function_chroma, BitDepthConvFuncPtr& conv_function_a) { // 32bit->8-16bits support fulls fulld // pure C #define convert_32_to_uintN_functions(uint_X_t) \ conv_function_a = convert_32_to_uintN_c; /* full-full */ \ if (fulls && fulld) { \ conv_function = convert_32_to_uintN_c; \ conv_function_chroma = convert_32_to_uintN_c; \ } \ else if (fulls && !fulld) { \ conv_function = convert_32_to_uintN_c; \ conv_function_chroma = convert_32_to_uintN_c; \ } \ else if (!fulls && fulld) { \ conv_function = convert_32_to_uintN_c; \ conv_function_chroma = convert_32_to_uintN_c; \ } \ else if (!fulls && !fulld) { \ conv_function = convert_32_to_uintN_c; \ conv_function_chroma = convert_32_to_uintN_c; \ } #ifdef INTEL_INTRINSICS #undef convert_32_to_uintN_functions #define convert_32_to_uintN_functions(uint_X_t) \ conv_function_a = avx2 ? convert_32_to_uintN_avx2 : sse4 ? convert_32_to_uintN_sse41 : convert_32_to_uintN_c; /* full-full */ \ if (fulls && fulld) { \ conv_function = avx2 ? convert_32_to_uintN_avx2 : sse4 ? convert_32_to_uintN_sse41 : convert_32_to_uintN_c; \ conv_function_chroma = avx2 ? convert_32_to_uintN_avx2 : sse4 ? convert_32_to_uintN_sse41 : convert_32_to_uintN_c; \ } \ else if (fulls && !fulld) { \ conv_function = avx2 ? convert_32_to_uintN_avx2 : sse4 ? convert_32_to_uintN_sse41 : convert_32_to_uintN_c; \ conv_function_chroma = avx2 ? convert_32_to_uintN_avx2 : sse4 ? convert_32_to_uintN_sse41 : convert_32_to_uintN_c; \ } \ else if (!fulls && fulld) { \ conv_function = avx2 ? convert_32_to_uintN_avx2 : sse4 ? convert_32_to_uintN_sse41 : convert_32_to_uintN_c; \ conv_function_chroma = avx2 ? convert_32_to_uintN_avx2 : sse4 ? convert_32_to_uintN_sse41 : convert_32_to_uintN_c; \ } \ else if (!fulls && !fulld) { \ conv_function = avx2 ? convert_32_to_uintN_avx2 : sse4 ? convert_32_to_uintN_sse41 : convert_32_to_uintN_c; \ conv_function_chroma = avx2 ? convert_32_to_uintN_avx2 : sse4 ? convert_32_to_uintN_sse41 : convert_32_to_uintN_c; \ } #endif switch (target_bitdepth) { case 8: convert_32_to_uintN_functions(uint8_t); // all variations of fulls fulld break; default: // 10-16 bits convert_32_to_uintN_functions(uint16_t); // all variations of fulls fulld break; } #undef convert_32_to_uintN_functions } static void get_convert_float_to_float_functions(bool fulls, bool fulld, BitDepthConvFuncPtr& conv_function, BitDepthConvFuncPtr& conv_function_chroma, BitDepthConvFuncPtr& conv_function_a) { // 32bit->32bits support fulls fulld, alpha is always full-full conv_function_a = convert_float_to_float_c; /* full-full */ if (fulls && fulld) { conv_function = convert_float_to_float_c; conv_function_chroma = convert_float_to_float_c; } else if (fulls && !fulld) { conv_function = convert_float_to_float_c; conv_function_chroma = convert_float_to_float_c; } else if (!fulls && fulld) { \ conv_function = convert_float_to_float_c; conv_function_chroma = convert_float_to_float_c; } else if (!fulls && !fulld) { conv_function = convert_float_to_float_c; conv_function_chroma = convert_float_to_float_c; } } static void get_convert_uintN_to_float_functions(int bits_per_pixel, bool fulls, bool fulld, #ifdef INTEL_INTRINSICS bool sse2, bool sse4, bool avx2, #endif BitDepthConvFuncPtr& conv_function, BitDepthConvFuncPtr& conv_function_chroma, BitDepthConvFuncPtr& conv_function_a) { // 8-16bit->32bits support fulls fulld, alpha is always full-full #define convert_uintN_to_float_functions(uint_X_t) \ conv_function_a = convert_uintN_to_float_c; /* full-full */ \ if (fulls && fulld) { \ conv_function = convert_uintN_to_float_c; \ conv_function_chroma = convert_uintN_to_float_c; \ } \ else if (fulls && !fulld) { \ conv_function = convert_uintN_to_float_c; \ conv_function_chroma = convert_uintN_to_float_c; \ } \ else if (!fulls && fulld) { \ conv_function = convert_uintN_to_float_c; \ conv_function_chroma = convert_uintN_to_float_c; \ } \ else if (!fulls && !fulld) { \ conv_function = convert_uintN_to_float_c; \ conv_function_chroma = convert_uintN_to_float_c; \ } #define convert_uintN_to_float_functions_avx2(uint_X_t) \ conv_function_a = convert_uintN_to_float_avx2; /* full-full */ \ if (fulls && fulld) { \ conv_function = convert_uintN_to_float_avx2; \ conv_function_chroma = convert_uintN_to_float_avx2; \ } \ else if (fulls && !fulld) { \ conv_function = convert_uintN_to_float_avx2; \ conv_function_chroma = convert_uintN_to_float_avx2; \ } \ else if (!fulls && fulld) { \ conv_function = convert_uintN_to_float_avx2; \ conv_function_chroma = convert_uintN_to_float_avx2; \ } \ else if (!fulls && !fulld) { \ conv_function = convert_uintN_to_float_avx2; \ conv_function_chroma = convert_uintN_to_float_avx2; \ } switch (bits_per_pixel) { case 8: convert_uintN_to_float_functions(uint8_t); break; default: // 10-16 bits convert_uintN_to_float_functions(uint16_t); break; } #ifdef INTEL_INTRINSICS if (avx2) { switch (bits_per_pixel) { case 8: convert_uintN_to_float_functions_avx2(uint8_t); break; default: // 10-16 bits convert_uintN_to_float_functions_avx2(uint16_t); break; } } #endif #undef convert_uintN_to_float_functions } static void get_convert_uintN_to_uintN_ordered_dither_functions(int source_bitdepth, int target_bitdepth, bool fulls, bool fulld, #ifdef INTEL_INTRINSICS bool sse2, bool sse4, bool avx2, #endif BitDepthConvFuncPtr& conv_function, BitDepthConvFuncPtr& conv_function_chroma) { // 8-16->8-16 bits support any fulls fulld combination // dither has no "conv_function_a" // pure C #define convert_uintN_to_uintN_ordered_dither_functions(uint_X_t, uint_X_dest_t) \ if (fulls && fulld) { \ conv_function = convert_ordered_dither_uint_c; \ conv_function_chroma = convert_ordered_dither_uint_c; \ } \ else if (fulls && !fulld) { \ conv_function = convert_ordered_dither_uint_c; \ conv_function_chroma = convert_ordered_dither_uint_c; \ } \ else if (!fulls && fulld) { \ conv_function = convert_ordered_dither_uint_c; \ conv_function_chroma = convert_ordered_dither_uint_c; \ } \ else if (!fulls && !fulld) { \ conv_function = convert_ordered_dither_uint_c; \ conv_function_chroma = convert_ordered_dither_uint_c; \ } #ifdef INTEL_INTRINSICS #undef convert_uintN_to_uintN_ordered_dither_functions // dither has no "conv_function_a" #define convert_uintN_to_uintN_ordered_dither_functions(uint_X_t, uint_X_dest_t) \ if (fulls && fulld) { \ conv_function = avx2 ? convert_ordered_dither_uint_avx2 : sse4 ? convert_ordered_dither_uint_sse41 : convert_ordered_dither_uint_c; \ conv_function_chroma = avx2 ? convert_ordered_dither_uint_avx2 : sse4 ? convert_ordered_dither_uint_sse41 : convert_ordered_dither_uint_c; \ } \ else if (fulls && !fulld) { \ conv_function = avx2 ? convert_ordered_dither_uint_avx2 : sse4 ? convert_ordered_dither_uint_sse41 : convert_ordered_dither_uint_c; \ conv_function_chroma = avx2 ? convert_ordered_dither_uint_avx2 : sse4 ? convert_ordered_dither_uint_sse41 : convert_ordered_dither_uint_c; \ } \ else if (!fulls && fulld) { \ conv_function = avx2 ? convert_ordered_dither_uint_avx2 : sse4 ? convert_ordered_dither_uint_sse41 : convert_ordered_dither_uint_c; \ conv_function_chroma = avx2 ? convert_ordered_dither_uint_avx2 : sse4 ? convert_ordered_dither_uint_sse41 : convert_ordered_dither_uint_c; \ } \ else if (!fulls && !fulld) { \ conv_function = avx2 ? convert_ordered_dither_uint_avx2 : sse4 ? convert_ordered_dither_uint_sse41 : convert_ordered_dither_uint_c; \ conv_function_chroma = avx2 ? convert_ordered_dither_uint_avx2 : sse4 ? convert_ordered_dither_uint_sse41 : convert_ordered_dither_uint_c; \ } #endif // all variations of fulls fulld byte/word source/target switch (target_bitdepth) { case 8: if (source_bitdepth == 8) { convert_uintN_to_uintN_ordered_dither_functions(uint8_t, uint8_t); } else { convert_uintN_to_uintN_ordered_dither_functions(uint16_t, uint8_t); } break; default: // uint16_t target is always uint16_t source convert_uintN_to_uintN_ordered_dither_functions(uint16_t, uint16_t); break; } #undef convert_uintN_to_uintN_ordered_dither_functions } static void get_convert_uintN_to_uintN_floyd_dither_functions(int source_bitdepth, int target_bitdepth, bool fulls, bool fulld, BitDepthConvFuncPtr& conv_function, BitDepthConvFuncPtr& conv_function_chroma) { // 8-16->8-16 bits support any fulls fulld combination // dither has no "conv_function_a" // pure C #define convert_uintN_to_uintN_floyd_dither_functions(uint_X_t, uint_X_dest_t) \ if (fulls && fulld) { \ conv_function = convert_uint_floyd_c; \ conv_function_chroma = convert_uint_floyd_c; \ } \ else if (fulls && !fulld) { \ conv_function = convert_uint_floyd_c; \ conv_function_chroma = convert_uint_floyd_c; \ } \ else if (!fulls && fulld) { \ conv_function = convert_uint_floyd_c; \ conv_function_chroma = convert_uint_floyd_c; \ } \ else if (!fulls && !fulld) { \ conv_function = convert_uint_floyd_c; \ conv_function_chroma = convert_uint_floyd_c; \ } // all variations of fulls fulld byte/word source/target switch (target_bitdepth) { case 8: if (source_bitdepth == 8) { convert_uintN_to_uintN_floyd_dither_functions(uint8_t, uint8_t); } else { convert_uintN_to_uintN_floyd_dither_functions(uint16_t, uint8_t); } break; default: // uint16_t target is always uint16_t source convert_uintN_to_uintN_floyd_dither_functions(uint16_t, uint16_t); break; } #undef convert_uintN_to_uintN_floyd_dither_functions } static void get_convert_uintN_to_uintN_functions(int source_bitdepth, int target_bitdepth, bool fulls, bool fulld, #ifdef INTEL_INTRINSICS bool sse2, bool sse4, bool avx2, #endif BitDepthConvFuncPtr& conv_function, BitDepthConvFuncPtr& conv_function_chroma, BitDepthConvFuncPtr& conv_function_a) { // 8-16->8-16 bits support any fulls fulld combination // pure C #define convert_uintN_to_uintN_functions(uint_X_t, uint_X_dest_t) \ conv_function_a = convert_uint_c; /* full-full */ \ if (fulls && fulld) { \ conv_function = convert_uint_c; \ conv_function_chroma = convert_uint_c; \ } \ else if (fulls && !fulld) { \ conv_function = convert_uint_c; \ conv_function_chroma = convert_uint_c; \ } \ else if (!fulls && fulld) { \ conv_function = convert_uint_c; \ conv_function_chroma = convert_uint_c; \ } \ else if (!fulls && !fulld) { \ conv_function = convert_uint_c; \ conv_function_chroma = convert_uint_c; \ } #ifdef INTEL_INTRINSICS #undef convert_uintN_to_uintN_functions #define convert_uintN_to_uintN_functions(uint_X_t, uint_X_dest_t) \ conv_function_a = avx2 ? convert_uint_avx2 : sse4 ? convert_uint_sse41 : convert_uint_c; /* full-full */ \ if (fulls && fulld) { \ conv_function = avx2 ? convert_uint_avx2 : sse4 ? convert_uint_sse41 : convert_uint_c; \ conv_function_chroma = avx2 ? convert_uint_avx2 : sse4 ? convert_uint_sse41 : convert_uint_c; \ } \ else if (fulls && !fulld) { \ conv_function = avx2 ? convert_uint_avx2 : sse4 ? convert_uint_sse41 : convert_uint_c; \ conv_function_chroma = avx2 ? convert_uint_avx2 : sse4 ? convert_uint_sse41 : convert_uint_c; \ } \ else if (!fulls && fulld) { \ conv_function = avx2 ? convert_uint_avx2 : sse4 ? convert_uint_sse41 : convert_uint_c; \ conv_function_chroma = avx2 ? convert_uint_avx2 : sse4 ? convert_uint_sse41 : convert_uint_c; \ } \ else if (!fulls && !fulld) { \ conv_function = avx2 ? convert_uint_avx2 : sse4 ? convert_uint_sse41 : convert_uint_c; \ conv_function_chroma = avx2 ? convert_uint_avx2 : sse4 ? convert_uint_sse41 : convert_uint_c; \ } #endif // all variations of fulls fulld byte/word source/target switch (target_bitdepth) { case 8: if (source_bitdepth == 8) { convert_uintN_to_uintN_functions(uint8_t, uint8_t); } else { convert_uintN_to_uintN_functions(uint16_t, uint8_t); } break; default: // 10-16 bits if (source_bitdepth == 8) { convert_uintN_to_uintN_functions(uint8_t, uint16_t); } else { convert_uintN_to_uintN_functions(uint16_t, uint16_t); } break; } #undef convert_uintN_to_uintN_functions } void get_convert_any_bits_functions(int dither_mode, int source_bitdepth, int target_bitdepth, bool fulls, bool fulld, #ifdef INTEL_INTRINSICS bool sse2, bool sse4, bool avx2, #endif BitDepthConvFuncPtr& conv_function, BitDepthConvFuncPtr& conv_function_chroma, BitDepthConvFuncPtr& conv_function_a) { if (source_bitdepth <= 16 && target_bitdepth <= 16) { // get basic non-dithered versions #ifdef INTEL_INTRINSICS get_convert_uintN_to_uintN_functions(source_bitdepth, target_bitdepth, fulls, fulld, sse2, sse4, avx2, conv_function, conv_function_chroma, conv_function_a); #else get_convert_uintN_to_uintN_functions(source_bitdepth, target_bitdepth, fulls, fulld, conv_function, conv_function_chroma, conv_function_a); #endif if (target_bitdepth <= source_bitdepth) { // dither is only down if (dither_mode == 0) { // ordered dither #ifdef INTEL_INTRINSICS get_convert_uintN_to_uintN_ordered_dither_functions(source_bitdepth, target_bitdepth, fulls, fulld, sse2, sse4, avx2, conv_function, conv_function_chroma); #else get_convert_uintN_to_uintN_ordered_dither_functions(source_bitdepth, target_bitdepth, fulls, fulld, conv_function, conv_function_chroma); #endif } else if (dither_mode == 1) { // Floyd, no SIMD there get_convert_uintN_to_uintN_floyd_dither_functions(source_bitdepth, target_bitdepth, fulls, fulld, conv_function, conv_function_chroma); } } } // 32->8-16 bit if (source_bitdepth == 32 && target_bitdepth <= 16) { #ifdef INTEL_INTRINSICS get_convert_32_to_uintN_functions(target_bitdepth, fulls, fulld, sse2, sse4, avx2, conv_function, conv_function_chroma, conv_function_a); #else get_convert_32_to_uintN_functions(target_bitdepth, fulls, fulld, conv_function, conv_function_chroma, conv_function_a); #endif } // 8-32->32 if (target_bitdepth == 32) { if (source_bitdepth <= 16) // 8-16->32 bit #ifdef INTEL_INTRINSICS get_convert_uintN_to_float_functions(source_bitdepth, fulls, fulld, sse2, sse4, avx2, conv_function, conv_function_chroma, conv_function_a); #else get_convert_uintN_to_float_functions(source_bitdepth, fulls, fulld, conv_function, conv_function_chroma, conv_function_a); #endif else get_convert_float_to_float_functions(fulls, fulld, conv_function, conv_function_chroma, conv_function_a); } } ConvertBits::ConvertBits(PClip _child, const int _dither_mode, const int _target_bitdepth, bool _truerange, int _ColorRange_src, int _ColorRange_dest, int _dither_bitdepth, IScriptEnvironment* env) : GenericVideoFilter(_child), conv_function(nullptr), conv_function_chroma(nullptr), conv_function_a(nullptr), target_bitdepth(_target_bitdepth), dither_mode(_dither_mode), dither_bitdepth(_dither_bitdepth), fulls(false), fulld(false), truerange(_truerange) { pixelsize = vi.ComponentSize(); bits_per_pixel = vi.BitsPerComponent(); format_change_only = false; #ifdef INTEL_INTRINSICS const bool sse2 = !!(env->GetCPUFlags() & CPUF_SSE2); const bool sse4 = !!(env->GetCPUFlags() & CPUF_SSE4_1); const bool avx2 = !!(env->GetCPUFlags() & CPUF_AVX2); #endif // full or limited decision // dest: if undefined, use src if (_ColorRange_dest != ColorRange_Compat_e::AVS_COLORRANGE_LIMITED && _ColorRange_dest != ColorRange_Compat_e::AVS_COLORRANGE_FULL) { _ColorRange_dest = _ColorRange_src; } // fulls = _ColorRange_src == ColorRange_Compat_e::AVS_COLORRANGE_FULL; fulld = _ColorRange_dest == ColorRange_Compat_e::AVS_COLORRANGE_FULL; if (!truerange) { if ((target_bitdepth == 8 || target_bitdepth == 32) && pixelsize == 2) bits_per_pixel = 16; if (target_bitdepth > 8 && target_bitdepth <= 16 && (bits_per_pixel == 8 || bits_per_pixel == 32)) target_bitdepth = 16; if (target_bitdepth > 8 && target_bitdepth <= 16 && bits_per_pixel > 8 && bits_per_pixel <= 16) format_change_only = true; } #ifdef INTEL_INTRINSICS get_convert_any_bits_functions(dither_mode, bits_per_pixel, target_bitdepth, fulls, fulld, sse2, sse4, avx2, conv_function, conv_function_chroma, conv_function_a); #else get_convert_any_bits_functions(dither_mode, bits_per_pixel, target_bitdepth, fulls, fulld, conv_function, conv_function_chroma, conv_function_a); #endif // Set VideoInfo if (target_bitdepth == 8) { if (vi.NumComponents() == 1) vi.pixel_type = VideoInfo::CS_Y8; else if (vi.IsYV411()) vi.pixel_type = VideoInfo::CS_YV411; else if (vi.Is420() || vi.IsYV12()) vi.pixel_type = vi.IsYUVA() ? VideoInfo::CS_YUVA420 : VideoInfo::CS_YV12; else if (vi.Is422()) vi.pixel_type = vi.IsYUVA() ? VideoInfo::CS_YUVA422 : VideoInfo::CS_YV16; else if (vi.Is444()) vi.pixel_type = vi.IsYUVA() ? VideoInfo::CS_YUVA444 : VideoInfo::CS_YV24; else if (vi.IsRGB48() || vi.IsRGB24()) vi.pixel_type = VideoInfo::CS_BGR24; else if (vi.IsRGB64() || vi.IsRGB32()) vi.pixel_type = VideoInfo::CS_BGR32; else if (vi.IsPlanarRGB()) vi.pixel_type = VideoInfo::CS_RGBP; else if (vi.IsPlanarRGBA()) vi.pixel_type = VideoInfo::CS_RGBAP; else env->ThrowError("ConvertTo8bit: unsupported color space"); return; } else if (target_bitdepth > 8 && target_bitdepth <= 16) { // set output vi format if (vi.IsRGB24() || vi.IsRGB48()) { vi.pixel_type = VideoInfo::CS_BGR48; } else if (vi.IsRGB32() || vi.IsRGB64()) { vi.pixel_type = VideoInfo::CS_BGR64; } else { // Y or YUV(A) or PlanarRGB(A) if (vi.IsYV12()) // YV12 can have an exotic compatibility constant vi.pixel_type = VideoInfo::CS_YV12; // override for known int new_bitdepth_bits; switch (target_bitdepth) { case 8: new_bitdepth_bits = VideoInfo::CS_Sample_Bits_8; break; case 10: new_bitdepth_bits = VideoInfo::CS_Sample_Bits_10; break; case 12: new_bitdepth_bits = VideoInfo::CS_Sample_Bits_12; break; case 14: new_bitdepth_bits = VideoInfo::CS_Sample_Bits_14; break; case 16: new_bitdepth_bits = VideoInfo::CS_Sample_Bits_16; break; case 32: new_bitdepth_bits = VideoInfo::CS_Sample_Bits_32; break; } vi.pixel_type = (vi.pixel_type & ~VideoInfo::CS_Sample_Bits_Mask) | new_bitdepth_bits; } return; } else if (target_bitdepth == 32) { if (vi.NumComponents() == 1) vi.pixel_type = VideoInfo::CS_Y32; else if (vi.Is420()) vi.pixel_type = vi.IsYUVA() ? VideoInfo::CS_YUVA420PS : VideoInfo::CS_YUV420PS; else if (vi.Is422()) vi.pixel_type = vi.IsYUVA() ? VideoInfo::CS_YUVA422PS : VideoInfo::CS_YUV422PS; else if (vi.Is444()) vi.pixel_type = vi.IsYUVA() ? VideoInfo::CS_YUVA444PS : VideoInfo::CS_YUV444PS; else if (vi.IsPlanarRGB()) vi.pixel_type = VideoInfo::CS_RGBPS; else if (vi.IsPlanarRGBA()) vi.pixel_type = VideoInfo::CS_RGBAPS; else env->ThrowError("ConvertToFloat: unsupported color space"); return; } env->ThrowError("ConvertBits: unsupported target bit-depth (%d)", target_bitdepth); } AVSValue __cdecl ConvertBits::Create(AVSValue args, void* user_data, IScriptEnvironment* env) { PClip clip = args[0].AsClip(); //0 1 2 3 4 5 6 //c[bits]i[truerange]b[dither]i[dither_bits]i[fulls]b[fulld]b const VideoInfo &vi = clip->GetVideoInfo(); int create_param = (int)reinterpret_cast(user_data); // when converting from/true 10-16 bit formats, truerange=false indicates bitdepth of 16 bits regardless of the 10-12-14 bit format // FIXME: stop supporting this parameter (a workaround in the dawn of hbd?) bool assume_truerange = args[2].AsBool(true); // n/a for non planar formats int source_bitdepth = vi.BitsPerComponent(); // default comes from old legacy To8,To16,ToFloat functions // or the clip's actual bit depth const int default_target_bitdepth = create_param == 0 ? source_bitdepth : create_param; int target_bitdepth = args[1].AsInt(default_target_bitdepth); // "bits" parameter int dither_bitdepth = args[4].AsInt(target_bitdepth); // "dither_bits" parameter if(target_bitdepth!=8 && target_bitdepth!=10 && target_bitdepth!=12 && target_bitdepth!=14 && target_bitdepth!=16 && target_bitdepth!=32) env->ThrowError("ConvertBits: invalid bit depth: %d", target_bitdepth); if(create_param == 8 && target_bitdepth !=8) env->ThrowError("ConvertTo8Bit: invalid bit depth: %d", target_bitdepth); if(create_param == 32 && target_bitdepth !=32) env->ThrowError("ConvertToFloat: invalid bit depth: %d", target_bitdepth); if(create_param == 16 && (target_bitdepth == 8 || target_bitdepth ==32)) env->ThrowError("ConvertTo16bit: invalid bit depth: %d", target_bitdepth); if (args[2].Defined()) { if (!vi.IsPlanar()) env->ThrowError("ConvertBits: truerange specified for non-planar source"); } // retrieve full/limited int ColorRange_src; int ColorRange_dest; if (args[5].Defined()) ColorRange_src = args[5].AsBool() ? ColorRange_Compat_e::AVS_COLORRANGE_FULL : ColorRange_Compat_e::AVS_COLORRANGE_LIMITED; else ColorRange_src = -1; // undefined. A frame property may override if (args[6].Defined()) ColorRange_dest = args[6].AsBool() ? ColorRange_Compat_e::AVS_COLORRANGE_FULL : ColorRange_Compat_e::AVS_COLORRANGE_LIMITED; else ColorRange_dest = -1; // undefined. A frame property or ColorRange_src may override if (ColorRange_src != ColorRange_Compat_e::AVS_COLORRANGE_LIMITED && ColorRange_src != ColorRange_Compat_e::AVS_COLORRANGE_FULL) { // try getting frame props if parameter is not specified auto frame0 = clip->GetFrame(0, env); const AVSMap* props = env->getFramePropsRO(frame0); if (env->propNumElements(props, "_ColorRange") > 0) { ColorRange_src = (int)env->propGetIntSaturated(props, "_ColorRange", 0, nullptr); } else { // no param, no frame property -> rgb is full others are limited ColorRange_src = vi.IsRGB() ? ColorRange_Compat_e::AVS_COLORRANGE_FULL : ColorRange_Compat_e::AVS_COLORRANGE_LIMITED; } } // cr_dest = cr_source if not specified if (ColorRange_dest != ColorRange_Compat_e::AVS_COLORRANGE_LIMITED && ColorRange_dest != ColorRange_Compat_e::AVS_COLORRANGE_FULL) { ColorRange_dest = ColorRange_src; } bool fulls = ColorRange_src == ColorRange_Compat_e::AVS_COLORRANGE_FULL; bool fulld = ColorRange_dest == ColorRange_Compat_e::AVS_COLORRANGE_FULL; int dither_type = args[3].AsInt(-1); bool dither_defined = args[3].Defined(); if(dither_defined && dither_type != 1 && dither_type != 0 && dither_type != -1) env->ThrowError("ConvertBits: invalid dither type parameter. Only -1 (disabled), 0 (ordered dither) or 1 (Floyd-S) is allowed"); if (dither_type >= 0) { if (source_bitdepth < target_bitdepth) env->ThrowError("ConvertBits: dithering is allowed only for scale down"); if (dither_bitdepth > target_bitdepth) env->ThrowError("ConvertBits: dither_bits must be <= target bitdepth"); if (target_bitdepth == 32) env->ThrowError("ConvertBits: dithering is not allowed into 32 bit float target"); } // 3.7.1 t25 // Unfortunately 32 bit float dithering is not implemented, thus we convert to 16 bit // intermediate clip if (source_bitdepth == 32 && (dither_type == 0 || dither_type == 1)) { // c[bits]i[truerange]b[dither]i[dither_bits]i[fulls]b[fulld]b source_bitdepth = 16; // solving ordered dither maximum bit depth difference of 8 problem // by automatic preconversion if (dither_type == 0 && source_bitdepth - dither_bitdepth > 8) { source_bitdepth = dither_bitdepth + 8; if (source_bitdepth % 2) source_bitdepth--; // must be even } AVSValue new_args[7] = { clip, source_bitdepth, true, -1 /* no dither */, AVSValue() /*dither_bits*/, fulls, fulld }; clip = env->Invoke("ConvertBits", AVSValue(new_args, 7)).AsClip(); clip = env->Invoke("Cache", AVSValue(clip)).AsClip(); // and now the source range becomes the previous target fulls = fulld; ColorRange_src = ColorRange_dest; } // solving ordered dither maximum bit depth difference of 8 problem // by automatic preconversion if (source_bitdepth <= 16 && dither_type == 0 && source_bitdepth - dither_bitdepth > 8) { // c[bits]i[truerange]b[dither]i[dither_bits]i[fulls]b[fulld]b source_bitdepth = dither_bitdepth + 8; if (source_bitdepth % 2) source_bitdepth--; // must be even AVSValue new_args[7] = { clip, source_bitdepth, true, -1 /* no dither */, AVSValue() /*dither_bits*/, fulls, fulld }; clip = env->Invoke("ConvertBits", AVSValue(new_args, 7)).AsClip(); clip = env->Invoke("Cache", AVSValue(clip)).AsClip(); // and now the source range becomes the previous target fulls = fulld; ColorRange_src = ColorRange_dest; } if (source_bitdepth == dither_bitdepth) dither_type = -1; // ignore dithering if(dither_type == 0) { if (dither_bitdepth < 1 || dither_bitdepth > 16) env->ThrowError("ConvertBits: ordered dither: invalid dither_bits specified (1-16 allowed)"); // this error message cannot appear if the automatic bit depth reducing conversions above are done if(source_bitdepth - dither_bitdepth > 8) env->ThrowError("ConvertBits: dither_bits cannot differ with more than 8 bits from source"); } // floyd if (dither_type == 1) { if (dither_bitdepth < 1 || dither_bitdepth > 16) env->ThrowError("ConvertBits: Floyd-S: invalid dither_bits specified (1-16 allowed)"); } // no change -> return unmodified if no transform required if (source_bitdepth == target_bitdepth) { // 10->10 .. 16->16 if((dither_type < 0 || dither_bitdepth == target_bitdepth) && fulls == fulld) return clip; } // YUY2 conversion is limited if (vi.IsYUY2()) { if (target_bitdepth != 8) env->ThrowError("ConvertBits: YUY2 input must stay in 8 bits"); } if (vi.IsYV411()) { if (target_bitdepth != 8) env->ThrowError("ConvertBits: YV411 input must stay in 8 bits"); } // packed RGB conversion is limited if (vi.IsRGB() && !vi.IsPlanar()) { if (target_bitdepth != 8 && target_bitdepth != 16) env->ThrowError("ConvertBits: invalid bit-depth for packed RGB formats, only 8 or 16 possible"); } // remark // source_10_bit.ConvertTo16bit(truerange=true) : upscale range // source_10_bit.ConvertTo16bit(truerange=false) : leaves data, only format conversion // source_10_bit.ConvertTo16bit(bits=12,truerange=true) : upscale range from 10 to 12 // source_10_bit.ConvertTo16bit(bits=12,truerange=false) : leaves data, only format conversion // source_16_bit.ConvertTo16bit(bits=10, truerange=true) : downscale range // source_16_bit.ConvertTo16bit(bits=10, truerange=false) : leaves data, only format conversion // yuy2 is autoconverted to/from YV16. fulls-fulld and dither to lower bit depths are supported bool need_convert_yuy2 = vi.IsYUY2(); // for dither, planar rgb conversion happens bool need_convert_24 = vi.IsRGB24() && dither_type >= 0; bool need_convert_32 = vi.IsRGB32() && dither_type >= 0; bool need_convert_48 = vi.IsRGB48() && dither_type >= 0; bool need_convert_64 = vi.IsRGB64() && dither_type >= 0; // convert to planar on the fly if dither was asked if (need_convert_24 || need_convert_48) { AVSValue new_args[1] = { clip }; clip = env->Invoke("ConvertToPlanarRGB", AVSValue(new_args, 1)).AsClip(); } else if (need_convert_32 || need_convert_64) { AVSValue new_args[1] = { clip }; clip = env->Invoke("ConvertToPlanarRGBA", AVSValue(new_args, 1)).AsClip(); } else if (need_convert_yuy2) { AVSValue new_args[1] = { clip }; clip = env->Invoke("ConvertToYV16", AVSValue(new_args, 1)).AsClip(); } AVSValue result = new ConvertBits(clip, dither_type, target_bitdepth, assume_truerange, ColorRange_src, ColorRange_dest, dither_bitdepth, env); // convert back to packed rgb from planar on the fly if (need_convert_24 || need_convert_48) { AVSValue new_args[1] = { result }; if(target_bitdepth == 8) result = env->Invoke("ConvertToRGB24", AVSValue(new_args, 1)).AsClip(); else result = env->Invoke("ConvertToRGB48", AVSValue(new_args, 1)).AsClip(); } else if (need_convert_32 || need_convert_64) { AVSValue new_args[1] = { result }; if (target_bitdepth == 8) result = env->Invoke("ConvertToRGB32", AVSValue(new_args, 1)).AsClip(); else result = env->Invoke("ConvertToRGB64", AVSValue(new_args, 1)).AsClip(); } else if (need_convert_yuy2) { AVSValue new_args[1] = { result }; result = env->Invoke("ConvertToYUY2", AVSValue(new_args, 1)).AsClip(); } return result; } PVideoFrame __stdcall ConvertBits::GetFrame(int n, IScriptEnvironment* env) { PVideoFrame src = child->GetFrame(n, env); if (format_change_only) { // for 10-16 bit: simple format override in constructor env->MakeWritable(&src); src->AmendPixelType(vi.pixel_type); return src; } PVideoFrame dst = env->NewVideoFrameP(vi, &src); auto props = env->getFramePropsRW(dst); update_ColorRange(props, fulld ? ColorRange_Compat_e::AVS_COLORRANGE_FULL : ColorRange_Compat_e::AVS_COLORRANGE_LIMITED, env); if(vi.IsPlanar()) { int planes_y[4] = { PLANAR_Y, PLANAR_U, PLANAR_V, PLANAR_A }; int planes_r[4] = { PLANAR_G, PLANAR_B, PLANAR_R, PLANAR_A }; int *planes = (vi.IsYUV() || vi.IsYUVA()) ? planes_y : planes_r; for (int p = 0; p < vi.NumComponents(); ++p) { const int plane = planes[p]; if (plane == PLANAR_A) { if (conv_function_a == nullptr) env->BitBlt(dst->GetWritePtr(plane), dst->GetPitch(plane), src->GetReadPtr(plane), src->GetPitch(plane), src->GetRowSize(plane), src->GetHeight(plane)); else conv_function_a(src->GetReadPtr(plane), dst->GetWritePtr(plane), src->GetRowSize(plane), src->GetHeight(plane), src->GetPitch(plane), dst->GetPitch(plane), bits_per_pixel, target_bitdepth, dither_bitdepth ); } else if (conv_function == nullptr) env->BitBlt(dst->GetWritePtr(plane), dst->GetPitch(plane), src->GetReadPtr(plane), src->GetPitch(plane), src->GetRowSize(plane), src->GetHeight(plane)); else { const bool chroma = (plane == PLANAR_U || plane == PLANAR_V); if (chroma && conv_function_chroma != nullptr) // 32bit float and 8-16 when full-range involved needs separate signed-aware conversion conv_function_chroma(src->GetReadPtr(plane), dst->GetWritePtr(plane), src->GetRowSize(plane), src->GetHeight(plane), src->GetPitch(plane), dst->GetPitch(plane), bits_per_pixel, target_bitdepth, dither_bitdepth); else conv_function(src->GetReadPtr(plane), dst->GetWritePtr(plane), src->GetRowSize(plane), src->GetHeight(plane), src->GetPitch(plane), dst->GetPitch(plane), bits_per_pixel, target_bitdepth, dither_bitdepth); } } } else { // packed RGBs conv_function(src->GetReadPtr(), dst->GetWritePtr(), src->GetRowSize(), src->GetHeight(), src->GetPitch(), dst->GetPitch(), bits_per_pixel, target_bitdepth, dither_bitdepth); } return dst; } ================================================ FILE: avs_core/convert/convert_bits.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __Convert_bits_H__ #define __Convert_bits_H__ #include #include #include "convert.h" // in convert_bits.cpp // repeated 8x for sse size 16 extern const BYTE dither2x2a_data[4]; // cycle: 2 extern const BYTE dither2x2a_data_sse2[2 * 16]; // e.g. 10->8 bits // repeated 8x for sse size 16 extern const BYTE dither2x2_data[4]; // cycle: 2 extern const BYTE dither2x2_data_sse2[2 * 16]; // e.g. 8->5 bits extern const BYTE dither4x4a_data[16]; // cycle: 4 extern const BYTE dither4x4a_data_sse2[4 * 16]; // e.g. 12->8 bits extern const BYTE dither4x4_data[16]; // cycle: 4 extern const BYTE dither4x4_data_sse2[4 * 16]; // e.g. 14->9 bits extern const BYTE dither8x8a_data[8][8]; // cycle: 8 extern const BYTE dither8x8a_data_sse2[8][16]; // e.g. 14->8 bits extern const BYTE dither8x8_data[8][8]; // cycle: 8 extern const BYTE dither8x8_data_sse2[8][16]; // e.g. 16->9 or 8->1 bits // cycle: 16x. No special 16 byte sse2 extern const BYTE dither16x16a_data[16][16]; // 16->8 // cycle: 16x. No special 16 byte sse2 extern const BYTE dither16x16_data[16][16]; typedef void (*BitDepthConvFuncPtr)(const BYTE *srcp, BYTE *dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); class ConvertBits : public GenericVideoFilter { public: ConvertBits(PClip _child, const int _dither_mode, const int _target_bitdepth, bool _truerange, int _ColorRange_src, int _ColorRange_dest, int _dither_bitdepth, IScriptEnvironment* env); PVideoFrame __stdcall GetFrame(int n,IScriptEnvironment* env) override; int __stdcall SetCacheHints(int cachehints, int frame_range) override { AVS_UNUSED(frame_range); return cachehints == CACHE_GET_MTMODE ? MT_NICE_FILTER : 0; } static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env); private: BitDepthConvFuncPtr conv_function; BitDepthConvFuncPtr conv_function_chroma; // 32bit float YUV chroma BitDepthConvFuncPtr conv_function_a; int target_bitdepth; int dither_mode; int dither_bitdepth; bool fulls; // source is full range (defaults: rgb=true, yuv=false (bit shift)) bool fulld; // destination is full range (defaults: rgb=true, yuv=false (bit shift)) bool truerange; // if 16->10 range reducing or e.g. 14->16 bit range expansion needed int pixelsize; int bits_per_pixel; bool format_change_only; }; void get_convert_any_bits_functions(int dither_mode, int source_bitdepth, int target_bitdepth, bool fulls, bool fulld, #ifdef INTEL_INTRINSICS bool sse2, bool sse4, bool avx2, #endif BitDepthConvFuncPtr& conv_function, BitDepthConvFuncPtr& conv_function_chroma, BitDepthConvFuncPtr& conv_function_a); /********************************** ****** Bitdepth conversions ***** **********************************/ #endif // __Convert_bits_H__ ================================================ FILE: avs_core/convert/convert_helper.cpp ================================================ // Avisynth v2.5. Copyright 2002-2009 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include #ifdef AVS_WINDOWS #include #else #include #endif #include "convert_matrix.h" #include "convert_helper.h" #include #include #include #include const std::vector> g_range_table{ { "limited", AVS_COLORRANGE_LIMITED }, { "full", AVS_COLORRANGE_FULL }, { "l", AVS_COLORRANGE_LIMITED }, { "f", AVS_COLORRANGE_FULL }, }; const std::vector> g_chromaloc_table{ { "left", AVS_CHROMA_LEFT }, { "center", AVS_CHROMA_CENTER }, { "top_left", AVS_CHROMA_TOP_LEFT }, { "top", AVS_CHROMA_TOP }, // not used in Avisynth { "bottom_left", AVS_CHROMA_BOTTOM_LEFT }, // not used in Avisynth { "bottom", AVS_CHROMA_BOTTOM }, // not used in Avisynth { "dv", AVS_CHROMA_DV }, // Special to Avisynth // compatibility { "mpeg1", AVS_CHROMA_CENTER }, { "mpeg2", AVS_CHROMA_LEFT }, { "jpeg", AVS_CHROMA_CENTER }, }; // unlike Avisynth conventions, the strings do not contain hints on full or limited range // e.g. PC.709 or Rec709 const std::vector> g_matrix_table{ { "rgb", AVS_MATRIX_RGB }, { "709", AVS_MATRIX_BT709 }, { "unspec", AVS_MATRIX_UNSPECIFIED }, { "170m", AVS_MATRIX_ST170_M }, { "240m", AVS_MATRIX_ST240_M }, { "470bg", AVS_MATRIX_BT470_BG }, { "fcc", AVS_MATRIX_BT470_M }, { "470m", AVS_MATRIX_BT470_M }, // as of 20211111 name is an add-on in Avisynth+ { "ycgco", AVS_MATRIX_YCGCO }, { "2020ncl", AVS_MATRIX_BT2020_NCL }, { "2020cl", AVS_MATRIX_BT2020_CL }, { "chromacl", AVS_MATRIX_CHROMATICITY_DERIVED_CL }, { "chromancl", AVS_MATRIX_CHROMATICITY_DERIVED_NCL }, { "ictcp", AVS_MATRIX_ICTCP }, // compatibility { "601", AVS_MATRIX_BT470_BG }, { "2020", AVS_MATRIX_BT2020_NCL }, }; // old Avisynth "matrix" parameter strings const std::vector> g_old_avs_matrix_table{ { "rec601", AVS_OLD_MATRIX_Rec601 }, { "rec709", AVS_OLD_MATRIX_Rec709 }, { "pc.601", AVS_OLD_MATRIX_PC_601 }, { "pc.709", AVS_OLD_MATRIX_PC_709 }, { "pc601", AVS_OLD_MATRIX_PC_601 }, { "pc709", AVS_OLD_MATRIX_PC_709 }, { "average", AVS_OLD_MATRIX_AVERAGE }, { "rec2020", AVS_OLD_MATRIX_Rec2020 }, { "pc.2020", AVS_OLD_MATRIX_PC_2020 }, { "pc2020", AVS_OLD_MATRIX_PC_2020 } }; // not used in Avisynth (yet) const std::vector> g_transfer_table{ { "709", AVS_TRANSFER_BT709 }, { "unspec", AVS_TRANSFER_UNSPECIFIED }, { "601", AVS_TRANSFER_BT601 }, { "linear", AVS_TRANSFER_LINEAR }, { "2020_10", AVS_TRANSFER_BT2020_10 }, { "2020_12", AVS_TRANSFER_BT2020_12 }, { "240m", AVS_TRANSFER_ST240_M }, { "470m", AVS_TRANSFER_BT470_M }, { "470bg", AVS_TRANSFER_BT470_BG }, { "log100", AVS_TRANSFER_LOG_100 }, { "log316", AVS_TRANSFER_LOG_316 }, { "st2084", AVS_TRANSFER_ST2084 }, { "std-b67", AVS_TRANSFER_ARIB_B67 }, { "srgb", AVS_TRANSFER_IEC_61966_2_1 }, { "xvycc", AVS_TRANSFER_IEC_61966_2_4 }, }; // not used in Avisynth (yet) const std::vector> g_primaries_table{ { "709", AVS_PRIMARIES_BT709 }, { "unspec", AVS_PRIMARIES_UNSPECIFIED }, { "170m", AVS_PRIMARIES_ST170_M }, { "240m", AVS_PRIMARIES_ST240_M }, { "470m", AVS_PRIMARIES_BT470_M }, { "470bg", AVS_PRIMARIES_BT470_BG }, { "film", AVS_PRIMARIES_FILM }, { "2020", AVS_PRIMARIES_BT2020 }, { "st428", AVS_PRIMARIES_ST428 }, { "xyz", AVS_PRIMARIES_ST428 }, { "st431-2", AVS_PRIMARIES_ST431_2 }, { "st432-1", AVS_PRIMARIES_ST432_1 }, { "ebu3213-e", AVS_PRIMARIES_EBU3213_E }, }; // -1: null input or empty string // -2: not found // table index otherwise template auto lookup_table(const std::vector>& table, const char* key) { if (key == nullptr) return -1; if (*key == 0) return -1; auto it = std::find_if(table.begin(), table.end(), [&key](const auto& element) { return !lstrcmpi(element.first, key); }); return it != std::end(table) ? it->second : -2; } bool getPrimaries(const char* primaries_name, IScriptEnvironment* env, int& _Primaries) { auto index = lookup_table(g_primaries_table, primaries_name); if (index >= 0) { _Primaries = index; return true; } if (index == -2) // not found env->ThrowError("Convert: Unknown Primaries"); // empty return false; } static bool getMatrix(const char* matrix_name, IScriptEnvironment* env, int& _Matrix) { auto index = lookup_table(g_matrix_table, matrix_name); if (index >= 0) { _Matrix = index; return true; } if (index == -2) // not found env->ThrowError("Convert: Unknown matrix"); // empty return false; } static bool getChromaLocation(const char* chromaloc_name, IScriptEnvironment* env, int& _ChromaLocation) { auto index = lookup_table(g_chromaloc_table, chromaloc_name); if (index >= 0) { _ChromaLocation = index; return true; } if (index == -2) // not found env->ThrowError("Unknown chroma placement"); // empty return false; } bool getColorRange(const char* color_range_name, IScriptEnvironment* env, int& _ColorRange) { auto color_range_enum = lookup_table(g_range_table, color_range_name); if (color_range_enum >= 0) { _ColorRange = color_range_enum; return true; } if (color_range_enum == -2) // not found env->ThrowError("Convert: Unknown color range, must be 'auto', 'full', 'f', 'limited' or 'l'"); // empty return false; } // Converts old-style Avisynth matrix to separated _Matrix and _ColorRange values // if not found or empty, returns false, does not throw exception. // _ColorRange for matrix generation // _ColorRange_Out for desired output range, can be set even to nothing for PC.xxx matrices static bool getOldMatrix(const char* matrix_name, int &_Matrix, int &_ColorRange) { auto old_matrix_enum = lookup_table(g_old_avs_matrix_table, matrix_name); if (old_matrix_enum < 0) return false; // not found or empty switch (old_matrix_enum) { case Old_Avs_Matrix_e::AVS_OLD_MATRIX_Rec601: _Matrix = Matrix_e::AVS_MATRIX_ST170_M; _ColorRange = ColorRange_Compat_e::AVS_COLORRANGE_LIMITED; break; case Old_Avs_Matrix_e::AVS_OLD_MATRIX_PC_601: _Matrix = Matrix_e::AVS_MATRIX_ST170_M; _ColorRange = -1; // better no change the range ColorRange_Compat_e::AVS_COLORRANGE_FULL; break; case Old_Avs_Matrix_e::AVS_OLD_MATRIX_Rec709: _Matrix = Matrix_e::AVS_MATRIX_BT709; _ColorRange = ColorRange_Compat_e::AVS_COLORRANGE_LIMITED; break; case Old_Avs_Matrix_e::AVS_OLD_MATRIX_PC_709: _Matrix = Matrix_e::AVS_MATRIX_BT709; _ColorRange = -1; // better no change the range ColorRange_Compat_e::AVS_COLORRANGE_FULL; break; case Old_Avs_Matrix_e::AVS_OLD_MATRIX_Rec2020: _Matrix = Matrix_e::AVS_MATRIX_BT2020_NCL; _ColorRange = ColorRange_Compat_e::AVS_COLORRANGE_LIMITED; break; case Old_Avs_Matrix_e::AVS_OLD_MATRIX_PC_2020: _Matrix = Matrix_e::AVS_MATRIX_BT2020_NCL; _ColorRange = -1; // better no change the range ColorRange_Compat_e::AVS_COLORRANGE_FULL; break; case Old_Avs_Matrix_e::AVS_OLD_MATRIX_AVERAGE: _Matrix = Matrix_e::AVS_MATRIX_AVERAGE; // non-standard! _ColorRange = -1; break; } return true; } static bool is_paramstring_auto(const std::string ¶m) { return !lstrcmpi(param.c_str(), "auto"); // true is match } static bool is_paramstring_same(const std::string& param) { return !lstrcmpi(param.c_str(), "same"); // true is match } static bool is_paramstring_empty_or_auto(const std::string& param) { return param.empty() || !lstrcmpi(param.c_str(), "auto"); // true is match } static bool is_paramstring_empty_or_auto(const char* param) { if (!param) return true; return !lstrcmpi(param, "auto"); // true is match } // called from yuv <-> rgb and to_greyscale converters void matrix_parse_merge_with_props_def(bool rgb_in, bool rgb_out, const char* matrix_name, const AVSMap* props, int& _Matrix, int& _ColorRange, int& _ColorRange_Out, int _Matrix_Default, int _ColorRange_Default, IScriptEnvironment* env) { // if once we'd like to use input colorrange when input is rgb (e.g. studio rgb of ColorBars is limited) int _ColorRange_In = rgb_in ? ColorRange_Compat_e::AVS_COLORRANGE_FULL : ColorRange_Compat_e::AVS_COLORRANGE_LIMITED; int _Default_ColorRange_Out = rgb_out ? ColorRange_Compat_e::AVS_COLORRANGE_FULL : ColorRange_Compat_e::AVS_COLORRANGE_LIMITED; // RGB -> YUV or YUV -> RGB if (props) { // _ColorRange exists for RGB as well if (env->propNumElements(props, "_ColorRange") > 0) { _ColorRange_In = (int)env->propGetIntSaturated(props, "_ColorRange", 0, nullptr); _ColorRange_Default = _ColorRange_In; if (rgb_in && rgb_out) // rgb in and out: keep input _Default_ColorRange_Out = _ColorRange_In; } if (!rgb_in) { if (env->propNumElements(props, "_Matrix") > 0) { int tmp_matrix = (int)env->propGetIntSaturated(props, "_Matrix", 0, nullptr); if (tmp_matrix != Matrix_e::AVS_MATRIX_UNSPECIFIED) _Matrix_Default = tmp_matrix; } } } // valid values: // old matrix name, optionally followed by 'auto' e.g. Rec709 // matrix name, optionally followed by color range e.g. 709:limited 2020:f 601:full std::vector splits; std::string split; if (matrix_name) { std::istringstream ss(matrix_name); while (std::getline(ss, split, ':')) splits.push_back(split); if (splits.size() > 2) env->ThrowError("Invalid matrix specifier, too many parts"); } std::string s_matrix_name = splits.size() > 0 ? splits[0] : ""; std::string s_color_range_name = splits.size() > 1 ? splits[1] : ""; // PC.xxx is like xxx:same (same is not supported though) // recxxx is like xxx:l (limited) if (getOldMatrix(s_matrix_name.c_str(), _Matrix, _ColorRange)) { // old avs syntax: single matrix names if (_ColorRange < 0) { // PC.xx does not suggest neither limited, not full // keep input range _ColorRange = _ColorRange_In; // a default range is set for getting the matrix _ColorRange_Out = _ColorRange_In; } else { // _ColorRange was explicitely set by matrix if (rgb_in) { // RGB -> YUV _ColorRange_Out = _ColorRange; _ColorRange = _ColorRange_In; // a frame prop may override default RGB full input range } else { // YUV -> RGB // _ColorRange; // input range is defined by the matrix _ColorRange_Out = _Default_ColorRange_Out; } } if (!s_color_range_name.empty() && !is_paramstring_auto(s_color_range_name)) env->ThrowError("Error: this 'old-style' matrix string can only be followed by 'auto' color range"); return; } if (is_paramstring_empty_or_auto(s_matrix_name) || !getMatrix(s_matrix_name.c_str(), env, _Matrix)) { _Matrix = _Matrix_Default; } if (_Matrix == Matrix_e::AVS_MATRIX_UNSPECIFIED) { _Matrix = _Matrix_Default; } // new in 3.7.3: same range as input's, e.g. "709:same" is like "PC.709" if (is_paramstring_same(s_color_range_name)) { _ColorRange = _ColorRange_In; _ColorRange_Out = _ColorRange; } else if (is_paramstring_empty_or_auto(s_color_range_name) || !getColorRange(s_color_range_name.c_str(), env, _ColorRange)) { // not specified or auto // RGB -> YUV // YUV -> RGB _ColorRange = _ColorRange_In; _ColorRange_Out = _Default_ColorRange_Out; } else { if (rgb_in) { // RGB -> YUV _ColorRange_Out = _ColorRange; _ColorRange = _ColorRange_In; // a frame prop may override default RGB full input range } else { // YUV -> RGB // _ColorRange; // input range is defined by the matrix _ColorRange_Out = _Default_ColorRange_Out; // unlike RGB->YUV, we have no way to tell output rgb's range, it's always full } } } void matrix_parse_merge_with_props(bool rgb_in, bool rgb_out, const char* matrix_name, const AVSMap* props, int& _Matrix, int& _ColorRange, int& ColorRange_Out, IScriptEnvironment * env) { int _Matrix_Default = Matrix_e::AVS_MATRIX_ST170_M; // Rec601 AVS_MATRIX_ST170_M (6-NTSC) and not AVS_MATRIX_BT470_BG (5-PAL) int _ColorRange_Default = ColorRange_Compat_e::AVS_COLORRANGE_LIMITED; matrix_parse_merge_with_props_def(rgb_in, rgb_out, matrix_name, props, _Matrix, _ColorRange, ColorRange_Out, _Matrix_Default, _ColorRange_Default, env); } void chromaloc_parse_merge_with_props(VideoInfo& vi, const char* chromaloc_name, const AVSMap* props, int& _ChromaLocation, int _ChromaLocation_Default, IScriptEnvironment* env) { if (props) { if (vi.Is420() || vi.Is422() || vi.IsYV411()) { // yes, YV411 can also have valid _ChromaLocation, if 'left'-ish one is given if (env->propNumElements(props, "_ChromaLocation") > 0) { _ChromaLocation_Default = (int)env->propGetIntSaturated(props, "_ChromaLocation", 0, nullptr); } } else { // Theoretically RGB and not subsampled formats must not have chroma location if (env->propNumElements(props, "_ChromaLocation") > 0) { // Uncommented for a while, just ignore when there is any // env->ThrowError("Error: _ChromaLocation property found at a non-subsampled source."); } } } if (is_paramstring_empty_or_auto(chromaloc_name) || !getChromaLocation(chromaloc_name, env, _ChromaLocation)) { _ChromaLocation = _ChromaLocation_Default; } } void export_frame_props(VideoInfo& vi, AVSMap* props, int _Matrix, int _ColorRange, IScriptEnvironment* env) { // fixme: what to do with the special "AVERAGE" non standard matrix? Solution 1: delete entry if (_Matrix == Matrix_e::AVS_MATRIX_AVERAGE) env->propDeleteKey(props, "_Matrix"); else if (_Matrix < 0) env->propDeleteKey(props, "_Matrix"); else env->propSetInt(props, "_Matrix", _Matrix, AVSPropAppendMode::PROPAPPENDMODE_REPLACE); env->propSetInt(props, "_ColorRange", _ColorRange, AVSPropAppendMode::PROPAPPENDMODE_REPLACE); } /* avsresize: The name of the frame properties that are read and set are: _ChromaLocation, _ColorRange, _Matrix, _Transfer, _Primaries The frame properties read and set the corresponding numerical index of the parameters. For example: matrix "709" has numerical index `1` and the frame property have value of `1`. If colorspace_op is not defined and there are frame properties, they are used for default source values. If colorspace_op is not defined and there are no frame properties or they are not supported, default values are used as before (there are default values for matrix, range and chromaloc). If colorspace_op is defined and you want to use the frame property for a source value, use "auto". If colorspace_op is defined and you use "auto" without frame property, the default value for that argument will be used if exist. If you use "auto" for argument with frame property that has value of 2 (unspec) and use anything different than "same" for destination, error will be raised. If you use "auto=>same" for matrix/transfer/primaries with frame property 2 (unspec) and you want to make colorspace conversion, error will be raised. For example: */ void update_Matrix_and_ColorRange(AVSMap* props, int theMatrix, int theColorRange, IScriptEnvironment* env) { auto set_int_if_positive = [&](const char* key, int x) { if (x >= 0) env->propSetInt(props, key, x, AVSPropAppendMode::PROPAPPENDMODE_REPLACE); else env->propDeleteKey(props, key); }; if (theColorRange == ColorRange_Compat_e::AVS_COLORRANGE_FULL || theColorRange == ColorRange_Compat_e::AVS_COLORRANGE_LIMITED) env->propSetInt(props, "_ColorRange", theColorRange, AVSPropAppendMode::PROPAPPENDMODE_REPLACE); else env->propDeleteKey(props, "_ColorRange"); set_int_if_positive("_Matrix", theMatrix); //set_int_if_positive("_Transfer", theTransferCharacteristics); //set_int_if_positive("_Primaries", theColorPrimaries); } void update_Transfer_and_Primaries(AVSMap* props, int theTransfer, int thePrimaries, IScriptEnvironment* env) { auto set_int_if_positive = [&](const char* key, int x) { if (x >= 0) env->propSetInt(props, key, x, AVSPropAppendMode::PROPAPPENDMODE_REPLACE); else env->propDeleteKey(props, key); }; set_int_if_positive("_Transfer", theTransfer); set_int_if_positive("_Primaries", thePrimaries); } void update_ChromaLocation(AVSMap* props, int theChromaLocation, IScriptEnvironment* env) { auto set_int_if_positive = [&](const char* key, int x) { if (x >= 0) env->propSetInt(props, key, x, AVSPropAppendMode::PROPAPPENDMODE_REPLACE); else env->propDeleteKey(props, key); }; set_int_if_positive("_ChromaLocation", theChromaLocation); } void update_ColorRange(AVSMap* props, int theColorRange, IScriptEnvironment* env) { if (theColorRange == ColorRange_Compat_e::AVS_COLORRANGE_FULL || theColorRange == ColorRange_Compat_e::AVS_COLORRANGE_LIMITED) env->propSetInt(props, "_ColorRange", theColorRange, AVSPropAppendMode::PROPAPPENDMODE_REPLACE); else env->propDeleteKey(props, "_ColorRange"); } ================================================ FILE: avs_core/convert/convert_helper.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __Convert_helper_H__ #define __Convert_helper_H__ #include #include #include // ITU-T H.265 (Table E.1) typedef enum ColorRange_e { AVS_RANGE_LIMITED = 0, // video_full_range_flag = 0, studio swing, e.g. 16-235 for 8-bit luma AVS_RANGE_FULL = 1, // video_full_range_flag = 1, full swing, e.g. 0-255 for 8-bit luma } ColorRange_e; // Old constants borrowed from VapourSynth, which transitioned to the ITU-T H.265 standard (Table E.1) // Just the opposite as the standard. typedef enum ColorRange_Compat_e { AVS_COLORRANGE_FULL = 0, AVS_COLORRANGE_LIMITED = 1 } ColorRange_Compat_e; typedef enum ChromaLocation_e { AVS_CHROMA_UNUSED = -1, AVS_CHROMA_LEFT = 0, AVS_CHROMA_CENTER = 1, AVS_CHROMA_TOP_LEFT = 2, AVS_CHROMA_TOP = 3, AVS_CHROMA_BOTTOM_LEFT = 4, AVS_CHROMA_BOTTOM = 5, AVS_CHROMA_DV = 6 // Special to Avisynth } ChromaLocation_e; typedef enum FieldBased_e { AVS_FIELD_PROGRESSIVE = 0, AVS_FIELD_BOTTOM = 1, AVS_FIELD_TOP = 2 } FieldBased_e; // https://www.itu.int/rec/T-REC-H.265-202108-I /* ITU-T H.265 Table E.5 */ typedef enum Matrix_e { AVS_MATRIX_RGB = 0, /* The identity matrix. Typically used for RGB, may also be used for XYZ */ AVS_MATRIX_BT709 = 1, /* ITU-R Rec. BT.709-5 */ AVS_MATRIX_UNSPECIFIED = 2, /* Image characteristics are unknown or are determined by the application */ AVS_MATRIX_BT470_M = 4, // instead of AVS_MATRIX_FCC // FCC Title 47 Code of Federal Regulations (2003) 73.682 (a) (20) // Rec. ITU-R BT.470-6 System M (historical) AVS_MATRIX_BT470_BG = 5, /* Equivalent to 6. */ // ITU-R Rec. BT.470-6 System B, G (historical) // Rec. ITU-R BT.601-7 625 // Rec. ITU-R BT.1358-0 625 (historical) // Rec. ITU-R BT.1700-0 625 PAL and 625 SECAM AVS_MATRIX_ST170_M = 6, /* Equivalent to 5. */ // Rec. ITU-R BT.601-7 525 // Rec. ITU-R BT.1358-1 525 or 625 (historical) // Rec. ITU-R BT.1700-0 NTSC // SMPTE ST 170 (2004) // SMPTE 170M (2004) AVS_MATRIX_ST240_M = 7, // SMPTE ST 240 (1999, historical) AVS_MATRIX_YCGCO = 8, AVS_MATRIX_BT2020_NCL = 9, // Rec. ITU-R BT.2020 non-constant luminance system // Rec. ITU-R BT.2100-2 Y'CbCr AVS_MATRIX_BT2020_CL = 10, /* Rec. ITU-R BT.2020 constant luminance system */ AVS_MATRIX_CHROMATICITY_DERIVED_NCL = 12, /* Chromaticity derived non-constant luminance system */ AVS_MATRIX_CHROMATICITY_DERIVED_CL = 13, /* Chromaticity derived constant luminance system */ AVS_MATRIX_ICTCP = 14, // REC_2100_ICTCP, Rec. ITU-R BT.2100-2 ICTCP AVS_MATRIX_AVERAGE = 9999, // Avisynth compatibility } Matrix_e; // Pre-Avisynth 3.7.1 matrix constants, with implicite PC/limited range typedef enum Old_Avs_Matrix_e { AVS_OLD_MATRIX_Rec601 = 0, AVS_OLD_MATRIX_Rec709 = 1, AVS_OLD_MATRIX_PC_601 = 2, AVS_OLD_MATRIX_PC_709 = 3, AVS_OLD_MATRIX_AVERAGE = 4, AVS_OLD_MATRIX_Rec2020 = 5, AVS_OLD_MATRIX_PC_2020 = 6 } Old_Avs_Matrix_e; // transfer characteristics ITU-T H.265 Table E.4 typedef enum Transfer_e { AVS_TRANSFER_BT709 = 1, AVS_TRANSFER_UNSPECIFIED = 2, AVS_TRANSFER_BT470_M = 4, AVS_TRANSFER_BT470_BG = 5, AVS_TRANSFER_BT601 = 6, /* Equivalent to 1. */ AVS_TRANSFER_ST240_M = 7, AVS_TRANSFER_LINEAR = 8, AVS_TRANSFER_LOG_100 = 9, AVS_TRANSFER_LOG_316 = 10, AVS_TRANSFER_IEC_61966_2_4 = 11, AVS_TRANSFER_IEC_61966_2_1 = 13, AVS_TRANSFER_BT2020_10 = 14, /* Equivalent to 1. */ AVS_TRANSFER_BT2020_12 = 15, /* Equivalent to 1. */ AVS_TRANSFER_ST2084 = 16, AVS_TRANSFER_ARIB_B67 = 18 } Transfer_e; // color primaries ITU-T H.265 Table E.3 typedef enum Primaries_e { AVS_PRIMARIES_BT709 = 1, AVS_PRIMARIES_UNSPECIFIED = 2, AVS_PRIMARIES_BT470_M = 4, AVS_PRIMARIES_BT470_BG = 5, AVS_PRIMARIES_ST170_M = 6, AVS_PRIMARIES_ST240_M = 7, /* Equivalent to 6. */ AVS_PRIMARIES_FILM = 8, AVS_PRIMARIES_BT2020 = 9, AVS_PRIMARIES_ST428 = 10, AVS_PRIMARIES_ST431_2 = 11, AVS_PRIMARIES_ST432_1 = 12, AVS_PRIMARIES_EBU3213_E = 22 } Primaries_e; void matrix_parse_merge_with_props(bool rgb_in, bool rgb_out, const char* matrix_name, const AVSMap* props, int& _Matrix, int& _ColorRange, int& ColorRange_Out, IScriptEnvironment* env); void matrix_parse_merge_with_props_def(bool rgb_in, bool rgb_out, const char* matrix_name, const AVSMap* props, int& _Matrix, int& _ColorRange, int& ColorRange_Out, int _Matrix_Default, int _ColorRange_Default, IScriptEnvironment* env); void chromaloc_parse_merge_with_props(VideoInfo& vi, const char* chromaloc_name, const AVSMap* props, int& _ChromaLocation, int _ChromaLocation_Default, IScriptEnvironment* env); void update_Matrix_and_ColorRange(AVSMap* props, int theMatrix, int theColorRange, IScriptEnvironment* env); void update_Transfer_and_Primaries(AVSMap* props, int theTransfer, int thePrimaries, IScriptEnvironment* env); void update_ColorRange(AVSMap* props, int theColorRange, IScriptEnvironment* env); void update_ChromaLocation(AVSMap* props, int theChromaLocation, IScriptEnvironment* env); typedef struct bits_conv_constants { float src_offset = 0.0f; int src_offset_i = 0; float mul_factor = 1.0f; float dst_offset = 0.0f; float src_span = 1.0f; float dst_span = 1.0f; } bits_conv_constants; // universal transform values for any full-limited bit-depth mix [[maybe_unused]] static AVS_FORCEINLINE void get_bits_conv_constants(bits_conv_constants& d, bool use_chroma, bool fulls, bool fulld, int srcBitDepth, int dstBitDepth) { d.src_offset = 0.0f; d.mul_factor = 1.0f; d.dst_offset = 0.0f; d.src_span = 1.0f; d.dst_span = 1.0f; // possible usage places // Expr (autoscale, scalef, scaleb) // convert_bits // ColorYUV // Histogram // YUV->RGB conversions (matrix coefficients depend on full-limited, but also the scaling of the actual pixel values, so this is needed for both matrix and pixel value conversion) if (use_chroma) { // decision: 'limited' range float +/-112 is +/-112/255.0. Must be consistent with Expr, ColorYUV etc // 3.7.2: full range chroma: as per ITU Rec H.273 eq.30 p.10: Cb=Clip1_C(Round(((1< 0..255 // int-float: 10+ bits first downshift to 8 bits then /255. // float-int: 10+ bits first *255 to have 0..255 range, then shift from 8 bits to actual bit depth // Since first we convert to 8 bit 0-255 range and do bit-shift after then to >8 depths, the 1.0 number will show up as 255*256 in 16 bits. // This is normal. Like float32.ConvertBits(8).ConvertBits(16) (srcBitDepth == 32) -> (255 * (float)(1 << (dstBitDepth - 8)) / 1.0 (dstBitDepth == 32) -> 1.0 / (255 * (float)(1 << (srcBitDepth - 8))) (srcBitDepth == 32) -> ((float)(1 << (dstBitDepth - 8)))) / (1 / 255.0f) (dstBitDepth == 32) -> 1.0 / 255.0f / (float)(1 << (srcBitDepth - 8)))) */ } else { // luma d.src_span = (srcBitDepth == 32) ? (fulls ? 1.0f : 219 / 255.0f) : (fulls ? ((1 << srcBitDepth) - 1) : (219 << (srcBitDepth - 8))); // 0..255, 16..235 d.dst_span = (dstBitDepth == 32) ? (fulld ? 1.0f : 219 / 255.0f) : (fulld ? ((1 << dstBitDepth) - 1) : (219 << (dstBitDepth - 8))); // luma d.src_offset = (srcBitDepth == 32) ? (fulls ? 0 : 16.0f / 255) : (fulls ? 0 : (16 << (srcBitDepth - 8))); d.dst_offset = (dstBitDepth == 32) ? (fulld ? 0 : 16.0f / 255) : (fulld ? 0 : (16 << (dstBitDepth - 8))); } d.mul_factor = d.dst_span / d.src_span; d.src_offset_i = (int)d.src_offset; // no rounding, when used, it is integer } enum class ConversionDirection { YUV_TO_RGB, RGB_TO_YUV, YUV_TO_YUV, RGB_TO_RGB, RGB_TO_Y }; #endif // __Convert_helper_H__ ================================================ FILE: avs_core/convert/convert_matrix.cpp ================================================ // Avisynth v2.5. Copyright 2002-2009 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include "convert_matrix.h" #include "convert_helper.h" #include #ifdef AVS_WINDOWS #include #else #include #endif #include /** * SIMD scaling logic for PMADDWD (16-bit signed multipliers, 32-bit accumulators). * RGB->YUV uses 15-bit scale as all coeffs are < 1.0 (max ~0.678, BT.2020 G weight), * fully utilizing 16-bit coefficient precision without overflow. * YUV->RGB requires 13-bit scale to accommodate chroma expansion coeffs up to ~1.881 * (BT.2020 Cb->B), keeping scaled coefficients within int16 range. * Fused YUV->YUV (e.g., 601->2020) needs 14-bit scale; diagonal gain slightly > 1.0 * (~1.03 max) rules out 15-bit, but coeffs are well within 13-bit headroom. * At 16-bit depth, errors partially average out during 32-bit accumulation before rounding. * Avoid unifying all paths to 13-bit: RGB->YUV would degrade from ~±1 to ~±12 LSB worst-case. * * | Conversion | Scale | Max Coeff | LSB Error (16-bit) | Worst-Case Matrix | * |-------------|--------|-----------|--------------------|---------------------| * | RGB -> YUV | 15-bit | ~0.678 | ~±1 (near-exact) | BT.2020 (G weight) | * | YUV -> RGB | 13-bit | ~1.881 | ~±8 (practical) | BT.2020 (Cb -> B) | * | YUV -> YUV | 14-bit | ~1.030 | ~±2 (low noise) | 601 <-> 2020 fused | * * matrix="RGB" (IDENTITY) exception: If Kr=Kb=0 (Identity), coeffs reach 1.0. (1.0 << 15) = 32768, * which overflows int16 (-32768 to 32767). Caller will check it and may diable int16 based SIMD optimization paths. */ static void BuildMatrix_Rgb2Yuv_core(double Kr, double Kb, int int_arith_shift, bool full_scale_s, bool full_scale_d, int bits_per_pixel, ConversionMatrix& matrix) { bits_conv_constants luma, chroma; bits_conv_constants luma_to_32bit; // helpers for post-matrix conversion to 32-bit float (for high bit depth sources or targets, e.g. 16-bit to 32-bit float) get_bits_conv_constants(luma_to_32bit, false, full_scale_s, full_scale_d, bits_per_pixel, 32); matrix.target_span_f_32 = luma_to_32bit.dst_span; matrix.offset_out_f_32 = luma_to_32bit.dst_offset; // RGB is source, YUV is destination // For RGB source / Y destination (both luma-like): get_bits_conv_constants(luma, false, full_scale_s, full_scale_d, bits_per_pixel, bits_per_pixel); // For UV destination (chroma behavior): // Note: we only need dst_span for UV, so we use full_scale_d for both params get_bits_conv_constants(chroma, true, full_scale_d, full_scale_d, bits_per_pixel, bits_per_pixel); double Srgb_f = luma.src_span; // RGB input range double Sy_f = luma.dst_span; // Y output range double Suv_f = chroma.dst_span; // UV output range double Orgb_f = luma.src_offset; // RGB input offset double Oy_f = luma.dst_offset; // Y output offset // Derive integer versions (for <= 16 bit paths) int Orgb = (int)Orgb_f; int Oy = (int)Oy_f; /* Kr = {0.299, 0.2126} Kb = {0.114, 0.0722} Kg = 1 - Kr - Kb // {0.587, 0.7152} Srgb = 255 Sy = {219, 255} // { 235-16, 255-0 } Suv = {112, 127} // { (240-16)/2, (255-0)/2 } Oy = {16, 0} Ouv = 128 R = r/Srgb // 0..1 G = g/Srgb B = b/Srgb Y = Kr*R + Kg*G + Kb*B // 0..1 U = B - (Kr*R + Kg*G)/(1-Kb) //-1..1 V = R - (Kg*G + Kb*B)/(1-Kr) y = Y*Sy + Oy // 16..235, 0..255 u = U*Suv + Ouv // 16..240, 1..255 v = V*Suv + Ouv */ const int mulfac_int = 1 << int_arith_shift; const double mulfac = double(mulfac_int); const double Kg = 1. - Kr - Kb; // Symmetric rounding for both positive and negative coefficients auto round_coeff = [](double v) { return (int)(v >= 0 ? (v + 0.5) : (v - 0.5)); }; // Calculate double-precision coefficients double y_b_f = Sy_f * Kb / Srgb_f; double y_g_f = Sy_f * Kg / Srgb_f; double y_r_f = Sy_f * Kr / Srgb_f; double u_b_f = Suv_f / Srgb_f; double u_g_f = Suv_f * Kg / (Kb - 1) / Srgb_f; double u_r_f = Suv_f * Kr / (Kb - 1) / Srgb_f; double v_b_f = Suv_f * Kb / (Kr - 1) / Srgb_f; double v_g_f = Suv_f * Kg / (Kr - 1) / Srgb_f; double v_r_f = Suv_f / Srgb_f; double offset_y_f = Oy_f; double offset_rgb_f = -Orgb_f; // Negative because addition is used // Store float versions matrix.y_b_f = (float)y_b_f; matrix.y_g_f = (float)y_g_f; matrix.y_r_f = (float)y_r_f; matrix.u_b_f = (float)u_b_f; matrix.u_g_f = (float)u_g_f; matrix.u_r_f = (float)u_r_f; matrix.v_b_f = (float)v_b_f; matrix.v_g_f = (float)v_g_f; matrix.v_r_f = (float)v_r_f; matrix.offset_y_f = (float)offset_y_f; matrix.offset_rgb_f = (float)offset_rgb_f; if (bits_per_pixel <= 16) { // Derive integer versions from doubles with proper rounding matrix.y_b = round_coeff(mulfac * y_b_f); matrix.y_g = round_coeff(mulfac * y_g_f); matrix.y_r = round_coeff(mulfac * y_r_f); matrix.u_b = round_coeff(mulfac * u_b_f); matrix.u_g = round_coeff(mulfac * u_g_f); matrix.u_r = round_coeff(mulfac * u_r_f); matrix.v_b = round_coeff(mulfac * v_b_f); matrix.v_g = round_coeff(mulfac * v_g_f); matrix.v_r = round_coeff(mulfac * v_r_f); matrix.offset_y = Oy; matrix.offset_rgb = -Orgb; // negative because addition is used // Luma gain check: ensure Y captures 100% of RGB energy // Only applies when destination is full-range (no offset) if (matrix.offset_y == 0) { int y_sum = matrix.y_b + matrix.y_g + matrix.y_r; if (y_sum != mulfac_int) { matrix.y_g += (mulfac_int - y_sum); } } // U neutrality check: ensure R=G=B results in U = 0 (before offset) int u_sum = matrix.u_b + matrix.u_g + matrix.u_r; if (u_sum != 0) { matrix.u_g -= u_sum; } // V neutrality check: ensure R=G=B results in V = 0 (before offset) int v_sum = matrix.v_b + matrix.v_g + matrix.v_r; if (v_sum != 0) { matrix.v_g -= v_sum; } } // in: rgb. out: yuv matrix.offset_in = matrix.offset_rgb; matrix.offset_in_f = matrix.offset_rgb_f; matrix.offset_out = matrix.offset_y; matrix.offset_out_f = matrix.offset_y_f; } /* * WARNING: int_arith_shift MUST NOT exceed 13 for YUV -> RGB expansion. * Example: BT.709 Limited -> Full Range * The Blue expansion factor (u_b_f) is ~2.112. * - At 14-bit shift: 2.112 * 16384 = 34603 (OVERFLOWS int16_t) * - At 13-bit shift: 2.112 * 8192 = 17302 (SAFE) * Use 13-bit shift to ensure coefficients fit in int16 for SIMD paths. * Additionally, summing up to 3 components (Y, U, V) plus rounding constant must * not overflow int32 accumulators in SIMD. (another 2 bits headroom needed) */ static void BuildMatrix_Yuv2Rgb_core(double Kr, double Kb, int int_arith_shift, bool full_scale_s, bool full_scale_d, int bits_per_pixel, ConversionMatrix& matrix) { float Sy_f, Suv_f, Oy_f, Orgb_f; bits_conv_constants luma, chroma; bits_conv_constants luma_to_32bit; // helpers for post-matrix conversion to 32-bit float (for high bit depth sources or targets, e.g. 16-bit to 32-bit float) get_bits_conv_constants(luma_to_32bit, false, full_scale_s, full_scale_d, bits_per_pixel, 32); matrix.target_span_f_32 = luma_to_32bit.dst_span; matrix.offset_out_f_32 = luma_to_32bit.dst_offset; // We use dstBitDepth = srcBitDepth because the matrix handles the magnitude // via the mulfac and Srgb calculations. We just need the standardized spans. get_bits_conv_constants(luma, false, full_scale_s, full_scale_d, bits_per_pixel, bits_per_pixel); get_bits_conv_constants(chroma, true, full_scale_s, full_scale_d, bits_per_pixel, bits_per_pixel); matrix.target_span_f = luma.dst_span; Sy_f = luma.src_span; Suv_f = chroma.src_span; Oy_f = luma.src_offset; Orgb_f = luma.dst_offset; /* Kr = {0.299, 0.2126} Kb = {0.114, 0.0722} Kg = 1 - Kr - Kb // {0.587, 0.7152} Srgb = 255 Sy = {219, 255} // { 235-16, 255-0 } Suv = {112, 127} // { (240-16)/2, (255-0)/2 } Oy = {16, 0} Ouv = 128 Y =(y-Oy) / Sy // 0..1 U =(u-Ouv) / Suv //-1..1 V =(v-Ouv) / Suv R = Y + V*(1-Kr) // 0..1 G = Y - U*(1-Kb)*Kb/Kg - V*(1-Kr)*Kr/Kg B = Y + U*(1-Kb) r = R*Srgb // 0..255 0..65535 g = G*Srgb b = B*Srgb */ const double mulfac = (double)(1 << int_arith_shift); // integer aritmetic precision scale const double Kg = 1. - Kr - Kb; // The Srgb (destination span) is also just the dst_span (RGB is luma-like)! const float Srgb_f = (float)luma.dst_span; // symmetric rounding for both positive and negative coefficients auto round_coeff = [](double v) { return (int)(v >= 0 ? (v + 0.5) : (v - 0.5)); }; double y_b_f = (Srgb_f * 1.000 / Sy_f); //Y double u_b_f = (Srgb_f * (1 - Kb) / Suv_f); //U double v_b_f = (Srgb_f * 0.000 / Suv_f); //V double y_g_f = (Srgb_f * 1.000 / Sy_f); double u_g_f = (Srgb_f * (Kb - 1) * Kb / Kg / Suv_f); double v_g_f = (Srgb_f * (Kr - 1) * Kr / Kg / Suv_f); double y_r_f = (Srgb_f * 1.000 / Sy_f); double u_r_f = (Srgb_f * 0.000 / Suv_f); double v_r_f = (Srgb_f * (1 - Kr) / Suv_f); double offset_y_f = -Oy_f; // negative, it will be added in the conversion, so we store the negative here double offset_rgb_f = Orgb_f; matrix.y_b_f = (float)(y_b_f); matrix.u_b_f = (float)(u_b_f); matrix.v_b_f = (float)(v_b_f); matrix.y_g_f = (float)(y_g_f); matrix.u_g_f = (float)(u_g_f); matrix.v_g_f = (float)(v_g_f); matrix.y_r_f = (float)(y_r_f); matrix.u_r_f = (float)(u_r_f); matrix.v_r_f = (float)(v_r_f); matrix.offset_y_f = (float)offset_y_f; matrix.offset_rgb_f = (float)offset_rgb_f; matrix.y_b = round_coeff(mulfac * y_b_f); matrix.u_b = round_coeff(mulfac * u_b_f); matrix.v_b = round_coeff(mulfac * v_b_f); matrix.y_g = round_coeff(mulfac * y_g_f); matrix.u_g = round_coeff(mulfac * u_g_f); matrix.v_g = round_coeff(mulfac * v_g_f); matrix.y_r = round_coeff(mulfac * y_r_f); matrix.u_r = round_coeff(mulfac * u_r_f); matrix.v_r = round_coeff(mulfac * v_r_f); matrix.offset_y = round_coeff(offset_y_f); matrix.offset_rgb = round_coeff(offset_rgb_f); // in: yuv. out: rgb matrix.offset_in = matrix.offset_y; matrix.offset_in_f = matrix.offset_y_f; matrix.offset_out = matrix.offset_rgb; matrix.offset_out_f = matrix.offset_rgb_f; } bool GetKrKb(int matrix, double& Kr, double& Kb) { switch (matrix) { case AVS_MATRIX_BT470_BG: case AVS_MATRIX_ST170_M: Kr = 0.299; Kb = 0.114; return true; case AVS_MATRIX_BT709: Kr = 0.2126; Kb = 0.0722; return true; case AVS_MATRIX_BT2020_NCL: case AVS_MATRIX_BT2020_CL: Kr = 0.2627; Kb = 0.0593; return true; case AVS_MATRIX_BT470_M: Kr = 0.3; Kb = 0.11; return true; case AVS_MATRIX_ST240_M: Kr = 0.212; Kb = 0.087; return true; case AVS_MATRIX_AVERAGE: Kr = 1.0 / 3; Kb = 1.0 / 3; return true; default: return false; } } bool do_BuildMatrix_Rgb2Yuv(int _Matrix, int _ColorRange, int _ColorRange_Out, int int_arith_shift, int bits_per_pixel, ConversionMatrix& matrix) { if (_ColorRange != ColorRange_Compat_e::AVS_COLORRANGE_FULL && _ColorRange != ColorRange_Compat_e::AVS_COLORRANGE_LIMITED) return false; if (_ColorRange_Out != ColorRange_Compat_e::AVS_COLORRANGE_FULL && _ColorRange_Out != ColorRange_Compat_e::AVS_COLORRANGE_LIMITED) return false; const bool is_full_s = _ColorRange == ColorRange_Compat_e::AVS_COLORRANGE_FULL; const bool is_full_d = _ColorRange_Out == ColorRange_Compat_e::AVS_COLORRANGE_FULL; // Special cases not handled by GetKrKb if (_Matrix == Matrix_e::AVS_MATRIX_RGB) { // copies Green to Y and sets UV to 0 BuildMatrix_Rgb2Yuv_core(0.0, 0.0, int_arith_shift, is_full_s, is_full_d, bits_per_pixel, matrix); return true; } if (_Matrix == Matrix_e::AVS_MATRIX_ICTCP || _Matrix == Matrix_e::AVS_MATRIX_YCGCO) return false; // not supported double Kr, Kb; if (!GetKrKb(_Matrix, Kr, Kb)) return false; BuildMatrix_Rgb2Yuv_core(Kr, Kb, int_arith_shift, is_full_s, is_full_d, bits_per_pixel, matrix); return true; } bool do_BuildMatrix_Yuv2Rgb(int _Matrix, int _ColorRange, int _ColorRange_Out, int int_arith_shift, int bits_per_pixel, ConversionMatrix& matrix) { if (_ColorRange != ColorRange_Compat_e::AVS_COLORRANGE_FULL && _ColorRange != ColorRange_Compat_e::AVS_COLORRANGE_LIMITED) return false; if (_ColorRange_Out != ColorRange_Compat_e::AVS_COLORRANGE_FULL && _ColorRange_Out != ColorRange_Compat_e::AVS_COLORRANGE_LIMITED) return false; const bool is_full_s = _ColorRange == ColorRange_Compat_e::AVS_COLORRANGE_FULL; const bool is_full_d = _ColorRange_Out == ColorRange_Compat_e::AVS_COLORRANGE_FULL; // Special cases not handled by GetKrKb if (_Matrix == Matrix_e::AVS_MATRIX_RGB) { BuildMatrix_Yuv2Rgb_core(0.0, 0.0, int_arith_shift, is_full_s, is_full_d, bits_per_pixel, matrix); return true; } if (_Matrix == Matrix_e::AVS_MATRIX_ICTCP || _Matrix == Matrix_e::AVS_MATRIX_YCGCO) return false; // not supported double Kr, Kb; if (!GetKrKb(_Matrix, Kr, Kb)) return false; BuildMatrix_Yuv2Rgb_core(Kr, Kb, int_arith_shift, is_full_s, is_full_d, bits_per_pixel, matrix); return true; } ================================================ FILE: avs_core/convert/convert_matrix.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __Convert_matrix_H__ #define __Convert_matrix_H__ #include "../core/internal.h" struct ConversionMatrix { int y_r, y_g, y_b; // for grayscale conversion these may not needed int u_r, u_g, u_b; int v_r, v_g, v_b; float y_r_f, y_g_f, y_b_f; float u_r_f, u_g_f, u_b_f; float v_r_f, v_g_f, v_b_f; int offset_y; float offset_y_f; int offset_rgb; float offset_rgb_f; // and the w/o the y/rgb suffix, supporting yuv-yuv or rgb-rgb fused matrix calculations. int offset_in; float offset_in_f; int offset_out; float offset_out_f; // Helper values for exact 32-bit target for hybric calculations, where // conversion to 32-bits is done after the integer-integer conversion. // E.g. yuv X-bit -> rgb X-bit -> rgb 32-bit float target_span_f; float target_span_f_32; float offset_out_f_32; }; bool GetKrKb(int matrix, double& Kr, double& Kb); bool do_BuildMatrix_Rgb2Yuv(int _Matrix, int _ColorRange, int _ColorRange_Out, int int_arith_shift, int bits_per_pixel, ConversionMatrix& matrix); bool do_BuildMatrix_Yuv2Rgb(int _Matrix, int _ColorRange, int _ColorRange_Out, int int_arith_shift, int bits_per_pixel, ConversionMatrix& matrix); /***************************************************** ******* Colorspace Single-Byte Conversions ****** ****************************************************/ // useful to other filters inline int RGB2YUV_Rec601(int rgb) // limited range { const int cyb = int(0.114*219/255*65536+0.5); const int cyg = int(0.587*219/255*65536+0.5); const int cyr = int(0.299*219/255*65536+0.5); // y can't overflow int y = (cyb*(rgb&255) + cyg*((rgb>>8)&255) + cyr*((rgb>>16)&255) + 0x108000) >> 16; int scaled_y = (y - 16) * int(255.0/219.0*65536+0.5); int b_y = ((rgb&255) << 16) - scaled_y; int u = ScaledPixelClip((b_y >> 10) * int(1/2.018*1024+0.5) + 0x800000); int r_y = (rgb & 0xFF0000) - scaled_y; int v = ScaledPixelClip((r_y >> 10) * int(1/1.596*1024+0.5) + 0x800000); return ((y*256+u)*256+v) | (rgb & 0xff000000); } #endif // __Convert_matrix_H__ ================================================ FILE: avs_core/convert/convert_planar.cpp ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. // ConvertPlanar (c) 2005 by Klaus Post #include "convert.h" #include "convert_matrix.h" #include "convert_helper.h" #include "convert_planar.h" #ifdef INTEL_INTRINSICS #include "intel/convert_planar_sse.h" #include "intel/convert_planar_avx2.h" #endif #include "convert_bits.h" #include "../filters/resample.h" #include "../filters/planeswap.h" #include "../filters/field.h" #ifdef AVS_WINDOWS #include #else #include #endif #include #include #include #include DISABLE_WARNING_PUSH DISABLE_WARNING_UNREFERENCED_LOCAL_VARIABLE template void fill_chroma(uint8_t * dstp_u, uint8_t * dstp_v, int height, int row_size, int pitch, pixel_t val) { if (pitch == row_size) { size_t size = height * pitch / sizeof(pixel_t); std::fill_n(reinterpret_cast(dstp_u), size, val); std::fill_n(reinterpret_cast(dstp_v), size, val); } else { size_t size = row_size / sizeof(pixel_t); for (int i = 0; i < height; i++) { std::fill_n(reinterpret_cast(dstp_u), size, val); std::fill_n(reinterpret_cast(dstp_v), size, val); dstp_u += pitch; dstp_v += pitch; } } } template void fill_plane(uint8_t * dstp, int height, int row_size, int pitch, pixel_t val) { if (pitch == row_size) { size_t size = height * pitch / sizeof(pixel_t); std::fill_n(reinterpret_cast(dstp), size, val); } else { size_t size = row_size / sizeof(pixel_t); for (int i = 0; i < height; i++) { std::fill_n(reinterpret_cast(dstp), size, val); dstp += pitch; } } } // specialize it template void fill_plane(uint8_t * dstp, int height, int row_size, int pitch, uint8_t val); template void fill_plane(uint8_t * dstp, int height, int row_size, int pitch, uint16_t val); template void fill_plane(uint8_t * dstp, int height, int row_size, int pitch, float val); template void fill_chroma(uint8_t * dstp_u, uint8_t * dstp_v, int height, int row_size, int pitch, uint8_t val); template void fill_chroma(uint8_t * dstp_u, uint8_t * dstp_v, int height, int row_size, int pitch, uint16_t val); template void fill_chroma(uint8_t * dstp_u, uint8_t * dstp_v, int height, int row_size, int pitch, float val); // ConvertToY::ConvertToY moved into ConvertPlanarToGeneric, since the conversion logic and parameters overlap with -->444 Conversion, we just need only Y. // Legacy formats (packed RGB/YUY2) are handled uniformly inside. AVSValue __cdecl ConvertToPlanarGeneric::CreateY(AVSValue args, void* user_data, IScriptEnvironment* env) { bool only_8bit = reinterpret_cast(user_data) == 0; PClip clip = args[0].AsClip(); // 0 1 2 3 // c[matrix]s[bits]i[quality]b if (only_8bit) { // ConvertToY8() syntax if (args[2].Defined() && args[2].AsInt() != 8) env->ThrowError("ConvertToY8: only 8 bit output supported. " "Use ConvertToY for higher bit depth."); } // 1.) One single route: planar constructor, where YUY2 is converted to Y8 if needed // 2.) If Y, reason to not return it right now: // - possible bit-depth conversion, // - optional Y-Y future matrix (auto:full->auto:limited) syntax conversion) // We use the very same logic as for ConvertToYV24/YUV444, ConvertToYV16/YUV422, ConvertToYV12/YUV420 if (only_8bit) { // ConvertToY8() syntax, force 8 bit output} AVSValue new_args[4] = { args[0], args[1], AVSValue(8), args[3] }; AVSValue new_args_val(new_args, 4); return Create(new_args_val, "ConvertToY", only_8bit, false /*to_yuva*/, env); } else { return Create(args, "ConvertToY", only_8bit, false /*to_yuva*/, env); } } /***************************************************** * ConvertRGBToYUV444 or simply Y only (when to_y=true) ******************************************************/ ConvertRGBToYUV444::ConvertRGBToYUV444(PClip src, const char *matrix_name, bool keep_packedrgb_alpha, int _target_bit_depth, bool _quality, bool& bitdepthConverted, bool _to_y, IScriptEnvironment* env) : GenericVideoFilter(src), target_bit_depth(_target_bit_depth), quality(_quality), conv_function(nullptr), conv_function_chroma(nullptr), conv_function_a(nullptr), to_y(_to_y) { if (!vi.IsRGB()) env->ThrowError("ConvertRGBToYV24/YUV444: Only RGB data input accepted"); if (vi.IsRGB48() || vi.IsRGB64()) env->ThrowError("ConvertRGBToYV24/YUV444: internal error: packed 16 bit not supported, must be converted to RGBP(A)16"); // ChromaInPlacement parameter exists, (default none/-1) + input frame properties; 'left'-ish _ChromaLocation is allowed, checked later auto frame0 = src->GetFrame(0, env); const AVSMap* props = env->getFramePropsRO(frame0); // input _ColorRange frame property can appear for RGB source (studio range limited rgb) matrix_parse_merge_with_props(true /*in rgb*/, false /*out yuv*/, matrix_name, props, theMatrix, theColorRange, theOutColorRange, env); const int shift = 15; // internally 15 bits precision, still no overflow in calculations int bits_per_pixel = vi.BitsPerComponent(); source_bit_depth = bits_per_pixel; if (!do_BuildMatrix_Rgb2Yuv(theMatrix, theColorRange, theOutColorRange, shift, source_bit_depth, /*ref*/matrix)) env->ThrowError("ConvertRGBToYV24/YUV444: Unknown matrix."); theColorRange = theOutColorRange; // final frame property // target_bit_depth == -1: no conversion required const bool need_bitdepth_conversion = (target_bit_depth != -1); // get alpha converter, GetFrame is using that if alpha must be depth-converterd and not only copied if (need_bitdepth_conversion) { // supported conversions: // 8-16-bits any range to 8-16, 32 bits any range bitdepthConverted = true; if (!to_y) { // single plane Y only has no alpha #ifdef INTEL_INTRINSICS const bool sse2 = !!(env->GetCPUFlags() & CPUF_SSE2); const bool sse4 = !!(env->GetCPUFlags() & CPUF_SSE4_1); const bool avx2 = !!(env->GetCPUFlags() & CPUF_AVX2); #endif // we really need only alpha conversion function const bool fulls = true; // alpha is always full range const bool fulld = true; // alpha is always full range const int dither_mode = -1; #ifdef INTEL_INTRINSICS get_convert_any_bits_functions(dither_mode, source_bit_depth, target_bit_depth, fulls, fulld, sse2, sse4, avx2, conv_function, conv_function_chroma, conv_function_a); #else get_convert_any_bits_functions(dither_mode, source_bit_depth, target_bit_depth, fulls, fulld, conv_function, conv_function_chroma, conv_function_a); #endif } } else { bitdepthConverted = false; target_bit_depth = source_bit_depth; } isPlanarRGBfamily = vi.IsPlanarRGB() || vi.IsPlanarRGBA(); targetHasAlpha = vi.IsPlanarRGBA() || (keep_packedrgb_alpha && (vi.IsRGB32() || vi.IsRGB64())); // for packed RGB it depends: ConvertToYUVAxxx() can force YUVA target option if (isPlanarRGBfamily) { if (to_y) { // --> Y pixel_step = -1; switch (target_bit_depth) { case 8: vi.pixel_type = VideoInfo::CS_Y8; break; case 10: vi.pixel_type = VideoInfo::CS_Y10; break; case 12: vi.pixel_type = VideoInfo::CS_Y12; break; case 14: vi.pixel_type = VideoInfo::CS_Y14; break; case 16: vi.pixel_type = VideoInfo::CS_Y16; break; case 32: vi.pixel_type = VideoInfo::CS_Y32; break; } } else { // --> 444(4) pixel_step = targetHasAlpha ? -2 : -1; switch (target_bit_depth) { case 8: vi.pixel_type = targetHasAlpha ? VideoInfo::CS_YUVA444 : VideoInfo::CS_YV24; break; case 10: vi.pixel_type = targetHasAlpha ? VideoInfo::CS_YUVA444P10 : VideoInfo::CS_YUV444P10; break; case 12: vi.pixel_type = targetHasAlpha ? VideoInfo::CS_YUVA444P12 : VideoInfo::CS_YUV444P12; break; case 14: vi.pixel_type = targetHasAlpha ? VideoInfo::CS_YUVA444P14 : VideoInfo::CS_YUV444P14; break; case 16: vi.pixel_type = targetHasAlpha ? VideoInfo::CS_YUVA444P16 : VideoInfo::CS_YUV444P16; break; case 32: vi.pixel_type = targetHasAlpha ? VideoInfo::CS_YUVA444PS : VideoInfo::CS_YUV444PS; break; } } } else { // packed RGB24/32/48/64 // for compatibility reasons ConvertToYUVxxx target is not YUVA even // if original has alpha, such as RGB32. // Unlike ConvertToYUVA which can force keeping RGB32's or RGB64's alpha // must be the same, bit depth change is supported only from planar rgb if (bits_per_pixel != target_bit_depth) env->ThrowError("ConvertRGBToYV24/YUV444: bit depth change is only supported from planar RGB input"); pixel_step = vi.BytesFromPixels(1); // 3,4 for packed 8 bit, 6,8 for switch(vi.ComponentSize()) { case 1: vi.pixel_type = targetHasAlpha ? VideoInfo::CS_YUVA444 : VideoInfo::CS_YV24; break; case 2: vi.pixel_type = targetHasAlpha ? VideoInfo::CS_YUVA444P16 : VideoInfo::CS_YUV444P16; break; } } } #if 0 // Kept for reference template static void convert_rgb24or32_to_yuv444_c(BYTE* dstY, BYTE* dstU, BYTE* dstV, BYTE* dstA, const BYTE* srcp, size_t Ypitch, size_t UVpitch, size_t Apitch, size_t Spitch, size_t width, size_t height, const ConversionMatrix& m) { const bool has_offset_rgb = 0 != m.offset_rgb; // RGB24 (pixel_step=3) // RGB32 (pixel_step=4) optional copyalpha srcp += Spitch * (height - 1); // We start at last line const size_t Sstep = Spitch + width * pixel_step; for (size_t y = 0; y < height; y++) { for (size_t x = 0; x < width; x++) { int b = srcp[0]; int g = srcp[1]; int r = srcp[2]; if (has_offset_rgb) { b = b + m.offset_rgb; g = g + m.offset_rgb; r = r + m.offset_rgb; } int Y = m.offset_y + (((int)m.y_b * b + (int)m.y_g * g + (int)m.y_r * r + 16384) >> 15); int U = 128 + (((int)m.u_b * b + (int)m.u_g * g + (int)m.u_r * r + 16384) >> 15); int V = 128 + (((int)m.v_b * b + (int)m.v_g * g + (int)m.v_r * r + 16384) >> 15); dstY[x] = PixelClip(Y); // All the safety we can wish for. dstU[x] = PixelClip(U); dstV[x] = PixelClip(V); if constexpr (copyalpha) { dstA[x] = srcp[3]; } srcp += pixel_step; } srcp -= Sstep; // packed RGBs are upside down dstY += Ypitch; dstU += UVpitch; dstV += UVpitch; if constexpr (copyalpha) { dstA += Apitch; } } } #endif PVideoFrame __stdcall ConvertRGBToYUV444::GetFrame(int n, IScriptEnvironment* env) { PVideoFrame src = child->GetFrame(n, env); PVideoFrame dst = env->NewVideoFrameP(vi, &src); auto props = env->getFramePropsRW(dst); update_Matrix_and_ColorRange(props, theMatrix, theColorRange, env); BYTE* dstY = dst->GetWritePtr(PLANAR_Y); BYTE* dstU = to_y ? nullptr : dst->GetWritePtr(PLANAR_U); BYTE* dstV = to_y ? nullptr : dst->GetWritePtr(PLANAR_V); const int Ypitch = dst->GetPitch(PLANAR_Y); const int UVpitch = to_y ? 0 : dst->GetPitch(PLANAR_U); const bool packedRGBsource = pixel_step > 0; if (packedRGBsource) { env->ThrowError("Packed RGB is no more allowed here, already preconverted to planar RGB. This is a bug."); } // here we do planar RGB only const int bits_per_pixel = source_bit_depth; // copy or fill alpha // Two places, at YUV444toPlanarRGB as well BYTE* dstpA; if (targetHasAlpha) { dstpA = dst->GetWritePtr(PLANAR_A); int heightA = dst->GetHeight(PLANAR_A); int rowsizeA = dst->GetRowSize(PLANAR_A); int dst_pitchA = dst->GetPitch(PLANAR_A); // simple copy if (src->GetRowSize(PLANAR_A)) { if (source_bit_depth == target_bit_depth) { // vi.IsYUVA() no-no! vi is already the target video type env->BitBlt(dstpA, dst_pitchA, src->GetReadPtr(PLANAR_A), src->GetPitch(PLANAR_A), src->GetRowSize(PLANAR_A_ALIGNED), src->GetHeight(PLANAR_A)); } else { // RGBPA target + different bit-depth // Alpha bit depth conversion needed, normal planes are done in-process. // we need only conv_function_a, proper dispatching from ConvertBits conv_function_a(src->GetReadPtr(PLANAR_A), dstpA, src->GetRowSize(PLANAR_A), heightA, src->GetPitch(PLANAR_A), dst_pitchA, source_bit_depth, target_bit_depth, -1); } } else { // fill default transparency switch (target_bit_depth) { case 1: fill_plane(dstpA, heightA, rowsizeA, dst_pitchA, 255); break; case 2: fill_plane(dstpA, heightA, rowsizeA, dst_pitchA, (1 << target_bit_depth) - 1); break; case 4: fill_plane(dstpA, heightA, rowsizeA, dst_pitchA, 1.0f); break; } } } const BYTE* srcp[3] = { src->GetReadPtr(PLANAR_G), src->GetReadPtr(PLANAR_B), src->GetReadPtr(PLANAR_R) }; const int srcPitch[3] = { src->GetPitch(PLANAR_G), src->GetPitch(PLANAR_B), src->GetPitch(PLANAR_R) }; BYTE* dstp[3] = { dstY, dstU, dstV }; int dstPitch[3] = { Ypitch, UVpitch, UVpitch }; const bool force_float = quality; // to Y if (to_y) { #ifdef INTEL_INTRINSICS if (env->GetCPUFlags() & CPUF_AVX2) { if (bits_per_pixel == 8) convert_yuv_to_planarrgb_avx2(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); else if (bits_per_pixel < 16) convert_yuv_to_planarrgb_avx2(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); else if (bits_per_pixel == 16) convert_yuv_to_planarrgb_avx2(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); else if (bits_per_pixel == 32) convert_yuv_to_planarrgb_avx2(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); return dst; } if (env->GetCPUFlags() & CPUF_SSE2) { if (bits_per_pixel == 8) convert_yuv_to_planarrgb_sse2(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); else if (bits_per_pixel < 16) convert_yuv_to_planarrgb_sse2(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); else if (bits_per_pixel == 16) convert_yuv_to_planarrgb_sse2(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); else if (bits_per_pixel == 32) convert_yuv_to_planarrgb_sse2(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); return dst; } #endif if (bits_per_pixel == 8) convert_yuv_to_planarrgb_c(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); else if (bits_per_pixel < 16) convert_yuv_to_planarrgb_c(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); else if (bits_per_pixel == 16) convert_yuv_to_planarrgb_c(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); else if (bits_per_pixel == 32) convert_yuv_to_planarrgb_c(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); return dst; } // to YUV #ifdef INTEL_INTRINSICS if (env->GetCPUFlags() & CPUF_AVX2) { if (bits_per_pixel == 8) convert_yuv_to_planarrgb_avx2(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); else if (bits_per_pixel < 16) convert_yuv_to_planarrgb_avx2(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); else if (bits_per_pixel == 16) convert_yuv_to_planarrgb_avx2(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); else if (bits_per_pixel == 32) convert_yuv_to_planarrgb_avx2(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); return dst; } if (env->GetCPUFlags() & CPUF_SSE2) { if (bits_per_pixel == 8) convert_yuv_to_planarrgb_sse2(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); else if (bits_per_pixel < 16) convert_yuv_to_planarrgb_sse2(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); else if (bits_per_pixel == 16) convert_yuv_to_planarrgb_sse2(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); else if (bits_per_pixel == 32) convert_yuv_to_planarrgb_sse2(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); return dst; } #endif if (bits_per_pixel == 8) convert_yuv_to_planarrgb_c(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); else if (bits_per_pixel < 16) convert_yuv_to_planarrgb_c(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); else if (bits_per_pixel == 16) convert_yuv_to_planarrgb_c(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); else if (bits_per_pixel == 32) convert_yuv_to_planarrgb_c(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); return dst; } /***************************************************** * ConvertYV24ToRGB * * (c) Klaus Post, 2005 * Generic 4:4:4(:4), 16 bit and Planar RGB(A) support 2016 by PF ******************************************************/ ConvertYUV444ToRGB::ConvertYUV444ToRGB(PClip src, const char *matrix_name, int _pixel_step, int _target_bit_depth, bool _quality, bool& bitdepthConverted, IScriptEnvironment* env) : GenericVideoFilter(src), pixel_step(_pixel_step), target_bit_depth(_target_bit_depth), quality(_quality), conv_function(nullptr), conv_function_chroma(nullptr), conv_function_a(nullptr) { if (!vi.Is444()) env->ThrowError("ConvertYUV444ToRGB: Only 4:4:4 data input accepted"); auto frame0 = child->GetFrame(0, env); const AVSMap* props = env->getFramePropsRO(frame0); matrix_parse_merge_with_props(false /*in yuv*/, true /*out rgb*/, matrix_name, props, theMatrix, theColorRange, theOutColorRange, env); // Good to know: // - When frame property "_ColorRange" exists, it overrides the default output RGB color range. // - PC.xxx old-style matrix names leave the color range unchanged, whether they exist or not. // - When using PC.xxx and YUV is limited => output RGB is narrow range (limited) // - Other non PC.xxx old matrix names: // - input range is defined by the matrix name, even if _ColorRange frame property exists // - output range is default Full for RGB, unless _ColorRange exists, when its value defines the output RGB range (full or limited/narrow) // - new style matrix definitions: see docs. Preserve what is not set, distinct :f or :l suffixes may tell the color range, not part of matrix name. // - Matrix coefficients still need to know input and output color range (full or limited/narrow) so by this time we have these two. const int shift = 13; // for integer arithmetic, over 13 bits would overflow the matrix elements/internal calculation const int bits_per_pixel = vi.BitsPerComponent(); source_bit_depth = bits_per_pixel; if (!do_BuildMatrix_Yuv2Rgb(theMatrix, theColorRange, theOutColorRange, shift, source_bit_depth, /*ref*/matrix)) env->ThrowError("ConvertYUV444ToRGB: Unknown matrix."); // Old comment: what is not implemented in-process, we do the conversion with invoked ConvertBits() // Now all source-target combinations are supported. // target_bit_depth == -1: no conversion required const bool need_bitdepth_conversion = (target_bit_depth != -1); // get alpha converter, GetFrame is using that if alpha must be depth-converterd and not only copied if (need_bitdepth_conversion) { // supported conversions: // 8-16-bits any range to 8-16, 32 bits any range bitdepthConverted = true; #ifdef INTEL_INTRINSICS const bool sse2 = !!(env->GetCPUFlags() & CPUF_SSE2); const bool sse4 = !!(env->GetCPUFlags() & CPUF_SSE4_1); const bool avx2 = !!(env->GetCPUFlags() & CPUF_AVX2); // we really need only alpha conversion function const bool fulls = true; // alpha is always full range const bool fulld = true; // alpha is always full range const int dither_mode = -1; #ifdef INTEL_INTRINSICS get_convert_any_bits_functions(dither_mode, source_bit_depth, target_bit_depth, fulls, fulld, sse2, sse4, avx2, conv_function, conv_function_chroma, conv_function_a); #else get_convert_any_bits_functions(dither_mode, source_bit_depth, target_bit_depth, fulls, fulld, conv_function, conv_function_chroma, conv_function_a); #endif #endif } else { bitdepthConverted = false; target_bit_depth = source_bit_depth; } theOutMatrix = Matrix_e::AVS_MATRIX_RGB; switch (pixel_step) { case -1: case -2: // target is planar RGB(A): all bit depths supported { const bool hasAlpha = (pixel_step == -2); switch (target_bit_depth) { case 8: vi.pixel_type = hasAlpha ? VideoInfo::CS_RGBAP : VideoInfo::CS_RGBP; break; case 10: vi.pixel_type = hasAlpha ? VideoInfo::CS_RGBAP10 : VideoInfo::CS_RGBP10; break; case 12: vi.pixel_type = hasAlpha ? VideoInfo::CS_RGBAP12 : VideoInfo::CS_RGBP12; break; case 14: vi.pixel_type = hasAlpha ? VideoInfo::CS_RGBAP14 : VideoInfo::CS_RGBP14; break; case 16: vi.pixel_type = hasAlpha ? VideoInfo::CS_RGBAP16 : VideoInfo::CS_RGBP16; break; case 32: vi.pixel_type = hasAlpha ? VideoInfo::CS_RGBAPS : VideoInfo::CS_RGBPS; break; default: env->ThrowError("ConvertYUV444ToRGB: invalid vi.BitsPerComponent(): %d", vi.BitsPerComponent()); } } break; case 3: vi.pixel_type = VideoInfo::CS_BGR24; break; case 4: vi.pixel_type = VideoInfo::CS_BGR32; break; case 6: vi.pixel_type = VideoInfo::CS_BGR48; break; case 8: vi.pixel_type = VideoInfo::CS_BGR64; break; default: env->ThrowError("ConvertYUV444ToRGB: invalid pixel step: %d", pixel_step); } } template static void convert_yv24_to_rgb_c(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE* srcV, const BYTE* srcA, int dst_pitch, int src_pitch_y, int src_pitch_uv, int src_pitch_a, int width, int height, const ConversionMatrix& matrix) { dstp += dst_pitch * (height - 1); // We start at last line. Packed RGB is bottom-up. auto round_mask_plus_rgb_offset_i = 4096 + (matrix.offset_rgb << 13); if constexpr (pixel_step == 4) { // RGB32 for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { int Y = srcY[x] + matrix.offset_y; int U = srcU[x] - 128; int V = srcV[x] - 128; uint8_t a = source_has_alpha ? srcA[x] : 255; // YUVA aware int b = (((int)matrix.y_b * Y + (int)matrix.u_b * U + (int)matrix.v_b * V + round_mask_plus_rgb_offset_i) >> 13); int g = (((int)matrix.y_g * Y + (int)matrix.u_g * U + (int)matrix.v_g * V + round_mask_plus_rgb_offset_i) >> 13); int r = (((int)matrix.y_r * Y + (int)matrix.u_r * U + (int)matrix.v_r * V + round_mask_plus_rgb_offset_i) >> 13); dstp[x * 4 + 0] = PixelClip(b); // All the safety we can wish for. dstp[x * 4 + 1] = PixelClip(g); // Probably needed here. dstp[x * 4 + 2] = PixelClip(r); dstp[x * 4 + 3] = a; // alpha } dstp -= dst_pitch; srcY += src_pitch_y; srcU += src_pitch_uv; srcV += src_pitch_uv; srcA += src_pitch_a; } } else if constexpr (pixel_step == 3) { // RGB24 const int Dstep = dst_pitch + (width * pixel_step); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { int Y = srcY[x] + matrix.offset_y; int U = srcU[x] - 128; int V = srcV[x] - 128; int b = (((int)matrix.y_b * Y + (int)matrix.u_b * U + (int)matrix.v_b * V + round_mask_plus_rgb_offset_i) >> 13); int g = (((int)matrix.y_g * Y + (int)matrix.u_g * U + (int)matrix.v_g * V + round_mask_plus_rgb_offset_i) >> 13); int r = (((int)matrix.y_r * Y + (int)matrix.u_r * U + (int)matrix.v_r * V + round_mask_plus_rgb_offset_i) >> 13); dstp[0] = PixelClip(b); // All the safety we can wish for. dstp[1] = PixelClip(g); // Probably needed here. dstp[2] = PixelClip(r); dstp += pixel_step; } dstp -= Dstep; srcY += src_pitch_y; srcU += src_pitch_uv; srcV += src_pitch_uv; } } } // C reference implementation matching AVX2/SSE2 logic with all conversion directions template static void convert_yuv_to_planarrgb_c_internal(BYTE* dstp[3], int dstPitch[3], const BYTE* srcp[3], const int srcPitch[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target) { // int64_t needed for exact 16 bit pixels in integer workflow // float input always uses float workflow typedef typename std::conditional::type safe_int_t; constexpr int INT_ARITH_SHIFT = (direction == ConversionDirection::YUV_TO_RGB) ? 13 : (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::RGB_TO_Y) ? 15 : (direction == ConversionDirection::YUV_TO_YUV) ? 14 : 13; // Validate: float input requires FORCE_FLOAT conversion type static_assert(!(std::is_floating_point::value && conv_type != YuvRgbConversionType::FORCE_FLOAT), "FORCE_FLOAT conversion type is required for float input pixel type"); constexpr bool force_float = conv_type == YuvRgbConversionType::FORCE_FLOAT; constexpr bool final_is_float = std::is_floating_point::value; constexpr bool need_int_conversion_narrow_range = conv_type == YuvRgbConversionType::BITCONV_INT_LIMITED; constexpr bool need_int_conversion_full_range = conv_type == YuvRgbConversionType::BITCONV_INT_FULL; constexpr bool need_int_conversion = conv_type == YuvRgbConversionType::BITCONV_INT_FULL || conv_type == YuvRgbConversionType::BITCONV_INT_LIMITED || (conv_type == YuvRgbConversionType::FORCE_FLOAT && !final_is_float); const bool float_matrix_workflow = force_float || need_int_conversion_full_range; // quasi-constexpr, may help optimizer if constexpr (std::is_same::value) bits_per_pixel = 8; if constexpr (std::is_same::value) bits_per_pixel_target = 8; if constexpr (std::is_same::value && !lessthan16bit) bits_per_pixel = 16; if constexpr (std::is_same::value && !lessthan16bit_target) bits_per_pixel_target = 16; if constexpr (conv_type == YuvRgbConversionType::NATIVE_INT) bits_per_pixel_target = bits_per_pixel; const int bit_diff = need_int_conversion ? bits_per_pixel_target - bits_per_pixel : 0; const int target_shift = need_int_conversion_narrow_range ? INT_ARITH_SHIFT - bit_diff : INT_ARITH_SHIFT; const int ROUNDER = (final_is_float || float_matrix_workflow) ? 0 : (1 << (target_shift - 1)); const float out_offset_f = m.offset_out_f_32; const int half_pixel_offset = 1 << (bits_per_pixel - 1); const int half_pixel_offset_target = 1 << (bits_per_pixel_target - 1); const int max_pixel_value_target = (1 << bits_per_pixel_target) - 1; bits_conv_constants conversion_ranges; const bool full_scale_d = m.offset_out == 0; get_bits_conv_constants(conversion_ranges, false, full_scale_d, full_scale_d, bits_per_pixel, bits_per_pixel_target); constexpr int int_arithmetic_shift = 1 << INT_ARITH_SHIFT; float scale_f = conversion_ranges.mul_factor; if (final_is_float && !float_matrix_workflow) scale_f = scale_f / int_arithmetic_shift; const int offset_in_scalar = m.offset_in; const int offset_out_scalar = m.offset_out; int round_mask_plus_offset_out_i; int round_mask_plus_offset_out_chroma_i; if constexpr (!float_matrix_workflow) { round_mask_plus_offset_out_i = final_is_float ? 0 : ROUNDER + (offset_out_scalar << INT_ARITH_SHIFT); round_mask_plus_offset_out_chroma_i = final_is_float ? 0 : ROUNDER + (half_pixel_offset << INT_ARITH_SHIFT); } for (int y = 0; y < height; y++) { const pixel_t* src0 = reinterpret_cast(srcp[0]); // Y or G const pixel_t* src1 = reinterpret_cast(srcp[1]); // U or B const pixel_t* src2 = reinterpret_cast(srcp[2]); // V or R pixel_t_dst* d0 = reinterpret_cast(dstp[0]); // G or Y pixel_t_dst* d1 = reinterpret_cast(dstp[1]); // B or U pixel_t_dst* d2 = reinterpret_cast(dstp[2]); // R or V for (int x = 0; x < width; x++) { float in0_f, in1_f, in2_f; int in0_i, in1_i, in2_i; // Load inputs if constexpr (std::is_floating_point::value) { in0_f = src0[x]; in1_f = src1[x]; in2_f = src2[x]; } else { in0_i = static_cast(src0[x]); in1_i = static_cast(src1[x]); in2_i = static_cast(src2[x]); } float out0_f, out1_f, out2_f; safe_int_t out0_raw, out1_raw, out2_raw; // Keep as int64_t for 16-bit if constexpr (float_matrix_workflow) { // Float workflow if constexpr (!std::is_floating_point::value) { // Convert integer to float and apply input offset if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::YUV_TO_YUV) { // YUV input in0_f = static_cast(in0_i + offset_in_scalar); // Y in1_f = static_cast(in1_i - half_pixel_offset); // U in2_f = static_cast(in2_i - half_pixel_offset); // V } else if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::RGB_TO_Y || direction == ConversionDirection::RGB_TO_RGB) { // RGB input in0_f = static_cast(in0_i + offset_in_scalar); // G in1_f = static_cast(in1_i + offset_in_scalar); // B in2_f = static_cast(in2_i + offset_in_scalar); // R } } else { // Float input - apply offset if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::YUV_TO_YUV) { in0_f += m.offset_in_f; // Y only } else { in0_f += m.offset_in_f; // G in1_f += m.offset_in_f; // B in2_f += m.offset_in_f; // R } } // Matrix multiply - coefficient order depends on direction if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::YUV_TO_YUV) { // YUV input: in0=Y, in1=U, in2=V out0_f = (m.y_g_f * in0_f + m.u_g_f * in1_f + m.v_g_f * in2_f) * scale_f; // G or Y out1_f = (m.y_b_f * in0_f + m.u_b_f * in1_f + m.v_b_f * in2_f) * scale_f; // B or U out2_f = (m.y_r_f * in0_f + m.u_r_f * in1_f + m.v_r_f * in2_f) * scale_f; // R or V } else if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::RGB_TO_RGB) { // RGB input: in0=G, in1=B, in2=R out0_f = (m.y_g_f * in0_f + m.y_b_f * in1_f + m.y_r_f * in2_f) * scale_f; // Y or G out1_f = (m.u_g_f * in0_f + m.u_b_f * in1_f + m.u_r_f * in2_f) * scale_f; // U or B out2_f = (m.v_g_f * in0_f + m.v_b_f * in1_f + m.v_r_f * in2_f) * scale_f; // V or R } else if constexpr (direction == ConversionDirection::RGB_TO_Y) { // RGB input: in0=G, in1=B, in2=R out0_f = (m.y_g_f * in0_f + m.y_b_f * in1_f + m.y_r_f * in2_f) * scale_f; // Y or G } // Add output offset if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::RGB_TO_RGB) { // RGB output: same offset for all float rgb_offset_scaled = m.offset_out_f * scale_f; out0_f += rgb_offset_scaled; out1_f += rgb_offset_scaled; out2_f += rgb_offset_scaled; } else if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::YUV_TO_YUV) { // YUV output: different offsets float y_offset_scaled = m.offset_out_f * scale_f; float uv_center = final_is_float ? 0.0f : (float)half_pixel_offset_target; out0_f += y_offset_scaled; // Y out1_f += uv_center; // U out2_f += uv_center; // V } else if constexpr (direction == ConversionDirection::RGB_TO_Y) { // Y output: single Y offsets float y_offset_scaled = m.offset_out_f * scale_f; out0_f += y_offset_scaled; // Y } if constexpr (final_is_float) { d0[x] = static_cast(out0_f); if constexpr (direction != ConversionDirection::RGB_TO_Y) { d1[x] = static_cast(out1_f); d2[x] = static_cast(out2_f); } } else { // Convert to integer with rounding int out0_i = static_cast(out0_f + 0.5f); out0_i = std::clamp(out0_i, 0, max_pixel_value_target); d0[x] = static_cast(out0_i); if constexpr (direction != ConversionDirection::RGB_TO_Y) { int out1_i = static_cast(out1_f + 0.5f); int out2_i = static_cast(out2_f + 0.5f); out1_i = std::clamp(out1_i, 0, max_pixel_value_target); out2_i = std::clamp(out2_i, 0, max_pixel_value_target); d1[x] = static_cast(out1_i); d2[x] = static_cast(out2_i); } } } else { // Integer workflow // Apply input offset and centering if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::YUV_TO_YUV) { // YUV input in0_i = in0_i + offset_in_scalar; // Y in1_i = in1_i - half_pixel_offset; // U (centered) in2_i = in2_i - half_pixel_offset; // V (centered) } else if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::RGB_TO_RGB || direction == ConversionDirection::RGB_TO_Y) { // RGB input in0_i = in0_i + offset_in_scalar; // G in1_i = in1_i + offset_in_scalar; // B in2_i = in2_i + offset_in_scalar; // R } // Matrix multiply with appropriate rounding/offset int round_and_offset_0, round_and_offset_1, round_and_offset_2; if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::RGB_TO_RGB) { // RGB output: same offset for all round_and_offset_0 = round_mask_plus_offset_out_i; round_and_offset_1 = round_mask_plus_offset_out_i; round_and_offset_2 = round_mask_plus_offset_out_i; } else if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::YUV_TO_YUV) { // YUV output: different offsets round_and_offset_0 = round_mask_plus_offset_out_i; // Y round_and_offset_1 = round_mask_plus_offset_out_chroma_i; // U round_and_offset_2 = round_mask_plus_offset_out_chroma_i; // V } else if constexpr (direction == ConversionDirection::RGB_TO_Y) { // Y output: single Y offset round_and_offset_0 = round_mask_plus_offset_out_i; // Y } if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::YUV_TO_YUV) { // YUV input: in0=Y, in1=U, in2=V out0_raw = (safe_int_t)m.y_g * in0_i + (safe_int_t)m.u_g * in1_i + (safe_int_t)m.v_g * in2_i + round_and_offset_0; out1_raw = (safe_int_t)m.y_b * in0_i + (safe_int_t)m.u_b * in1_i + (safe_int_t)m.v_b * in2_i + round_and_offset_1; out2_raw = (safe_int_t)m.y_r * in0_i + (safe_int_t)m.u_r * in1_i + (safe_int_t)m.v_r * in2_i + round_and_offset_2; } else if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::RGB_TO_RGB) { // RGB input: in0=G, in1=B, in2=R out0_raw = (safe_int_t)m.y_g * in0_i + (safe_int_t)m.y_b * in1_i + (safe_int_t)m.y_r * in2_i + round_and_offset_0; out1_raw = (safe_int_t)m.u_g * in0_i + (safe_int_t)m.u_b * in1_i + (safe_int_t)m.u_r * in2_i + round_and_offset_1; out2_raw = (safe_int_t)m.v_g * in0_i + (safe_int_t)m.v_b * in1_i + (safe_int_t)m.v_r * in2_i + round_and_offset_2; } else if constexpr (direction == ConversionDirection::RGB_TO_Y) { // RGB input: in0=G, in1=B, in2=R out0_raw = (safe_int_t)m.y_g * in0_i + (safe_int_t)m.y_b * in1_i + (safe_int_t)m.y_r * in2_i + round_and_offset_0; } if constexpr (final_is_float) { // Integer workflow + float output out0_f = static_cast(out0_raw) * scale_f + out_offset_f; if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::RGB_TO_RGB) { // offset for the rest two only RGB output out1_f = static_cast(out1_raw) * scale_f + out_offset_f; out2_f = static_cast(out2_raw) * scale_f + out_offset_f; } else if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::YUV_TO_YUV) { // for YUV the U and V float offset is different : 0.0f out1_f = static_cast(out1_raw) * scale_f; // U out2_f = static_cast(out2_raw) * scale_f; // V } d0[x] = static_cast(out0_f); if constexpr (direction != ConversionDirection::RGB_TO_Y) { d1[x] = static_cast(out1_f); d2[x] = static_cast(out2_f); } } else { // Integer workflow + integer output int out0_i = static_cast(out0_raw >> target_shift); out0_i = std::clamp(out0_i, 0, max_pixel_value_target); d0[x] = static_cast(out0_i); if constexpr (direction != ConversionDirection::RGB_TO_Y) { int out1_i = static_cast(out1_raw >> target_shift); int out2_i = static_cast(out2_raw >> target_shift); // We are in integer domain, no convenient SIMD packus! We cannot spare min-max clamp to constexpr (lessthan16bit_target) { // We need to do it always out1_i = std::clamp(out1_i, 0, max_pixel_value_target); out2_i = std::clamp(out2_i, 0, max_pixel_value_target); d1[x] = static_cast(out1_i); d2[x] = static_cast(out2_i); } } } } dstp[0] += dstPitch[0]; if constexpr (direction != ConversionDirection::RGB_TO_Y) { dstp[1] += dstPitch[1]; dstp[2] += dstPitch[2]; } srcp[0] += srcPitch[0]; srcp[1] += srcPitch[1]; srcp[2] += srcPitch[2]; } } // Dispatcher matching AVX2/SSE2 structure template void convert_yuv_to_planarrgb_c(BYTE* dstp[3], int dstPitch[3], const BYTE* srcp[3], const int srcPitch[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float) { // Handle forced float or float input if (force_float || std::is_floating_point::value) { if (bits_per_pixel_target == 8) { convert_yuv_to_planarrgb_c_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); } else if (bits_per_pixel_target < 16) { convert_yuv_to_planarrgb_c_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); } else if (bits_per_pixel_target == 16) { convert_yuv_to_planarrgb_c_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); } else { convert_yuv_to_planarrgb_c_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); } return; } if constexpr (!std::is_floating_point::value) { const bool need_conversion = bits_per_pixel_target != bits_per_pixel; if (!need_conversion) { convert_yuv_to_planarrgb_c_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); return; } const bool full_d = m.offset_out == 0; if (bits_per_pixel_target >= 8 && bits_per_pixel <= 16) { if (bits_per_pixel_target == 8) { if (full_d) convert_yuv_to_planarrgb_c_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); else convert_yuv_to_planarrgb_c_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); } else if (bits_per_pixel_target < 16) { if (full_d) convert_yuv_to_planarrgb_c_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); else convert_yuv_to_planarrgb_c_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); } else if (bits_per_pixel_target == 16) { if (full_d) convert_yuv_to_planarrgb_c_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); else convert_yuv_to_planarrgb_c_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); } else { convert_yuv_to_planarrgb_c_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); } } } } // Template instantiations for C version - all 4 directions // YUV_TO_RGB template void convert_yuv_to_planarrgb_c(BYTE* dstp[3], int dstPitch[3], const BYTE* srcp[3], const int srcPitch[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_c(BYTE* dstp[3], int dstPitch[3], const BYTE* srcp[3], const int srcPitch[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_c(BYTE* dstp[3], int dstPitch[3], const BYTE* srcp[3], const int srcPitch[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_c(BYTE* dstp[3], int dstPitch[3], const BYTE* srcp[3], const int srcPitch[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); // RGB_TO_YUV template void convert_yuv_to_planarrgb_c(BYTE* dstp[3], int dstPitch[3], const BYTE* srcp[3], const int srcPitch[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_c(BYTE* dstp[3], int dstPitch[3], const BYTE* srcp[3], const int srcPitch[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_c(BYTE* dstp[3], int dstPitch[3], const BYTE* srcp[3], const int srcPitch[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_c(BYTE* dstp[3], int dstPitch[3], const BYTE* srcp[3], const int srcPitch[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); // RGB_TO_Y template void convert_yuv_to_planarrgb_c(BYTE* dstp[3], int dstPitch[3], const BYTE* srcp[3], const int srcPitch[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_c(BYTE* dstp[3], int dstPitch[3], const BYTE* srcp[3], const int srcPitch[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_c(BYTE* dstp[3], int dstPitch[3], const BYTE* srcp[3], const int srcPitch[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_c(BYTE* dstp[3], int dstPitch[3], const BYTE* srcp[3], const int srcPitch[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); // YUV_TO_YUV template void convert_yuv_to_planarrgb_c(BYTE* dstp[3], int dstPitch[3], const BYTE* srcp[3], const int srcPitch[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_c(BYTE* dstp[3], int dstPitch[3], const BYTE* srcp[3], const int srcPitch[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_c(BYTE* dstp[3], int dstPitch[3], const BYTE* srcp[3], const int srcPitch[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_c(BYTE* dstp[3], int dstPitch[3], const BYTE* srcp[3], const int srcPitch[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); PVideoFrame __stdcall ConvertYUV444ToRGB::GetFrame(int n, IScriptEnvironment* env) { PVideoFrame src = child->GetFrame(n, env); PVideoFrame dst = env->NewVideoFrameP(vi, &src); auto props = env->getFramePropsRW(dst); update_Matrix_and_ColorRange(props, theOutMatrix, theOutColorRange, env); update_ChromaLocation(props, -1, env); // RGB target: delete _ChromaLocation const BYTE* srcY = src->GetReadPtr(PLANAR_Y); const BYTE* srcU = src->GetReadPtr(PLANAR_U); const BYTE* srcV = src->GetReadPtr(PLANAR_V); const BYTE* srcA = src->GetReadPtr(PLANAR_A); BYTE* dstp = dst->GetWritePtr(); const int src_pitch_y = src->GetPitch(PLANAR_Y); const int src_pitch_uv = src->GetPitch(PLANAR_U); const int src_pitch_a = src->GetPitch(PLANAR_A); // zero if no Alpha const int dst_pitch = dst->GetPitch(); // Legacy direct YV24 -> packed 8 bit RGB24/RGB32 // quality=true float-inside or bit-depth changing transformation is handled through planar RGB intermediate. if (pixel_step == 3 || pixel_step == 4) { #ifdef INTEL_INTRINSICS if (env->GetCPUFlags() & CPUF_AVX2) { if (pixel_step == 4) { // RGB32 if (src_pitch_a) // move alpha channel from YUVA convert_yv24_to_rgb_avx2<4, true>(dstp, srcY, srcU, srcV, srcA, dst_pitch, src_pitch_y, src_pitch_uv, src_pitch_a, vi.width, vi.height, matrix); else convert_yv24_to_rgb_avx2<4, false>(dstp, srcY, srcU, srcV, srcA, dst_pitch, src_pitch_y, src_pitch_uv, src_pitch_a, vi.width, vi.height, matrix); } else { // RGB24 convert_yv24_to_rgb_avx2<3, false>(dstp, srcY, srcU, srcV, srcA, dst_pitch, src_pitch_y, src_pitch_uv, src_pitch_a, vi.width, vi.height, matrix); } return dst; } else if (env->GetCPUFlags() & CPUF_SSE2) { if (pixel_step == 4) { if (src_pitch_a) // move alpha channel from YUVA convert_yv24_to_rgb_sse2<4, true>(dstp, srcY, srcU, srcV, srcA, dst_pitch, src_pitch_y, src_pitch_uv, src_pitch_a, vi.width, vi.height, matrix); else convert_yv24_to_rgb_sse2<4, false>(dstp, srcY, srcU, srcV, srcA, dst_pitch, src_pitch_y, src_pitch_uv, src_pitch_a, vi.width, vi.height, matrix); } else { if (env->GetCPUFlags() & CPUF_SSSE3) { convert_yv24_to_rgb_ssse3<3, false>(dstp, srcY, srcU, srcV, srcA, dst_pitch, src_pitch_y, src_pitch_uv, src_pitch_a, vi.width, vi.height, matrix); } else { convert_yv24_to_rgb_sse2<3, false>(dstp, srcY, srcU, srcV, srcA, dst_pitch, src_pitch_y, src_pitch_uv, src_pitch_a, vi.width, vi.height, matrix); } } return dst; } #ifdef X86_32 // packed RGB24 and RGB32 if ((src_pitch_a == 0) && (env->GetCPUFlags() & CPUF_MMX)) { if (pixel_step == 4) { convert_yv24_to_rgb_mmx<4>(dstp, srcY, srcU, srcV, dst_pitch, src_pitch_y, src_pitch_uv, vi.width, vi.height, matrix); } else { convert_yv24_to_rgb_mmx<3>(dstp, srcY, srcU, srcV, dst_pitch, src_pitch_y, src_pitch_uv, vi.width, vi.height, matrix); } return dst; } #endif #endif // Unoptimized C-code. // rgb24 or rgb32, packed RGB if (pixel_step == 3 || pixel_step == 4) { if (pixel_step == 4) { if (src_pitch_a) // move alpha channel from YUVA convert_yv24_to_rgb_c<4, true>(dstp, srcY, srcU, srcV, srcA, dst_pitch, src_pitch_y, src_pitch_uv, src_pitch_a, vi.width, vi.height, matrix); else convert_yv24_to_rgb_c<4, false>(dstp, srcY, srcU, srcV, srcA, dst_pitch, src_pitch_y, src_pitch_uv, src_pitch_a, vi.width, vi.height, matrix); } else { // 3 RGB24 convert_yv24_to_rgb_c<3, false>(dstp, srcY, srcU, srcV, srcA, dst_pitch, src_pitch_y, src_pitch_uv, src_pitch_a, vi.width, vi.height, matrix); } return dst; } } // YV24->RGB24/RGB32 // rgb48 or rgb64, packed RGB if (pixel_step == 6 || pixel_step == 8) { // cannot happen, handled earlier, RGB48/64 are post converted from RGB(A)P16 env->ThrowError("ConvertFrom 444: RGB48/64 conversion should have been handled earlier through planar RGB intermediate"); } if (pixel_step < 0) { // -1: RGBP -2:RGBAP // Common task: copy or fill alpha channel // YUV444 -> PlanarRGB // YUVA444 -> PlanarRGBA bool targetHasAlpha = pixel_step == -2; BYTE *dstpG = dst->GetWritePtr(PLANAR_G); BYTE *dstpB = dst->GetWritePtr(PLANAR_B); BYTE *dstpR = dst->GetWritePtr(PLANAR_R); // copy or fill alpha BYTE *dstpA; if (targetHasAlpha) { dstpA = dst->GetWritePtr(PLANAR_A); int heightA = dst->GetHeight(PLANAR_A); int rowsizeA = dst->GetRowSize(PLANAR_A); int dst_pitchA = dst->GetPitch(PLANAR_A); // simple copy if (src->GetRowSize(PLANAR_A)) { if (source_bit_depth == target_bit_depth) { // vi.IsYUVA() no-no! vi is already the target video type env->BitBlt(dstpA, dst_pitchA, src->GetReadPtr(PLANAR_A), src->GetPitch(PLANAR_A), src->GetRowSize(PLANAR_A_ALIGNED), src->GetHeight(PLANAR_A)); } else { // RGBPA target + different bit-depth // Alpha bit depth conversion needed, normal planes are done in-process. // we need only conv_function_a, proper dispatching from ConvertBits conv_function_a(src->GetReadPtr(PLANAR_A), dstpA, src->GetRowSize(PLANAR_A), heightA, src->GetPitch(PLANAR_A), dst_pitchA, source_bit_depth, target_bit_depth, -1); } } else { // fill default transparency switch (target_bit_depth) { case 1: fill_plane(dstpA, heightA, rowsizeA, dst_pitchA, 255); break; case 2: fill_plane(dstpA, heightA, rowsizeA, dst_pitchA, (1 << target_bit_depth) - 1); break; case 4: fill_plane(dstpA, heightA, rowsizeA, dst_pitchA, 1.0f); break; } } } int dst_pitchG = dst->GetPitch(PLANAR_G); int dst_pitchB = dst->GetPitch(PLANAR_B); int dst_pitchR = dst->GetPitch(PLANAR_R); // always start from source bit depth int bits_per_pixel = source_bit_depth; const BYTE* srcp[3] = { src->GetReadPtr(PLANAR_Y), src->GetReadPtr(PLANAR_U), src->GetReadPtr(PLANAR_V) }; const int srcPitch[3] = { src->GetPitch(PLANAR_Y), src->GetPitch(PLANAR_U), src->GetPitch(PLANAR_V) }; BYTE* dstp[3] = { dstpG, dstpB, dstpR }; int dstPitch[3] = { dst_pitchG, dst_pitchB, dst_pitchR }; // alpha is already handled above const bool force_float = quality; #ifdef INTEL_INTRINSICS if (env->GetCPUFlags() & CPUF_AVX2) { if (bits_per_pixel == 8) convert_yuv_to_planarrgb_avx2(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); else if (bits_per_pixel < 16) convert_yuv_to_planarrgb_avx2(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); else if (bits_per_pixel == 16) convert_yuv_to_planarrgb_avx2(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); else if (bits_per_pixel == 32) convert_yuv_to_planarrgb_avx2(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); return dst; } if (env->GetCPUFlags() & CPUF_SSE2) { if (bits_per_pixel == 8) convert_yuv_to_planarrgb_sse2(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); else if (bits_per_pixel < 16) convert_yuv_to_planarrgb_sse2(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); else if (bits_per_pixel == 16) convert_yuv_to_planarrgb_sse2(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); else if (bits_per_pixel == 32) convert_yuv_to_planarrgb_sse2(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); return dst; } #endif if (bits_per_pixel == 8) convert_yuv_to_planarrgb_c(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); else if (bits_per_pixel < 16) convert_yuv_to_planarrgb_c(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); else if (bits_per_pixel == 16) convert_yuv_to_planarrgb_c(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); else if (bits_per_pixel == 32) convert_yuv_to_planarrgb_c(dstp, dstPitch, srcp, srcPitch, vi.width, vi.height, matrix, bits_per_pixel, target_bit_depth, force_float); return dst; } return dst; } /************************************ * YUY2 to YV16 ************************************/ ConvertYUY2ToYV16_or_Y::ConvertYUY2ToYV16_or_Y(PClip src, bool _to_y, IScriptEnvironment* env) : GenericVideoFilter(src), to_y(_to_y) { if (!vi.IsYUY2()) env->ThrowError("ConvertYUY2ToYV16/Y: Only YUY2 is allowed as input"); vi.pixel_type = to_y ? VideoInfo::CS_Y8 : VideoInfo::CS_YV16; } static void convert_yuy2_to_y8_c(const BYTE* srcp, BYTE* dstp, size_t src_pitch, size_t dst_pitch, size_t width, size_t height) { for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { dstp[x] = srcp[x * 2]; } srcp += src_pitch; dstp += dst_pitch; } } static void convert_yuy2_to_yv16_c(const BYTE *srcp, BYTE *dstp_y, BYTE *dstp_u, BYTE *dstp_v, size_t src_pitch, size_t dst_pitch_y, size_t dst_pitch_uv, size_t width, size_t height) { width /= 2; for (size_t y = 0; y < height; ++y) { for (size_t x = 0; x < width; ++x) { dstp_y[x * 2] = srcp[x * 4 + 0]; dstp_y[x * 2 + 1] = srcp[x * 4 + 2]; dstp_u[x] = srcp[x * 4 + 1]; dstp_v[x] = srcp[x * 4 + 3]; } srcp += src_pitch; dstp_y += dst_pitch_y; dstp_u += dst_pitch_uv; dstp_v += dst_pitch_uv; } } PVideoFrame __stdcall ConvertYUY2ToYV16_or_Y::GetFrame(int n, IScriptEnvironment* env) { PVideoFrame src = child->GetFrame(n, env); PVideoFrame dst = env->NewVideoFrameP(vi, &src); const BYTE* srcP = src->GetReadPtr(); BYTE* dstY = dst->GetWritePtr(PLANAR_Y); if (to_y) { update_ChromaLocation(env->getFramePropsRW(dst), -1, env); // Y8 target: delete _ChromaLocation // YUY2 to Y8, luma only #ifdef INTEL_INTRINSICS if (env->GetCPUFlags() & CPUF_SSE2) { convert_yuy2_to_y8_sse2(srcP, dstY, src->GetPitch(), dst->GetPitch(PLANAR_Y), vi.width, vi.height); } else #endif { convert_yuy2_to_y8_c(srcP, dstY, src->GetPitch(), dst->GetPitch(PLANAR_Y), vi.width, vi.height); } return dst; } else { BYTE* dstU = dst->GetWritePtr(PLANAR_U); BYTE* dstV = dst->GetWritePtr(PLANAR_V); // YUY2 to YV16, separate luma and chroma #ifdef INTEL_INTRINSICS if (env->GetCPUFlags() & CPUF_SSE2) { convert_yuy2_to_yv16_sse2(srcP, dstY, dstU, dstV, src->GetPitch(), dst->GetPitch(PLANAR_Y), dst->GetPitch(PLANAR_U), vi.width, vi.height); } else #ifdef X86_32 if (env->GetCPUFlags() & CPUF_MMX) { convert_yuy2_to_yv16_mmx(srcP, dstY, dstU, dstV, src->GetPitch(), dst->GetPitch(PLANAR_Y), dst->GetPitch(PLANAR_U), vi.width, vi.height); } else #endif #endif { convert_yuy2_to_yv16_c(srcP, dstY, dstU, dstV, src->GetPitch(), dst->GetPitch(PLANAR_Y), dst->GetPitch(PLANAR_U), vi.width, vi.height); } } return dst; } AVSValue __cdecl ConvertYUY2ToYV16_or_Y::Create(AVSValue args, void*, IScriptEnvironment* env) { PClip clip = args[0].AsClip(); if (clip->GetVideoInfo().IsYV16()) return clip; return new ConvertYUY2ToYV16_or_Y(clip, false /*to_y*/, env); } /************************************ * YV16 to YUY2 ************************************/ ConvertYV16ToYUY2::ConvertYV16ToYUY2(PClip src, IScriptEnvironment* env) : GenericVideoFilter(src) { if (!vi.IsYV16()) env->ThrowError("ConvertYV16ToYUY2: Only YV16 is allowed as input"); vi.pixel_type = VideoInfo::CS_YUY2; } static void convert_yv16_to_yuy2_c(const BYTE *srcp_y, const BYTE *srcp_u, const BYTE *srcp_v, BYTE *dstp, size_t src_pitch_y, size_t src_pitch_uv, size_t dst_pitch, size_t width, size_t height) { for (size_t y=0; y < height; y++) { for (size_t x=0; x < width / 2; x++) { dstp[x*4+0] = srcp_y[x*2]; dstp[x*4+1] = srcp_u[x]; dstp[x*4+2] = srcp_y[x*2+1]; dstp[x*4+3] = srcp_v[x]; } srcp_y += src_pitch_y; srcp_u += src_pitch_uv; srcp_v += src_pitch_uv; dstp += dst_pitch; } } PVideoFrame __stdcall ConvertYV16ToYUY2::GetFrame(int n, IScriptEnvironment* env) { PVideoFrame src = child->GetFrame(n, env); PVideoFrame dst = env->NewVideoFrameP(vi, &src); const BYTE* srcY = src->GetReadPtr(PLANAR_Y); const BYTE* srcU = src->GetReadPtr(PLANAR_U); const BYTE* srcV = src->GetReadPtr(PLANAR_V); BYTE* dstp = dst->GetWritePtr(); #ifdef INTEL_INTRINSICS if (env->GetCPUFlags() & CPUF_SSE2) { //U and V don't have to be aligned since we user movq to read from those convert_yv16_to_yuy2_sse2(srcY, srcU, srcV, dstp, src->GetPitch(PLANAR_Y), src->GetPitch(PLANAR_U), dst->GetPitch(), vi.width, vi.height); } else #ifdef X86_32 if (env->GetCPUFlags() & CPUF_MMX) { convert_yv16_to_yuy2_mmx(srcY, srcU, srcV, dstp, src->GetPitch(PLANAR_Y), src->GetPitch(PLANAR_U), dst->GetPitch(), vi.width, vi.height); } else #endif #endif { convert_yv16_to_yuy2_c(srcY, srcU, srcV, dstp, src->GetPitch(PLANAR_Y), src->GetPitch(PLANAR_U), dst->GetPitch(), vi.width, vi.height); } return dst; } AVSValue __cdecl ConvertYV16ToYUY2::Create(AVSValue args, void*, IScriptEnvironment* env) { PClip clip = args[0].AsClip(); if (clip->GetVideoInfo().IsYUY2()) return clip; return new ConvertYV16ToYUY2(clip, env); } /********************************************** * Converter between arbitrary planar formats * * This uses plane copy for luma, and a custom * resizer for chroma * * (c) Klaus Post, 2005 * (c) Ian Brabham, 2011 **********************************************/ ConvertToPlanarGeneric::ConvertToPlanarGeneric( PClip src, int dst_space, bool interlaced, int _ChromaLocation_In, const AVSValue& chromaResampler, const AVSValue& param1, const AVSValue& param2, const AVSValue& param3, int _ChromaLocation_Out, IScriptEnvironment* env) : GenericVideoFilter(src), ChromaLocation_In(_ChromaLocation_In), ChromaLocation_Out(_ChromaLocation_Out) { Yinput = vi.NumComponents() == 1; pixelsize = vi.ComponentSize(); if (Yinput) { vi.pixel_type = dst_space; if (vi.ComponentSize() != pixelsize) env->ThrowError("Convert: Conversion from %d to %d-byte format not supported.", pixelsize, vi.ComponentSize()); // no more preparation here, GetFrame simply returns Y return; } // Y only output from any YUV: no chroma involved, GetFrame will snatch Y plane if (dst_space == VideoInfo::CS_Y8 || dst_space == VideoInfo::CS_Y10 || dst_space == VideoInfo::CS_Y12 || dst_space == VideoInfo::CS_Y14 || dst_space == VideoInfo::CS_Y16 || dst_space == VideoInfo::CS_Y32) { vi.pixel_type = dst_space; return; } auto Is420 = [](int pix_type) { return pix_type == VideoInfo::CS_YV12 || pix_type == VideoInfo::CS_I420 || pix_type == VideoInfo::CS_YUV420P10 || pix_type == VideoInfo::CS_YUV420P12 || pix_type == VideoInfo::CS_YUV420P14 || pix_type == VideoInfo::CS_YUV420P16 || pix_type == VideoInfo::CS_YUV420PS || pix_type == VideoInfo::CS_YUVA420 || pix_type == VideoInfo::CS_YUVA420P10 || pix_type == VideoInfo::CS_YUVA420P12 || pix_type == VideoInfo::CS_YUVA420P14 || pix_type == VideoInfo::CS_YUVA420P16 || pix_type == VideoInfo::CS_YUVA420PS; }; if (!Is420(vi.pixel_type) && !Is420(dst_space)) interlaced = false; // Ignore, if YV12 is not involved. //if (interlaced) env->ThrowError("Convert: Interlaced only available with 4:2:0 color spaces."); // Describe input pixel positioning float xdInU = 0.0f, txdInU = 0.0f, bxdInU = 0.0f; float ydInU = 0.0f, tydInU = 0.0f, bydInU = 0.0f; float xdInV = 0.0f, txdInV = 0.0f, bxdInV = 0.0f; float ydInV = 0.0f, tydInV = 0.0f, bydInV = 0.0f; /* "mpeg1", "center" - 1-1 averaging kernel (4:2:0, 4:2:2 (horizontal only)) "mpeg2", "left" (4:2:0, 4:2:2) - top-field samples are sited 1/4 sample below the luma samples (4:2:0) - bottom-field samples are sited 1/4 sample above the luma samples (4:2:0) - horizontal 1-2-1 kernel "dv": (4:2:0) Chroma samples are sited on top of luma samples, but CB and CR samples are sited on alternate lines. - top: V - bottom: U "top_left" (4:2:0) - horizontal 1-2-1 vertical 1-2-1 */ if (Is420(vi.pixel_type)) { switch (ChromaLocation_In) { case ChromaLocation_e::AVS_CHROMA_DV: // spec. avisynth xdInU = 0.0f; ydInU = 1.0f; txdInU = 0.0f; tydInU = 1.0f; bxdInU = 0.0f; bydInU = 1.0f; // Cb xdInV = 0.0f; ydInV = 0.0f; txdInV = 0.0f; tydInV = 0.0f; bxdInV = 0.0f; bydInV = 0.0f; // Cr break; case ChromaLocation_e::AVS_CHROMA_TOP: xdInU = 0.5f, ydInU = 0.0f; txdInU = 0.5f; tydInU = 0.0f; bxdInU = 0.5f; bydInU = 0.5f; xdInV = 0.5f, ydInV = 0.0f; txdInV = 0.5f; tydInV = 0.0f; bxdInV = 0.5f; bydInV = 0.5f; break; case ChromaLocation_e::AVS_CHROMA_CENTER: // mpeg1, center xdInU = 0.5f, ydInU = 0.5f; txdInU = 0.5f; tydInU = 0.25f; bxdInU = 0.5f; bydInU = 0.75f; xdInV = 0.5f, ydInV = 0.5f; txdInV = 0.5f; tydInV = 0.25f; bxdInV = 0.5f; bydInV = 0.75f; break; case ChromaLocation_e::AVS_CHROMA_BOTTOM: xdInU = 0.5f, ydInU = 1.0f; txdInU = 0.5f; tydInU = 0.5f; bxdInU = 0.5f; bydInU = 1.0f; xdInV = 0.5f, ydInV = 1.0f; txdInV = 0.5f; tydInV = 0.5f; bxdInV = 0.5f; bydInV = 1.0f; break; case ChromaLocation_e::AVS_CHROMA_TOP_LEFT: xdInU = 0.0f; ydInU = 0.0f; txdInU = 0.0f; tydInU = 0.0f; bxdInU = 0.0f; bydInU = 0.5f; xdInV = 0.0f; ydInV = 0.0f; txdInV = 0.0f; tydInV = 0.0f; bxdInV = 0.0f; bydInV = 0.5f; break; case ChromaLocation_e::AVS_CHROMA_LEFT: // left, mpeg2 xdInU = 0.0f; ydInU = 0.5f; txdInU = 0.0f; tydInU = 0.25f; bxdInU = 0.0f; bydInU = 0.75f; xdInV = 0.0f; ydInV = 0.5f; txdInV = 0.0f; tydInV = 0.25f; bxdInV = 0.0f; bydInV = 0.75f; break; case ChromaLocation_e::AVS_CHROMA_BOTTOM_LEFT: xdInU = 0.0f; ydInU = 1.0f; txdInU = 0.0f; tydInU = 0.5f; bxdInU = 0.0f; bydInU = 1.0f; xdInV = 0.0f; ydInV = 1.0f; txdInV = 0.0f; tydInV = 0.5f; bxdInV = 0.0f; bydInV = 1.0f; break; default: env->ThrowError("Convert: not supported ChromaPlacement for 4:2:0 input."); } } else if (vi.Is422()) { switch (ChromaLocation_In) { case ChromaLocation_e::AVS_CHROMA_CENTER: // center xdInU = 0.5f, ydInU = 0.0f; txdInU = 0.5f; tydInU = 0.0f; bxdInU = 0.5f; bydInU = 0.0f; xdInV = 0.5f, ydInV = 0.0f; txdInV = 0.5f; tydInV = 0.0f; bxdInV = 0.5f; bydInV = 0.0f; break; case ChromaLocation_e::AVS_CHROMA_TOP_LEFT: // treated as left case ChromaLocation_e::AVS_CHROMA_LEFT: // left, mpeg2 case ChromaLocation_e::AVS_CHROMA_BOTTOM_LEFT: // treated as left xdInU = 0.0f; ydInU = 0.0f; txdInU = 0.0f; tydInU = 0.0f; bxdInU = 0.0f; bydInU = 0.0f; xdInV = 0.0f; ydInV = 0.0f; txdInV = 0.0f; tydInV = 0.0f; bxdInV = 0.0f; bydInV = 0.0f; break; default: env->ThrowError("Convert: not supported ChromaPlacement for 4:2:2 input."); } } else if (vi.IsYV411()) { if (ChromaLocation_In >= 0 && ChromaLocation_In != ChromaLocation_e::AVS_CHROMA_TOP_LEFT && ChromaLocation_In != ChromaLocation_e::AVS_CHROMA_LEFT && ChromaLocation_In != ChromaLocation_e::AVS_CHROMA_BOTTOM_LEFT ) { // if given, only the 'left'-ish versions are accepted, this is how it is treated env->ThrowError("Convert: not supported ChromaPlacement for 4:1:1 input. Only 'left'-style is allowed if given."); } } else if (ChromaLocation_In >= 0) env->ThrowError("Convert: Input ChromaPlacement is invalid for this format."); const int xsIn = 1 << vi.GetPlaneWidthSubsampling(PLANAR_U); const int ysIn = 1 << vi.GetPlaneHeightSubsampling(PLANAR_U); // change vi to the output format vi.pixel_type = dst_space; if (vi.ComponentSize() != pixelsize) env->ThrowError("Convert: Conversion from %d to %d-byte format not supported.", pixelsize, vi.ComponentSize()); // Describe output pixel positioning float xdOutU = 0.0f, txdOutU = 0.0f, bxdOutU = 0.0f; float ydOutU = 0.0f, tydOutU = 0.0f, bydOutU = 0.0f; float xdOutV = 0.0f, txdOutV = 0.0f, bxdOutV = 0.0f; float ydOutV = 0.0f, tydOutV = 0.0f, bydOutV = 0.0f; if (Is420(vi.pixel_type)) { switch (ChromaLocation_Out) { case ChromaLocation_e::AVS_CHROMA_DV: xdOutU = 0.0f; ydOutU = 1.0f; txdOutU = 0.0f; tydOutU = 1.0f; bxdOutU = 0.0f; bydOutU = 1.0f; // Cb xdOutV = 0.0f; ydOutV = 0.0f; txdOutV = 0.0f; tydOutV = 0.0f; bxdOutV = 0.0f; bydOutV = 0.0f; // Cr break; case ChromaLocation_e::AVS_CHROMA_TOP: xdOutU = 0.5f, ydOutU = 0.0f; txdOutU = 0.5f; tydOutU = 0.0f; bxdOutU = 0.5f; bydOutU = 0.5f; xdOutV = 0.5f, ydOutV = 0.0f; txdOutV = 0.5f; tydOutV = 0.0f; bxdOutV = 0.5f; bydOutV = 0.5f; break; case ChromaLocation_e::AVS_CHROMA_CENTER: // mpeg1, center xdOutU = 0.5f, ydOutU = 0.5f; txdOutU = 0.5f; tydOutU = 0.25f; bxdOutU = 0.5f; bydOutU = 0.75f; xdOutV = 0.5f, ydOutV = 0.5f; txdOutV = 0.5f; tydOutV = 0.25f; bxdOutV = 0.5f; bydOutV = 0.75f; break; case ChromaLocation_e::AVS_CHROMA_BOTTOM: xdOutU = 0.5f, ydOutU = 1.0f; txdOutU = 0.5f; tydOutU = 0.5f; bxdOutU = 0.5f; bydOutU = 1.0f; xdOutV = 0.5f, ydOutV = 1.0f; txdOutV = 0.5f; tydOutV = 0.5f; bxdOutV = 0.5f; bydOutV = 1.0f; break; case ChromaLocation_e::AVS_CHROMA_TOP_LEFT: xdOutU = 0.0f; ydOutU = 0.0f; txdOutU = 0.0f; tydOutU = 0.0f; bxdOutU = 0.0f; bydOutU = 0.5f; xdOutV = 0.0f; ydOutV = 0.0f; txdOutV = 0.0f; tydOutV = 0.0f; bxdOutV = 0.0f; bydOutV = 0.5f; break; case ChromaLocation_e::AVS_CHROMA_LEFT: // left, mpeg2 xdOutU = 0.0f; ydOutU = 0.5f; txdOutU = 0.0f; tydOutU = 0.25f; bxdOutU = 0.0f; bydOutU = 0.75f; xdOutV = 0.0f; ydOutV = 0.5f; txdOutV = 0.0f; tydOutV = 0.25f; bxdOutV = 0.0f; bydOutV = 0.75f; break; case ChromaLocation_e::AVS_CHROMA_BOTTOM_LEFT: xdOutU = 0.0f; ydOutU = 1.0f; txdOutU = 0.0f; tydOutU = 0.5f; bxdOutU = 0.0f; bydOutU = 1.0f; xdOutV = 0.0f; ydOutV = 1.0f; txdOutV = 0.0f; tydOutV = 0.5f; bxdOutV = 0.0f; bydOutV = 1.0f; break; default: env->ThrowError("Convert: not supported ChromaPlacement for 4:2:0 output."); } } else if (vi.Is422()) { switch (ChromaLocation_Out) { case ChromaLocation_e::AVS_CHROMA_CENTER: // mpeg1, center xdOutU = 0.5f, ydOutU = 0.0f; txdOutU = 0.5f; tydOutU = 0.0f; bxdOutU = 0.5f; bydOutU = 0.0f; xdOutV = 0.5f, ydOutV = 0.0f; txdOutV = 0.5f; tydOutV = 0.0f; bxdOutV = 0.5f; bydOutV = 0.0f; break; case ChromaLocation_e::AVS_CHROMA_TOP_LEFT: // treated as left case ChromaLocation_e::AVS_CHROMA_LEFT: // left, mpeg2 case ChromaLocation_e::AVS_CHROMA_BOTTOM_LEFT: // treated as left xdOutU = 0.0f; ydOutU = 0.0f; txdOutU = 0.0f; tydOutU = 0.0f; bxdOutU = 0.0f; bydOutU = 0.0f; xdOutV = 0.0f; ydOutV = 0.0f; txdOutV = 0.0f; tydOutV = 0.0f; bxdOutV = 0.0f; bydOutV = 0.0f; break; default: env->ThrowError("Convert: not supported ChromaPlacement for 4:2:2 output."); } } else if (ChromaLocation_Out >= 0) env->ThrowError("Convert: Output ChromaPlacement only available with 4:2:0 or 4:2:2 output."); const int xsOut = 1 << vi.GetPlaneWidthSubsampling(PLANAR_U); const int xmask = xsOut - 1; if (vi.width & xmask) env->ThrowError("Convert: Cannot convert if width isn't mod%d!", xsOut); const int ysOut = 1 << vi.GetPlaneHeightSubsampling(PLANAR_U); const int ymask = ysOut - 1; if (vi.height & ymask) env->ThrowError("Convert: Cannot convert if height isn't mod%d!", ysOut); int uv_width = vi.width >> vi.GetPlaneWidthSubsampling(PLANAR_U); int uv_height = vi.height >> vi.GetPlaneHeightSubsampling(PLANAR_U); ResamplingFunction *filter = getResampler(chromaResampler.AsString("bicubic"), param1, param2, param3, true, env); bool P = !lstrcmpi(chromaResampler.AsString(""), "point"); auto ChrOffset = [P](int sIn, float dIn, int sOut, float dOut) { // (1 - sOut/sIn)/2 + (dOut-dIn)/sIn; // Gavino Jan 2011 return P ? (dOut - dIn) / sIn : 0.5f + (dOut - dIn - 0.5f*sOut) / sIn; }; const int force = 0; const bool preserve_center = true; const char *placement_name_notused = nullptr; // n/a const int forced_chroma_placement = -1; // no force // chroma planes are extracted, behave like Y when resized, no chroma planes involved if (interlaced) { uv_height /= 2; AVSValue tUsubSampling[4] = { ChrOffset(xsIn, txdInU, xsOut, txdOutU), ChrOffset(ysIn, tydInU, ysOut, tydOutU), AVSValue(), AVSValue() }; AVSValue bUsubSampling[4] = { ChrOffset(xsIn, bxdInU, xsOut, bxdOutU), ChrOffset(ysIn, bydInU, ysOut, bydOutU), AVSValue(), AVSValue() }; AVSValue tVsubSampling[4] = { ChrOffset(xsIn, txdInV, xsOut, txdOutV), ChrOffset(ysIn, tydInV, ysOut, tydOutV), AVSValue(), AVSValue() }; AVSValue bVsubSampling[4] = { ChrOffset(xsIn, bxdInV, xsOut, bxdOutV), ChrOffset(ysIn, bydInV, ysOut, bydOutV), AVSValue(), AVSValue() }; Usource = new SeparateFields(new AssumeParity(new SwapUVToY(child, SwapUVToY::UToY8, env), true), env); // also works for Y16/Y32 Vsource = new SeparateFields(new AssumeParity(new SwapUVToY(child, SwapUVToY::VToY8, env), true), env); // also works for Y16/Y32 std::vector tbUsource(2); // Interleave() will take ownership of these std::vector tbVsource(2); tbUsource[0] = FilteredResize::CreateResize(new SelectEvery(Usource, 2, 0, env), uv_width, uv_height, tUsubSampling, force, filter, preserve_center, placement_name_notused, forced_chroma_placement, env); tbUsource[1] = FilteredResize::CreateResize(new SelectEvery(Usource, 2, 1, env), uv_width, uv_height, bUsubSampling, force, filter, preserve_center, placement_name_notused, forced_chroma_placement, env); tbVsource[0] = FilteredResize::CreateResize(new SelectEvery(Vsource, 2, 0, env), uv_width, uv_height, tVsubSampling, force, filter, preserve_center, placement_name_notused, forced_chroma_placement, env); tbVsource[1] = FilteredResize::CreateResize(new SelectEvery(Vsource, 2, 1, env), uv_width, uv_height, bVsubSampling, force, filter, preserve_center, placement_name_notused, forced_chroma_placement, env); Usource = new SelectEvery(new DoubleWeaveFields(new Interleave(std::move(tbUsource), env)), 2, 0, env); Vsource = new SelectEvery(new DoubleWeaveFields(new Interleave(std::move(tbVsource), env)), 2, 0, env); } else { AVSValue UsubSampling[4] = { ChrOffset(xsIn, xdInU, xsOut, xdOutU), ChrOffset(ysIn, ydInU, ysOut, ydOutU), AVSValue(), AVSValue() }; AVSValue VsubSampling[4] = { ChrOffset(xsIn, xdInV, xsOut, xdOutV), ChrOffset(ysIn, ydInV, ysOut, ydOutV), AVSValue(), AVSValue() }; Usource = FilteredResize::CreateResize(new SwapUVToY(child, SwapUVToY::UToY8, env), uv_width, uv_height, UsubSampling, force, filter, preserve_center, placement_name_notused, forced_chroma_placement, env); Vsource = FilteredResize::CreateResize(new SwapUVToY(child, SwapUVToY::VToY8, env), uv_width, uv_height, VsubSampling, force, filter, preserve_center, placement_name_notused, forced_chroma_placement, env); } delete filter; } PVideoFrame __stdcall ConvertToPlanarGeneric::GetFrame(int n, IScriptEnvironment* env) { PVideoFrame src = child->GetFrame(n, env); if (vi.IsY()) { // Abuse Subframe to snatch the Y plane PVideoFrame dst = env->Subframe(src, 0, src->GetPitch(PLANAR_Y), src->GetRowSize(PLANAR_Y), src->GetHeight(PLANAR_Y)); auto props = env->getFramePropsRW(dst); // ChromaLocation_Out is <0 : erased update_ChromaLocation(props, ChromaLocation_Out, env); return dst; } PVideoFrame dst = env->NewVideoFrameP(vi, &src); env->BitBlt(dst->GetWritePtr(PLANAR_Y), dst->GetPitch(PLANAR_Y), src->GetReadPtr(PLANAR_Y), src->GetPitch(PLANAR_Y), src->GetRowSize(PLANAR_Y_ALIGNED), src->GetHeight(PLANAR_Y)); auto props = env->getFramePropsRW(dst); update_ChromaLocation(props, ChromaLocation_Out, env); // alpha. if pitch is zero -> no alpha channel const int rowsizeA = dst->GetRowSize(PLANAR_A); const int dst_pitchA = dst->GetPitch(PLANAR_A); BYTE* dstp_a = (dst_pitchA == 0) ? nullptr : dst->GetWritePtr(PLANAR_A); const int heightA = dst->GetHeight(PLANAR_A); if (dst_pitchA != 0) { if (src->GetPitch(PLANAR_A) != 0) env->BitBlt(dstp_a, dst_pitchA, src->GetReadPtr(PLANAR_A), src->GetPitch(PLANAR_A), src->GetRowSize(PLANAR_A_ALIGNED), src->GetHeight(PLANAR_A)); else { // e.g. ConvertToYUVA() case from Alpha-less formats switch (vi.ComponentSize()) { case 1: fill_plane(dstp_a, heightA, rowsizeA, dst_pitchA, 255); break; case 2: fill_plane(dstp_a, heightA, rowsizeA, dst_pitchA, (1 << vi.BitsPerComponent()) - 1); break; case 4: fill_plane(dstp_a, heightA, rowsizeA, dst_pitchA, 1.0f); break; } } } BYTE* dstp_u = dst->GetWritePtr(PLANAR_U); BYTE* dstp_v = dst->GetWritePtr(PLANAR_V); const int height = dst->GetHeight(PLANAR_U); const int rowsizeUV = dst->GetRowSize(PLANAR_U); const int dst_pitch = dst->GetPitch(PLANAR_U); if (Yinput) { switch (vi.ComponentSize()) { case 1: fill_chroma(dstp_u, dstp_v, height, rowsizeUV, dst_pitch, 0x80); break; case 2: fill_chroma(dstp_u, dstp_v, height, rowsizeUV, dst_pitch, 1 << (vi.BitsPerComponent() - 1)); break; case 4: const float half = 0.0f; fill_chroma(dstp_u, dstp_v, height, rowsizeUV, dst_pitch, half); break; } } else { src = Usource->GetFrame(n, env); env->BitBlt(dstp_u, dst_pitch, src->GetReadPtr(PLANAR_Y), src->GetPitch(PLANAR_Y), src->GetRowSize(PLANAR_Y_ALIGNED), height); src = Vsource->GetFrame(n, env); env->BitBlt(dstp_v, dst_pitch, src->GetReadPtr(PLANAR_Y), src->GetPitch(PLANAR_Y), src->GetRowSize(PLANAR_Y_ALIGNED), height); } return dst; } /* 0 1 2 3 4 5 6 7 8 9 { "ConvertToYUV411", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f[bits]i[quality]b", ConvertToPlanarGeneric::CreateYV411, (void*)1 }, // alias for ConvertToYV411, 8 bit check later { "ConvertToYUV444", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f[bits]i[quality]b", ConvertToPlanarGeneric::CreateYUV444, (void*)1 }, { "ConvertToYUVA444", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f[bits]i[quality]b", ConvertToPlanarGeneric::CreateYUV444, (void*)2 }, 0 1 2 3 4 5 6 7 8 9 10 { "ConvertToYUV420", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[ChromaOutPlacement]s[param1]f[param2]f[param3]f[bits]i[quality]b", ConvertToPlanarGeneric::CreateYUV420, (void*)1 }, { "ConvertToYUV422", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[ChromaOutPlacement]s[param1]f[param2]f[param3]f[bits]i[quality]b", ConvertToPlanarGeneric::CreateYUV422, (void*)1 }, { "ConvertToYUVA420", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[ChromaOutPlacement]s[param1]f[param2]f[param3]f[bits]i[quality]b", ConvertToPlanarGeneric::CreateYUV420, (void*)2 }, { "ConvertToYUVA422", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[ChromaOutPlacement]s[param1]f[param2]f[param3]f[bits]i[quality]b", ConvertToPlanarGeneric::CreateYUV422, (void*)2 }, 0 1 2 3 { "ConvertToY", BUILTIN_FUNC_PREFIX, "c[matrix]s[bits]i[quality]b", ConvertToPlanarGeneric::CreateConvertToY, (void*)1 }, // user_data == 1 -> any bit depth sources */ AVSValue ConvertToPlanarGeneric::Create(AVSValue& args, const char* filter, bool strip_alpha_legacy_8bit, bool to_yuva, IScriptEnvironment* env) { bool converted = false; PClip clip = args[0].AsClip(); VideoInfo vi = clip->GetVideoInfo(); const bool to_y = strcmp(filter, "ConvertToY") == 0; const bool to_420 = strcmp(filter, "ConvertToYUV420") == 0; const bool to_422 = strcmp(filter, "ConvertToYUV422") == 0; const bool to_411 = strcmp(filter, "ConvertToYV411") == 0; const bool to_444 = strcmp(filter, "ConvertToYUV444") == 0; if (vi.IsYUY2()) { // use to_y: no need YV16 extra planes when our target is Y only clip = new ConvertYUY2ToYV16_or_Y(clip, to_y, env); vi = clip->GetVideoInfo(); } AVSValue bits_arg; AVSValue quality_arg; AVSValue matrix_arg; if (to_y) { matrix_arg = args[1]; bits_arg = args[2]; quality_arg = args[3]; } else if (to_420 || to_422) { matrix_arg = args[2]; bits_arg = args[9]; quality_arg = args[10]; } else { matrix_arg = args[2]; bits_arg = args[8]; quality_arg = args[9]; } const int target_bits_per_pixel = bits_arg.AsInt(vi.BitsPerComponent()); const bool quality = quality_arg.AsBool(false); // float RGB YUV inside int bits_per_pixel = vi.BitsPerComponent(); /* if (target_bits_per_pixel != bits_per_pixel && !vi.IsRGB()) { env->ThrowError("%s: on-thy-fly bit-depth conversion only supported from RGB formats.", filter); } */ bool needConvertFinalBitdepth = false; if (target_bits_per_pixel != vi.BitsPerComponent()) { needConvertFinalBitdepth = true; } if (vi.IsRGB()) { // packed or planar source const bool keep_packedrgb_alpha = to_yuva && (vi.IsRGB32() || vi.IsRGB64()); // 3.7.6: We convert ALL packed RGB formats to planar RGB! // The only case where a RGB32->YV24 is a bit slower is: SSE2-only but no SSSE3 capable CPU. // All other cases are quicker, when converting to planar first and then to YUV444, than doing packed RGB->YUV444 in one step. // On AVX2 capable CPUs using the PlanarRGB-YUV engine, we are +80% quicker // doing RGB32->PlanarRGB->YUV444 than doing RGB32->YUV444 in the old SSSE3 step. if (!vi.IsPlanar()) { // we convert to intermediate PlanarRGB, RGB48/64->YUV444 is slow C, planarRGB is fast // Default ConvertToPlanarRGB call AVSValue new_args[10] = { clip, AVSValue(), AVSValue(), AVSValue(), AVSValue(), AVSValue(), AVSValue(), AVSValue(), AVSValue(), AVSValue() }; // clip, matrix, interlaced, chromainplacement, chromaresample, param1, param2, param3, bits, quality // convert to planar RGBA only if RGB64 and target is YUVA (need to keep alpha) const intptr_t planar_rgb_type = keep_packedrgb_alpha ? -2 : -1; clip = CreateConvertToRGB(AVSValue(new_args, 10), (void *)planar_rgb_type, env).AsClip(); vi = clip->GetVideoInfo(); } if (target_bits_per_pixel != vi.BitsPerComponent()) { needConvertFinalBitdepth = true; } bool bitdepthConverted = false; if (needConvertFinalBitdepth) { // Optional bit-depth conversion in PackedRGBtoPlanarRGB. // int->float full/narrow range, int-int full/narrow supported clip = new ConvertRGBToYUV444(clip, matrix_arg.AsString(0) /* matrix_name */, keep_packedrgb_alpha, target_bits_per_pixel, quality, /*ref*/bitdepthConverted, to_y, env); vi = clip->GetVideoInfo(); if (bitdepthConverted) { needConvertFinalBitdepth = false; // done in-process } } else { // pass -1 as finalBitdepth, signing that no bit-depth conversion required // output bitdepthConverted is n/a clip = new ConvertRGBToYUV444(clip, matrix_arg.AsString(0) /* matrix_name */, keep_packedrgb_alpha, -1 /*no bit-depth conversion*/, quality, /*ref*/bitdepthConverted, to_y, env); vi = clip->GetVideoInfo(); } vi = clip->GetVideoInfo(); converted = true; } else if (!vi.IsPlanar()) env->ThrowError("%s: Can only convert from Planar YUV.", filter); if (needConvertFinalBitdepth) { // plain Invoke and no "new ConvertBits()": this detects and keeps source and target ranges // FIXME: use fulls, fulld YUV->YUY (Y->Y where only limited/full is changed) AVSValue new_args[2] = { clip, target_bits_per_pixel }; clip = env->Invoke("ConvertBits", AVSValue(new_args, 2)).AsClip(); vi = clip->GetVideoInfo(); } bits_per_pixel = vi.BitsPerComponent(); // rgb conversion or standalone ConvertBits() would alter it. int pixel_type = VideoInfo::CS_UNKNOWN; AVSValue outplacement = AVSValue(); // only for ConvertToYUV420 and ConvertToYUV422 bool hasAlpha = vi.NumComponents() == 4 && !strip_alpha_legacy_8bit; bool shouldStripAlpha = vi.NumComponents() == 4 && strip_alpha_legacy_8bit; bool shouldAddAlpha = vi.NumComponents() != 4 && to_yuva; bool targethasAlpha = hasAlpha || shouldAddAlpha; int ChromaLocation_In = -1; // invalid. Chromalocation_e::AVS_CHROMALOCATION_UNUSED int ChromaLocation_Out = -1; // left as invalid for 444, and Y if (vi.IsYV411()) { // ChromaInPlacement parameter exists, (default none/-1) + input frame properties; 'left'-ish _ChromaLocation is allowed, checked later auto frame0 = clip->GetFrame(0, env); const AVSMap* props = env->getFramePropsRO(frame0); chromaloc_parse_merge_with_props(vi, args[3].AsString(nullptr), props, /* ref*/ChromaLocation_In, -1 /*default none chromaloc */, env); } else if (vi.Is420() || vi.Is422()) { // ChromaInPlacement parameter is valid + input frame properties auto frame0 = clip->GetFrame(0, env); const AVSMap* props = env->getFramePropsRO(frame0); chromaloc_parse_merge_with_props(vi, args[3].AsString(nullptr), props, /* ref*/ChromaLocation_In, ChromaLocation_e::AVS_CHROMA_LEFT /*default*/, env); } AVSValue param1; AVSValue param2; AVSValue param3; if (to_420 || to_422) { // ChromaOutPlacement parameter is valid chromaloc_parse_merge_with_props(vi, args[5].AsString(nullptr), nullptr, /* ref*/ChromaLocation_Out, ChromaLocation_e::AVS_CHROMA_LEFT /*default*/, env); param1 = args[6]; param2 = args[7]; param3 = args[8]; } else if (to_444 || to_411) { // No ChromaOutPlacement parameter, indexes skip back accordingly param1 = args[5]; param2 = args[6]; param3 = args[7]; } // FIXME: no-op or almost no-op shortcuts won't exist even at 420-420 conversion if YUV-YUV matrix conversion is added if (to_y) { if (vi.IsY()) { // After RGB->Y conversion or input as Y return clip; } // planar YUV original, GetFrame will return Y switch (bits_per_pixel) { case 8: pixel_type = VideoInfo::CS_Y8; break; case 10: pixel_type = VideoInfo::CS_Y10; break; case 12: pixel_type = VideoInfo::CS_Y12; break; case 14: pixel_type = VideoInfo::CS_Y14; break; case 16: pixel_type = VideoInfo::CS_Y16; break; case 32: pixel_type = VideoInfo::CS_Y32; break; } } else if (to_420) { if (vi.Is420()) { // possible shortcut if (ChromaLocation_In == ChromaLocation_Out) { if (shouldStripAlpha) return new RemoveAlphaPlane(clip, env); if (shouldAddAlpha) { // create with default alpha clip = new AddAlphaPlane(clip, nullptr, 0.0f, false, env); vi = clip->GetVideoInfo(); } return clip; } } outplacement = args[5]; switch (vi.BitsPerComponent()) { case 8 : pixel_type = targethasAlpha ? VideoInfo::CS_YUVA420 : VideoInfo::CS_YV12; break; case 10: pixel_type = targethasAlpha ? VideoInfo::CS_YUVA420P10 : VideoInfo::CS_YUV420P10; break; case 12: pixel_type = targethasAlpha ? VideoInfo::CS_YUVA420P12 : VideoInfo::CS_YUV420P12; break; case 14: pixel_type = targethasAlpha ? VideoInfo::CS_YUVA420P14 : VideoInfo::CS_YUV420P14; break; case 16: pixel_type = targethasAlpha ? VideoInfo::CS_YUVA420P16 : VideoInfo::CS_YUV420P16; break; case 32: pixel_type = targethasAlpha ? VideoInfo::CS_YUVA420PS : VideoInfo::CS_YUV420PS; break; } } else if (to_422) { if (vi.Is422()) { // possible shortcut if (ChromaLocation_In == ChromaLocation_Out) { if (shouldStripAlpha) return new RemoveAlphaPlane(clip, env); if (shouldAddAlpha) { // create with default alpha clip = new AddAlphaPlane(clip, nullptr, 0.0f, false, env); vi = clip->GetVideoInfo(); } return clip; } } outplacement = args[5]; switch (bits_per_pixel) { case 8 : pixel_type = targethasAlpha ? VideoInfo::CS_YUVA422 : VideoInfo::CS_YV16; break; case 10: pixel_type = targethasAlpha ? VideoInfo::CS_YUVA422P10 : VideoInfo::CS_YUV422P10; break; case 12: pixel_type = targethasAlpha ? VideoInfo::CS_YUVA422P12 : VideoInfo::CS_YUV422P12; break; case 14: pixel_type = targethasAlpha ? VideoInfo::CS_YUVA422P14 : VideoInfo::CS_YUV422P14; break; case 16: pixel_type = targethasAlpha ? VideoInfo::CS_YUVA422P16 : VideoInfo::CS_YUV422P16; break; case 32: pixel_type = targethasAlpha ? VideoInfo::CS_YUVA422PS : VideoInfo::CS_YUV422PS; break; } } else if (to_444) { if (vi.Is444()) { if (shouldStripAlpha) return new RemoveAlphaPlane(clip, env); if (shouldAddAlpha) { // create with default alpha clip = new AddAlphaPlane(clip, nullptr, 0.0f, false, env); vi = clip->GetVideoInfo(); } return clip; } switch (bits_per_pixel) { case 8 : pixel_type = targethasAlpha ? VideoInfo::CS_YUVA444 : VideoInfo::CS_YV24; break; case 10: pixel_type = targethasAlpha ? VideoInfo::CS_YUVA444P10 : VideoInfo::CS_YUV444P10; break; case 12: pixel_type = targethasAlpha ? VideoInfo::CS_YUVA444P12 : VideoInfo::CS_YUV444P12; break; case 14: pixel_type = targethasAlpha ? VideoInfo::CS_YUVA444P14 : VideoInfo::CS_YUV444P14; break; case 16: pixel_type = targethasAlpha ? VideoInfo::CS_YUVA444P16 : VideoInfo::CS_YUV444P16; break; case 32: pixel_type = targethasAlpha ? VideoInfo::CS_YUVA444PS : VideoInfo::CS_YUV444PS; break; } } else if (to_411) { if (target_bits_per_pixel != 8) env->ThrowError("%s: only bits=8 supported for YV411", filter); if (vi.IsYV411()) return clip; if(vi.ComponentSize()!=1) env->ThrowError("%s: 8 bit input only", filter); pixel_type = VideoInfo::CS_YV411; } else env->ThrowError("Convert: unknown filter '%s'.", filter); if (pixel_type == VideoInfo::CS_UNKNOWN) env->ThrowError("%s: unsupported bit depth", filter); if (converted) clip = env->Invoke("Cache", AVSValue(clip)).AsClip(); // ConvertToPlanarGeneric's GetFrame will recognize if alpha copy or fill-with-defaults needed AVSValue dummy_for_to_y; return new ConvertToPlanarGeneric(clip, pixel_type, to_y ? false : args[1].AsBool(false), // interlaced ChromaLocation_In, to_y ? dummy_for_to_y : args[4], // chromaresample param1, param2, param3, ChromaLocation_Out, env); } AVSValue __cdecl ConvertToPlanarGeneric::CreateYUV420(AVSValue args, void* user_data, IScriptEnvironment* env) { bool only_8bit = reinterpret_cast(user_data) == 0; bool to_yuva = reinterpret_cast(user_data) == 2; if (only_8bit) { // "ConvertToYV12" syntax if (args[9].Defined() && args[9].AsInt() != 8) env->ThrowError("ConvertToYV12: only 8 bit output supported. " "Use ConvertToYUV420 for higher bit depth."); AVSValue new_args[11] = { args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], AVSValue(8), // bits forced to 8 args[10] }; AVSValue new_args_val(new_args, 11); // named, lives until end of scope return Create(new_args_val, "ConvertToYUV420", only_8bit, to_yuva, env); } return Create(args, "ConvertToYUV420", only_8bit, to_yuva, env); } AVSValue __cdecl ConvertToPlanarGeneric::CreateYUV422(AVSValue args, void* user_data, IScriptEnvironment* env) { bool only_8bit = reinterpret_cast(user_data) == 0; bool to_yuva = reinterpret_cast(user_data) == 2; if (only_8bit) { // "ConvertToYV16" syntax if (args[9].Defined() && args[9].AsInt() != 8) env->ThrowError("ConvertToYV16: only 8 bit output supported. " "Use ConvertToYUV422 for higher bit depth."); AVSValue new_args[11] = { args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], AVSValue(8), args[10] }; AVSValue new_args_val(new_args, 11); return Create(new_args_val, "ConvertToYUV422", only_8bit, to_yuva, env); } return Create(args, "ConvertToYUV422", only_8bit, to_yuva, env); } AVSValue __cdecl ConvertToPlanarGeneric::CreateYUV444(AVSValue args, void* user_data, IScriptEnvironment* env) { bool only_8bit = reinterpret_cast(user_data) == 0; bool to_yuva = reinterpret_cast(user_data) == 2; if (only_8bit) { // "ConvertToYV24" syntax // parameter index skip back by 1 compared to 420/422, no ChromaOutPlacement parameter, bits is at index 8 instead of 9 if (args[8].Defined() && args[8].AsInt() != 8) env->ThrowError("ConvertToYV24: only 8 bit output supported. " "Use ConvertToYUV444 for higher bit depth."); AVSValue new_args[10] = { args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], AVSValue(8), args[9] }; AVSValue new_args_val(new_args, 10); return Create(new_args_val, "ConvertToYUV444", only_8bit, to_yuva, env); } return Create(args, "ConvertToYUV444", only_8bit, to_yuva, env); } AVSValue __cdecl ConvertToPlanarGeneric::CreateYV411(AVSValue args, void* user_data, IScriptEnvironment* env) { bool only_8bit = reinterpret_cast(user_data) == 0; bool to_yuva = reinterpret_cast(user_data) == 2; // parameter index skip back by 1 compared to 420/422, no ChromaOutPlacement parameter, bits is at index 8 instead of 9 if (args[8].Defined() && args[8].AsInt() != 8) env->ThrowError("ConvertToYV411: only 8 bit output supported, " "no high bit depth YUV411 format exists."); AVSValue new_args[10] = { args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], AVSValue(8), args[9] }; AVSValue new_args_val(new_args, 10); return Create(new_args_val, "ConvertToYV411", only_8bit, to_yuva, env); } AVSValue __cdecl ConvertToPlanarGeneric::CreateConvertToYUY2(AVSValue args, void*, IScriptEnvironment* env) { PClip clip = args[0].AsClip(); VideoInfo vi = clip->GetVideoInfo(); // Fast no-op: YUY2 source, no parameters at all. // Do not touch frame properties - caller's responsibility. if (vi.IsYUY2() && !args[1].Defined() // interlaced && !args[2].Defined() // matrix && !args[3].Defined() // ChromaInPlacement && !args[4].Defined() // chromaresample && !args[5].Defined() // ChromaOutPlacement && !args[6].Defined() // param1 && !args[7].Defined() // param2 && !args[8].Defined() // param3 && !args[9].Defined() // bits && !args[10].Defined()) // quality return clip; // YUY2 is 8-bit only: bits= must be 8 if specified. // We check here to give a proper ConvertToYUY2-specific error message, // rather than letting CreateYUV422 complain about something unrelated. // Source can be any bit depth - the conversion chain will downconvert. if (args[9].Defined() && args[9].AsInt() != 8) env->ThrowError("ConvertToYUY2: bits must be 8, YUY2 is an 8-bit format"); // Rebuild args with bits=8 forced, so CreateYUV422 sees an explicit // 8-bit target regardless of source bit depth. // This also means the void*1 path in CreateYUV422 won't reject // high bit depth sources - the bits=8 in args drives the downconvert. AVSValue new_args[11] = { args[0], // clip args[1], // interlaced args[2], // matrix args[3], // ChromaInPlacement args[4], // chromaresample args[5], // ChromaOutPlacement args[6], // param1 args[7], // param2 args[8], // param3 AVSValue(8), // bits: always 8 for YUY2, overrides source depth args[10] // quality }; // (void*)1: allow any source bit depth, bits=8 in args enforces 8-bit output. // The legacy (void*)0 source-depth check is not appropriate here since // we explicitly want to allow e.g. 10-bit YUV420 → 8-bit YUY2. PClip yv16 = CreateYUV422(AVSValue(new_args, 11), (void*)1, env).AsClip(); // Lossless repack YV16->YUY2. // Frame properties preserved via NewVideoFrameP in GetFrame. return new ConvertYV16ToYUY2(yv16, env); } AVSValue __cdecl ConvertToPlanarGeneric::CreateConvertBackToYUY2(AVSValue args, void*, IScriptEnvironment* env) { // ConvertBackToYUY2 was a pre-2.5 optimization for RGB roundtrip workflows. // It was never interlaced-aware (hardcoded interlaced=false). // Now obsolete - forward to ConvertToYUY2::Create with full parameter array. // ConvertBackToYUY2 signature: c[matrix]s // ConvertToYUY2 signature: c[interlaced]b[matrix]s[ChromaInPlacement]s // [chromaresample]s[ChromaOutPlacement]s // [param1]f[param2]f[param3]f[bits]i[quality]b AVSValue new_args[11] = { args[0], // clip AVSValue(false),// interlaced: was always false in ConvertBackToYUY2 args[1], // matrix: pass through AVSValue(), // ChromaInPlacement: not defined AVSValue(), // chromaresample: not defined AVSValue(), // ChromaOutPlacement: not defined AVSValue(), // param1: not defined AVSValue(), // param2: not defined AVSValue(), // param3: not defined AVSValue(), // bits: not defined (will be forced to 8 inside) AVSValue() // quality: not defined }; return CreateConvertToYUY2(AVSValue(new_args, 11), nullptr, env); } /* static int getPlacement(const AVSValue& _placement, IScriptEnvironment* env) { const char* placement = _placement.AsString(0); if (placement) { if (!lstrcmpi(placement, "mpeg2") || !lstrcmpi(placement, "left")) return PLACEMENT_MPEG2; if (!lstrcmpi(placement, "mpeg1") || !lstrcmpi(placement, "jpeg") || !lstrcmpi(placement, "center")) return PLACEMENT_MPEG1; if (!lstrcmpi(placement, "dv")) return PLACEMENT_DV; if (!lstrcmpi(placement, "top_left")) return PLACEMENT_TOP_LEFT; env->ThrowError("Convert: Unknown chromaplacement"); } return PLACEMENT_MPEG2; } */ ResamplingFunction* getResampler(const char* resampler, AVSValue param1, AVSValue param2, AVSValue param3, bool throw_on_error, IScriptEnvironment* env) { if (resampler) { if (!lstrcmpi(resampler, "point")) return new PointFilter(); else if (!lstrcmpi(resampler, "bilinear")) return new TriangleFilter(); else if (!lstrcmpi(resampler, "bicubic")) return new MitchellNetravaliFilter(param1.AsDblDef(1.0/3), param2.AsDblDef(1.0/3)); // optional B and C as param1 and param2 else if (!lstrcmpi(resampler, "lanczos")) return new LanczosFilter((int)param1.AsFloat(3)); // optional Taps as param1 else if (!lstrcmpi(resampler, "lanczos4")) return new LanczosFilter(4); else if (!lstrcmpi(resampler, "blackman")) return new BlackmanFilter((int)param1.AsFloat(4)); // optional Taps as param1 else if (!lstrcmpi(resampler, "spline16")) return new Spline16Filter(); else if (!lstrcmpi(resampler, "spline36")) return new Spline36Filter(); else if (!lstrcmpi(resampler, "spline64")) return new Spline64Filter(); else if (!lstrcmpi(resampler, "gauss")) return new GaussianFilter(param1.AsDblDef(30.0), param2.AsDblDef(2.0), param3.AsDblDef(4.0)); // optional P, B, S as param1, param2, param3 else if (!lstrcmpi(resampler, "sinc")) return new SincFilter((int)param1.AsFloat(4)); // optional Taps as param1 else if (!lstrcmpi(resampler, "sinpow")) return new SinPowerFilter(param1.AsDblDef(2.5)); // optional P as param1 else if (!lstrcmpi(resampler, "sinclin2")) return new SincLin2Filter((int)param1.AsFloat(15)); // optional Taps= as param1 else if (!lstrcmpi(resampler, "userdefined2")) return new UserDefined2Filter(param1.AsDblDef(121.0), param2.AsDblDef(19.0), param3.AsDblDef(2.3)); // optional B and C and S as param1, param2, param3 else if (throw_on_error) env->ThrowError("Convert: Unknown chroma resampler, '%s'", resampler); else return nullptr; // e.g. from AddBorders } return new MitchellNetravaliFilter(param1.AsDblDef(1.0/3), param2.AsDblDef(1.0/3)); // Default colorspace conversion for AviSynth } DISABLE_WARNING_POP ================================================ FILE: avs_core/convert/convert_planar.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. // ConvertPlanar (c) 2005 by Klaus Post #ifndef __Convert_PLANAR_H__ #define __Convert_PLANAR_H__ #include #include #include "convert.h" #include "convert_matrix.h" #include "../filters/resample.h" #include "convert_helper.h" #include "convert_bits.h" enum YuvRgbConversionType { NATIVE_INT, // Same bit depth, integer matrix arithmetic, no conversion FORCE_FLOAT, // Float matrix workflow (required for float input, optional for accuracy) FLOAT_OUTPUT, // Integer matrix -> float output (for int->float conversions) BITCONV_INT_LIMITED, // Bit-depth change with limited range (shift-based scaling) BITCONV_INT_FULL // Bit-depth change with full range (requires float coefficients) }; // Dispatcher matching AVX2/SSE2 structure template void convert_yuv_to_planarrgb_c(BYTE* dstp[3], int dstPitch[3], const BYTE* srcp[3], const int srcPitch[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); // useful functions template void fill_chroma(uint8_t * dstp_u, uint8_t * dstp_v, int height, int row_size, int pitch, pixel_t val); template void fill_plane(uint8_t * dstp, int height, int row_size, int pitch, pixel_t val); ResamplingFunction* getResampler(const char* resampler, AVSValue param1, AVSValue param2, AVSValue param3, bool throw_on_error, IScriptEnvironment* env); class ConvertRGBToYUV444 : public GenericVideoFilter { public: ConvertRGBToYUV444(PClip src, const char *matrix_name, bool keep_packedrgb_alpha, int _target_bit_depth, bool _quality, bool& bitdepthConverted, bool _to_y, IScriptEnvironment* env); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) override; int __stdcall SetCacheHints(int cachehints, int frame_range) override { AVS_UNUSED(frame_range); return cachehints == CACHE_GET_MTMODE ? MT_NICE_FILTER : 0; } private: int theMatrix; int theColorRange; int theOutColorRange; ConversionMatrix matrix; int pixel_step; bool targetHasAlpha; bool isPlanarRGBfamily; int source_bit_depth; int target_bit_depth; bool quality; bool to_y; // primarily for alpha plane conversion BitDepthConvFuncPtr conv_function; BitDepthConvFuncPtr conv_function_chroma; // 32bit float YUV chroma BitDepthConvFuncPtr conv_function_a; }; class ConvertYUY2ToYV16_or_Y : public GenericVideoFilter { public: ConvertYUY2ToYV16_or_Y(PClip src, bool _to_y, IScriptEnvironment* env); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) override; int __stdcall SetCacheHints(int cachehints, int frame_range) override { AVS_UNUSED(frame_range); return cachehints == CACHE_GET_MTMODE ? MT_NICE_FILTER : 0; } static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env); private: bool to_y; }; class ConvertYUV444ToRGB : public GenericVideoFilter { public: ConvertYUV444ToRGB(PClip src, const char* matrix_name, int _pixel_step, int _target_bit_depth, bool quality, bool& bitdepthConverted, IScriptEnvironment* env); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) override; int __stdcall SetCacheHints(int cachehints, int frame_range) override { AVS_UNUSED(frame_range); return cachehints == CACHE_GET_MTMODE ? MT_NICE_FILTER : 0; } private: int theMatrix; int theColorRange; // separate out set for rgb target int theOutMatrix; int theOutColorRange; ConversionMatrix matrix; int pixel_step; int source_bit_depth; int target_bit_depth; bool quality; // true: forced float matrix multiplication // primarily for alpha plane conversion BitDepthConvFuncPtr conv_function; BitDepthConvFuncPtr conv_function_chroma; // 32bit float YUV chroma BitDepthConvFuncPtr conv_function_a; }; class ConvertYV16ToYUY2 : public GenericVideoFilter { public: ConvertYV16ToYUY2(PClip src, IScriptEnvironment* env); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) override; int __stdcall SetCacheHints(int cachehints, int frame_range) override { AVS_UNUSED(frame_range); return cachehints == CACHE_GET_MTMODE ? MT_NICE_FILTER : 0; } static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env); }; class ConvertToPlanarGeneric : public GenericVideoFilter { public: ConvertToPlanarGeneric(PClip src, int dst_space, bool interlaced, int _ChromaLocation_In, const AVSValue& ChromaResampler, const AVSValue& param1, const AVSValue& param2, const AVSValue& param3, int _ChromaLocation_Out, IScriptEnvironment* env); ~ConvertToPlanarGeneric() {} PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) override; int __stdcall SetCacheHints(int cachehints, int frame_range) override { AVS_UNUSED(frame_range); return cachehints == CACHE_GET_MTMODE ? MT_NICE_FILTER : 0; } static AVSValue __cdecl CreateY(AVSValue args, void* user_data, IScriptEnvironment* env); static AVSValue __cdecl CreateYV411(AVSValue args, void* user_data, IScriptEnvironment* env); static AVSValue __cdecl CreateYUV420(AVSValue args, void* user_data, IScriptEnvironment* env); static AVSValue __cdecl CreateYUV422(AVSValue args, void* user_data, IScriptEnvironment* env); static AVSValue __cdecl CreateYUV444(AVSValue args, void* user_data, IScriptEnvironment* env); // YUY2 targets: route through YV16, no GetFrame in this class needed. // Placed here as the natural hub for all YUV format conversion routing. static AVSValue __cdecl CreateConvertToYUY2(AVSValue args, void* user_data, IScriptEnvironment* env); static AVSValue __cdecl CreateConvertBackToYUY2(AVSValue args, void* user_data, IScriptEnvironment* env); private: static AVSValue Create(AVSValue& args, const char* filter, bool strip_alpha_legacy_8bit, bool to_yuva, IScriptEnvironment* env); bool Yinput; int pixelsize; int ChromaLocation_In; int ChromaLocation_Out; // future _ChromaLocation PClip Usource; PClip Vsource; }; class AddAlphaPlane : public GenericVideoFilter { public: AddAlphaPlane(PClip _child, PClip _maskClip, float _mask_f, bool isMaskDefined, IScriptEnvironment* env); PVideoFrame __stdcall GetFrame(int n,IScriptEnvironment* env) override; int __stdcall SetCacheHints(int cachehints, int frame_range) override { AVS_UNUSED(frame_range); return cachehints == CACHE_GET_MTMODE ? MT_NICE_FILTER : 0; } static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env); private: int mask; float mask_f; PClip alphaClip; int pixelsize; int bits_per_pixel; }; class RemoveAlphaPlane : public GenericVideoFilter { public: RemoveAlphaPlane(PClip _child, IScriptEnvironment* env); PVideoFrame __stdcall GetFrame(int n,IScriptEnvironment* env) override; int __stdcall SetCacheHints(int cachehints, int frame_range) override { AVS_UNUSED(frame_range); return cachehints == CACHE_GET_MTMODE ? MT_NICE_FILTER : 0; } static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env); private: }; #endif ================================================ FILE: avs_core/convert/convert_rgb.cpp ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include "convert_rgb.h" #ifdef INTEL_INTRINSICS #include "intel/convert_rgb_sse.h" #include "intel/convert_rgb_avx2.h" #ifdef INTEL_INTRINSICS_AVX512 #include "intel/convert_rgb_avx512.h" #endif #endif #include /************************************* ******* RGB Helper Classes ****** *************************************/ RGBtoRGBA::RGBtoRGBA(PClip src) : GenericVideoFilter(src) { vi.pixel_type = src->GetVideoInfo().ComponentSize() == 1 ? VideoInfo::CS_BGR32 : VideoInfo::CS_BGR64; } static void convert_rgb24_to_rgb32_c(const BYTE *srcp, BYTE *dstp, size_t src_pitch, size_t dst_pitch, size_t width, size_t height) { for (size_t y = height; y > 0; --y) { for (size_t x = 0; x < width; ++x) { *reinterpret_cast(dstp + x*4) = *reinterpret_cast(srcp+x*3) | 0xFF000000; } srcp += src_pitch; dstp += dst_pitch; } } static void convert_rgb48_to_rgb64_c(const BYTE *srcp, BYTE *dstp, size_t src_pitch, size_t dst_pitch, size_t width, size_t height) { for (size_t y = height; y > 0; --y) { for (size_t x = 0; x < width; ++x) { *reinterpret_cast(dstp + x*8) = *reinterpret_cast(srcp+x*6) | 0xFFFF000000000000ULL; } srcp += src_pitch; dstp += dst_pitch; } } PVideoFrame __stdcall RGBtoRGBA::GetFrame(int n, IScriptEnvironment* env) { PVideoFrame src = child->GetFrame(n, env); PVideoFrame dst = env->NewVideoFrameP(vi, &src); const BYTE *srcp = src->GetReadPtr(); BYTE *dstp = dst->GetWritePtr(); const int src_pitch = src->GetPitch(); const int dst_pitch = dst->GetPitch(); int pixelsize = vi.ComponentSize(); using conv_fn_t = void(*)(const BYTE*, BYTE*, size_t, size_t, size_t, size_t); conv_fn_t fn; #ifdef INTEL_INTRINSICS if (env->GetCPUFlags() & CPUF_SSSE3) fn = (pixelsize == 1) ? convert_rgb24_to_rgb32_ssse3 : convert_rgb48_to_rgb64_ssse3; else #endif fn = (pixelsize == 1) ? convert_rgb24_to_rgb32_c : convert_rgb48_to_rgb64_c; fn(srcp, dstp, src_pitch, dst_pitch, vi.width, vi.height); return dst; } RGBAtoRGB::RGBAtoRGB(PClip src) : GenericVideoFilter(src) { vi.pixel_type = src->GetVideoInfo().ComponentSize() == 1 ? VideoInfo::CS_BGR24 : VideoInfo::CS_BGR48; } static void convert_rgb32_to_rgb24_c(const BYTE *srcp, BYTE *dstp, size_t src_pitch, size_t dst_pitch, size_t width, size_t height) { for (size_t y = height; y > 0; --y) { size_t x; for (x = 0; x < width-1; ++x) { *reinterpret_cast(dstp+x*3) = *reinterpret_cast(srcp+x*4); } //last pixel dstp[x*3+0] = srcp[x*4+0]; dstp[x*3+1] = srcp[x*4+1]; dstp[x*3+2] = srcp[x*4+2]; srcp += src_pitch; dstp += dst_pitch; } } static void convert_rgb64_to_rgb48_c(const BYTE *srcp, BYTE *dstp, size_t src_pitch, size_t dst_pitch, size_t width, size_t height) { for (size_t y = height; y > 0; --y) { size_t x; for (x = 0; x < width-1; ++x) { // width-1 really! *reinterpret_cast(dstp+x*6) = *reinterpret_cast(srcp+x*8); } //last pixel reinterpret_cast(dstp)[x*3+0] = reinterpret_cast(srcp)[x*4+0]; reinterpret_cast(dstp)[x*3+1] = reinterpret_cast(srcp)[x*4+1]; reinterpret_cast(dstp)[x*3+2] = reinterpret_cast(srcp)[x*4+2]; srcp += src_pitch; dstp += dst_pitch; } } PVideoFrame __stdcall RGBAtoRGB::GetFrame(int n, IScriptEnvironment* env) { PVideoFrame src = child->GetFrame(n, env); PVideoFrame dst = env->NewVideoFrameP(vi, &src); const BYTE *srcp = src->GetReadPtr(); BYTE *dstp = dst->GetWritePtr(); size_t src_pitch = src->GetPitch(); size_t dst_pitch = dst->GetPitch(); int pixelsize = vi.ComponentSize(); using conv_fn_t = void(*)(const BYTE*, BYTE*, size_t, size_t, size_t, size_t); conv_fn_t fn = nullptr; #ifdef INTEL_INTRINSICS if (env->GetCPUFlags() & CPUF_SSSE3) fn = (pixelsize == 1) ? convert_rgb32_to_rgb24_ssse3 : convert_rgb64_to_rgb48_ssse3; else if ((pixelsize == 1) && (env->GetCPUFlags() & CPUF_SSE2)) fn = convert_rgb32_to_rgb24_sse2; else #endif fn = (pixelsize == 1) ? convert_rgb32_to_rgb24_c : convert_rgb64_to_rgb48_c; fn(srcp, dstp, src_pitch, dst_pitch, vi.width, vi.height); return dst; } PackedRGBtoPlanarRGB::PackedRGBtoPlanarRGB(PClip src, bool _sourceHasAlpha, bool _targetHasAlpha) : GenericVideoFilter(src), sourceHasAlpha(_sourceHasAlpha), targetHasAlpha(_targetHasAlpha) { vi.pixel_type = src->GetVideoInfo().ComponentSize() == 1 ? (targetHasAlpha ? VideoInfo::CS_RGBAP : VideoInfo::CS_RGBP) : (targetHasAlpha ? VideoInfo::CS_RGBAP16 : VideoInfo::CS_RGBP16); } template static void convert_rgb_to_rgbp_c(const BYTE* srcp, BYTE* (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height) { constexpr int bits_per_pixel = sizeof(pixel_t) == 1 ? 8 : 16; constexpr int max_pixel_value = (1 << bits_per_pixel) - 1; for (int y = height; y > 0; --y) { int x; for (x = 0; x < width; ++x) { pixel_t B = reinterpret_cast(srcp)[x * src_numcomponents + 0]; pixel_t G = reinterpret_cast(srcp)[x * src_numcomponents + 1]; pixel_t R = reinterpret_cast(srcp)[x * src_numcomponents + 2]; pixel_t A = 0; if constexpr (targetHasAlpha) A = (src_numcomponents == 4) ? reinterpret_cast(srcp)[x * src_numcomponents + 3] : max_pixel_value; reinterpret_cast(dstp[0])[x] = G; reinterpret_cast(dstp[1])[x] = B; reinterpret_cast(dstp[2])[x] = R; if constexpr (targetHasAlpha) reinterpret_cast(dstp[3])[x] = A; } srcp -= src_pitch; // source packed RGB is upside down dstp[0] += dst_pitch[0]; dstp[1] += dst_pitch[1]; dstp[2] += dst_pitch[2]; if constexpr (targetHasAlpha) dstp[3] += dst_pitch[3]; } } PVideoFrame __stdcall PackedRGBtoPlanarRGB::GetFrame(int n, IScriptEnvironment* env) { PVideoFrame src = child->GetFrame(n, env); PVideoFrame dst = env->NewVideoFrameP(vi, &src); int src_pitch = src->GetPitch(); const BYTE* srcp = src->GetReadPtr(); BYTE* dstp[4] = { dst->GetWritePtr(PLANAR_G), dst->GetWritePtr(PLANAR_B), dst->GetWritePtr(PLANAR_R), dst->GetWritePtr(PLANAR_A) }; int dst_pitch[4] = { dst->GetPitch(PLANAR_G), dst->GetPitch(PLANAR_B), dst->GetPitch(PLANAR_R), dst->GetPitch(PLANAR_A) }; int pixelsize = vi.ComponentSize(); srcp += src_pitch * (vi.height - 1); // start from bottom: packed RGB is upside down using conv_fn_t = void(*)(const BYTE*, BYTE* (&)[4], int, int(&)[4], int, int); conv_fn_t fn = nullptr; const bool targetHasAlpha = vi.IsPlanarRGBA(); #ifdef INTEL_INTRINSICS auto CPU = env->GetCPUFlagsEx(); const bool hasSSE2 = (CPU & CPUF_SSE2) != 0; const bool hasSSSE3 = (CPU & CPUF_SSSE3) != 0; const bool hasAVX2 = (CPU & CPUF_AVX2) != 0; #ifdef INTEL_INTRINSICS_AVX512 //const bool has_AVX512_base = (CPU & CPUF_AVX512_BASE) == CPUF_AVX512_BASE; // group flag! const bool has_AVX512_fast = (CPU & CPUF_AVX512_FAST) == CPUF_AVX512_FAST; // group flag! #endif #endif // for RGBA there is no width limit, we do full scanlines, Avisynth's 64 byte alignment allows // processing 16 RGB32 pixels or 8 RGB64 pixels at a time // RGB is tricky, remainder handling is needed. if (pixelsize == 1) { if (sourceHasAlpha) { // RGB32-> #ifdef INTEL_INTRINSICS #ifdef INTEL_INTRINSICS_AVX512 if (has_AVX512_fast) fn = targetHasAlpha ? convert_rgba_to_rgbp_avx512vbmi : convert_rgba_to_rgbp_avx512vbmi; else #endif if (hasAVX2) fn = targetHasAlpha ? convert_rgba_to_rgbp_avx2 : convert_rgba_to_rgbp_avx2; else if (hasSSSE3) fn = targetHasAlpha ? convert_rgba_to_rgbp_ssse3 : convert_rgba_to_rgbp_ssse3; else if (hasSSE2) fn = targetHasAlpha ? convert_rgba_to_rgbp_sse2 : convert_rgba_to_rgbp_sse2 ; else #endif fn = targetHasAlpha ? convert_rgb_to_rgbp_c : convert_rgb_to_rgbp_c; } else { // RGB24-> #ifdef INTEL_INTRINSICS // RGB24->RGB(A)P8, works with 48byte blocks (16xRGB), min width is 16 (SSSE3, 32 (AVX2), width constraint is due to remainder handling, not alignment) if (hasAVX2 && vi.width >= 32) fn = targetHasAlpha ? convert_rgb_to_rgbp_avx2 : convert_rgb_to_rgbp_avx2 ; else if (hasSSSE3 && vi.width >= 16) fn = targetHasAlpha ? convert_rgb_to_rgbp_ssse3 : convert_rgb_to_rgbp_ssse3; else if (hasSSE2 && vi.width >= 16) fn = targetHasAlpha ? convert_rgb_to_rgbp_sse2 : convert_rgb_to_rgbp_sse2 ; else #endif fn = targetHasAlpha ? convert_rgb_to_rgbp_c : convert_rgb_to_rgbp_c; } } else { // pixelsize == 2 if (sourceHasAlpha) { // RGB64-> #ifdef INTEL_INTRINSICS #ifdef INTEL_INTRINSICS_AVX512 if (has_AVX512_fast) fn = targetHasAlpha ? convert_rgba_to_rgbp_avx512vbmi : convert_rgba_to_rgbp_avx512vbmi; else #endif if (hasAVX2) fn = targetHasAlpha ? convert_rgba_to_rgbp_avx2 : convert_rgba_to_rgbp_avx2; else if (hasSSSE3) fn = targetHasAlpha ? convert_rgba_to_rgbp_ssse3 : convert_rgba_to_rgbp_ssse3; else if (hasSSE2) fn = targetHasAlpha ? convert_rgba_to_rgbp_sse2 : convert_rgba_to_rgbp_sse2 ; else #endif fn = targetHasAlpha ? convert_rgb_to_rgbp_c : convert_rgb_to_rgbp_c; } else { // RGB48-> // width constraint is due to remainder handling, not alignment, AVX2 needs 16 pixels (48 bytes) to process, SSE2/SSSE3 need 8 pixels (48 bytes) to process #ifdef INTEL_INTRINSICS if (hasAVX2 && vi.width >= 16) fn = targetHasAlpha ? convert_rgb_to_rgbp_avx2 : convert_rgb_to_rgbp_avx2 ; else if (hasSSSE3 && vi.width >= 8) fn = targetHasAlpha ? convert_rgb_to_rgbp_ssse3 : convert_rgb_to_rgbp_ssse3; else if (hasSSE2 && vi.width >= 8) fn = targetHasAlpha ? convert_rgb_to_rgbp_sse2 : convert_rgb_to_rgbp_sse2 ; else #endif fn = targetHasAlpha ? convert_rgb_to_rgbp_c : convert_rgb_to_rgbp_c; } } fn(srcp, dstp, src_pitch, dst_pitch, vi.width, vi.height); return dst; } PlanarRGBtoPackedRGB::PlanarRGBtoPackedRGB(PClip src, bool _targetHasAlpha) : GenericVideoFilter(src), targetHasAlpha(_targetHasAlpha) { vi.pixel_type = src->GetVideoInfo().ComponentSize() == 1 ? (targetHasAlpha ? VideoInfo::CS_BGR32 : VideoInfo::CS_BGR24) : // PlanarRGB(A)->RGB24/32 (targetHasAlpha ? VideoInfo::CS_BGR64 : VideoInfo::CS_BGR48); // PlanarRGB(A)->RGB48/64 } template static void convert_rgbp_to_rgb_c(const BYTE *(&srcp)[4], BYTE * dstp, int (&src_pitch)[4], int dst_pitch, int width, int height) { constexpr int bits_per_pixel = sizeof(pixel_t) == 1 ? 8 : 16; constexpr int max_pixel_value = (1 << bits_per_pixel) - 1; for (int y = 0; y < height; y++) { int x; for (x = 0; x < width; ++x) { const pixel_t G = reinterpret_cast(srcp[0])[x]; const pixel_t B = reinterpret_cast(srcp[1])[x]; const pixel_t R = reinterpret_cast(srcp[2])[x]; reinterpret_cast(dstp)[x*target_numcomponents+0] = B; reinterpret_cast(dstp)[x*target_numcomponents+1] = G; reinterpret_cast(dstp)[x*target_numcomponents+2] = R; if constexpr (target_numcomponents == 4) { // either from A channel or default transparent constant pixel_t A; if constexpr (hasSrcAlpha) A = reinterpret_cast(srcp[3])[x]; else A = max_pixel_value; // 255/65535 reinterpret_cast(dstp)[x*target_numcomponents + 3] = A; } } dstp -= dst_pitch; // source packed RGB is upside down srcp[0] += src_pitch[0]; srcp[1] += src_pitch[1]; srcp[2] += src_pitch[2]; if constexpr (hasSrcAlpha) srcp[3] += src_pitch[3]; } } PVideoFrame __stdcall PlanarRGBtoPackedRGB::GetFrame(int n, IScriptEnvironment* env) { PVideoFrame src = child->GetFrame(n, env); PVideoFrame dst = env->NewVideoFrameP(vi, &src); int dst_pitch = dst->GetPitch(); BYTE* dstp = dst->GetWritePtr(); const BYTE* srcp[4] = { src->GetReadPtr(PLANAR_G), src->GetReadPtr(PLANAR_B), src->GetReadPtr(PLANAR_R), src->GetReadPtr(PLANAR_A) }; int src_pitch[4] = { src->GetPitch(PLANAR_G), src->GetPitch(PLANAR_B), src->GetPitch(PLANAR_R), src->GetPitch(PLANAR_A) }; int pixelsize = vi.ComponentSize(); dstp += dst_pitch * (vi.height - 1); // start from bottom: packed RGB is upside down const bool hasSrcAlpha = (src_pitch[3] != 0); // planar RGB_A_ source const bool hasTargetAlpha = (vi.NumComponents() == 4); // RGB32 or RGB64 target using conv_fn_t = void(*)(const BYTE* (&)[4], BYTE*, int(&)[4], int, int, int); conv_fn_t fn = nullptr; #ifdef INTEL_INTRINSICS const bool hasSSE2 = (env->GetCPUFlags() & CPUF_SSE2) != 0; #endif if (pixelsize == 1) { if (!hasTargetAlpha) { // RGB24 — no SIMD path exists fn = hasSrcAlpha ? convert_rgbp_to_rgb_c : convert_rgbp_to_rgb_c; } else { // RGBA32 #ifdef INTEL_INTRINSICS if (hasSSE2) fn = hasSrcAlpha ? convert_rgbp_to_rgba_sse2 : convert_rgbp_to_rgba_sse2; else #endif fn = hasSrcAlpha ? convert_rgbp_to_rgb_c : convert_rgbp_to_rgb_c; } } else { // pixelsize == 2 if (!hasTargetAlpha) { // RGB48 — no SIMD path exists fn = hasSrcAlpha ? convert_rgbp_to_rgb_c : convert_rgbp_to_rgb_c; } else { // RGBA64 #ifdef INTEL_INTRINSICS if (hasSSE2) fn = hasSrcAlpha ? convert_rgbp_to_rgba_sse2 : convert_rgbp_to_rgba_sse2; else #endif fn = hasSrcAlpha ? convert_rgbp_to_rgb_c : convert_rgbp_to_rgb_c; } } fn(srcp, dstp, src_pitch, dst_pitch, vi.width, vi.height); return dst; } ================================================ FILE: avs_core/convert/convert_rgb.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __Convert_RGB_H__ #define __Convert_RGB_H__ #include class RGBtoRGBA : public GenericVideoFilter /** * RGB -> RGBA, setting alpha channel to 255/65535 */ { public: RGBtoRGBA(PClip src); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) override; int __stdcall SetCacheHints(int cachehints, int frame_range) override { AVS_UNUSED(frame_range); return cachehints == CACHE_GET_MTMODE ? MT_NICE_FILTER : 0; } }; class RGBAtoRGB : public GenericVideoFilter /** * Class to strip alpha channel */ { public: RGBAtoRGB(PClip src); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) override; int __stdcall SetCacheHints(int cachehints, int frame_range) override { AVS_UNUSED(frame_range); return cachehints == CACHE_GET_MTMODE ? MT_NICE_FILTER : 0; } }; class PackedRGBtoPlanarRGB : public GenericVideoFilter /** * RGB(A) -> RGBP(A) */ { public: PackedRGBtoPlanarRGB(PClip src, bool _sourceHasAlpha, bool _targetHasAlpha); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) override; int __stdcall SetCacheHints(int cachehints, int frame_range) override { AVS_UNUSED(frame_range); return cachehints == CACHE_GET_MTMODE ? MT_NICE_FILTER : 0; } const bool sourceHasAlpha; const bool targetHasAlpha; }; class PlanarRGBtoPackedRGB : public GenericVideoFilter /** * RGBP(A) -> RGB(A) */ { public: PlanarRGBtoPackedRGB(PClip src, bool _targetHasAlpha); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) override; int __stdcall SetCacheHints(int cachehints, int frame_range) override { AVS_UNUSED(frame_range); return cachehints == CACHE_GET_MTMODE ? MT_NICE_FILTER : 0; } const bool targetHasAlpha; }; #endif // __Convert_RGB_H__ ================================================ FILE: avs_core/convert/intel/convert_audio_avx2.cpp ================================================ // Avisynth+ // https://avs-plus.net // // This file is part of Avisynth+ which is released under GPL2+ with exception. // Convert Audio helper functions (AVX2) // Copyright (c) 2020 Xinyue Lu, (c) 2021 pinterf #include #include // Intrinsics base header + really required extension headers #if defined(_MSC_VER) #include // MSVC #else #include // GCC/MinGW/Clang/LLVM #endif #include // AVX2 // Easy: 32-16, 16-32 // Float: 8/16/32-FLT, FLT-8/16/32 void convert32To16_AVX2(void *inbuf, void *outbuf, int count) { auto in = reinterpret_cast(inbuf); auto in16 = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); const int c_loop = count & ~15; for (int i = c_loop; i < count; i++) out[i] = in16[i * 2 + 1]; for (int i = 0; i < c_loop; i += 16) { __m256i in32a = _mm256_loadu_si256(reinterpret_cast(in)); in += 8; __m256i in32b = _mm256_loadu_si256(reinterpret_cast(in)); in += 8; __m256i in16a = _mm256_srai_epi32(in32a, 16); __m256i in16b = _mm256_srai_epi32(in32b, 16); __m256i out16 = _mm256_packs_epi32(in16a, in16b); out16 = _mm256_permute4x64_epi64(out16, 216); _mm256_storeu_si256(reinterpret_cast<__m256i *>(out), out16); out += 16; } } void convert16To32_AVX2(void *inbuf, void *outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); auto out16 = reinterpret_cast(outbuf); const int c_loop = count & ~15; for (int i = c_loop; i < count; i++) { out16[i * 2] = 0; out16[i * 2 + 1] = in[i]; } __m256i zero = _mm256_set1_epi16(0); for (int i = 0; i < c_loop; i += 16) { __m256i in16 = _mm256_loadu_si256(reinterpret_cast(in)); in += 16; in16 = _mm256_permute4x64_epi64(in16, 216); __m256i out32a = _mm256_unpacklo_epi16(zero, in16); __m256i out32b = _mm256_unpackhi_epi16(zero, in16); _mm256_storeu_si256(reinterpret_cast<__m256i *>(out), out32a); out += 8; _mm256_storeu_si256(reinterpret_cast<__m256i *>(out), out32b); out += 8; } } void convert8ToFLT_AVX2(void* inbuf, void* outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); constexpr float divisor = 1.0f / 128.f; // 1 << 7 const int c_loop = count & ~7; for (int i = c_loop; i < count; i++) out[i] = (in[i] - 128) * divisor; __m256 divv = _mm256_set1_ps(divisor); for (int i = 0; i < c_loop; i += 8) { __m128i src = _mm_loadl_epi64(reinterpret_cast<__m128i*>(in)); in += 8; __m256i in32 = _mm256_cvtepu8_epi32(src); in32 = _mm256_sub_epi32(in32, _mm256_set1_epi32(128)); __m256 infl = _mm256_cvtepi32_ps(in32); __m256 outfl = _mm256_mul_ps(infl, divv); _mm256_storeu_ps(out, outfl); out += 8; } } void convertFLTTo8_AVX2(void* inbuf, void* outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); constexpr float multiplier = 128.f; constexpr float max8 = 127.f; constexpr float min8 = -128.f; const int c_loop = count & ~15; for (int i = c_loop; i < count; i++) { float val = in[i] * multiplier; uint8_t result; if (val >= max8) result = 255; else if (val <= min8) result = 0; else result = static_cast(val) + 128; out[i] = result; } __m256 mulv = _mm256_set1_ps(multiplier); __m256 maxv = _mm256_set1_ps(max8); __m256 minv = _mm256_set1_ps(min8); for (int i = 0; i < c_loop; i += 16) { __m256 infl_lo = _mm256_loadu_ps(in); in += 8; __m256 infl_hi = _mm256_loadu_ps(in); in += 8; __m256 outfl_lo = _mm256_max_ps(minv, _mm256_min_ps(maxv, _mm256_mul_ps(infl_lo, mulv))); __m256 outfl_hi = _mm256_max_ps(minv, _mm256_min_ps(maxv, _mm256_mul_ps(infl_hi, mulv))); __m256i out32_lo = _mm256_cvttps_epi32(outfl_lo); __m256i out32_hi = _mm256_cvttps_epi32(outfl_hi); __m256i out16 = _mm256_packs_epi32(out32_lo, out32_hi); out16 = _mm256_permute4x64_epi64(out16, (0 << 0) | (2 << 2) | (1 << 4) | (3 << 6)); __m128i out16_lo = _mm256_castsi256_si128(out16); __m128i out16_hi = _mm256_extractf128_si256(out16, 1); __m128i out8 = _mm_packs_epi16(out16_lo, out16_hi); out8 = _mm_add_epi8(out8, _mm_set1_epi8(-128)); // 128 _mm_storeu_si128(reinterpret_cast<__m128i*>(out), out8); out += 16; } } void convert16ToFLT_AVX2(void* inbuf, void* outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); constexpr float divisor = 1.0f / 32768.f; // 1 << 15 const int c_loop = count & ~7; for (int i = c_loop; i < count; i++) out[i] = in[i] * divisor; __m256 divv = _mm256_set1_ps(divisor); for (int i = 0; i < c_loop; i += 8) { __m128i src = _mm_loadu_si128(reinterpret_cast<__m128i*>(in)); in += 8; __m256i in32 = _mm256_cvtepi16_epi32(src); __m256 infl = _mm256_cvtepi32_ps(in32); __m256 outfl = _mm256_mul_ps(infl, divv); _mm256_storeu_ps(out, outfl); out += 8; } } void convertFLTTo16_AVX2(void* inbuf, void* outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); constexpr float multiplier = 32768.f; constexpr float max16 = 32767.f; constexpr float min16 = -32768.f; const int c_loop = count & ~7; for (int i = c_loop; i < count; i++) { float val = in[i] * multiplier; int16_t result; if (val >= max16) result = 32767; else if (val <= min16) result = (int16_t)-32768; else result = static_cast(val); out[i] = result; } __m256 mulv = _mm256_set1_ps(multiplier); __m256 maxv = _mm256_set1_ps(max16); __m256 minv = _mm256_set1_ps(min16); for (int i = 0; i < c_loop; i += 8) { __m256 infl = _mm256_loadu_ps(in); in += 8; __m256 outfl = _mm256_max_ps(minv, _mm256_min_ps(maxv, _mm256_mul_ps(infl, mulv))); __m256i out32 = _mm256_cvttps_epi32(outfl); __m256i out16 = _mm256_packs_epi32(out32, out32); out16 = _mm256_permute4x64_epi64(out16, (0 << 0) | (2 << 2) | (1 << 4) | (3 << 6)); _mm_storeu_si128(reinterpret_cast<__m128i*>(out), _mm256_castsi256_si128(out16)); out += 8; } } void convert32ToFLT_AVX2(void *inbuf, void *outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); const float divisor = 1.0f/2147483648.0f; const int c_loop = count & ~7; for (int i = c_loop; i < count; i++) out[i] = in[i] * divisor; __m256 divv = _mm256_set1_ps(divisor); for (int i = 0; i < c_loop; i += 8) { __m256i in32 = _mm256_loadu_si256(reinterpret_cast(in)); in += 8; __m256 infl = _mm256_cvtepi32_ps(in32); __m256 outfl = _mm256_mul_ps(infl, divv); _mm256_storeu_ps(out, outfl); out += 8; } } void convertFLTTo32_AVX2(void *inbuf, void *outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); const float multiplier = 2147483648.0f; const float max32 = 2147483647.0f; // 2147483648.0f in reality const float min32 = -2147483648.0f; const int c_loop = count & ~7; for (int i = c_loop; i < count; i++) { float val = in[i] * multiplier; int32_t result; if (val >= max32) result = 0x7FFFFFFF; // 2147483647 else if (val <= min32) result = 0x80000000; // -2147483648 else result = static_cast(val); out[i] = result; } __m256 mulv = _mm256_set1_ps(multiplier); __m256 maxv = _mm256_set1_ps(max32); __m256 minv = _mm256_set1_ps(min32); __m256i maxv_i = _mm256_set1_epi32(0x7FFFFFFF); // 2147483647 __m256i minv_i = _mm256_set1_epi32(0x80000000); // -2147483648 for (int i = 0; i < c_loop; i += 8) { __m256 infl = _mm256_loadu_ps(in); in += 8; __m256 outfl = _mm256_mul_ps(infl, mulv); __m256i cmphigh = _mm256_castps_si256(_mm256_cmp_ps(outfl, maxv, _CMP_GE_OS)); __m256i cmplow = _mm256_castps_si256(_mm256_cmp_ps(minv, outfl, _CMP_GE_OS)); __m256i out32 = _mm256_cvttps_epi32(outfl); out32 = _mm256_blendv_epi8(out32, maxv_i, cmphigh); out32 = _mm256_blendv_epi8(out32, minv_i, cmplow); _mm256_storeu_si256(reinterpret_cast<__m256i *>(out), out32); out += 8; } } ================================================ FILE: avs_core/convert/intel/convert_audio_sse.cpp ================================================ // Avisynth+ // https://avs-plus.net // // This file is part of Avisynth+ which is released under GPL2+ with exception. // Convert Audio helper functions (SSE2/SSSE3) // Copyright (c) 2020 Xinyue Lu, (c) 2021 pinterf #include #include // Intrinsics base header + really required extension headers #if defined(_MSC_VER) #include // MSVC #else #include // GCC/MinGW/Clang/LLVM #endif #include // SSE4.1 #if defined(GCC) || defined(CLANG) #define SSE2 __attribute__((__target__("sse2"))) #define SSSE3 __attribute__((__target__("ssse3"))) #define SSE41 __attribute__((__target__("sse4.1"))) #else #define SSE2 #define SSSE3 #define SSE41 #endif // Easy: 32-16, 16-32, 32-8, 8-32, 16-8, 8-16 // Hard: 32-24, 24-32, 24-16, 16-24, 24-8, 8-24 // Float: 32-FLT, FLT-32 SSE2 void convert32To16_SSE2(void *inbuf, void *outbuf, int count) { auto in = reinterpret_cast(inbuf); auto in16 = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); const int c_loop = count & ~7; for (int i = c_loop; i < count; i++) out[i] = in16[i * 2 + 1]; for (int i = 0; i < c_loop; i += 8) { __m128i in32a = _mm_loadu_si128(reinterpret_cast(in)); in += 4; __m128i in32b = _mm_loadu_si128(reinterpret_cast(in)); in += 4; __m128i in16a = _mm_srai_epi32(in32a, 16); __m128i in16b = _mm_srai_epi32(in32b, 16); __m128i out16 = _mm_packs_epi32(in16a, in16b); _mm_storeu_si128(reinterpret_cast<__m128i *>(out), out16); out += 8; } } SSE2 void convert16To32_SSE2(void *inbuf, void *outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); auto out16 = reinterpret_cast(outbuf); const int c_loop = count & ~7; for (int i = c_loop; i < count; i++) { out16[i * 2] = 0; out16[i * 2 + 1] = in[i]; } __m128i zero = _mm_set1_epi16(0); for (int i = 0; i < c_loop; i += 8) { __m128i in16 = _mm_loadu_si128(reinterpret_cast(in)); in += 8; __m128i out32a = _mm_unpacklo_epi16(zero, in16); __m128i out32b = _mm_unpackhi_epi16(zero, in16); _mm_storeu_si128(reinterpret_cast<__m128i *>(out), out32a); out += 4; _mm_storeu_si128(reinterpret_cast<__m128i *>(out), out32b); out += 4; } } SSE2 void convert32To8_SSE2(void *inbuf, void *outbuf, int count) { auto in = reinterpret_cast(inbuf); auto in8 = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); const int c_loop = count & ~15; for (int i = c_loop; i < count; i++) out[i] = in8[i * 4 + 3] + 128; for (int i = 0; i < c_loop; i += 16) { __m128i in32a = _mm_loadu_si128(reinterpret_cast(in)); in += 4; __m128i in32b = _mm_loadu_si128(reinterpret_cast(in)); in += 4; __m128i in32c = _mm_loadu_si128(reinterpret_cast(in)); in += 4; __m128i in32d = _mm_loadu_si128(reinterpret_cast(in)); in += 4; __m128i in8a = _mm_srai_epi32(in32a, 24); __m128i in8b = _mm_srai_epi32(in32b, 24); __m128i in8c = _mm_srai_epi32(in32c, 24); __m128i in8d = _mm_srai_epi32(in32d, 24); __m128i out8a = _mm_packs_epi32(in8a, in8b); __m128i out8b = _mm_packs_epi32(in8c, in8d); __m128i out8 = _mm_packs_epi16(out8a, out8b); out8 = _mm_add_epi8(out8, _mm_set1_epi8(-128)); _mm_storeu_si128(reinterpret_cast<__m128i *>(out), out8); out += 16; } } SSE2 void convert8To32_SSE2(void *inbuf, void *outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); auto out8 = reinterpret_cast(outbuf); const int c_loop = count & ~15; for (int i = c_loop; i < count; i++) { out8[i * 4] = 0; out8[i * 4 + 1] = 0; out8[i * 4 + 2] = 0; out8[i * 4 + 3] = in[i] - 128; } __m128i n128 = _mm_set1_epi8(-128); __m128i zero = _mm_set1_epi16(0); for (int i = 0; i < c_loop; i += 16) { __m128i in8 = _mm_loadu_si128(reinterpret_cast(in)); in += 16; in8 = _mm_add_epi8(in8, n128); __m128i v16a = _mm_unpacklo_epi8(zero, in8); __m128i v16b = _mm_unpackhi_epi8(zero, in8); __m128i out32a = _mm_unpacklo_epi16(zero, v16a); __m128i out32b = _mm_unpackhi_epi16(zero, v16a); __m128i out32c = _mm_unpacklo_epi16(zero, v16b); __m128i out32d = _mm_unpackhi_epi16(zero, v16b); _mm_storeu_si128(reinterpret_cast<__m128i *>(out), out32a); out += 4; _mm_storeu_si128(reinterpret_cast<__m128i *>(out), out32b); out += 4; _mm_storeu_si128(reinterpret_cast<__m128i *>(out), out32c); out += 4; _mm_storeu_si128(reinterpret_cast<__m128i *>(out), out32d); out += 4; } } SSE2 void convert16To8_SSE2(void *inbuf, void *outbuf, int count) { auto in = reinterpret_cast(inbuf); auto in8 = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); const int c_loop = count & ~15; for (int i = c_loop; i < count; i++) out[i] = in8[i * 2 + 1] + 128; for (int i = 0; i < c_loop; i += 16) { __m128i in16a = _mm_loadu_si128(reinterpret_cast(in)); in += 8; __m128i in16b = _mm_loadu_si128(reinterpret_cast(in)); in += 8; __m128i in8a = _mm_srai_epi16(in16a, 8); __m128i in8b = _mm_srai_epi16(in16b, 8); __m128i out8 = _mm_packs_epi16(in8a, in8b); out8 = _mm_add_epi8(out8, _mm_set1_epi8(-128)); _mm_storeu_si128(reinterpret_cast<__m128i *>(out), out8); out += 16; } } SSE2 void convert8To16_SSE2(void *inbuf, void *outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); auto out8 = reinterpret_cast(outbuf); const int c_loop = count & ~15; for (int i = c_loop; i < count; i++) { out8[i * 2] = 0; out8[i * 2 + 1] = in[i] - 128; } __m128i n128 = _mm_set1_epi8(-128); __m128i zero = _mm_set1_epi16(0); for (int i = 0; i < c_loop; i += 16) { __m128i in8 = _mm_loadu_si128(reinterpret_cast(in)); in += 16; in8 = _mm_add_epi8(in8, n128); __m128i out16a = _mm_unpacklo_epi8(zero, in8); __m128i out16b = _mm_unpackhi_epi8(zero, in8); _mm_storeu_si128(reinterpret_cast<__m128i *>(out), out16a); out += 8; _mm_storeu_si128(reinterpret_cast<__m128i *>(out), out16b); out += 8; } } SSSE3 void convert32To24_SSSE3(void *inbuf, void *outbuf, int count) { auto in = reinterpret_cast(inbuf); auto in8 = reinterpret_cast(inbuf); auto out8 = reinterpret_cast(outbuf); const int c_loop = count & ~15; for (int i = c_loop; i < count; i++) { out8[i * 3 + 0] = in8[i * 4 + 1]; out8[i * 3 + 1] = in8[i * 4 + 2]; out8[i * 3 + 2] = in8[i * 4 + 3]; } __m128i inv[4], outv[3], mask[6]; // clang-format off mask[0] = _mm_set_epi8( -1, -1, -1, -1, 15, 14, 13, 11, 10, 9, 7, 6, 5, 3, 2, 1); mask[1] = _mm_set_epi8( 5, 3, 2, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); mask[2] = _mm_set_epi8( -1, -1, -1, -1, -1, -1, -1, -1, 15, 14, 13, 11, 10, 9, 7, 6); mask[3] = _mm_set_epi8( 10, 9, 7, 6, 5, 3, 2, 1, -1, -1, -1, -1, -1, -1, -1, -1); mask[4] = _mm_set_epi8( -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15, 14, 13, 11); mask[5] = _mm_set_epi8( 15, 14, 13, 11, 10, 9, 7, 6, 5, 3, 2, 1, -1, -1, -1, -1); for (int i = 0; i < c_loop; i += 16) { inv[0] = _mm_loadu_si128(reinterpret_cast(in)); in += 4; inv[1] = _mm_loadu_si128(reinterpret_cast(in)); in += 4; inv[2] = _mm_loadu_si128(reinterpret_cast(in)); in += 4; inv[3] = _mm_loadu_si128(reinterpret_cast(in)); in += 4; outv[0] = _mm_or_si128( _mm_shuffle_epi8(inv[0], mask[0]), _mm_shuffle_epi8(inv[1], mask[1]) ); outv[1] = _mm_or_si128( _mm_shuffle_epi8(inv[1], mask[2]), _mm_shuffle_epi8(inv[2], mask[3]) ); outv[2] = _mm_or_si128( _mm_shuffle_epi8(inv[2], mask[4]), _mm_shuffle_epi8(inv[3], mask[5]) ); _mm_storeu_si128(reinterpret_cast<__m128i *>(out8), outv[0]); out8 += 16; _mm_storeu_si128(reinterpret_cast<__m128i *>(out8), outv[1]); out8 += 16; _mm_storeu_si128(reinterpret_cast<__m128i *>(out8), outv[2]); out8 += 16; } // clang-format on } SSSE3 void convert24To32_SSSE3(void *inbuf, void *outbuf, int count) { auto in8 = reinterpret_cast(inbuf); auto out8 = reinterpret_cast(outbuf); auto out = reinterpret_cast(outbuf); const int c_loop = count & ~15; for (int i = c_loop; i < count; i++) { out8[i * 4] = 0; out8[i * 4 + 1] = in8[i * 3 + 0]; out8[i * 4 + 2] = in8[i * 3 + 1]; out8[i * 4 + 3] = in8[i * 3 + 2]; } __m128i inv[3], outv[4], mask[6]; // clang-format off mask[0] = _mm_set_epi8( 11, 10, 9, -1, 8, 7, 6, -1, 5, 4, 3, -1, 2, 1, 0, -1); mask[1] = _mm_set_epi8( -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15, -1, 14, 13, 12, -1); mask[2] = _mm_set_epi8( 7, 6, 5, -1, 4, 3, 2, -1, 1, 0, -1, -1, -1, -1, -1, -1); mask[3] = _mm_set_epi8( -1, -1, -1, -1, -1, 15, 14, -1, 13, 12, 11, -1, 10, 9, 8, -1); mask[4] = _mm_set_epi8( 3, 2, 1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); mask[5] = _mm_set_epi8( 15, 14, 13, -1, 12, 11, 10, -1, 9, 8, 7, -1, 6, 5, 4, -1); for (int i = 0; i < c_loop; i += 16) { inv[0] = _mm_loadu_si128(reinterpret_cast(in8)); in8 += 16; inv[1] = _mm_loadu_si128(reinterpret_cast(in8)); in8 += 16; inv[2] = _mm_loadu_si128(reinterpret_cast(in8)); in8 += 16; outv[0] = _mm_shuffle_epi8(inv[0], mask[0]); outv[1] = _mm_or_si128( _mm_shuffle_epi8(inv[0], mask[1]), _mm_shuffle_epi8(inv[1], mask[2]) ); outv[2] = _mm_or_si128( _mm_shuffle_epi8(inv[1], mask[3]), _mm_shuffle_epi8(inv[2], mask[4]) ); outv[3] = _mm_shuffle_epi8(inv[2], mask[5]); _mm_storeu_si128(reinterpret_cast<__m128i *>(out), outv[0]); out += 4; _mm_storeu_si128(reinterpret_cast<__m128i *>(out), outv[1]); out += 4; _mm_storeu_si128(reinterpret_cast<__m128i *>(out), outv[2]); out += 4; _mm_storeu_si128(reinterpret_cast<__m128i *>(out), outv[3]); out += 4; } // clang-format on } SSSE3 void convert24To16_SSSE3(void *inbuf, void *outbuf, int count) { auto in8 = reinterpret_cast(inbuf); auto out8 = reinterpret_cast(outbuf); auto out = reinterpret_cast(outbuf); const int c_loop = count & ~15; for (int i = c_loop; i < count; i++) { out8[i * 2 + 0] = in8[i * 3 + 1]; out8[i * 2 + 1] = in8[i * 3 + 2]; } __m128i inv[3], outv[2], mask[4]; // clang-format off mask[0] = _mm_set_epi8( -1, -1, -1, -1, -1, -1, 14, 13, 11, 10, 8, 7, 5, 4, 2, 1); mask[1] = _mm_set_epi8( 7, 6, 4, 3, 1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); mask[2] = _mm_set_epi8( -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15, 13, 12, 10, 9); mask[3] = _mm_set_epi8( 15, 14, 12, 11, 9, 8, 6, 5, 3, 2, 0, -1, -1, -1, -1, -1); for (int i = 0; i < c_loop; i += 16) { inv[0] = _mm_loadu_si128(reinterpret_cast(in8)); in8 += 16; inv[1] = _mm_loadu_si128(reinterpret_cast(in8)); in8 += 16; inv[2] = _mm_loadu_si128(reinterpret_cast(in8)); in8 += 16; outv[0] = _mm_or_si128( _mm_shuffle_epi8(inv[0], mask[0]), _mm_shuffle_epi8(inv[1], mask[1]) ); outv[1] = _mm_or_si128( _mm_shuffle_epi8(inv[1], mask[2]), _mm_shuffle_epi8(inv[2], mask[3]) ); _mm_storeu_si128(reinterpret_cast<__m128i *>(out), outv[0]); out += 8; _mm_storeu_si128(reinterpret_cast<__m128i *>(out), outv[1]); out += 8; } // clang-format on } SSSE3 void convert16To24_SSSE3(void *inbuf, void *outbuf, int count) { auto in = reinterpret_cast(inbuf); auto in8 = reinterpret_cast(inbuf); auto out8 = reinterpret_cast(outbuf); const int c_loop = count & ~15; for (int i = c_loop; i < count; i++) { out8[i * 3] = 0; out8[i * 3 + 1] = in8[i * 2 + 0]; out8[i * 3 + 2] = in8[i * 2 + 1]; } __m128i inv[2], outv[3], mask[4]; // clang-format off mask[0] = _mm_set_epi8( -1, 9, 8, -1, 7, 6, -1, 5, 4, -1, 3, 2, -1, 1, 0, -1); mask[1] = _mm_set_epi8( -1, -1, -1, -1, -1, -1, -1, -1, 15, 14, -1, 13, 12, -1, 11, 10); mask[2] = _mm_set_epi8( 4, -1, 3, 2, -1, 1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1); mask[3] = _mm_set_epi8( 15, 14, -1, 13, 12, -1, 11, 10, -1, 9, 8, -1, 7, 6, -1, 5); for (int i = 0; i < c_loop; i += 16) { inv[0] = _mm_loadu_si128(reinterpret_cast(in)); in += 8; inv[1] = _mm_loadu_si128(reinterpret_cast(in)); in += 8; outv[0] = _mm_shuffle_epi8(inv[0], mask[0]); outv[1] = _mm_or_si128( _mm_shuffle_epi8(inv[0], mask[1]), _mm_shuffle_epi8(inv[1], mask[2]) ); outv[2] = _mm_shuffle_epi8(inv[1], mask[3]); _mm_storeu_si128(reinterpret_cast<__m128i *>(out8), outv[0]); out8 += 16; _mm_storeu_si128(reinterpret_cast<__m128i *>(out8), outv[1]); out8 += 16; _mm_storeu_si128(reinterpret_cast<__m128i *>(out8), outv[2]); out8 += 16; } // clang-format on } SSSE3 void convert24To8_SSSE3(void *inbuf, void *outbuf, int count) { auto in8 = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); const int c_loop = count & ~15; for (int i = c_loop; i < count; i++) out[i] = in8[i * 3 + 2] + 128; __m128i inv[3], outv, mask[3]; __m128i n128 = _mm_set1_epi8(-128); // clang-format off mask[0] = _mm_set_epi8( -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 14, 11, 8, 5, 2); mask[1] = _mm_set_epi8( -1, -1, -1, -1, -1, -1, 13, 10, 7, 4, 1, -1, -1, -1, -1, -1); mask[2] = _mm_set_epi8( 15, 12, 9, 6, 3, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); for (int i = 0; i < c_loop; i += 16) { inv[0] = _mm_loadu_si128(reinterpret_cast(in8)); in8 += 16; inv[1] = _mm_loadu_si128(reinterpret_cast(in8)); in8 += 16; inv[2] = _mm_loadu_si128(reinterpret_cast(in8)); in8 += 16; outv = _mm_or_si128( _mm_shuffle_epi8(inv[0], mask[0]), _mm_shuffle_epi8(inv[1], mask[1]) ); outv = _mm_or_si128( outv, _mm_shuffle_epi8(inv[2], mask[2]) ); outv = _mm_add_epi8(outv, n128); _mm_storeu_si128(reinterpret_cast<__m128i *>(out), outv); out += 16; } // clang-format on } SSSE3 void convert8To24_SSSE3(void *inbuf, void *outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out8 = reinterpret_cast(outbuf); const int c_loop = count & ~15; for (int i = c_loop; i < count; i++) { out8[i * 3] = 0; out8[i * 3 + 1] = 0; out8[i * 3 + 2] = in[i] - 128; } __m128i inv, outv[3], mask[3]; __m128i n128 = _mm_set1_epi8(-128); // clang-format off mask[0] = _mm_set_epi8( -1, 4, -1, -1, 3, -1, -1, 2, -1, -1, 1, -1, -1, 0, -1, -1); mask[1] = _mm_set_epi8( -1, -1, 9, -1, -1, 8, -1, -1, 7, -1, -1, 6, -1, -1, 5, -1); mask[2] = _mm_set_epi8( 15, -1, -1, 14, -1, -1, 13, -1, -1, 12, -1, -1, 11, -1, -1, 10); for (int i = 0; i < c_loop; i += 16) { inv = _mm_loadu_si128(reinterpret_cast(in)); in += 16; inv = _mm_add_epi8(inv, n128); outv[0] = _mm_shuffle_epi8(inv, mask[0]); outv[1] = _mm_shuffle_epi8(inv, mask[1]); outv[2] = _mm_shuffle_epi8(inv, mask[2]); _mm_storeu_si128(reinterpret_cast<__m128i *>(out8), outv[0]); out8 += 16; _mm_storeu_si128(reinterpret_cast<__m128i *>(out8), outv[1]); out8 += 16; _mm_storeu_si128(reinterpret_cast<__m128i *>(out8), outv[2]); out8 += 16; } // clang-format on } SSE41 void convert8ToFLT_SSE41(void* inbuf, void* outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); constexpr float divisor = 1.0f / 128.f; // 1 << 7 const int c_loop = count & ~3; for (int i = c_loop; i < count; i++) out[i] = (in[i] - 128) * divisor; __m128 divv = _mm_set1_ps(divisor); for (int i = 0; i < c_loop; i += 4) { __m128i in32 = _mm_cvtepu8_epi32(_mm_castps_si128(_mm_load_ss(reinterpret_cast(in)))); in += 4; in32 = _mm_sub_epi32(in32, _mm_set1_epi32(128)); __m128 infl = _mm_cvtepi32_ps(in32); __m128 outfl = _mm_mul_ps(infl, divv); _mm_storeu_ps(out, outfl); out += 4; } } SSE2 void convertFLTTo8_SSE2(void* inbuf, void* outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); constexpr float multiplier = 128.f; constexpr float max8 = 127.f; constexpr float min8 = -128.f; const int c_loop = count & ~3; for (int i = c_loop; i < count; i++) { float val = in[i] * multiplier; uint8_t result; if (val >= max8) result = 255; else if (val <= min8) result = 0; else result = static_cast(val) + 128; out[i] = result; } __m128 mulv = _mm_set1_ps(multiplier); __m128 maxv = _mm_set1_ps(max8); __m128 minv = _mm_set1_ps(min8); for (int i = 0; i < c_loop; i += 4) { __m128 infl = _mm_loadu_ps(in); in += 4; __m128 outfl = _mm_max_ps(minv, _mm_min_ps(maxv,_mm_mul_ps(infl, mulv))); __m128i out32 = _mm_cvttps_epi32(outfl); __m128i out16 = _mm_packs_epi32(out32, out32); __m128i out8 = _mm_packs_epi16(out16, out16); out8 = _mm_add_epi8(out8, _mm_set1_epi8(-128)); // 128 *(uint32_t *)(out) = _mm_cvtsi128_si32(out8); out += 4; } } SSE41 void convert16ToFLT_SSE41(void* inbuf, void* outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); constexpr float divisor = 1.0f / 32768.f; // 1 << 15 const int c_loop = count & ~3; for (int i = c_loop; i < count; i++) out[i] = in[i] * divisor; __m128 divv = _mm_set1_ps(divisor); for (int i = 0; i < c_loop; i += 4) { __m128i in32 = _mm_cvtepi16_epi32(_mm_loadl_epi64(reinterpret_cast(in))); in += 4; __m128 infl = _mm_cvtepi32_ps(in32); __m128 outfl = _mm_mul_ps(infl, divv); _mm_storeu_ps(out, outfl); out += 4; } } SSE2 void convertFLTTo16_SSE2(void* inbuf, void* outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); constexpr float multiplier = 32768.f; constexpr float max16 = 32767.f; constexpr float min16 = -32768.f; const int c_loop = count & ~3; for (int i = c_loop; i < count; i++) { float val = in[i] * multiplier; int16_t result; if (val >= max16) result = 32767; else if (val <= min16) result = (int16_t)-32768; else result = static_cast(val); out[i] = result; } __m128 mulv = _mm_set1_ps(multiplier); __m128 maxv = _mm_set1_ps(max16); __m128 minv = _mm_set1_ps(min16); for (int i = 0; i < c_loop; i += 4) { __m128 infl = _mm_loadu_ps(in); in += 4; __m128 outfl = _mm_max_ps(minv, _mm_min_ps(maxv, _mm_mul_ps(infl, mulv))); __m128i out32 = _mm_cvttps_epi32(outfl); __m128i out16 = _mm_packs_epi32(out32, out32); _mm_storel_epi64(reinterpret_cast<__m128i*>(out), out16); out += 4; } } SSE2 void convert32ToFLT_SSE2(void *inbuf, void *outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); const float divisor = 1.0f/2147483648.0f; const int c_loop = count & ~3; for (int i = c_loop; i < count; i++) out[i] = in[i] * divisor; __m128 divv = _mm_set1_ps(divisor); for (int i = 0; i < c_loop; i += 4) { __m128i in32 = _mm_loadu_si128(reinterpret_cast(in)); in += 4; __m128 infl = _mm_cvtepi32_ps(in32); __m128 outfl = _mm_mul_ps(infl, divv); _mm_storeu_ps(out, outfl); out += 4; } } SSE41 void convertFLTTo32_SSE41(void *inbuf, void *outbuf, int count) { auto in = reinterpret_cast(inbuf); auto out = reinterpret_cast(outbuf); constexpr float multiplier = 2147483648.0f; constexpr float max32 = 2147483647.0f; // 2147483648.0f in reality constexpr float min32 = -2147483648.0f; const int c_loop = count & ~3; for (int i = c_loop; i < count; i++) { float val = in[i] * multiplier; int32_t result; if (val >= max32) result = 0x7FFFFFFF; // 2147483647 else if (val <= min32) result = 0x80000000; // -2147483648 else result = static_cast(val); out[i] = result; } __m128 mulv = _mm_set1_ps(multiplier); __m128 maxv = _mm_set1_ps(max32); __m128 minv = _mm_set1_ps(min32); __m128i maxv_i = _mm_set1_epi32(0x7FFFFFFF); // 2147483647 __m128i minv_i = _mm_set1_epi32(0x80000000); // -2147483648 for (int i = 0; i < c_loop; i += 4) { __m128 infl = _mm_loadu_ps(in); in += 4; __m128 outfl = _mm_mul_ps(infl, mulv); __m128i cmphigh = _mm_castps_si128(_mm_cmpge_ps(outfl, maxv)); __m128i cmplow = _mm_castps_si128(_mm_cmpge_ps(minv, outfl)); __m128i out32 = _mm_cvttps_epi32(outfl); out32 = _mm_blendv_epi8(out32, maxv_i, cmphigh); out32 = _mm_blendv_epi8(out32, minv_i, cmplow); _mm_storeu_si128(reinterpret_cast<__m128i *>(out), out32); out += 4; } } ================================================ FILE: avs_core/convert/intel/convert_bits_avx2.cpp ================================================ // Avisynth v2.5. Copyright 2002-2009 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include #include #ifdef _MSC_VER #include #else #include #endif #include #ifndef _mm256_set_m128i #define _mm256_set_m128i(v0, v1) _mm256_insertf128_si256(_mm256_castsi128_si256(v1), (v0), 1) #endif #ifndef _mm256_set_m128 #define _mm256_set_m128(v0, v1) _mm256_insertf128_ps(_mm256_castps128_ps256(v1), (v0), 1) #endif #include "convert_bits_avx2.h" #include "../convert_bits.h" #include "../convert_helper.h" #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable: 4305) #endif template void convert_32_to_uintN_avx2(const BYTE *srcp, BYTE *dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth) { const float* srcp0 = reinterpret_cast(srcp); pixel_t* dstp0 = reinterpret_cast(dstp); src_pitch = src_pitch / sizeof(float); dst_pitch = dst_pitch / sizeof(pixel_t); const int src_width = src_rowsize / sizeof(float); //----------------------- bits_conv_constants d; get_bits_conv_constants(d, chroma, fulls, fulld, source_bitdepth, target_bitdepth); auto dst_offset_plus_round = d.dst_offset + 0.5f; constexpr auto dst_pixel_min = 0; const auto dst_pixel_max = (1 << target_bitdepth) - 1; auto src_offset_ps = _mm256_set1_ps(d.src_offset); auto factor_ps = _mm256_set1_ps(d.mul_factor); auto dst_offset_plus_round_ps = _mm256_set1_ps(dst_offset_plus_round); auto dst_pixel_min_ps = _mm256_set1_ps((float)dst_pixel_min); auto dst_pixel_max_ps = _mm256_set1_ps((float)dst_pixel_max); for (int y = 0; y < src_height; y++) { for (int x = 0; x < src_width; x += 16) // 16 pixels at a time (64 byte - alignment is OK) { __m256i result; __m256i result_0, result_1; __m256 src_0 = _mm256_load_ps(reinterpret_cast(srcp0 + x)); __m256 src_1 = _mm256_load_ps(reinterpret_cast(srcp0 + x + 8)); if constexpr (!chroma && !fulls) { // when offset is different from 0 src_0 = _mm256_sub_ps(src_0, src_offset_ps); src_1 = _mm256_sub_ps(src_1, src_offset_ps); } src_0 = _mm256_fmadd_ps(src_0, factor_ps, dst_offset_plus_round_ps); src_1 = _mm256_fmadd_ps(src_1, factor_ps, dst_offset_plus_round_ps); src_0 = _mm256_max_ps(_mm256_min_ps(src_0, dst_pixel_max_ps), dst_pixel_min_ps); src_1 = _mm256_max_ps(_mm256_min_ps(src_1, dst_pixel_max_ps), dst_pixel_min_ps); result_0 = _mm256_cvttps_epi32(src_0); // truncate result_1 = _mm256_cvttps_epi32(src_1); if constexpr (sizeof(pixel_t) == 2) { result = _mm256_packus_epi32(result_0, result_1); result = _mm256_permute4x64_epi64(result, (0 << 0) | (2 << 2) | (1 << 4) | (3 << 6)); _mm256_store_si256(reinterpret_cast<__m256i*>(dstp0 + x), result); } else { result = _mm256_packs_epi32(result_0, result_1); result = _mm256_permute4x64_epi64(result, (0 << 0) | (2 << 2) | (1 << 4) | (3 << 6)); __m128i result128_lo = _mm256_castsi256_si128(result); __m128i result128_hi = _mm256_extractf128_si256(result, 1); __m128i result128 = _mm_packus_epi16(result128_lo, result128_hi); _mm_store_si128(reinterpret_cast<__m128i*>(dstp0 + x), result128); } // c: //const int pixel = (int)((srcp0[x] - src_offset) * mul_factor + dst_offset_plus_round); //dstp0[x] = pixel_t(clamp(pixel, dst_pixel_min, dst_pixel_max)); } dstp0 += dst_pitch; srcp0 += src_pitch; } } #ifdef _MSC_VER #pragma warning(pop) #endif #define convert_32_to_uintN_avx2_functions(type) \ template void convert_32_to_uintN_avx2(const BYTE *srcp, BYTE *dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_32_to_uintN_avx2(const BYTE *srcp, BYTE *dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_32_to_uintN_avx2(const BYTE *srcp, BYTE *dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_32_to_uintN_avx2(const BYTE *srcp, BYTE *dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_32_to_uintN_avx2(const BYTE *srcp, BYTE *dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_32_to_uintN_avx2(const BYTE *srcp, BYTE *dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_32_to_uintN_avx2(const BYTE *srcp, BYTE *dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_32_to_uintN_avx2(const BYTE *srcp, BYTE *dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); convert_32_to_uintN_avx2_functions(uint8_t) convert_32_to_uintN_avx2_functions(uint16_t) #undef convert_32_to_uintN_avx2_functions /* 3.7.1 test26: stop using manual _mm256_zeroupper() This warning is left in Avisynth at one single place. 1.) compilers do it automatically 2.) clang is getting mad and produces suboptimal prologue and epilogue, saving and loading all xmm registers! ** Good (no manual zeroupper) ** push rsi .seh_pushreg rsi push rdi .seh_pushreg rdi .seh_endprologue [...] pop rdi pop rsi vzeroupper ret ** Bad, manual _mm256_zeroupper() ** vmovaps xmmword ptr [rsp + 144], xmm15 # 16-byte Spill .seh_savexmm xmm15, 144 vmovaps xmmword ptr [rsp + 128], xmm14 # 16-byte Spill .seh_savexmm xmm14, 128 vmovaps xmmword ptr [rsp + 112], xmm13 # 16-byte Spill .seh_savexmm xmm13, 112 vmovaps xmmword ptr [rsp + 96], xmm12 # 16-byte Spill .seh_savexmm xmm12, 96 vmovaps xmmword ptr [rsp + 80], xmm11 # 16-byte Spill .seh_savexmm xmm11, 80 vmovaps xmmword ptr [rsp + 64], xmm10 # 16-byte Spill .seh_savexmm xmm10, 64 vmovaps xmmword ptr [rsp + 48], xmm9 # 16-byte Spill .seh_savexmm xmm9, 48 vmovaps xmmword ptr [rsp + 32], xmm8 # 16-byte Spill .seh_savexmm xmm8, 32 vmovaps xmmword ptr [rsp + 16], xmm7 # 16-byte Spill .seh_savexmm xmm7, 16 vmovaps xmmword ptr [rsp], xmm6 # 16-byte Spill .seh_savexmm xmm6, 0 .seh_endprologue [...] pop rdi pop rsi vzeroupper vmovaps xmm6, xmmword ptr [rsp] # 16-byte Reload vmovaps xmm7, xmmword ptr [rsp + 16] # 16-byte Reload vmovaps xmm8, xmmword ptr [rsp + 32] # 16-byte Reload vmovaps xmm9, xmmword ptr [rsp + 48] # 16-byte Reload vmovaps xmm10, xmmword ptr [rsp + 64] # 16-byte Reload vmovaps xmm11, xmmword ptr [rsp + 80] # 16-byte Reload vmovaps xmm12, xmmword ptr [rsp + 96] # 16-byte Reload vmovaps xmm13, xmmword ptr [rsp + 112] # 16-byte Reload vmovaps xmm14, xmmword ptr [rsp + 128] # 16-byte Reload vmovaps xmm15, xmmword ptr [rsp + 144] # 16-byte Reload ret */ // YUV: bit shift 8-16 <=> 8-16 bits // shift right or left, depending on expandrange template static void convert_uint_limited_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth) { const pixel_t_s* srcp0 = reinterpret_cast(srcp); pixel_t_d* dstp0 = reinterpret_cast(dstp); src_pitch = src_pitch / sizeof(pixel_t_s); dst_pitch = dst_pitch / sizeof(pixel_t_d); const int src_width = src_rowsize / sizeof(pixel_t_s); if (target_bitdepth > source_bitdepth) // expandrange. pixel_t_d is always uint16_t { const int shift_bits = target_bitdepth - source_bitdepth; __m128i shift = _mm_set_epi32(0, 0, 0, shift_bits); for (int y = 0; y < src_height; y++) { for (int x = 0; x < src_width; x += 32) { __m256i src_lo, src_hi; if constexpr (sizeof(pixel_t_s) == 1) { auto src_lo_128 = _mm_load_si128(reinterpret_cast(srcp0 + x)); // 16* uint8 auto src_hi_128 = _mm_load_si128(reinterpret_cast(srcp0 + x + 16)); // 16* uint8 src_lo = _mm256_cvtepu8_epi16(src_lo_128); // 16* uint16 src_hi = _mm256_cvtepu8_epi16(src_hi_128); // 16* uint16 } else { // 64 bytes per cycle. Ok in avs+ src_lo = _mm256_load_si256(reinterpret_cast(srcp0 + x)); // 16* uint_16 src_hi = _mm256_load_si256(reinterpret_cast(srcp0 + x + 16)); // 16* uint_16 } src_lo = _mm256_sll_epi16(src_lo, shift); src_hi = _mm256_sll_epi16(src_hi, shift); if constexpr (sizeof(pixel_t_d) == 1) { // upconvert always to 2 bytes assert(0); } else { _mm256_store_si256(reinterpret_cast<__m256i*>(dstp0 + x), src_lo); _mm256_store_si256(reinterpret_cast<__m256i*>(dstp0 + x + 16), src_hi); } } dstp0 += dst_pitch; srcp0 += src_pitch; } } else { // reduce range const int shift_bits = source_bitdepth - target_bitdepth; const int round = 1 << (shift_bits - 1); __m128i shift = _mm_set_epi32(0, 0, 0, shift_bits); const auto round_simd = _mm256_set1_epi16(round); for (int y = 0; y < src_height; y++) { for (int x = 0; x < src_width; x += 32) { if constexpr (sizeof(pixel_t_s) == 1) assert(0); // downconvert always from 2 bytes // 64 bytes per cycle. Ok in avs+ auto src_lo = _mm256_load_si256(reinterpret_cast(srcp0 + x)); // 16* uint_16 auto src_hi = _mm256_load_si256(reinterpret_cast(srcp0 + x + 16)); // 16* uint_16 src_lo = _mm256_srl_epi16(_mm256_adds_epu16(src_lo, round_simd), shift); src_hi = _mm256_srl_epi16(_mm256_adds_epu16(src_hi, round_simd), shift); if constexpr (sizeof(pixel_t_d) == 1) { // to 8 bits auto dst = _mm256_packus_epi16(src_lo, src_hi); dst = _mm256_permute4x64_epi64(dst, (0 << 0) | (2 << 2) | (1 << 4) | (3 << 6)); _mm256_store_si256(reinterpret_cast<__m256i*>(dstp0 + x), dst); } else { _mm256_store_si256(reinterpret_cast<__m256i*>(dstp0 + x), src_lo); _mm256_store_si256(reinterpret_cast<__m256i*>(dstp0 + x + 16), src_hi); } } dstp0 += dst_pitch; srcp0 += src_pitch; } } } template void convert_uint_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth) { // limited to limited is bitshift, see in other function if constexpr (!fulls && !fulld) { convert_uint_limited_avx2(srcp, dstp, src_rowsize, src_height, src_pitch, dst_pitch, source_bitdepth, target_bitdepth, dither_target_bitdepth); return; } const pixel_t_s* srcp0 = reinterpret_cast(srcp); pixel_t_d* dstp0 = reinterpret_cast(dstp); src_pitch = src_pitch / sizeof(pixel_t_s); dst_pitch = dst_pitch / sizeof(pixel_t_d); const int src_width = src_rowsize / sizeof(pixel_t_s); const int wmod32 = (src_width / 32) * 32; if constexpr (sizeof(pixel_t_s) == 1 && sizeof(pixel_t_d) == 2) { if (fulls && fulld && !chroma && source_bitdepth == 8 && target_bitdepth == 16) { // special case 8->16 bit full scale: * 65535 / 255 = *257 __m256i multiplier = _mm256_set1_epi16(257); for (int y = 0; y < src_height; y++) { for (int x = 0; x < src_width; x += 32) { auto src_lo_128 = _mm_load_si128(reinterpret_cast(srcp0 + x)); // 16* uint8 auto src_hi_128 = _mm_load_si128(reinterpret_cast(srcp0 + x + 16)); // 16* uint8 auto src_lo = _mm256_cvtepu8_epi16(src_lo_128); // 16* uint16 auto src_hi = _mm256_cvtepu8_epi16(src_hi_128); // 16* uint16 // *257 mullo is faster than x*257 = (x<<8 + x) add/or solution (i7) auto res_lo = _mm256_mullo_epi16(src_lo, multiplier); // lower 16 bit of multiplication is enough auto res_hi = _mm256_mullo_epi16(src_hi, multiplier); // dstp[x] = srcp0[x] * 257; // RGB: full range 0..255 <-> 0..65535 (257 = 65535 / 255) _mm256_store_si256(reinterpret_cast<__m256i*>(dstp0 + x), res_lo); _mm256_store_si256(reinterpret_cast<__m256i*>(dstp0 + x + 16), res_hi); } // for x // rest for (int x = wmod32; x < src_width; x++) { dstp0[x] = (pixel_t_d)(srcp0[x] * 257); } dstp0 += dst_pitch; srcp0 += src_pitch; } // for y return; } } const int target_max = (1 << target_bitdepth) - 1; bits_conv_constants d; get_bits_conv_constants(d, chroma, fulls, fulld, source_bitdepth, target_bitdepth); auto vect_mul_factor = _mm256_set1_ps(d.mul_factor); auto vect_src_offset = _mm256_set1_epi32(d.src_offset_i); auto dst_offset_plus_round = d.dst_offset + 0.5f; auto vect_dst_offset_plus_round = _mm256_set1_ps(dst_offset_plus_round); auto vect_target_max = _mm256_set1_epi16(target_max); auto zero = _mm256_setzero_si256(); for (int y = 0; y < src_height; y++) { for (int x = 0; x < src_width; x += 32) { __m256i src_lo, src_hi; if constexpr (sizeof(pixel_t_s) == 1) { auto src_lo_128 = _mm_load_si128(reinterpret_cast(srcp0 + x)); // 16* uint8 auto src_hi_128 = _mm_load_si128(reinterpret_cast(srcp0 + x + 16)); // 16* uint8 src_lo = _mm256_cvtepu8_epi16(src_lo_128); // 16* uint16 src_hi = _mm256_cvtepu8_epi16(src_hi_128); // 16* uint16 } else { // 64 bytes per cycle. Ok in avs+ src_lo = _mm256_load_si256(reinterpret_cast(srcp0 + x)); // 8* uint_16 src_hi = _mm256_load_si256(reinterpret_cast(srcp0 + x + 16)); // 8* uint_16 } __m256i result1, result2; { // src: 8*uint16 // convert to int32, bias, to float auto res_lo_i = _mm256_unpacklo_epi16(src_lo, zero); auto res_hi_i = _mm256_unpackhi_epi16(src_lo, zero); if constexpr (chroma || !fulls) { // src_offset is not zero res_lo_i = _mm256_sub_epi32(res_lo_i, vect_src_offset); res_hi_i = _mm256_sub_epi32(res_hi_i, vect_src_offset); } auto res_lo = _mm256_cvtepi32_ps(res_lo_i); auto res_hi = _mm256_cvtepi32_ps(res_hi_i); // multiply, bias back+round // avx2 mode: smart fma instruction inserted even from msvc! res_lo = _mm256_add_ps(_mm256_mul_ps(res_lo, vect_mul_factor), vect_dst_offset_plus_round); res_hi = _mm256_add_ps(_mm256_mul_ps(res_hi, vect_mul_factor), vect_dst_offset_plus_round); // convert back w/ truncate auto result_l = _mm256_cvttps_epi32(res_lo); // no banker's rounding auto result_h = _mm256_cvttps_epi32(res_hi); // 0 min is ensured by packus // back to 16 bit result1 = _mm256_packus_epi32(result_l, result_h); // 8 * 16 bit pixels result1 = _mm256_min_epu16(result1, vect_target_max); } // byte target: not yet if constexpr (sizeof(pixel_t_d) == 2) _mm256_store_si256(reinterpret_cast<__m256i*>(dstp0 + x), result1); { // src: 8*uint16 // convert to int32, bias, to float auto res_lo_i = _mm256_unpacklo_epi16(src_hi, zero); auto res_hi_i = _mm256_unpackhi_epi16(src_hi, zero); if constexpr (chroma || !fulls) { // src_offset is not zero res_lo_i = _mm256_sub_epi32(res_lo_i, vect_src_offset); res_hi_i = _mm256_sub_epi32(res_hi_i, vect_src_offset); } auto res_lo = _mm256_cvtepi32_ps(res_lo_i); auto res_hi = _mm256_cvtepi32_ps(res_hi_i); // multiply, bias back+round res_lo = _mm256_add_ps(_mm256_mul_ps(res_lo, vect_mul_factor), vect_dst_offset_plus_round); res_hi = _mm256_add_ps(_mm256_mul_ps(res_hi, vect_mul_factor), vect_dst_offset_plus_round); // convert back w/ truncate auto result_l = _mm256_cvttps_epi32(res_lo); auto result_h = _mm256_cvttps_epi32(res_hi); // 0 min is ensured by packus // back to 16 bit result2 = _mm256_packus_epi32(result_l, result_h); // 8 * 16 bit pixels result2 = _mm256_min_epu16(result2, vect_target_max); } if constexpr (sizeof(pixel_t_d) == 2) _mm256_store_si256(reinterpret_cast<__m256i*>(dstp0 + x + 16), result2); else { // byte target: store both auto result12 = _mm256_packus_epi16(result1, result2); result12 = _mm256_permute4x64_epi64(result12, (0 << 0) | (2 << 2) | (1 << 4) | (3 << 6)); _mm256_store_si256(reinterpret_cast<__m256i*>(dstp0 + x), result12); } } // for x dstp0 += dst_pitch; srcp0 += src_pitch; } } // instantiate them all // template // spec: fulld=false, fulls=false #define convert_uint_avx2_functions(uint_X_t, uint_X_dest_t) \ template void convert_uint_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_uint_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_uint_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_uint_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_uint_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_uint_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_uint_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_uint_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); convert_uint_avx2_functions(uint8_t, uint8_t) convert_uint_avx2_functions(uint8_t, uint16_t) convert_uint_avx2_functions(uint16_t, uint8_t) convert_uint_avx2_functions(uint16_t, uint16_t) #undef convert_uint_avx2_functions template static void do_convert_ordered_dither_uint_avx2(const BYTE* srcp8, BYTE* dstp8, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth) { const pixel_t_s* srcp = reinterpret_cast(srcp8); pixel_t_d* dstp = reinterpret_cast(dstp8); dst_pitch = dst_pitch / sizeof(pixel_t_d); src_pitch = src_pitch / sizeof(pixel_t_s); // we can safely process whole 16 (8 bit src) / 32 byte (16 bit source) chunks, Avisynth ensures at least 32 byte alignment const int src_width = (src_rowsize / sizeof(pixel_t_s) + 15) & ~15; // helps compiler optimization if constexpr (sizeof(pixel_t_s) == 1) source_bitdepth = 8; if constexpr (sizeof(pixel_t_d) == 1) { target_bitdepth = 8; if (!TEMPLATE_NEED_BACKSCALE) { dither_target_bitdepth = 8; } } const int max_pixel_value_target = (1 << target_bitdepth) - 1; const int max_pixel_value_dithered = (1 << dither_target_bitdepth) - 1; // precheck ensures: // target_bitdepth >= dither_target_bitdepth // source_bitdepth - dither_target_bitdepth <= 8 (max precalculated table is 16x16) const bool odd_diff = (source_bitdepth - dither_target_bitdepth) & 1; const int dither_bit_diff = (source_bitdepth - dither_target_bitdepth); const int dither_order = (dither_bit_diff + 1) / 2; const int dither_mask = (1 << dither_order) - 1; // 9,10=2 11,12=4 13,14=8 15,16=16 // 10->8: 0x01 (2x2) // 11->8: 0x03 (4x4) // 12->8: 0x03 (4x4) // 14->8: 0x07 (8x8) // 16->8: 0x0F (16x16) const BYTE* matrix; switch (dither_order) { case 1: matrix = reinterpret_cast(odd_diff ? dither2x2a_data_sse2 : dither2x2_data_sse2); break; case 2: matrix = reinterpret_cast(odd_diff ? dither4x4a_data_sse2 : dither4x4_data_sse2); break; case 3: matrix = reinterpret_cast(odd_diff ? dither8x8a_data_sse2 : dither8x8_data_sse2); break; case 4: matrix = reinterpret_cast(odd_diff ? dither16x16a_data : dither16x16_data); break; // no spec sse, already 16 bytes long default: return; // n/a } const int bitdiff_between_dither_and_target = target_bitdepth - dither_target_bitdepth; assert(TEMPLATE_NEED_BACKSCALE == (target_bitdepth != dither_target_bitdepth)); // dither to x, target to y assert(TEMPLATE_LOW_DITHER_BITDEPTH == (dither_target_bitdepth < 8)); // e.g. instead of 0,1 => -0.5,+0.5; 0,1,2,3 => -1.5,-0.5,0.5,1.5 const float half_maxcorr_value = ((1 << dither_bit_diff) - 1) / 2.0f; const int source_max = (1 << source_bitdepth) - 1; //----------------------- // When calculating src_pixel, src and dst are of the same bit depth bits_conv_constants d; get_bits_conv_constants(d, chroma, fulls, fulld, source_bitdepth, source_bitdepth); // both is src_bitdepth auto dst_offset_plus_round = d.dst_offset + 0.5f; //constexpr auto src_pixel_min = 0; const auto src_pixel_max = source_max; const float mul_factor_backfromlowdither = (float)max_pixel_value_target / max_pixel_value_dithered; //----------------------- const auto mul_factor_simd = _mm256_set1_ps(d.mul_factor); const auto mul_factor_backfromlowdither_simd = _mm256_set1_ps(mul_factor_backfromlowdither); const auto half_maxcorr_value_simd = _mm256_set1_ps(half_maxcorr_value); const auto zero = _mm256_setzero_si256(); const BYTE* matrix_simd16 = matrix; const BYTE* current_matrix_line; for (int y = 0; y < src_height; y++) { // int _y = (y & dither_mask) << dither_order; // for C version current_matrix_line = matrix_simd16 + ((y & dither_mask) << 4); // always 16 byte boundary instead of dither order // load and convert corr to 16 bit __m256i corr = _mm256_cvtepu8_epi16(_mm_load_si128(reinterpret_cast(current_matrix_line))); // int corr = matrix[_y | (x & dither_mask)]; for (int x = 0; x < src_width; x += 16) { //const int corr = matrix[_y | (x & dither_mask)]; //int src_pixel = srcp[x]; //__m128i src_lo, src_hi; __m256i src; if constexpr (sizeof(pixel_t_s) == 1) { src = _mm256_cvtepu8_epi16(_mm_load_si128(reinterpret_cast(srcp + x))); // 16* uint8->uint16 } else { src= _mm256_load_si256(reinterpret_cast(srcp + x)); // 16* uint16 } [[maybe_unused]] __m256i src_lo; [[maybe_unused]] __m256i src_hi; if constexpr (fulls != fulld) { // goint to 32 float // const float val = (srcp[x] - src_offset) * mul_factor + dst_offset_plus_round; const auto src_offset_simd = _mm256_set1_epi32(d.src_offset_i); const auto dst_offset_plus_round_simd = _mm256_set1_ps(dst_offset_plus_round); auto src_lo_ps = _mm256_cvtepi32_ps(_mm256_sub_epi32(_mm256_unpacklo_epi16(src, zero), src_offset_simd)); auto src_hi_ps = _mm256_cvtepi32_ps(_mm256_sub_epi32(_mm256_unpackhi_epi16(src, zero), src_offset_simd)); src_lo_ps = _mm256_add_ps(_mm256_mul_ps(src_lo_ps, mul_factor_simd), dst_offset_plus_round_simd); src_hi_ps = _mm256_add_ps(_mm256_mul_ps(src_hi_ps, mul_factor_simd), dst_offset_plus_round_simd); // src_pixel = clamp((int)val, src_pixel_min, src_pixel_max); if constexpr (sizeof(pixel_t_s) == 1 && !TEMPLATE_LOW_DITHER_BITDEPTH) { // Source is 8 bits. This branch is ineffective if we define TEMPLATE_LOW_DITHER_BITDEPTH for all <8 bits, as we do now // We would reach this code for 5-7 bits when lo limit would be e.g. 4 bits // 8 bit source: we can go back from 32 to 16 bit int src = _mm256_packus_epi32(_mm256_cvttps_epi32(src_lo_ps), _mm256_cvttps_epi32(src_hi_ps)); // min is 0, which was ensured by packus const auto src_pixel_max_simd = _mm256_set1_epi16(src_pixel_max); src = _mm256_min_epu16(src, src_pixel_max_simd); // tmp result 16 bits in src } else { // go back to int32 only src_lo = _mm256_cvttps_epi32(src_lo_ps); src_hi = _mm256_cvttps_epi32(src_hi_ps); // min is 0, which was ensured by packus const auto src_pixel_max_simd = _mm256_set1_epi32(src_pixel_max); src_lo = _mm256_min_epi32(src_lo, src_pixel_max_simd); src_hi = _mm256_min_epi32(src_hi, src_pixel_max_simd); // tmp result 32 bits in src_lo, src_hi } } else { // 10-16 bits or preshift: go into 32 bit int if constexpr (sizeof(pixel_t_s) == 2 || TEMPLATE_LOW_DITHER_BITDEPTH) { src_lo = _mm256_unpacklo_epi16(src, zero); src_hi = _mm256_unpackhi_epi16(src, zero); // tmp result 32 bits in src_lo, src_hi } } __m256i new_pixel; // scale down after adding dithering noise // int new_pixel = ((src_pixel + corr) >> dither_bit_diff); if constexpr (sizeof(pixel_t_s) == 1 && !TEMPLATE_LOW_DITHER_BITDEPTH) { // when dither_target_bits is 1, then preshift==1 and dither_bit_diff==(7+1) would not fit in 16 bits new_pixel = _mm256_srai_epi16(_mm256_add_epi16(src, corr), dither_bit_diff); // new_pixel is ready with 16 bit data } else { // source bits: >8. // At 16 bit overflow can happen when 0xFFFF it dithered up. This is why we are at 32 bits int // Theoretically fulls == fulld && <16 bit would allow 16 bit int workflow but we do not specialize for that // source bits: >8 or 8 bit but PRESHIFT // At 16 bit overflow can happen when 0xFFFF it dithered up. This is why we are at 32 bits int // Theoretically fulls == fulld && <16 bit would allow 16 bit int workflow but we do not specialize for that // low dither bitdepth is special as well /* int new_pixel; if (TEMPLATE_LOW_DITHER_BITDEPTH) { // accurate dither: +/- const float corr_f = corr - half_maxcorr_value; new_pixel = (int)(src_pixel + corr_f) >> dither_bit_diff; } else new_pixel = ((src_pixel + corr) >> dither_bit_diff); */ __m256i new_pixel_lo, new_pixel_hi; auto corr_lo = _mm256_unpacklo_epi16(corr, zero); auto corr_hi = _mm256_unpackhi_epi16(corr, zero); if (TEMPLATE_LOW_DITHER_BITDEPTH) { // accurately positioned to the center auto corr_lo_ps = _mm256_sub_ps(_mm256_cvtepi32_ps(corr_lo), half_maxcorr_value_simd); auto corr_hi_ps = _mm256_sub_ps(_mm256_cvtepi32_ps(corr_hi), half_maxcorr_value_simd); // accurate dither: +/- new_pixel_lo = _mm256_srai_epi32(_mm256_cvttps_epi32(_mm256_add_ps(_mm256_cvtepi32_ps(src_lo), corr_lo_ps)), dither_bit_diff); new_pixel_hi = _mm256_srai_epi32(_mm256_cvttps_epi32(_mm256_add_ps(_mm256_cvtepi32_ps(src_hi), corr_hi_ps)), dither_bit_diff); } else { // Arrgh. If dither_bit_diff would be an immediate constant (e.g. template parameter) then we get 2390 fps vs 1378 even for sse4.1! // for a simple Vide16bit.ConvertBits(8, dither=0, dither_bits=8) // const auto dither_bit_diff = 8; new_pixel_lo = _mm256_srai_epi32(_mm256_add_epi32(src_lo, corr_lo), dither_bit_diff); new_pixel_hi = _mm256_srai_epi32(_mm256_add_epi32(src_hi, corr_hi), dither_bit_diff); } new_pixel = _mm256_packus_epi32(new_pixel_lo, new_pixel_hi); // new_pixel is ready with 16 bit data } // scale back to the required bit depth // dither to x, target to y if constexpr (TEMPLATE_NEED_BACKSCALE) { /* new_pixel = min(new_pixel, max_pixel_value_dithered); if (TEMPLATE_LOW_DITHER_BITDEPTH) { new_pixel = (int)(new_pixel * mul_factor_backfromlowdither + 0.5f); } else { new_pixel = new_pixel << bitdiff_between_dither_and_target; } */ const auto max_pixel_value_dithered_simd = _mm256_set1_epi16(max_pixel_value_dithered); new_pixel = _mm256_min_epu16(new_pixel, max_pixel_value_dithered_simd); // Interesting problem of dither_bits==1 (or in general at small dither_bits) // After simple slli 0,1 becomes 0,128, we'd expect 0,255 instead. So we make cosmetics. // dither_bits // 1 0,1 => 0,128 => 0,255 // 2 0,1,2,3 => 0,64,128,192 => 0,85,170,255 // 3 0,...,7 => 0,32,...,224 => 0,....255 // 4 0,..,15 => 0,16,...,240 => 0,....255 // 5 0,..,31 => 0,8,....,248 => 0,....255 // 6 0,..,63 => 0,4,....,252 => 0,....255 // 7 0,.,127 => 0,2. ..,254 => 0,?,?,255 if (TEMPLATE_LOW_DITHER_BITDEPTH) { // new_pixel = (int)(new_pixel * mul_factor_backfromlowdither + 0.5f); auto rounder_half_simd = _mm256_set1_ps(0.5f); auto new_pixel_lo_ps = _mm256_cvtepi32_ps(_mm256_unpacklo_epi16(new_pixel, zero)); auto new_pixel_hi_ps = _mm256_cvtepi32_ps(_mm256_unpackhi_epi16(new_pixel, zero)); new_pixel = _mm256_packus_epi32( _mm256_cvttps_epi32(_mm256_add_ps(_mm256_mul_ps(new_pixel_lo_ps, mul_factor_backfromlowdither_simd), rounder_half_simd)), _mm256_cvttps_epi32(_mm256_add_ps(_mm256_mul_ps(new_pixel_hi_ps, mul_factor_backfromlowdither_simd), rounder_half_simd)) ); } else { new_pixel = _mm256_slli_epi16(new_pixel, bitdiff_between_dither_and_target); } } // dstp[x] = (pixel_t_d)(min((int)new_pixel, max_pixel_value_target)); if constexpr (sizeof(pixel_t_d) == 1) { // byte target: 16x 2bytes -> 16x 1 bytes like cvtepu16->epu8 auto result12 = _mm256_packus_epi16(new_pixel, new_pixel); result12 = _mm256_permute4x64_epi64(result12, (0 << 0) | (2 << 2) | (1 << 4) | (3 << 6)); _mm_store_si128(reinterpret_cast<__m128i*>(dstp + x), _mm256_castsi256_si128(result12)); } else { const auto max_pixel_value_target_simd = _mm256_set1_epi16(max_pixel_value_target); // max is unnecessary for exact 16 bit pixel type but we are not specialized for that case new_pixel = _mm256_min_epu16(new_pixel, max_pixel_value_target_simd); _mm256_store_si256(reinterpret_cast<__m256i*>(dstp + x), new_pixel); } } dstp += dst_pitch; srcp += src_pitch; } } template void convert_ordered_dither_uint_avx2(const BYTE* srcp8, BYTE* dstp8, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth) { const bool need_backscale = target_bitdepth != dither_target_bitdepth; // dither to x, target to y const bool low_dither_bitdepth = dither_target_bitdepth < 8; // 1-7 bits dither targets, need_backscale is always true, since 8 bit format is the minimum if (need_backscale) { if (low_dither_bitdepth) do_convert_ordered_dither_uint_avx2(srcp8, dstp8, src_rowsize, src_height, src_pitch, dst_pitch, source_bitdepth, target_bitdepth, dither_target_bitdepth); else do_convert_ordered_dither_uint_avx2(srcp8, dstp8, src_rowsize, src_height, src_pitch, dst_pitch, source_bitdepth, target_bitdepth, dither_target_bitdepth); } else { do_convert_ordered_dither_uint_avx2(srcp8, dstp8, src_rowsize, src_height, src_pitch, dst_pitch, source_bitdepth, target_bitdepth, dither_target_bitdepth); } } // instantiate them all // template // spec: fulld=false, fulls=false #define convert_ordered_dither_uint_sse4_functions(uint_X_t, uint_X_dest_t) \ template void convert_ordered_dither_uint_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_ordered_dither_uint_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_ordered_dither_uint_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_ordered_dither_uint_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_ordered_dither_uint_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_ordered_dither_uint_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_ordered_dither_uint_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_ordered_dither_uint_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); // dither only same of less bit depth convert_ordered_dither_uint_sse4_functions(uint8_t, uint8_t) convert_ordered_dither_uint_sse4_functions(uint16_t, uint8_t) convert_ordered_dither_uint_sse4_functions(uint16_t, uint16_t) #undef convert_ordered_dither_uint_sse4_functions template void convert_uintN_to_float_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth) { const pixel_t* srcp0 = reinterpret_cast(srcp); float* dstp0 = reinterpret_cast(dstp); src_pitch = src_pitch / sizeof(pixel_t); dst_pitch = dst_pitch / sizeof(float); const int src_width = src_rowsize / sizeof(pixel_t); // write 32 floats (128 bytes) only if valid, scanline alignment is only 64 bytes (16 floats). // Alignment, write-limited, 16 floats (64 bytes) is guaranteed by AviSynth const int w16 = (src_width + 15) & ~15; //----------------------- bits_conv_constants d; get_bits_conv_constants(d, chroma, fulls, fulld, source_bitdepth, target_bitdepth); const __m256i m256_src_offset_epi32 = _mm256_set1_epi32(d.src_offset_i); const __m256 m256_mul_factor = _mm256_set1_ps(d.mul_factor); const __m256 m256_dst_offset = _mm256_set1_ps(d.dst_offset); for (int y = 0; y < src_height; y++) { // rows are 64 bytes - 16 float pixels - aligned we have a write constraint int x; for (x = 0; x + 32 <= w16; x += 32) { __m256i src_0_32, src_1_32, src_2_32, src_3_32; if constexpr (sizeof(pixel_t) == 1) // uint8_t { __m256i src_32 = _mm256_load_si256(reinterpret_cast(srcp0 + x)); // unpack to 4x64bits src_0_32 = _mm256_cvtepu8_epi32(_mm256_castsi256_si128(src_32)); // bytes 0-7 __m256i src_1 = _mm256_permute4x64_epi64(src_32, 1); __m256i src_2 = _mm256_permute4x64_epi64(src_32, 2); __m256i src_3 = _mm256_permute4x64_epi64(src_32, 3); src_1_32 = _mm256_cvtepu8_epi32(_mm256_castsi256_si128(src_1)); src_2_32 = _mm256_cvtepu8_epi32(_mm256_castsi256_si128(src_2)); src_3_32 = _mm256_cvtepu8_epi32(_mm256_castsi256_si128(src_3)); } if constexpr (sizeof(pixel_t) == 2) // uint16_t { __m256i src_16 = _mm256_load_si256(reinterpret_cast(srcp0 + x)); __m256i src_16_2 = _mm256_load_si256(reinterpret_cast(srcp0 + x + 16)); // unpack to 2x128bits 2x8 uint16 src_0_32 = _mm256_cvtepu16_epi32(_mm256_castsi256_si128(src_16)); src_1_32 = _mm256_cvtepu16_epi32(_mm256_extracti128_si256(src_16, 1)); src_2_32 = _mm256_cvtepu16_epi32(_mm256_castsi256_si128(src_16_2)); src_3_32 = _mm256_cvtepu16_epi32(_mm256_extracti128_si256(src_16_2, 1)); } src_0_32 = _mm256_sub_epi32(src_0_32, m256_src_offset_epi32); src_1_32 = _mm256_sub_epi32(src_1_32, m256_src_offset_epi32); src_2_32 = _mm256_sub_epi32(src_2_32, m256_src_offset_epi32); src_3_32 = _mm256_sub_epi32(src_3_32, m256_src_offset_epi32); __m256 src_0_ps = _mm256_cvtepi32_ps(src_0_32); __m256 src_1_ps = _mm256_cvtepi32_ps(src_1_32); __m256 src_2_ps = _mm256_cvtepi32_ps(src_2_32); __m256 src_3_ps = _mm256_cvtepi32_ps(src_3_32); __m256 out_0_ps = _mm256_fmadd_ps(src_0_ps, m256_mul_factor, m256_dst_offset); __m256 out_1_ps = _mm256_fmadd_ps(src_1_ps, m256_mul_factor, m256_dst_offset); __m256 out_2_ps = _mm256_fmadd_ps(src_2_ps, m256_mul_factor, m256_dst_offset); __m256 out_3_ps = _mm256_fmadd_ps(src_3_ps, m256_mul_factor, m256_dst_offset); // process 32 pixels, write 128 bytes _mm256_store_ps((dstp0 + x + 0), out_0_ps); _mm256_store_ps((dstp0 + x + 8), out_1_ps); _mm256_store_ps((dstp0 + x + 16), out_2_ps); _mm256_store_ps((dstp0 + x + 24), out_3_ps); // const float pixel = (srcp0[x] - d.src_offset_i) * d.mul_factor + d.dst_offset; // dstp0[x] = pixel; // no clamp } // second loop: process remaining 1-15 pixels, 16 at a time if (x < w16) { __m256i src_0_32, src_1_32; if constexpr (sizeof(pixel_t) == 1) // uint8_t { // _m128 enough, 16 pixels __m128i src_16_bytes = _mm_load_si128(reinterpret_cast(srcp0 + x)); src_0_32 = _mm256_cvtepu8_epi32(src_16_bytes); // 0-7 src_1_32 = _mm256_cvtepu8_epi32(_mm_srli_si128(src_16_bytes, 8)); // 8-15, quick permuteless } else // uint16_t { __m256i src_16 = _mm256_load_si256(reinterpret_cast(srcp0 + x)); src_0_32 = _mm256_cvtepu16_epi32(_mm256_castsi256_si128(src_16)); // 0-7 src_1_32 = _mm256_cvtepu16_epi32(_mm256_extracti128_si256(src_16, 1)); // 8-15 } src_0_32 = _mm256_sub_epi32(src_0_32, m256_src_offset_epi32); src_1_32 = _mm256_sub_epi32(src_1_32, m256_src_offset_epi32); __m256 out_0_ps = _mm256_fmadd_ps(_mm256_cvtepi32_ps(src_0_32), m256_mul_factor, m256_dst_offset); __m256 out_1_ps = _mm256_fmadd_ps(_mm256_cvtepi32_ps(src_1_32), m256_mul_factor, m256_dst_offset); // 16 floats - 64 bytes always safe _mm256_store_ps((dstp0 + x + 0), out_0_ps); _mm256_store_ps((dstp0 + x + 8), out_1_ps); // const float pixel = (srcp0[x] - d.src_offset_i) * d.mul_factor + d.dst_offset; // dstp0[x] = pixel; // no clamp } dstp0 += dst_pitch; srcp0 += src_pitch; } } // instantinate template void convert_uintN_to_float_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); template void convert_uintN_to_float_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); template void convert_uintN_to_float_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); template void convert_uintN_to_float_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); template void convert_uintN_to_float_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); template void convert_uintN_to_float_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); template void convert_uintN_to_float_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); template void convert_uintN_to_float_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); template void convert_uintN_to_float_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); template void convert_uintN_to_float_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); template void convert_uintN_to_float_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); template void convert_uintN_to_float_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); template void convert_uintN_to_float_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); template void convert_uintN_to_float_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); template void convert_uintN_to_float_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); template void convert_uintN_to_float_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); ================================================ FILE: avs_core/convert/intel/convert_bits_avx2.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __Convert_bits_AVX2_H__ #define __Convert_bits_AVX2_H__ #include template void convert_32_to_uintN_avx2(const BYTE *srcp, BYTE *dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); template void convert_uint_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); template void convert_ordered_dither_uint_avx2(const BYTE* srcp8, BYTE* dstp8, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); template void convert_uintN_to_float_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); #endif // __Convert_bits_AVX2_H__ ================================================ FILE: avs_core/convert/intel/convert_bits_sse.cpp ================================================ // Avisynth v2.5. Copyright 2002-2009 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include "../convert_bits.h" #include "convert_bits_sse.h" #include "../convert_helper.h" #include #include #include #include #include #include #ifdef AVS_WINDOWS #include #else #include #endif // Intrinsics base header + really required extension headers #if defined(_MSC_VER) #include // MSVC #else #include // GCC/MinGW/Clang/LLVM #endif #include // SSE4.1 // float to 8 bit, float to 10/12/14/16 bit // sse4.1 template #if defined(GCC) || defined(CLANG) __attribute__((__target__("sse4.1"))) #endif void convert_32_to_uintN_sse41(const BYTE *srcp, BYTE *dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth) { const float* srcp0 = reinterpret_cast(srcp); pixel_t* dstp0 = reinterpret_cast(dstp); src_pitch = src_pitch / sizeof(float); dst_pitch = dst_pitch / sizeof(pixel_t); const int src_width = src_rowsize / sizeof(float); bits_conv_constants d; get_bits_conv_constants(d, chroma, fulls, fulld, source_bitdepth, target_bitdepth); auto dst_offset_plus_round = d.dst_offset + 0.5f; constexpr auto dst_pixel_min = 0; const auto dst_pixel_max = (1 << target_bitdepth) - 1; auto src_offset_ps = _mm_set1_ps(d.src_offset); auto factor_ps = _mm_set1_ps(d.mul_factor); auto dst_offset_plus_round_ps = _mm_set1_ps(dst_offset_plus_round); auto dst_pixel_min_ps = _mm_set1_ps((float)dst_pixel_min); auto dst_pixel_max_ps = _mm_set1_ps((float)dst_pixel_max); for (int y = 0; y < src_height; y++) { for (int x = 0; x < src_width; x += 8) // 8 pixels at a time { __m128i result; __m128i result_0, result_1; __m128 src_0 = _mm_load_ps(reinterpret_cast(srcp0 + x)); __m128 src_1 = _mm_load_ps(reinterpret_cast(srcp0 + x + 4)); if constexpr (!chroma && !fulls) { // when offset is different from 0 src_0 = _mm_sub_ps(src_0, src_offset_ps); src_1 = _mm_sub_ps(src_1, src_offset_ps); } src_0 = _mm_add_ps(_mm_mul_ps(src_0, factor_ps), dst_offset_plus_round_ps); src_1 = _mm_add_ps(_mm_mul_ps(src_1, factor_ps), dst_offset_plus_round_ps); src_0 = _mm_max_ps(_mm_min_ps(src_0, dst_pixel_max_ps), dst_pixel_min_ps); src_1 = _mm_max_ps(_mm_min_ps(src_1, dst_pixel_max_ps), dst_pixel_min_ps); result_0 = _mm_cvttps_epi32(src_0); // truncate result_1 = _mm_cvttps_epi32(src_1); if constexpr (sizeof(pixel_t) == 2) { result = _mm_packus_epi32(result_0, result_1); // sse41 _mm_store_si128(reinterpret_cast<__m128i*>(dstp0 + x), result); } else { result = _mm_packs_epi32(result_0, result_1); result = _mm_packus_epi16(result, result); // lo 8 byte _mm_storel_epi64(reinterpret_cast<__m128i*>(dstp0 + x), result); } // c: //const int pixel = (int)((srcp0[x] - src_offset) * mul_factor + dst_offset_plus_round); //dstp0[x] = pixel_t(clamp(pixel, dst_pixel_min, dst_pixel_max)); } dstp0 += dst_pitch; srcp0 += src_pitch; } } // instantiate them //template #define DEF_convert_32_to_uintN_functions(uint_X_t) \ template void convert_32_to_uintN_sse41(const BYTE* srcp8, BYTE* dstp8, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_32_to_uintN_sse41(const BYTE* srcp8, BYTE* dstp8, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_32_to_uintN_sse41(const BYTE* srcp8, BYTE* dstp8, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_32_to_uintN_sse41(const BYTE* srcp8, BYTE* dstp8, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_32_to_uintN_sse41(const BYTE* srcp8, BYTE* dstp8, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_32_to_uintN_sse41(const BYTE* srcp8, BYTE* dstp8, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_32_to_uintN_sse41(const BYTE* srcp8, BYTE* dstp8, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_32_to_uintN_sse41(const BYTE* srcp8, BYTE* dstp8, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); DEF_convert_32_to_uintN_functions(uint8_t) DEF_convert_32_to_uintN_functions(uint16_t) #undef DEF_convert_32_to_uintN_functions // YUV: bit shift 8-16 <=> 8-16 bits // shift right or left, depending on expandrange template #if defined(GCC) || defined(CLANG) __attribute__((__target__("sse4.1"))) #endif static void convert_uint_limited_sse41(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth) { const pixel_t_s* srcp0 = reinterpret_cast(srcp); pixel_t_d* dstp0 = reinterpret_cast(dstp); src_pitch = src_pitch / sizeof(pixel_t_s); dst_pitch = dst_pitch / sizeof(pixel_t_d); const int src_width = src_rowsize / sizeof(pixel_t_s); if (target_bitdepth > source_bitdepth) // expandrange. pixel_t_d is always uint16_t { const int shift_bits = target_bitdepth - source_bitdepth; __m128i shift = _mm_set_epi32(0, 0, 0, shift_bits); for (int y = 0; y < src_height; y++) { for (int x = 0; x < src_width; x += 16) { __m128i src_lo, src_hi; if constexpr (sizeof(pixel_t_s) == 1) { auto src = _mm_load_si128(reinterpret_cast(srcp0 + x)); // 16* uint8 src_lo = _mm_cvtepu8_epi16(src); // 8* uint16 src_hi = _mm_unpackhi_epi8(src, _mm_setzero_si128()); // 8* uint16 } else { src_lo = _mm_load_si128(reinterpret_cast(srcp0 + x)); // 8* uint_16 src_hi = _mm_load_si128(reinterpret_cast(srcp0 + x + 8)); // 8* uint_16 } src_lo = _mm_sll_epi16(src_lo, shift); src_hi = _mm_sll_epi16(src_hi, shift); if constexpr (sizeof(pixel_t_d) == 1) { // upconvert always to 2 bytes assert(0); } else { _mm_store_si128(reinterpret_cast<__m128i*>(dstp0 + x), src_lo); _mm_store_si128(reinterpret_cast<__m128i*>(dstp0 + x + 8), src_hi); } } dstp0 += dst_pitch; srcp0 += src_pitch; } } else { // reduce range const int shift_bits = source_bitdepth - target_bitdepth; const int round = 1 << (shift_bits - 1); __m128i shift = _mm_set_epi32(0, 0, 0, shift_bits); const auto round_simd = _mm_set1_epi16(round); for (int y = 0; y < src_height; y++) { for (int x = 0; x < src_width; x += 16) { if constexpr (sizeof(pixel_t_s) == 1) assert(0); // downconvert always from 2 bytes auto src_lo = _mm_load_si128(reinterpret_cast(srcp0 + x)); // 8* uint_16 auto src_hi = _mm_load_si128(reinterpret_cast(srcp0 + x + 8)); // 8* uint_16 src_lo = _mm_srl_epi16(_mm_adds_epu16(src_lo, round_simd), shift); src_hi = _mm_srl_epi16(_mm_adds_epu16(src_hi, round_simd), shift); if constexpr (sizeof(pixel_t_d) == 1) { // to 8 bits auto dst = _mm_packus_epi16(src_lo, src_hi); _mm_store_si128(reinterpret_cast<__m128i*>(dstp0 + x), dst); } else { _mm_store_si128(reinterpret_cast<__m128i*>(dstp0 + x), src_lo); _mm_store_si128(reinterpret_cast<__m128i*>(dstp0 + x + 8), src_hi); } } dstp0 += dst_pitch; srcp0 += src_pitch; } } } template #if defined(GCC) || defined(CLANG) __attribute__((__target__("sse4.1"))) #endif void convert_uint_sse41(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth) { // limited to limited is bitshift, see in other function if constexpr (!fulls && !fulld) { convert_uint_limited_sse41< pixel_t_s, pixel_t_d>(srcp, dstp, src_rowsize, src_height, src_pitch, dst_pitch, source_bitdepth, target_bitdepth, dither_target_bitdepth); return; } const pixel_t_s* srcp0 = reinterpret_cast(srcp); pixel_t_d* dstp0 = reinterpret_cast(dstp); src_pitch = src_pitch / sizeof(pixel_t_s); dst_pitch = dst_pitch / sizeof(pixel_t_d); const int src_width = src_rowsize / sizeof(pixel_t_s); if constexpr (sizeof(pixel_t_s) == 1 && sizeof(pixel_t_d) == 2) { if (fulls && fulld && !chroma && source_bitdepth == 8 && target_bitdepth == 16) { // special case 8->16 bit full scale: * 65535 / 255 = *257 __m128i zero = _mm_setzero_si128(); __m128i multiplier = _mm_set1_epi16(257); for (int y = 0; y < src_height; y++) { for (int x = 0; x < src_width; x += 16) { __m128i src = _mm_load_si128(reinterpret_cast(srcp0 + x)); // 16* uint8 __m128i src_lo = _mm_unpacklo_epi8(src, zero); // 8* uint16 __m128i src_hi = _mm_unpackhi_epi8(src, zero); // 8* uint16 // *257 mullo is faster than x*257 = (x<<8 + x) add/or solution (i7) __m128i res_lo = _mm_mullo_epi16(src_lo, multiplier); // lower 16 bit of multiplication is enough __m128i res_hi = _mm_mullo_epi16(src_hi, multiplier); // dstp[x] = srcp0[x] * 257; // RGB: full range 0..255 <-> 0..65535 (257 = 65535 / 255) _mm_store_si128(reinterpret_cast<__m128i*>(dstp0 + x), res_lo); _mm_store_si128(reinterpret_cast<__m128i*>(dstp0 + x + 8), res_hi); } // for x dstp0 += dst_pitch; srcp0 += src_pitch; } // for y return; } } const int target_max = (1 << target_bitdepth) - 1; bits_conv_constants d; get_bits_conv_constants(d, chroma, fulls, fulld, source_bitdepth, target_bitdepth); auto vect_mul_factor = _mm_set1_ps(d.mul_factor); auto vect_src_offset = _mm_set1_epi32(d.src_offset_i); auto dst_offset_plus_round = d.dst_offset + 0.5f; auto vect_dst_offset_plus_round = _mm_set1_ps(dst_offset_plus_round); auto vect_target_max = _mm_set1_epi16(target_max); auto zero = _mm_setzero_si128(); for (int y = 0; y < src_height; y++) { for (int x = 0; x < src_width; x += 16) { __m128i src_lo, src_hi; if constexpr (sizeof(pixel_t_s) == 1) { auto src = _mm_load_si128(reinterpret_cast(srcp0 + x)); // 16* uint8 src_lo = _mm_cvtepu8_epi16(src); // 8* uint16 src_hi = _mm_unpackhi_epi8(src, zero); // 8* uint16 } else { src_lo = _mm_load_si128(reinterpret_cast(srcp0 + x)); // 8* uint_16 src_hi = _mm_load_si128(reinterpret_cast(srcp0 + x + 8)); // 8* uint_16 } __m128i result1, result2; { // src: 8*uint16 // convert to int32, bias, to float auto res_lo_i = _mm_cvtepu16_epi32(src_lo); auto res_hi_i = _mm_unpackhi_epi16(src_lo, zero); if constexpr (chroma || !fulls) { // src_offset is not zero res_lo_i = _mm_sub_epi32(res_lo_i, vect_src_offset); res_hi_i = _mm_sub_epi32(res_hi_i, vect_src_offset); } auto res_lo = _mm_cvtepi32_ps(res_lo_i); auto res_hi = _mm_cvtepi32_ps(res_hi_i); // multiply, bias back+round res_lo = _mm_add_ps(_mm_mul_ps(res_lo, vect_mul_factor), vect_dst_offset_plus_round); res_hi = _mm_add_ps(_mm_mul_ps(res_hi, vect_mul_factor), vect_dst_offset_plus_round); // convert back w/ truncate auto result_l = _mm_cvttps_epi32(res_lo); // no banker's rounding auto result_h = _mm_cvttps_epi32(res_hi); // 0 min is ensured by packus // back to 16 bit result1 = _mm_packus_epi32(result_l, result_h); // 8 * 16 bit pixels result1 = _mm_min_epu16(result1, vect_target_max); } // byte target: not yet if constexpr (sizeof(pixel_t_d) == 2) _mm_store_si128(reinterpret_cast<__m128i*>(dstp0 + x), result1); { // src: 8*uint16 // convert to int32, bias, to float auto res_lo_i = _mm_cvtepu16_epi32(src_hi); auto res_hi_i = _mm_unpackhi_epi16(src_hi, zero); if constexpr (chroma || !fulls) { // src_offset is not zero res_lo_i = _mm_sub_epi32(res_lo_i, vect_src_offset); res_hi_i = _mm_sub_epi32(res_hi_i, vect_src_offset); } auto res_lo = _mm_cvtepi32_ps(res_lo_i); auto res_hi = _mm_cvtepi32_ps(res_hi_i); // multiply, bias back+round res_lo = _mm_add_ps(_mm_mul_ps(res_lo, vect_mul_factor), vect_dst_offset_plus_round); res_hi = _mm_add_ps(_mm_mul_ps(res_hi, vect_mul_factor), vect_dst_offset_plus_round); // convert back w/ truncate auto result_l = _mm_cvttps_epi32(res_lo); auto result_h = _mm_cvttps_epi32(res_hi); // 0 min is ensured by packus // back to 16 bit result2 = _mm_packus_epi32(result_l, result_h); // 8 * 16 bit pixels result2 = _mm_min_epu16(result2, vect_target_max); } if constexpr (sizeof(pixel_t_d) == 2) _mm_store_si128(reinterpret_cast<__m128i*>(dstp0 + x + 8), result2); else { // byte target: store both auto result12 = _mm_packus_epi16(result1, result2); _mm_store_si128(reinterpret_cast<__m128i*>(dstp0 + x), result12); } } // for x dstp0 += dst_pitch; srcp0 += src_pitch; } } // instantiate them all // template #define convert_uint_sse4_functions(uint_X_t, uint_X_dest_t) \ template void convert_uint_sse41(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_uint_sse41(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_uint_sse41(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_uint_sse41(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_uint_sse41(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_uint_sse41(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_uint_sse41(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_uint_sse41(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); convert_uint_sse4_functions(uint8_t, uint8_t) convert_uint_sse4_functions(uint8_t, uint16_t) convert_uint_sse4_functions(uint16_t, uint8_t) convert_uint_sse4_functions(uint16_t, uint16_t) #undef convert_uint_sse4_functions // for optimization this one has extra template parameters // TEMPLATE_NEED_BACKSCALE to support dither_target_bits being lower than target bit depth template #if defined(GCC) || defined(CLANG) __attribute__((__target__("sse4.1"))) #endif static void do_convert_ordered_dither_uint_sse41(const BYTE* srcp8, BYTE* dstp8, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth) { const pixel_t_s* srcp = reinterpret_cast(srcp8); pixel_t_d* dstp = reinterpret_cast(dstp8); dst_pitch = dst_pitch / sizeof(pixel_t_d); src_pitch = src_pitch / sizeof(pixel_t_s); // we can safely process whole 16 (8 bit src) / 32 byte (16 bit source) chunks, Avisynth ensures at least 32 byte alignment const int src_width = (src_rowsize / sizeof(pixel_t_s) + 15) & ~15; // helps compiler optimization if constexpr (sizeof(pixel_t_s) == 1) source_bitdepth = 8; if constexpr (sizeof(pixel_t_d) == 1) { target_bitdepth = 8; if (!TEMPLATE_NEED_BACKSCALE) { dither_target_bitdepth = 8; } } const int max_pixel_value_target = (1 << target_bitdepth) - 1; const int max_pixel_value_dithered = (1 << dither_target_bitdepth) - 1; // precheck ensures: // target_bitdepth >= dither_target_bitdepth // source_bitdepth - dither_target_bitdepth <= 8 (max precalculated table is 16x16) const bool odd_diff = (source_bitdepth - dither_target_bitdepth) & 1; const int dither_bit_diff = (source_bitdepth - dither_target_bitdepth); const int dither_order = (dither_bit_diff + 1) / 2; const int dither_mask = (1 << dither_order) - 1; // 9,10=2 11,12=4 13,14=8 15,16=16 // 10->8: 0x01 (2x2) // 11->8: 0x03 (4x4) // 12->8: 0x03 (4x4) // 14->8: 0x07 (8x8) // 16->8: 0x0F (16x16) const BYTE* matrix; switch (dither_order) { case 1: matrix = reinterpret_cast(odd_diff ? dither2x2a_data_sse2 : dither2x2_data_sse2); break; case 2: matrix = reinterpret_cast(odd_diff ? dither4x4a_data_sse2 : dither4x4_data_sse2); break; case 3: matrix = reinterpret_cast(odd_diff ? dither8x8a_data_sse2 : dither8x8_data_sse2); break; case 4: matrix = reinterpret_cast(odd_diff ? dither16x16a_data : dither16x16_data); break; // no spec sse, already 16 bytes long default: return; // n/a } const int bitdiff_between_dither_and_target = target_bitdepth - dither_target_bitdepth; assert(TEMPLATE_NEED_BACKSCALE == (target_bitdepth != dither_target_bitdepth)); // dither to x, target to y assert(TEMPLATE_LOW_DITHER_BITDEPTH == (dither_target_bitdepth < 8)); // e.g. instead of 0,1 => -0.5,+0.5; 0,1,2,3 => -1.5,-0.5,0.5,1.5 const float half_maxcorr_value = ((1 << dither_bit_diff) - 1) / 2.0f; const int source_max = (1 << source_bitdepth) - 1; //----------------------- // When calculating src_pixel, src and dst are of the same bit depth bits_conv_constants d; get_bits_conv_constants(d, chroma, fulls, fulld, source_bitdepth, source_bitdepth); // both is src_bitdepth auto dst_offset_plus_round = d.dst_offset + 0.5f; constexpr auto src_pixel_min = 0; const auto src_pixel_max = source_max; const float mul_factor_backfromlowdither = (float)max_pixel_value_target / max_pixel_value_dithered; //----------------------- const auto mul_factor_simd = _mm_set1_ps(d.mul_factor); const auto mul_factor_backfromlowdither_simd = _mm_set1_ps(mul_factor_backfromlowdither); const auto half_maxcorr_value_simd = _mm_set1_ps(half_maxcorr_value); const auto zero = _mm_setzero_si128(); const BYTE* matrix_simd16 = matrix; const BYTE* current_matrix_line; for (int y = 0; y < src_height; y++) { // int _y = (y & dither_mask) << dither_order; // for C version current_matrix_line = matrix_simd16 + ((y & dither_mask) << 4); // always 16 byte boundary instead of dither order __m128i corr = _mm_load_si128(reinterpret_cast(current_matrix_line)); // int corr = matrix[_y | (x & dither_mask)]; // convert corr to 16 bit __m128i corr_lo = _mm_unpacklo_epi8(corr, zero); __m128i corr_hi = _mm_unpackhi_epi8(corr, zero); for (int x = 0; x < src_width; x += 16) { //const int corr = matrix[_y | (x & dither_mask)]; //int src_pixel = srcp[x]; __m128i src_lo, src_hi; if constexpr (sizeof(pixel_t_s) == 1) { auto src = _mm_load_si128(reinterpret_cast(srcp + x)); // 16* uint8 src_lo = _mm_unpacklo_epi8(src, zero); // 8* uint16 src_hi = _mm_unpackhi_epi8(src, zero); // 8* uint16 } else { src_lo = _mm_load_si128(reinterpret_cast(srcp + x)); // 8* uint16 src_hi = _mm_load_si128(reinterpret_cast(srcp + x + 8)); } [[maybe_unused]] __m128i src_lo_lo; [[maybe_unused]] __m128i src_lo_hi; [[maybe_unused]] __m128i src_hi_lo; [[maybe_unused]] __m128i src_hi_hi; if constexpr (fulls != fulld) { // goint to 32 float // const float val = (srcp[x] - src_offset) * mul_factor + dst_offset_plus_round; const auto src_offset_simd = _mm_set1_epi32(d.src_offset_i); const auto dst_offset_plus_round_simd = _mm_set1_ps(dst_offset_plus_round); auto src_lo_lo_ps = _mm_cvtepi32_ps(_mm_sub_epi32(_mm_unpacklo_epi16(src_lo, zero), src_offset_simd)); auto src_lo_hi_ps = _mm_cvtepi32_ps(_mm_sub_epi32(_mm_unpackhi_epi16(src_lo, zero), src_offset_simd)); src_lo_lo_ps = _mm_add_ps(_mm_mul_ps(src_lo_lo_ps, mul_factor_simd), dst_offset_plus_round_simd); src_lo_hi_ps = _mm_add_ps(_mm_mul_ps(src_lo_hi_ps, mul_factor_simd), dst_offset_plus_round_simd); auto src_hi_lo_ps = _mm_cvtepi32_ps(_mm_sub_epi32(_mm_unpacklo_epi16(src_hi, zero), src_offset_simd)); auto src_hi_hi_ps = _mm_cvtepi32_ps(_mm_sub_epi32(_mm_unpackhi_epi16(src_hi, zero), src_offset_simd)); src_hi_lo_ps = _mm_add_ps(_mm_mul_ps(src_hi_lo_ps, mul_factor_simd), dst_offset_plus_round_simd); src_hi_hi_ps = _mm_add_ps(_mm_mul_ps(src_hi_hi_ps, mul_factor_simd), dst_offset_plus_round_simd); // src_pixel = clamp((int)val, src_pixel_min, src_pixel_max); if constexpr (sizeof(pixel_t_s) == 1 && !TEMPLATE_LOW_DITHER_BITDEPTH) { // Source is 8 bits. This branch is ineffective if we define TEMPLATE_LOW_DITHER_BITDEPTH for all <8 bits, as we do now // We would reach this code for 5-7 bits when lo limit would be e.g. 4 bits // 8 bit source: we can go back from 32 to 16 bit int src_lo = _mm_packus_epi32(_mm_cvttps_epi32(src_lo_lo_ps), _mm_cvttps_epi32(src_lo_hi_ps)); src_hi = _mm_packus_epi32(_mm_cvttps_epi32(src_hi_lo_ps), _mm_cvttps_epi32(src_hi_hi_ps)); // 0 min is ensured by packus const auto src_pixel_max_simd = _mm_set1_epi16(src_pixel_max); src_lo = _mm_min_epu16(src_lo, src_pixel_max_simd); src_hi = _mm_min_epu16(src_hi, src_pixel_max_simd); // tmp result 16 bits in src_lo, src_hi } else { // go back to int32 only src_lo_lo = _mm_cvttps_epi32(src_lo_lo_ps); src_lo_hi = _mm_cvttps_epi32(src_lo_hi_ps); src_hi_lo = _mm_cvttps_epi32(src_hi_lo_ps); src_hi_hi = _mm_cvttps_epi32(src_hi_hi_ps); // no packus to ensure min 0 const auto src_pixel_min_simd = _mm_set1_epi32(src_pixel_min); src_lo_lo = _mm_max_epi32(src_lo_lo, src_pixel_min_simd); src_lo_hi = _mm_max_epi32(src_lo_hi, src_pixel_min_simd); src_hi_lo = _mm_max_epi32(src_hi_lo, src_pixel_min_simd); src_hi_hi = _mm_max_epi32(src_hi_hi, src_pixel_min_simd); const auto src_pixel_max_simd = _mm_set1_epi32(src_pixel_max); src_lo_lo = _mm_min_epi32(src_lo_lo, src_pixel_max_simd); src_lo_hi = _mm_min_epi32(src_lo_hi, src_pixel_max_simd); src_hi_lo = _mm_min_epi32(src_hi_lo, src_pixel_max_simd); src_hi_hi = _mm_min_epi32(src_hi_hi, src_pixel_max_simd); // tmp result 32 bits in src_lo_lo, src_lo_hi, src_hi_lo, src_hi_hi } } else { // 10-16 bits: go into 32 bit int if constexpr (sizeof(pixel_t_s) == 2 || TEMPLATE_LOW_DITHER_BITDEPTH) { src_lo_lo = _mm_unpacklo_epi16(src_lo, zero); src_lo_hi = _mm_unpackhi_epi16(src_lo, zero); src_hi_lo = _mm_unpacklo_epi16(src_hi, zero); src_hi_hi = _mm_unpackhi_epi16(src_hi, zero); // tmp result 32 bits in src_lo_lo, src_lo_hi, src_hi_lo, src_hi_hi } } __m128i new_pixel_lo, new_pixel_hi; // scale down after adding dithering noise // int new_pixel = ((src_pixel + corr) >> dither_bit_diff); if constexpr (sizeof(pixel_t_s) == 1 && !TEMPLATE_LOW_DITHER_BITDEPTH) { new_pixel_lo = _mm_srai_epi16(_mm_add_epi16(src_lo, corr_lo), dither_bit_diff); new_pixel_hi = _mm_srai_epi16(_mm_add_epi16(src_hi, corr_hi), dither_bit_diff); // new_pixel_lo/hi is ready with 16 bit data } else { // source bits: >8 or 8 bit but PRESHIFT // At 16 bit overflow can happen when 0xFFFF it dithered up. This is why we are at 32 bits int // Theoretically fulls == fulld && <16 bit would allow 16 bit int workflow but we do not specialize for that // low dither bitdepth is special as well /* int new_pixel; if (TEMPLATE_LOW_DITHER_BITDEPTH) { // accurate dither: +/- const float corr_f = corr - half_maxcorr_value; new_pixel = (int)(src_pixel + corr_f) >> dither_bit_diff; } else new_pixel = ((src_pixel + corr) >> dither_bit_diff); */ __m128i new_pixel_lo_lo, new_pixel_lo_hi, new_pixel_hi_lo, new_pixel_hi_hi; auto corr_lo_lo = _mm_unpacklo_epi16(corr_lo, zero); auto corr_lo_hi = _mm_unpackhi_epi16(corr_lo, zero); auto corr_hi_lo = _mm_unpacklo_epi16(corr_hi, zero); auto corr_hi_hi = _mm_unpackhi_epi16(corr_hi, zero); if constexpr(TEMPLATE_LOW_DITHER_BITDEPTH) { // accurately positioned to the center auto corr_lo_lo_ps = _mm_sub_ps(_mm_cvtepi32_ps(corr_lo_lo), half_maxcorr_value_simd); auto corr_lo_hi_ps = _mm_sub_ps(_mm_cvtepi32_ps(corr_lo_hi), half_maxcorr_value_simd); auto corr_hi_lo_ps = _mm_sub_ps(_mm_cvtepi32_ps(corr_hi_lo), half_maxcorr_value_simd); auto corr_hi_hi_ps = _mm_sub_ps(_mm_cvtepi32_ps(corr_hi_hi), half_maxcorr_value_simd); // accurate dither: +/- new_pixel_lo_lo = _mm_srai_epi32(_mm_cvttps_epi32(_mm_add_ps(_mm_cvtepi32_ps(src_lo_lo), corr_lo_lo_ps)), dither_bit_diff); new_pixel_lo_hi = _mm_srai_epi32(_mm_cvttps_epi32(_mm_add_ps(_mm_cvtepi32_ps(src_lo_hi), corr_lo_hi_ps)), dither_bit_diff); new_pixel_hi_lo = _mm_srai_epi32(_mm_cvttps_epi32(_mm_add_ps(_mm_cvtepi32_ps(src_hi_lo), corr_hi_lo_ps)), dither_bit_diff); new_pixel_hi_hi = _mm_srai_epi32(_mm_cvttps_epi32(_mm_add_ps(_mm_cvtepi32_ps(src_hi_hi), corr_hi_hi_ps)), dither_bit_diff); } else { // Arrgh. If dither_bit_diff would be an immediate constant (e.g. template parameter) then we get 2390 fps vs 1378! // for a simple Vide16bit.ConvertBits(8, dither=0, dither_bits=8) // const auto dither_bit_diff = 8; new_pixel_lo_lo = _mm_srai_epi32(_mm_add_epi32(src_lo_lo, corr_lo_lo), dither_bit_diff); new_pixel_lo_hi = _mm_srai_epi32(_mm_add_epi32(src_lo_hi, corr_lo_hi), dither_bit_diff); new_pixel_hi_lo = _mm_srai_epi32(_mm_add_epi32(src_hi_lo, corr_hi_lo), dither_bit_diff); new_pixel_hi_hi = _mm_srai_epi32(_mm_add_epi32(src_hi_hi, corr_hi_hi), dither_bit_diff); } new_pixel_lo = _mm_packus_epi32(new_pixel_lo_lo, new_pixel_lo_hi); new_pixel_hi = _mm_packus_epi32(new_pixel_hi_lo, new_pixel_hi_hi); // new_pixel_lo/hi is ready with 16 bit data } // scale back to the required bit depth // dither to x, target to y if constexpr (TEMPLATE_NEED_BACKSCALE) { /* new_pixel = min(new_pixel, max_pixel_value_dithered); if (TEMPLATE_LOW_DITHER_BITDEPTH) { new_pixel = (int)(new_pixel * mul_factor_backfromlowdither + 0.5f); } else { new_pixel = new_pixel << bitdiff_between_dither_and_target; } */ const auto max_pixel_value_dithered_simd = _mm_set1_epi16(max_pixel_value_dithered); new_pixel_lo = _mm_min_epu16(new_pixel_lo, max_pixel_value_dithered_simd); new_pixel_hi = _mm_min_epu16(new_pixel_hi, max_pixel_value_dithered_simd); // Interesting problem of dither_bits==1 (or in general at small dither_bits) // After simple slli 0,1 becomes 0,128, we'd expect 0,255 instead. So we make cosmetics. // dither_bits // 1 0,1 => 0,128 => 0,255 // 2 0,1,2,3 => 0,64,128,192 => 0,?,?,255 // 3 0,...,7 => 0,32,...,224 => 0,?,?,255 // 4 0,..,15 => 0,16,...,240 => 0,?,?,255 // 5 0,..,31 => 0,8,....,248 => 0,?,?,255 // 6 0,..,63 => 0,4,....,252 => 0,?,?,255 // 7 0,.,127 => 0,2. ..,254 => 0,?,?,255 if constexpr(TEMPLATE_LOW_DITHER_BITDEPTH) { // new_pixel = (int)(new_pixel * mul_factor_backfromlowdither + 0.5f); auto rounder_half_simd = _mm_set1_ps(0.5f); auto new_pixel_lo_lo_ps = _mm_cvtepi32_ps(_mm_unpacklo_epi16(new_pixel_lo, zero)); auto new_pixel_lo_hi_ps = _mm_cvtepi32_ps(_mm_unpackhi_epi16(new_pixel_lo, zero)); new_pixel_lo = _mm_packus_epi32( _mm_cvttps_epi32(_mm_add_ps(_mm_mul_ps(new_pixel_lo_lo_ps, mul_factor_backfromlowdither_simd), rounder_half_simd)), _mm_cvttps_epi32(_mm_add_ps(_mm_mul_ps(new_pixel_lo_hi_ps, mul_factor_backfromlowdither_simd), rounder_half_simd)) ); auto new_pixel_hi_lo_ps = _mm_cvtepi32_ps(_mm_unpacklo_epi16(new_pixel_hi, zero)); auto new_pixel_hi_hi_ps = _mm_cvtepi32_ps(_mm_unpackhi_epi16(new_pixel_hi, zero)); new_pixel_hi = _mm_packus_epi32( _mm_cvttps_epi32(_mm_add_ps(_mm_mul_ps(new_pixel_hi_lo_ps, mul_factor_backfromlowdither_simd), rounder_half_simd)), _mm_cvttps_epi32(_mm_add_ps(_mm_mul_ps(new_pixel_hi_hi_ps, mul_factor_backfromlowdither_simd), rounder_half_simd)) ); } else { new_pixel_lo = _mm_slli_epi16(new_pixel_lo, bitdiff_between_dither_and_target); new_pixel_hi = _mm_slli_epi16(new_pixel_hi, bitdiff_between_dither_and_target); } } // dstp[x] = (pixel_t_d)(min((int)new_pixel, max_pixel_value_target)); if constexpr(sizeof(pixel_t_d) == 1) { auto result = _mm_packus_epi16(new_pixel_lo, new_pixel_hi); _mm_store_si128(reinterpret_cast<__m128i*>(dstp + x), result); } else { const auto max_pixel_value_target_simd = _mm_set1_epi16(max_pixel_value_target); // max is unnecessary for exact 16 bit pixel type but we are not specialized for that case new_pixel_lo = _mm_min_epu16(new_pixel_lo, max_pixel_value_target_simd); new_pixel_hi = _mm_min_epu16(new_pixel_hi, max_pixel_value_target_simd); _mm_store_si128(reinterpret_cast<__m128i*>(dstp + x), new_pixel_lo); _mm_store_si128(reinterpret_cast<__m128i*>(dstp + x + 8), new_pixel_hi); } } dstp += dst_pitch; srcp += src_pitch; } } template #if defined(GCC) || defined(CLANG) __attribute__((__target__("sse4.1"))) #endif void convert_ordered_dither_uint_sse41(const BYTE* srcp8, BYTE* dstp8, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth) { const bool need_backscale = target_bitdepth != dither_target_bitdepth; // dither to x, target to y const bool low_dither_bitdepth = dither_target_bitdepth < 8; // 1-7 bits dither targets, need_backscale is always true, since 8 bit format is the minimum if (need_backscale) { if (low_dither_bitdepth) do_convert_ordered_dither_uint_sse41(srcp8, dstp8, src_rowsize, src_height, src_pitch, dst_pitch, source_bitdepth, target_bitdepth, dither_target_bitdepth); else do_convert_ordered_dither_uint_sse41(srcp8, dstp8, src_rowsize, src_height, src_pitch, dst_pitch, source_bitdepth, target_bitdepth, dither_target_bitdepth); } else { do_convert_ordered_dither_uint_sse41(srcp8, dstp8, src_rowsize, src_height, src_pitch, dst_pitch, source_bitdepth, target_bitdepth, dither_target_bitdepth); } } // instantiate them all // template // spec: fulld=false, fulls=false #define convert_ordered_dither_uint_sse4_functions(uint_X_t, uint_X_dest_t) \ template void convert_ordered_dither_uint_sse41(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_ordered_dither_uint_sse41(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_ordered_dither_uint_sse41(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_ordered_dither_uint_sse41(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_ordered_dither_uint_sse41(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_ordered_dither_uint_sse41(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_ordered_dither_uint_sse41(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \ template void convert_ordered_dither_uint_sse41(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); // dither only same of less bit depth convert_ordered_dither_uint_sse4_functions(uint8_t, uint8_t) convert_ordered_dither_uint_sse4_functions(uint16_t, uint8_t) convert_ordered_dither_uint_sse4_functions(uint16_t, uint16_t) #undef convert_ordered_dither_uint_sse4_functions ================================================ FILE: avs_core/convert/intel/convert_bits_sse.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __Convert_bits_sse_H__ #define __Convert_bits_sse_H__ #include template #if defined(GCC) || defined(CLANG) __attribute__((__target__("sse4.1"))) #endif void convert_32_to_uintN_sse41(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); template #if defined(GCC) || defined(CLANG) __attribute__((__target__("sse4.1"))) #endif void convert_uint_sse41(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); template #if defined(GCC) || defined(CLANG) __attribute__((__target__("sse4.1"))) #endif void convert_ordered_dither_uint_sse41(const BYTE* srcp8, BYTE* dstp8, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); #endif // __Convert_bits_sse_H__ ================================================ FILE: avs_core/convert/intel/convert_planar_avx2.cpp ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include #ifdef _MSC_VER #include #else #include #endif #include #include "convert_planar_avx2.h" #include "../convert_planar.h" #include "../convert_helper.h" #ifndef _mm256_set_m128i #define _mm256_set_m128i(v0, v1) _mm256_insertf128_si256(_mm256_castsi128_si256(v1), (v0), 1) #endif DISABLE_WARNING_PUSH DISABLE_WARNING_UNREFERENCED_LOCAL_VARIABLE // packed rgb helper static AVS_FORCEINLINE __m256i convert_yuv_to_rgb_avx2_core(const __m256i& px0189, const __m256i& px23AB, const __m256i& px45CD, const __m256i& px67EF, const __m256i& zero, const __m256i& matrix, const __m256i& round_mask_plus_rgb_offset) { //int b = (((int)m[0] * Y + (int)m[1] * U + (int)m[ 2] * V + 4096 + rgb_offset)>>13); //px01 - xx xx 00 V1 00 U1 00 Y1 xx xx 00 V0 00 U0 00 Y0 auto low_lo = _mm256_madd_epi16(px0189, matrix); //xx*0 + v1*m2 | u1*m1 + y1*m0 | xx*0 + v0*m2 | u0*m1 + y0*m0 auto low_hi = _mm256_madd_epi16(px23AB, matrix); //xx*0 + v3*m2 | u3*m1 + y3*m0 | xx*0 + v2*m2 | u2*m1 + y2*m0 auto high_lo = _mm256_madd_epi16(px45CD, matrix); auto high_hi = _mm256_madd_epi16(px67EF, matrix); auto low_v = _mm256_castps_si256(_mm256_shuffle_ps(_mm256_castsi256_ps(low_lo), _mm256_castsi256_ps(low_hi), _MM_SHUFFLE(3, 1, 3, 1))); // v3*m2 | v2*m2 | v1*m2 | v0*m2 auto high_v = _mm256_castps_si256(_mm256_shuffle_ps(_mm256_castsi256_ps(high_lo), _mm256_castsi256_ps(high_hi), _MM_SHUFFLE(3, 1, 3, 1))); auto low_yu = _mm256_castps_si256(_mm256_shuffle_ps(_mm256_castsi256_ps(low_lo), _mm256_castsi256_ps(low_hi), _MM_SHUFFLE(2, 0, 2, 0))); // u3*m1 + y3*m0 | u2*m1 + y2*m0 | u1*m1 + y1*m0 | u0*m1 + y0*m0 auto high_yu = _mm256_castps_si256(_mm256_shuffle_ps(_mm256_castsi256_ps(high_lo), _mm256_castsi256_ps(high_hi), _MM_SHUFFLE(2, 0, 2, 0))); auto t_lo = _mm256_add_epi32(low_v, low_yu); // v3*m2 + u3*m1 + y3*m0... auto t_hi = _mm256_add_epi32(high_v, high_yu); // v3*m2 + u3*m1 + y3*m0 + 4096 + rgb_offset t_lo = _mm256_add_epi32(t_lo, round_mask_plus_rgb_offset); t_hi = _mm256_add_epi32(t_hi, round_mask_plus_rgb_offset); t_lo = _mm256_srai_epi32(t_lo, 13); // (v3*m2 + u3*m1 + y3*m0 + 4096) >> 13... t_hi = _mm256_srai_epi32(t_hi, 13); auto result = _mm256_packs_epi32(t_lo, t_hi); result = _mm256_packus_epi16(result, zero); //00 00 00 00 00 00 00 00 b15 b14 b14 b12 b11 b10 b9 b8 00 00 00 00 00 00 00 00 b7 b6 b5 b4 b3 b2 b1 b0 return result; } template void convert_yv24_to_rgb_avx2(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE* srcV, const BYTE* srcA, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t src_pitch_a, size_t width, size_t height, const ConversionMatrix& matrix) { dstp += dst_pitch * (height - 1); // We start at last line size_t mod16_width = rgb_pixel_step == 3 ? width / 16 * 16 : width; // for rgb32 target we can process pixels beyond width, but we have 64bit alignment at target 16 pixels to 16*4=64 rgb pixels // if alignment would only be 32 bytes, we'd do the last cycle to process only 8 source pixels auto matrix_b = _mm256_set_epi16(0, matrix.v_b, matrix.u_b, matrix.y_b, 0, matrix.v_b, matrix.u_b, matrix.y_b, 0, matrix.v_b, matrix.u_b, matrix.y_b, 0, matrix.v_b, matrix.u_b, matrix.y_b); auto matrix_g = _mm256_set_epi16(0, matrix.v_g, matrix.u_g, matrix.y_g, 0, matrix.v_g, matrix.u_g, matrix.y_g, 0, matrix.v_g, matrix.u_g, matrix.y_g, 0, matrix.v_g, matrix.u_g, matrix.y_g); auto matrix_r = _mm256_set_epi16(0, matrix.v_r, matrix.u_r, matrix.y_r, 0, matrix.v_r, matrix.u_r, matrix.y_r, 0, matrix.v_r, matrix.u_r, matrix.y_r, 0, matrix.v_r, matrix.u_r, matrix.y_r); auto zero128 = _mm_setzero_si128(); auto zero = _mm256_setzero_si256(); // .13 bit frac integer arithmetic int round_mask_plus_rgb_offset_i = (1 << 12) + (matrix.offset_rgb << 13); auto round_mask_plus_rgb_offset = _mm256_set1_epi32(round_mask_plus_rgb_offset_i); auto offset = _mm256_set_epi16(0, -128, -128, matrix.offset_y, 0, -128, -128, matrix.offset_y, 0, -128, -128, matrix.offset_y, 0, -128, -128, matrix.offset_y); // 16 YUV(A) pixels --> 4x16 RGB quads = 64 bytes. Avisynth's alignment is 64 fortunately. for (size_t y = 0; y < height; ++y) { for (size_t x = 0; x < mod16_width; x += 16) { __m128i src_y = _mm_load_si128(reinterpret_cast(srcY + x)); //Y15 .. Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 __m128i src_u = _mm_load_si128(reinterpret_cast(srcU + x)); //U15 .. U7 U6 U5 U4 U3 U2 U1 U0 __m128i src_v = _mm_load_si128(reinterpret_cast(srcV + x)); //V15 .. V7 V6 V5 V4 V3 V2 V1 V0 [[maybe_unused]] __m128i src_a; if constexpr(hasAlpha) src_a = _mm_load_si128(reinterpret_cast(srcA + x)); //A15 .. A7 A6 A5 A4 A3 A2 A1 A0 __m128i t1_lo = _mm_unpacklo_epi8(src_y, src_u); //U7 Y7 U6 Y6 U5 Y5 U4 Y4 U3 Y3 U2 Y2 U1 Y1 U0 Y0 __m128i t1_hi = _mm_unpackhi_epi8(src_y, src_u); //U15 Y15 U14 Y14 U13 Y13 U12 Y12 U11 Y11 U10 Y10 U9 Y9 U8 Y8 __m128i t2_lo = _mm_unpacklo_epi8(src_v, zero128); //00 V7 00 V6 00 V5 00 V4 00 V3 00 V2 00 V1 00 V0 __m128i t2_hi = _mm_unpackhi_epi8(src_v, zero128); //00 V15 00 V14 00 V13 00 V12 00 V11 00 V10 00 V9 00 V8 __m256i t1 = _mm256_set_m128i(t1_hi, t1_lo); __m256i t2 = _mm256_set_m128i(t2_hi, t2_lo); t1 = _mm256_permute4x64_epi64(t1, (0 << 0) | (2 << 2) | (1 << 4) | (3 << 6)); t2 = _mm256_permute4x64_epi64(t2, (0 << 0) | (2 << 2) | (1 << 4) | (3 << 6)); __m256i low = _mm256_unpacklo_epi16(t1, t2); //xx V11 U11 Y11 xx V10 U10 Y10 xx V9 U9 Y9 xx V8 U8 Y8 xx V3 U3 Y3 xx V2 U2 Y2 xx V1 U1 Y1 xx V0 U0 Y0 __m256i high = _mm256_unpackhi_epi16(t1, t2); //xx V15 U15 Y15 xx V14 U14 Y14 xx V13 U13 Y13 xx V12 U12 Y12 xx V7 U7 Y7 xx V6 U6 Y6 xx V5 U5 Y5 xx V4 U4 Y4 __m256i px0189 = _mm256_unpacklo_epi8(low, zero); //xx xx 00 V1 00 U1 00 Y1 xx xx 00 V0 00 U0 00 Y0 __m256i px23AB = _mm256_unpackhi_epi8(low, zero); //xx xx 00 V3 00 U3 00 Y3 xx xx 00 V2 00 U2 00 Y2 __m256i px45CD = _mm256_unpacklo_epi8(high, zero); //xx xx 00 V5 00 U5 00 Y5 xx xx 00 V4 00 U4 00 Y4 __m256i px67EF = _mm256_unpackhi_epi8(high, zero); //xx xx 00 V7 00 U7 00 Y7 xx xx 00 V6 00 U6 00 Y6 px0189 = _mm256_add_epi16(px0189, offset); px23AB = _mm256_add_epi16(px23AB, offset); px45CD = _mm256_add_epi16(px45CD, offset); px67EF = _mm256_add_epi16(px67EF, offset); __m256i result_b = convert_yuv_to_rgb_avx2_core(px0189, px23AB, px45CD, px67EF, zero, matrix_b, round_mask_plus_rgb_offset); // b15..0 __m256i result_g = convert_yuv_to_rgb_avx2_core(px0189, px23AB, px45CD, px67EF, zero, matrix_g, round_mask_plus_rgb_offset); // g15..0 __m256i result_r = convert_yuv_to_rgb_avx2_core(px0189, px23AB, px45CD, px67EF, zero, matrix_r, round_mask_plus_rgb_offset); // r15..0 __m256i result_bg = _mm256_unpacklo_epi8(result_b, result_g); //g15 b15 g14 b14 g13 b13 g12 b12 g11 b11 g10 b10 g9 b9 g8 b8 | g7 b7 g6 b6 g5 b5 g4 b4 g3 b3 g2 b2 g1 b1 g0 b0 __m256i alpha; if constexpr(hasAlpha) { __m128i a_lo = _mm_unpacklo_epi8(src_a, zero128); //00 A7 00 A6 00 A5 00 A4 00 A3 00 A2 00 A1 00 A0 __m128i a_hi = _mm_unpackhi_epi8(src_a, zero128); //00 A15 00 A14 00 A13 00 A12 00 A11 00 A10 00 A9 00 A8 alpha = _mm256_set_m128i(a_hi, a_lo); // a15 .. a0 at low of each m128i part alpha = _mm256_permute4x64_epi64(alpha, (0 << 0) | (2 << 2) | (1 << 4) | (3 << 6)); } else alpha = _mm256_cmpeq_epi32(result_r, result_r); // FF FF FF FF ... default alpha transparent __m256i result_ra = _mm256_unpacklo_epi8(result_r, alpha); //a7 r7 a6 r6 a5 r5 a4 r4 a3 r3 a2 r2 a1 r1 a0 r0 __m256i result_lo = _mm256_unpacklo_epi16(result_bg, result_ra); // a11 r11 g11 b11 | a10 r10 g10 b10 | a9 r9 g9 b9 | a8 r8 g8 b8 | a3 r3 g3 b3 | a2 r2 g2 b2 | a1 r1 g1 b1 | a0 r0 g0 b0 __m256i result_hi = _mm256_unpackhi_epi16(result_bg, result_ra); // note: actual pixel indexes are different from the numbers in comments, they are kept to be follow more easily // Initial _mm256_permute4x64_epi64 ensures that the order here is properly argb7..argb0 and argb15..argb8 if constexpr (rgb_pixel_step == 4) { //rgb32 _mm256_store_si256(reinterpret_cast<__m256i*>(dstp + x * 4), result_lo); _mm256_store_si256(reinterpret_cast<__m256i*>(dstp + x * 4 + 32), result_hi); } else { // rgb24 // 16*4 bytes to 16*3 bytes __m256i perm10 = _mm256_set_epi32(0, 0, 6, 5, 4, 2, 1, 0); __m256i shuffle_lo = _mm256_set_epi8( 0, 0, 0, 0, 14, 13, 12, 10, 9, 8, 6, 5, 4, 2, 1, 0, 0, 0, 0, 0, 14, 13, 12, 10, 9, 8, 6, 5, 4, 2, 1, 0 ); __m128i shuffle_hi_lo = _mm_set_epi8(9, 8, 6, 5, 4, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0); __m128i result_hi_lo = _mm256_extracti128_si256(result_hi, 0); // aBbBgBrB aAbAgArA a9b9g9r9 a8b8g8r8 __m128i result_hi_hi = _mm256_extracti128_si256(result_hi, 1); // aFbFgFrF aEbEgErE aDbDgDrD aCbCgCrC __m256i result_lo_reorg = _mm256_shuffle_epi8(result_lo, shuffle_lo); // x x x x b7g7r7 b6g6r6 b5g5r5 b4g4r4 x x x x b3g3r3 b2g2r2 b1g1r1 b0g0r0 result_lo_reorg = _mm256_permutevar8x32_epi32(result_lo_reorg, perm10); // x x x x x x x x b7g7r7 b6g6r6 b5g5r5 b4g4r4 b3g3r3 b2g2r2 b1g1r1 b0g0r0 __m128i result_hi_lo_reorg = _mm_shuffle_epi8(result_hi_lo, shuffle_hi_lo); // gA rA b9 g9 r9 b8 g8 r8 x x x x x x x x __m256i dummy_y0 = _mm256_undefined_si256(); auto result_hi_lo_reorg_2 = _mm256_inserti128_si256(dummy_y0, result_hi_lo_reorg, 1); // // gA rA b9 g9|r9 b8 g8 r8|x x x x|x x x x|x x x x |x x x x|x x x x|x x x x // result_hi_lo_reorg_2 // x x x x x x x x b7g7r7 b6g6r6 b5g5r5 b4g4r4 b3g3r3 b2g2r2 b1g1r1 b0g0r0 // result_lo_reorg auto result_0_15 = _mm256_blend_epi32(result_lo_reorg, result_hi_lo_reorg_2, 0xC0); // 11000000 _mm256_storeu_si256(reinterpret_cast<__m256i*>(dstp + x * 3), result_0_15); // not necessarily 32 bytes aligned // => x x x x x x x x x x x x bB gB rB bA __m128i shuffle_hi_lo_2 = _mm_set_epi8((char)0x80, (char)0x80, (char)0x80, (char)0x80, (char)0x80, (char)0x80, (char)0x80, (char)0x80, (char)0x80, (char)0x80, (char)0x80, (char)0x80, 14, 13, 12, 10); __m128i xmm4 = _mm_shuffle_epi8(result_hi_lo, shuffle_hi_lo_2); // => bF gF rF bE gE rE bD gD rD bC gC rC x x x x __m128i shuffle_hi_hi = _mm_set_epi8(14, 13, 12, 10, 9, 8, 6, 5, 4, 2, 1, 0, (char)0x80, (char)0x80, (char)0x80, (char)0x80); __m128i xmm5 = _mm_shuffle_epi8(result_hi_hi, shuffle_hi_hi); // => bF gF rF bE gE rE bD gD rD bC gC rC bB gB rB bA __m128i result_16_23 = _mm_or_si128(xmm4, xmm5); _mm_store_si128(reinterpret_cast<__m128i*>(dstp + x * 3 + 32), result_16_23); #if 0 // Intel compiler can cope with it 100% optimized. No store, just shuffles and blends as above. alignas(32) BYTE temp[64]; _mm256_store_si256(reinterpret_cast<__m256i*>(temp), result_lo); _mm256_store_si256(reinterpret_cast<__m256i*>(temp + 32), result_hi); for (int i = 0; i < 16; ++i) { dstp[(x + i) * 3 + 0] = temp[i * 4 + 0]; dstp[(x + i) * 3 + 1] = temp[i * 4 + 1]; dstp[(x + i) * 3 + 2] = temp[i * 4 + 2]; } #endif } } if constexpr (rgb_pixel_step == 3) { // for rgb32 (pixel_step == 4) we processed full width and more, including padded bytes for (size_t x = mod16_width; x < width; ++x) { int Y = srcY[x] + matrix.offset_y; int U = srcU[x] - 128; int V = srcV[x] - 128; int b = (((int)matrix.y_b * Y + (int)matrix.u_b * U + (int)matrix.v_b * V + round_mask_plus_rgb_offset_i) >> 13); int g = (((int)matrix.y_g * Y + (int)matrix.u_g * U + (int)matrix.v_g * V + round_mask_plus_rgb_offset_i) >> 13); int r = (((int)matrix.y_r * Y + (int)matrix.u_r * U + (int)matrix.v_r * V + round_mask_plus_rgb_offset_i) >> 13); dstp[x * rgb_pixel_step + 0] = PixelClip(b); dstp[x * rgb_pixel_step + 1] = PixelClip(g); dstp[x * rgb_pixel_step + 2] = PixelClip(r); if constexpr (rgb_pixel_step == 4) { // n/a dstp[x * 4 + 3] = 255; } } } dstp -= dst_pitch; srcY += src_pitch_y; srcU += src_pitch_uv; srcV += src_pitch_uv; if constexpr(hasAlpha) srcA += src_pitch_a; } } //instantiate //template template void convert_yv24_to_rgb_avx2<3, false>(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE* srcV, const BYTE* srcA, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t src_pitch_a, size_t width, size_t height, const ConversionMatrix& matrix); template void convert_yv24_to_rgb_avx2<4, false>(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE* srcV, const BYTE* srcA, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t src_pitch_a, size_t width, size_t height, const ConversionMatrix& matrix); template void convert_yv24_to_rgb_avx2<3, true>(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE* srcV, const BYTE* srcA, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t src_pitch_a, size_t width, size_t height, const ConversionMatrix& matrix); template void convert_yv24_to_rgb_avx2<4, true>(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE* srcV, const BYTE* srcA, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t src_pitch_a, size_t width, size_t height, const ConversionMatrix& matrix); #define XP_LAMBDA_CAPTURE_FIX(x) (void)(x) /* ================================================================================ YUV ↔ RGB Color Space Conversion - Unified Implementation ================================================================================ This module provides a unified, highly optimized implementation for color space conversions between YUV and RGB formats, supporting all bit depths (8-16 bit integer and 32-bit float) with optional bit-depth conversion. CONVERSION DIRECTIONS: - YUV_TO_RGB: YUV → RGB (e.g., video decode path) - RGB_TO_YUV: RGB → YUV (e.g., video encode path) - YUV_TO_YUV: YUV → YUV (e.g., BT.601 → BT.709 matrix conversion) - RGB_TO_RGB: RGB → RGB (e.g., gamut/color correction) ARITHMETIC PRECISION: - YUV→RGB / RGB→RGB: 13-bit fixed-point (coefficients scaled by 2^13 = 8192) - RGB→YUV: 15-bit fixed-point (coefficients scaled by 2^15 = 32768) - YUV→YUV: 14-bit fixed-point (fused matrix precision) PLANE MEMORY LAYOUT: - YUV: Plane[0]=Y, Plane[1]=U, Plane[2]=V - RGB: Plane[0]=G, Plane[1]=B, Plane[2]=R (AviSynth convention) ================================================================================ */ /** * @enum YuvRgbConversionType * @brief Defines the conversion workflow type for color space transformations * * Each conversion type determines: * - Whether to use integer or float arithmetic for the matrix multiply * - How input/output offsets are applied * - Whether bit-depth conversion is integrated into the workflow * - Whether 16-bit pivot trick is needed for exact 16-bit integer paths * * CONVERSION TYPE COMPARISON TABLE: * ┌─────────────────────┬────────────┬─────────────┬──────────────┬─────────────┬──────────────┐ * │ Conversion Type │ 16-bit │ Input │ Matrix │ Post-Matrix │ Bit-Depth │ * │ │ Pivot? │ Offset │ Coefficients │ Rounding │ Scaling │ * ├─────────────────────┼────────────┼─────────────┼──────────────┼─────────────┼──────────────┤ * │ NATIVE_INT │ Yes (16) │ After load │ Integer │ Yes (shift) │ None │ * │ │ No (<16) │ (16-bit add)│ (13/15-bit) │ Integrated │ │ * ├─────────────────────┼────────────┼─────────────┼──────────────┼─────────────┼──────────────┤ * │ FORCE_FLOAT │ N/A │ Pre-matrix │ Float │ Float+0.5 │ In scale_f │ * │ │ │ (float add) │ (scaled) │ (if int out)│ │ * ├─────────────────────┼────────────┼─────────────┼──────────────┼─────────────┼──────────────┤ * │ FLOAT_OUTPUT │ Yes (16) │ After load │ Integer │ No shift │ Post-matrix │ * │ │ No (<16) │ (16-bit add)│ (13/15-bit) │ (int→float) │ (scale_f) │ * ├─────────────────────┼────────────┼─────────────┼──────────────┼─────────────┼──────────────┤ * │ BITCONV_INT_LIMITED │ Yes (16) │ After load │ Integer │ Yes (adj. │ Integrated │ * │ │ No (<16) │ (16-bit add)│ (13/15-bit) │ shift) │ into shift │ * ├─────────────────────┼────────────┼─────────────┼──────────────┼─────────────┼──────────────┤ * │ BITCONV_INT_FULL │ N/A │ Pre-matrix │ Float │ Float+0.5 │ In scale_f │ * │ │ │ (float add) │ (scaled) │ (if int out)│ │ * └─────────────────────┴────────────┴─────────────┴──────────────┴─────────────┴──────────────┘ * * OFFSET APPLICATION DETAILS: * ┌─────────────────────┬─────────────────────────────────────────────────────────────────────┐ * │ Conversion Type │ Offset Application Strategy │ * ├─────────────────────┼─────────────────────────────────────────────────────────────────────┤ * │ NATIVE_INT │ • <16-bit: offset_in added as int16 after load │ * │ │ • 16-bit: offset_in in 32-bit patch after MADD (with pivot) │ * │ │ • Output: offset_out in MADD rounding constant (scaled by 2^13/15) │ * ├─────────────────────┼─────────────────────────────────────────────────────────────────────┤ * │ FORCE_FLOAT │ • Input: offset_in added as float before matrix multiply │ * │ │ • Output: offset_out added as float in matrix result │ * │ │ • Coefficients pre-scaled by scale_f for bit-depth conversion │ * ├─────────────────────┼─────────────────────────────────────────────────────────────────────┤ * │ FLOAT_OUTPUT │ • Input: Same as NATIVE_INT (int16 or 32-bit patch) │ * │ │ • Output: No offset in MADD; added post-conversion in float domain │ * │ │ • Result: int32 → float with scale_f, then + offset_out_f │ * ├─────────────────────┼─────────────────────────────────────────────────────────────────────┤ * │ BITCONV_INT_LIMITED │ • Same as NATIVE_INT but with adjusted shift (13 - bit_diff) │ * │ │ • Chroma offset uses SOURCE bit depth (half_pixel_offset) │ * │ │ • Bit-depth scaling integrated into the right-shift operation │ * ├─────────────────────┼─────────────────────────────────────────────────────────────────────┤ * │ BITCONV_INT_FULL │ • Same as FORCE_FLOAT (uses float workflow internally) │ * │ │ • Required for full-range bit-depth conversions (e.g., 10→8 full) │ * └─────────────────────┴─────────────────────────────────────────────────────────────────────┘ * * 16-BIT PIVOT TECHNIQUE (for integer paths only): * Problem: uint16 range [0, 65535] doesn't fit in signed int16 [-32768, 32767] * Solution: Flip MSB to pivot unsigned to signed: Y_signed = Y XOR 0x8000 * - 0 → -32768, 65535 → 32767 (all values fit in int16) * - Correction applied in 32-bit patch: add (32768 + offset_in) × coefficients * - See detailed explanation at top of function * * CHROMA CENTERING: * YUV Input: U/V centered around half (e.g., 128 for 8-bit) → subtract half * YUV Output: U/V centered around half → add half after matrix * RGB: No centering (all values have same zero point) * * PERFORMANCE CHARACTERISTICS: * - AVX2: 32 pixels per iteration (primary target, 2013+ CPUs) * - SSE2: 8 pixels per iteration (legacy compatibility) * - Integer MADD path: ~4000-5400 fps (1920×1080, 8-bit, Ryzen) * - Float workflow: ~3200-3900 fps (10-26% slower, but necessary for some cases) * * EXAMPLE USE CASES: * YUV→RGB, 10-bit→10-bit, limited range: * → NATIVE_INT (integer MADD, no bit conversion) * * YUV→RGB, 10-bit→8-bit, limited→limited: * → BITCONV_INT_LIMITED (integrated bit scaling in shift) * * YUV→RGB, 10-bit→8-bit, full→full: * → BITCONV_INT_FULL (uses float workflow internally) * * YUV→RGB, 16-bit→32-bit float: * → FORCE_FLOAT (required for float input) * * YUV→RGB, 8-bit→32-bit float, limited→full: * → FLOAT_OUTPUT (integer matrix, float output with range expansion) * * YUV(BT.601)→YUV(BT.709), 10-bit→10-bit: * → NATIVE_INT with fused conversion matrix (avoids RGB intermediate) */ /** * @brief Universal color space conversion function (AVX2 optimized) * * Converts between YUV and RGB color spaces with optional bit-depth conversion. * Supports all combinations of 8/10/12/14/16-bit integer and 32-bit float formats. * * @tparam direction Conversion direction (YUV_TO_RGB, RGB_TO_YUV, YUV_TO_YUV, RGB_TO_RGB) * @tparam pixel_t Input pixel type (uint8_t, uint16_t, or float) * @tparam lessthan16bit True if input is 8/10/12/14-bit (enables optimizations) * @tparam lessthan16bit_target True if output is 8/10/12/14-bit (enables clamping) * @tparam pixel_t_dst Output pixel type (uint8_t, uint16_t, or float) * @tparam conv_type Conversion workflow type (see YuvRgbConversionType) * * @param dstp Output plane pointers [3] (G/Y, B/U, R/V) * @param dstPitch Output plane pitches in bytes [3] * @param srcp Input plane pointers [3] (G/Y, B/U, R/V) * @param srcPitch Input plane pitches in bytes [3] * @param width Frame width in pixels * @param height Frame height in pixels * @param m Conversion matrix with coefficients and offsets * @param bits_per_pixel Input bit depth (8-16) * @param bits_per_pixel_target Output bit depth (8-16) * * @note Matrix coefficients in ConversionMatrix must be pre-scaled: * - Integer coefficients: scaled by 2^13 (YUV↔RGB) or 2^15 (RGB→YUV) * - Float coefficients: unscaled, will be multiplied by scale_f internally * * @note For 16-bit integer paths, the function uses a pivot trick to work around * signed int16 range limitations. See detailed comment at function start. * * @note Processes 32 pixels per iteration on AVX2. For float input/output, includes * safety checks to respect 64-byte scanline alignment guarantees. */ template static void convert_yuv_to_planarrgb_avx2_internal(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target) { constexpr int INT_ARITH_SHIFT = (direction == ConversionDirection::YUV_TO_RGB) ? 13 : (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::RGB_TO_Y) ? 15 : (direction == ConversionDirection::YUV_TO_YUV) ? 14 : 13; // 8 bit uint8_t // 10,12,14 bit uint16_t (signed range) // 16 bit logic: /* 1. pivot the pixel: Convert uint16 pixel Y to a signed int16 by flipping the MSB (this is mathematically identical to Y−32768). 0 becomes −32768. 65535 becomes 32767. All values now fit in int16 without saturation. 2. reorganize the formula (offset_in is negative when exists, e.g. -4096): Original: (Y + offset_y) * Cy Substitute Y = (Ysigned​ + 32768) => (Ysigned​ + 32768 + offset_y) * Cy​ => (Ysigned​ * Cy​) + (32768 + offset_y) * Cy​) 3. correction after the madd section: Add ((32768 + offset_y) * Cy​) to the existing 32-bit rounding/offset_in constant. 4. Output rgb offset_in is also added to the precalculated patch. */ // When input is float (pixel_t), float workflow (FORCE_FLOAT) is compulsory. // But not the opposite: FORCE_FLOAT and not float input is fine // make a static assert static_assert(!(std::is_floating_point::value && conv_type != YuvRgbConversionType::FORCE_FLOAT), "FORCE_FLOAT conversion type is required for float input pixel type"); constexpr bool force_float = conv_type == YuvRgbConversionType::FORCE_FLOAT; // effectively full-float-inside for int full range conversion, but with the same output rules as other float conversions constexpr bool final_is_float = std::is_floating_point::value; constexpr bool need_int_conversion_narrow_range = conv_type == YuvRgbConversionType::BITCONV_INT_LIMITED; // full_d is false constexpr bool need_int_conversion_full_range = conv_type == YuvRgbConversionType::BITCONV_INT_FULL; // full_d is true constexpr bool need_int_conversion = conv_type == YuvRgbConversionType::BITCONV_INT_FULL || conv_type == YuvRgbConversionType::BITCONV_INT_LIMITED || (conv_type == YuvRgbConversionType::FORCE_FLOAT && !final_is_float); const bool float_matrix_workflow = force_float || need_int_conversion_full_range; // effectively full-float-inside for int full range conversion // quasi-constexpr, may help optimizer if constexpr (std::is_same::value) bits_per_pixel = 8; if constexpr (std::is_same::value) bits_per_pixel_target = 8; if constexpr (std::is_same::value && !lessthan16bit) bits_per_pixel = 16; if constexpr (std::is_same::value && !lessthan16bit_target) bits_per_pixel_target = 16; if constexpr (conv_type == YuvRgbConversionType::NATIVE_INT) bits_per_pixel_target = bits_per_pixel; const int bit_diff = need_int_conversion ? bits_per_pixel_target - bits_per_pixel : 0; const int target_shift = need_int_conversion_narrow_range ? INT_ARITH_SHIFT - bit_diff : INT_ARITH_SHIFT; // int->int narrow range: integrate the bit depth conversion into the scaling back const int ROUNDER = (final_is_float || float_matrix_workflow) ? 0 : (1 << (target_shift - 1)); // 0 when float internal calculation is involved // For integer workflow + final is float: const float out_offset_f = m.offset_out_f_32; // for post-32-bit float conversion const int half_pixel_offset = 1 << (bits_per_pixel - 1); // YUV --> // at input is float: n/a const int half_pixel_offset_target = 1 << (bits_per_pixel_target - 1); // For float_matrix_workflow or output is float const int max_pixel_value_target = (1 << bits_per_pixel_target) - 1; bits_conv_constants conversion_ranges; const bool full_scale_d = m.offset_out == 0; // matrix is handling only the same-bit-depth factor. Output result must be scaled as if // we further correct it with a post-matrix scaling for bit depth conversion which depends only // on the destination limite/full get_bits_conv_constants(conversion_ranges, false, full_scale_d, full_scale_d, bits_per_pixel, bits_per_pixel_target); // our final scale would be as if work to float constexpr int int_arithmetic_shift = 1 << INT_ARITH_SHIFT; float scale_f = conversion_ranges.mul_factor; // Integer matrix workflow + 32 bit final float output extra rules // - no rounding and scaling back INT_ARITH_SHIFT e.g. 13 for YUV-RGB, 15 for RGB-YUV bits // - no clamping to bit depth limits // - the INT_ARITH_SHIFT-bit scaling factor is integrated into the bits_per_pixel shift if (final_is_float && !float_matrix_workflow) scale_f = scale_f / int_arithmetic_shift; // int workflow, float at the end __m256i half = _mm256_set1_epi16((short)half_pixel_offset); // 128 __m256i limit = _mm256_set1_epi16((short)max_pixel_value_target); // 255 // to be able to use it as signed 16 bit in madd; 4096+(16<<13) would not fit into i16 // multiplier is 4096 instead of 1: // original : 1 * 4096 // needed : 1 * (4096 + offset_rgb<<13) (4096 + 131072 overflows i16) // changed to : 4096 * (1 + offset_rgb>>(13-1) // Except for exact 16 bit, where we do the output offset_in adjustment along with the 16 bit signed-unsigned pivot fix constexpr int ROUND_SCALE = 1 << (INT_ARITH_SHIFT - 1); // 1 << 12, for 13 bit integer arithmetic: "0.5" const __m256i m256i_round_scale = _mm256_set1_epi16(ROUND_SCALE); int round_mask_plus_offset_out_scaled_i; int round_mask_plus_offset_out_chroma_scaled_i; // integer workflow + exact 16 bit path: needs a special handling for the pivot and input offset_in and output rgb offset_out __m256i v_patch_G, v_patch_B, v_patch_R; __m256i sign_flip_mask = _mm256_set1_epi16((short)0x8000); // for 16 bit pivot // Full-range is float-workflow inside, so no need to do any of the above adjustments in // integer arithmetic, just do the full float conversion and clamp at the end if needed // Input offset_in handling const int offset_in_scalar = m.offset_in; const int offset_out_scalar = m.offset_out; __m256i offset_in; __m256 offset_in_f; if constexpr (float_matrix_workflow) { offset_in = _mm256_set1_epi32(offset_in_scalar); // float workflow, integer inputs offset_in_f = _mm256_set1_ps(m.offset_in_f); // float workflow, float inputs } else if constexpr (lessthan16bit) // integer workflow, lessthan16 bit path offset_in = _mm256_set1_epi16((short)offset_in_scalar); // input offset_in correction can happen in 16 bit arithmetic else // n/a, for exact 16 bit integer workflow, the offset_in is handled in the 32-bit patch together with the pivot adjustment offset_in = _mm256_setzero_si256(); if constexpr (!float_matrix_workflow) { // integer preparations for the madd-based main loop if constexpr (lessthan16bit) { // 8-14 bit // offset of same magnitude as coeffs, also in simd madd round_mask_plus_offset_out_scaled_i = final_is_float ? 0 : (ROUNDER + (offset_out_scalar << INT_ARITH_SHIFT)) / ROUND_SCALE; round_mask_plus_offset_out_chroma_scaled_i = final_is_float ? 0 : (ROUNDER + (half_pixel_offset << INT_ARITH_SHIFT)) / ROUND_SCALE; v_patch_G = v_patch_B = v_patch_R = _mm256_setzero_si256(); // No patch needed, since the signed 16-bit workaround is not needed. } else { // exact 16 bit // keep madd simple: only handle the rounding (ROUND_SCALE * 1) // rgb offset is handled later in the patch, after the madd, added to the same place as the pivot adjustment round_mask_plus_offset_out_scaled_i = ROUNDER / ROUND_SCALE; // effectively 1 or 0 (final_is_float) round_mask_plus_offset_out_chroma_scaled_i = ROUNDER / ROUND_SCALE; // effectively 1 or 0 (final_is_float) // move BOTH the pivot and the output offset to the 32-bit patch // Since we have to do the patching anyway, we can combine both adjustments here const int luma_or_rgbin_pivot = 32768 + offset_in_scalar; const int chroma_pivot = 32768; const int offset_out_for_patch = final_is_float ? 0 : (offset_out_scalar << INT_ARITH_SHIFT); // 32-bit post-conversion adds offset in float domain. const int chroma_offset_out_for_patch = final_is_float ? 0 : (half_pixel_offset << INT_ARITH_SHIFT); // 32-bit post-conversion adds offset in float domain. if constexpr (direction == ConversionDirection::YUV_TO_RGB) { // for YUV->RGB, the pivot adjustment is needed for all three channels since the luma coeffs are not zero, but pivot only the Y v_patch_G = _mm256_set1_epi32(luma_or_rgbin_pivot * m.y_g + offset_out_for_patch); v_patch_B = _mm256_set1_epi32(luma_or_rgbin_pivot * m.y_b + offset_out_for_patch); v_patch_R = _mm256_set1_epi32(luma_or_rgbin_pivot * m.y_r + offset_out_for_patch); } else if constexpr (direction == ConversionDirection::RGB_TO_RGB) { // for RGB->RGB, the pivot adjustment is needed for all three channels in and aout v_patch_G = _mm256_set1_epi32(luma_or_rgbin_pivot * (m.y_g + m.u_g + m.v_g) + offset_out_for_patch); v_patch_B = _mm256_set1_epi32(luma_or_rgbin_pivot * (m.y_b + m.u_b + m.v_b) + offset_out_for_patch); v_patch_R = _mm256_set1_epi32(luma_or_rgbin_pivot * (m.y_r + m.u_r + m.v_r) + offset_out_for_patch); } else if constexpr (direction == ConversionDirection::RGB_TO_YUV) { // RGB→YUV: All RGB inputs are pivoted, need to account for all three // Out0=Y (luma offset), Out1=U and Out2=V (chroma offset) // Y output = y_r*R + y_g*G + y_b*B v_patch_G = _mm256_set1_epi32(luma_or_rgbin_pivot * (m.y_r + m.y_g + m.y_b) + offset_out_for_patch); // U output = u_r*R + u_g*G + u_b*B v_patch_B = _mm256_set1_epi32(luma_or_rgbin_pivot * (m.u_r + m.u_g + m.u_b) + chroma_offset_out_for_patch); // V output = v_r*R + v_g*G + v_b*B v_patch_R = _mm256_set1_epi32(luma_or_rgbin_pivot * (m.v_r + m.v_g + m.v_b) + chroma_offset_out_for_patch); } else if constexpr (direction == ConversionDirection::RGB_TO_Y) { // RGB→YUV: All RGB inputs are pivoted, need to account for all three // Out0=Y (luma offset), No chroma // Y output = y_r*R + y_g*G + y_b*B v_patch_G = _mm256_set1_epi32(luma_or_rgbin_pivot * (m.y_r + m.y_g + m.y_b) + offset_out_for_patch); } else if constexpr (direction == ConversionDirection::YUV_TO_YUV) { // for YUV->YUV // FIXME: untested, no AviSynth caller yet. Suspect m.y_b/m.y_r should be // m.u_b/m.v_r (chroma diagonal), and offset should be chroma_offset_out_for_patch. v_patch_G = _mm256_set1_epi32(luma_or_rgbin_pivot * m.y_g + offset_out_for_patch); v_patch_B = _mm256_set1_epi32(chroma_pivot * m.y_b + offset_out_for_patch); v_patch_R = _mm256_set1_epi32(chroma_pivot * m.y_r + offset_out_for_patch); } } } // For integer workflow + final is float const __m256 out_offset_f_avx2 = _mm256_set1_ps(out_offset_f); __m256i zero = _mm256_setzero_si256(); const __m256 scale_f_avx2 = _mm256_set1_ps(scale_f); // For integer workflow __m256i m_uy_G, m_vr_G, m_uy_B, m_vr_B, m_uy_R, m_vr_R; // integer arithmetic, including 32-bit float target when non-float_matrix_workflow // For float_matrix_workflow: define coefficient accessors based on direction __m256 coeff_out0_in0, coeff_out0_in1, coeff_out0_in2; // First output row __m256 coeff_out1_in0, coeff_out1_in1, coeff_out1_in2; // Second output row __m256 coeff_out2_in0, coeff_out2_in1, coeff_out2_in2; // Third output row __m256 m_offset_out_y_or_g_f, m_offset_out_u_or_b_f, m_offset_out_v_or_r_f; // three separate offsets, in YUV-RGB they are the same, in RGB-YUV they are different for luma and chroma if constexpr (float_matrix_workflow) { __m256 m_y_g_f, m_y_b_f, m_y_r_f, m_u_g_f, m_u_b_f, m_u_r_f, m_v_g_f, m_v_b_f, m_v_r_f; m_y_g_f = _mm256_mul_ps(_mm256_set1_ps(m.y_g_f), scale_f_avx2); m_y_b_f = _mm256_mul_ps(_mm256_set1_ps(m.y_b_f), scale_f_avx2); m_y_r_f = _mm256_mul_ps(_mm256_set1_ps(m.y_r_f), scale_f_avx2); if constexpr (direction != ConversionDirection::RGB_TO_Y) { m_u_g_f = _mm256_mul_ps(_mm256_set1_ps(m.u_g_f), scale_f_avx2); m_u_b_f = _mm256_mul_ps(_mm256_set1_ps(m.u_b_f), scale_f_avx2); m_u_r_f = _mm256_mul_ps(_mm256_set1_ps(m.u_r_f), scale_f_avx2); m_v_g_f = _mm256_mul_ps(_mm256_set1_ps(m.v_g_f), scale_f_avx2); m_v_b_f = _mm256_mul_ps(_mm256_set1_ps(m.v_b_f), scale_f_avx2); m_v_r_f = _mm256_mul_ps(_mm256_set1_ps(m.v_r_f), scale_f_avx2); } if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::RGB_TO_RGB) { // RGB output: same offset for all channels float rgb_out_offset_scaled = m.offset_out_f * scale_f; m_offset_out_y_or_g_f = _mm256_set1_ps(rgb_out_offset_scaled); m_offset_out_u_or_b_f = _mm256_set1_ps(rgb_out_offset_scaled); m_offset_out_v_or_r_f = _mm256_set1_ps(rgb_out_offset_scaled); } else if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::YUV_TO_YUV) { // YUV output float y_out_offset = m.offset_out_f; float y_out_offset_scaled = y_out_offset * scale_f; // U/V center offset - should NOT be scaled by scale_f! // The matrix output is already in the target range, just add the center float uv_center_offset = final_is_float ? 0.0f : (float)half_pixel_offset_target; m_offset_out_y_or_g_f = _mm256_set1_ps(y_out_offset_scaled); m_offset_out_u_or_b_f = _mm256_set1_ps(uv_center_offset); m_offset_out_v_or_r_f = _mm256_set1_ps(uv_center_offset); } else if constexpr (direction == ConversionDirection::RGB_TO_Y) { // no chroma output float y_out_offset_scaled = m.offset_out_f * scale_f; m_offset_out_y_or_g_f = _mm256_set1_ps(y_out_offset_scaled); } if constexpr (direction == ConversionDirection::YUV_TO_RGB) { // YUV→RGB: outputs are RGB (rows G,B,R), inputs are YUV (columns Y,U,V) // Out0=G, Out1=B, Out2=R coeff_out0_in0 = m_y_g_f; coeff_out0_in1 = m_u_g_f; coeff_out0_in2 = m_v_g_f; coeff_out1_in0 = m_y_b_f; coeff_out1_in1 = m_u_b_f; coeff_out1_in2 = m_v_b_f; coeff_out2_in0 = m_y_r_f; coeff_out2_in1 = m_u_r_f; coeff_out2_in2 = m_v_r_f; } else if constexpr (direction == ConversionDirection::RGB_TO_YUV) { // RGB→YUV: outputs are YUV (rows Y,U,V), inputs are RGB in memory order (G, B, R) // Out0=Y, Out1=U, Out2=V // Inputs: in0=G, in1=B, in2=R // Y = y_r*R + y_g*G + y_b*B // = y_g*in0 + y_b*in1 + y_r*in2 coeff_out0_in0 = m_y_g_f; coeff_out0_in1 = m_y_b_f; coeff_out0_in2 = m_y_r_f; // U = u_r*R + u_g*G + u_b*B // = u_g*in0 + u_b*in1 + u_r*in2 coeff_out1_in0 = m_u_g_f; coeff_out1_in1 = m_u_b_f; coeff_out1_in2 = m_u_r_f; // V = v_r*R + v_g*G + v_b*B // = v_g*in0 + v_b*in1 + v_r*in2 coeff_out2_in0 = m_v_g_f; coeff_out2_in1 = m_v_b_f; coeff_out2_in2 = m_v_r_f; } else if constexpr (direction == ConversionDirection::RGB_TO_Y) { // RGB→YUV: outputs are YUV (rows Y,U,V), inputs are RGB in memory order (G, B, R) // Out0=Y, No chroma output // Inputs: in0=G, in1=B, in2=R // Y = y_r*R + y_g*G + y_b*B // = y_g*in0 + y_b*in1 + y_r*in2 coeff_out0_in0 = m_y_g_f; coeff_out0_in1 = m_y_b_f; coeff_out0_in2 = m_y_r_f; } else if constexpr (direction == ConversionDirection::YUV_TO_YUV) { // YUV→YUV: outputs are YUV (rows Y,U,V), inputs are YUV (columns Y,U,V) // For BT.601→BT.709 conversion, this is a fused matrix // Out0=Y_out, Out1=U_out, Out2=V_out coeff_out0_in0 = m_y_g_f; coeff_out0_in1 = m_u_g_f; coeff_out0_in2 = m_v_g_f; coeff_out1_in0 = m_y_b_f; coeff_out1_in1 = m_u_b_f; coeff_out1_in2 = m_v_b_f; coeff_out2_in0 = m_y_r_f; coeff_out2_in1 = m_u_r_f; coeff_out2_in2 = m_v_r_f; } else if constexpr (direction == ConversionDirection::RGB_TO_RGB) { // RGB_TO_RGB // RGB→RGB: outputs are RGB (rows R,G,B), inputs are RGB (columns R,G,B) // For gamut conversion or color correction // Out0=G_out, Out1=B_out, Out2=R_out coeff_out0_in0 = m_y_g_f; coeff_out0_in1 = m_u_g_f; coeff_out0_in2 = m_v_g_f; coeff_out1_in0 = m_y_b_f; coeff_out1_in1 = m_u_b_f; coeff_out1_in2 = m_v_b_f; coeff_out2_in0 = m_y_r_f; coeff_out2_in1 = m_u_r_f; coeff_out2_in2 = m_v_r_f; } } else { // Integer workflow coefficient setup int round_and_out_offset_y_or_g; int round_and_out_offset_u_or_b; int round_and_out_offset_v_or_r; if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::RGB_TO_RGB) { // output RGB: same offset for all channels round_and_out_offset_y_or_g = round_mask_plus_offset_out_scaled_i; round_and_out_offset_u_or_b = round_mask_plus_offset_out_scaled_i; round_and_out_offset_v_or_r = round_mask_plus_offset_out_scaled_i; } else if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::YUV_TO_YUV) { // output YUV: different offsets for Y vs U/V round_and_out_offset_y_or_g = round_mask_plus_offset_out_scaled_i; round_and_out_offset_u_or_b = round_mask_plus_offset_out_chroma_scaled_i; round_and_out_offset_v_or_r = round_mask_plus_offset_out_chroma_scaled_i; } else if constexpr (direction == ConversionDirection::RGB_TO_Y) { // no chroma output round_and_out_offset_y_or_g = round_mask_plus_offset_out_scaled_i; } // Pack coefficients based on direction // For MADD packing: [coeff_in1, coeff_in0] and [coeff_in2, round] if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::YUV_TO_YUV) { // YUV→RGB: Out0=G, Out1=B, Out2=R // YUV→YUV: Out0=Y, Out1=U, Out2=V // G = y_g*Y + u_g*U + v_g*V // Inputs are: in0=Y, in1=U, in2=V m_uy_G = _mm256_set1_epi32((static_cast(m.y_g) << 16) | static_cast(m.u_g)); m_vr_G = _mm256_set1_epi32((static_cast(round_and_out_offset_y_or_g) << 16) | static_cast(m.v_g)); // B = y_b*Y + u_b*U + v_b*V m_uy_B = _mm256_set1_epi32((static_cast(m.y_b) << 16) | static_cast(m.u_b)); m_vr_B = _mm256_set1_epi32((static_cast(round_and_out_offset_u_or_b) << 16) | static_cast(m.v_b)); // R = y_r*Y + u_r*U + v_r*V m_uy_R = _mm256_set1_epi32((static_cast(m.y_r) << 16) | static_cast(m.u_r)); m_vr_R = _mm256_set1_epi32((static_cast(round_and_out_offset_v_or_r) << 16) | static_cast(m.v_r)); } else if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::RGB_TO_RGB) { // RGB→YUV: Out0=Y, Out1=U, Out2=V // RGB→RGB: Out0=G, Out1=B, Out2=R // Inputs are: in0=G, in1=B, in2=R // Y = y_r*R + y_g*G + y_b*B // = y_g*in0 + y_b*in1 + y_r*in2 m_uy_G = _mm256_set1_epi32((static_cast(m.y_g) << 16) | static_cast(m.y_b)); m_vr_G = _mm256_set1_epi32((static_cast(round_and_out_offset_y_or_g) << 16) | static_cast(m.y_r)); // U = u_r*R + u_g*G + u_b*B // = u_g*in0 + u_b*in1 + u_r*in2 m_uy_B = _mm256_set1_epi32((static_cast(m.u_g) << 16) | static_cast(m.u_b)); m_vr_B = _mm256_set1_epi32((static_cast(round_and_out_offset_u_or_b) << 16) | static_cast(m.u_r)); // V = v_r*R + v_g*G + v_b*B // = v_g*in0 + v_b*in1 + v_r*in2 m_uy_R = _mm256_set1_epi32((static_cast(m.v_g) << 16) | static_cast(m.v_b)); m_vr_R = _mm256_set1_epi32((static_cast(round_and_out_offset_v_or_r) << 16) | static_cast(m.v_r)); } else if constexpr (direction == ConversionDirection::RGB_TO_Y) { // RGB→Y: Out0=Y, No chroma output // Inputs are: in0=G, in1=B, in2=R // Y = y_r*R + y_g*G + y_b*B // = y_g*in0 + y_b*in1 + y_r*in2 m_uy_G = _mm256_set1_epi32((static_cast(m.y_g) << 16) | static_cast(m.y_b)); m_vr_G = _mm256_set1_epi32((static_cast(round_and_out_offset_y_or_g) << 16) | static_cast(m.y_r)); } } const int rowsize = width * sizeof(pixel_t); const int rowsize_aligned = AlignNumber(rowsize, FRAME_ALIGN); // 64 for (int yy = 0; yy < height; yy++) { // 32 pixels per loop: 32 * 8 bit = 32 bytes; 32 * 16 bit = 64 bytes // Note: extra care needed for 32-bit float input or output, since 32xfloat is over // Avisynth+ guaranteed scanline alignment (64 bytes) // Ideally, we have to separate the processing into 32 pixel then 16 pixel chunks. // See ConvertBits to float AVX2 version for reference. // Actually, we only check a pre-calculated limit inside the loop, before the storage. (FIXME) // But I guess, when processing so many pixels at once, it's not that big penalty. // However duplicating the loop body seen below for the two float-problematic cases, that _is_ penalty :) for (int x = 0; x < rowsize; x += 32 * sizeof(pixel_t)) { // ConversionDirection::YUV_TO_RGB: y, u, v // ConversionDirection::RGB_TO_YUV: g, b, r // Regardless of the YUV/RGB source, we ise in0_1, in1_1, in2_1 for the first 16 pixels, and in0_2, in1_2, in2_2 for the second 16 pixels // Layout for 0-1-2: Y-U-V or G-B-R // integer input pixels __m256i in0_1, in1_1, in2_1; __m256i in0_2, in1_2, in2_2; // float workflow __m256 in0_1_f_lo, in0_1_f_hi, in0_2_f_lo, in0_2_f_hi; __m256 in1_1_f_lo, in1_1_f_hi, in1_2_f_lo, in1_2_f_hi; __m256 in2_1_f_lo, in2_1_f_hi, in2_2_f_lo, in2_2_f_hi; // Avisynth FRAME_ALIGN == 64, so when final_is_float, we cannot process 32 pixels at once at the end of the line // Can I write all 32 pixels (blockA+B+C+D)? // yes: write all 4 blocks (blockA, B, C, D) // no : Write only first 2 blocks (blockA, B), 16 floats are guaranteed safe due to 64-byte alignment bool safe_last_16float_64bytes; if constexpr (final_is_float || sizeof(pixel_t) == 4) safe_last_16float_64bytes = (x + 32 * (int)sizeof(pixel_t)) <= rowsize_aligned; else safe_last_16float_64bytes = false; // Note on widening strategy (Y, U, V) for the float internal path, where series of widenings are required: // // We use unpacklo/hi_epi16 for widening Y, U and V from (uint8 to) (u)int16 to int32, // rather than _mm256_extracti128_si256 + (cvtepu8_epi16) + cvtepi16_epi32/cvtepu16_epi32. // For U and V, an additional srai_epi16 generates the sign fill word needed // for correct sign extension of the centered (negative-capable) chroma values. // // Although the extract+cvt approach would produce a sequential lane layout // that avoids the permute2f128 shuffles before the final float store, it is // measurably slower (Possibly port contention). // Load pixels, for the integer path, we pivot for exact 16 bit Y later if constexpr (sizeof(pixel_t) == 1) { // Load 32 bytes (32 pixels), unpack to two 16-bit registers __m256i in0_raw = _mm256_load_si256(reinterpret_cast(srcp[0] + x)); // 0..7 8..15 16..23 24..31 Y or G __m256i in1_raw = _mm256_load_si256(reinterpret_cast(srcp[1] + x)); // U or B __m256i in2_raw = _mm256_load_si256(reinterpret_cast(srcp[2] + x)); // V or R if constexpr (sizeof(pixel_t_dst) == 2) { // 8->16 bit: pre-shuffle to avoid permutes at the end in0_raw = _mm256_permute4x64_epi64(in0_raw, 0xD8); // (0 << 0) | (2 << 2) | (1 << 4) | (3 << 6) // 0..7, 16..23, 8..15, 24..31 in1_raw = _mm256_permute4x64_epi64(in1_raw, 0xD8); in2_raw = _mm256_permute4x64_epi64(in2_raw, 0xD8); } in0_1 = _mm256_unpacklo_epi8(in0_raw, zero); in0_2 = _mm256_unpackhi_epi8(in0_raw, zero); // in0_1: 0..7, 8..15, in0_2: 16..23, 24..31 in1_1 = _mm256_unpacklo_epi8(in1_raw, zero); in1_2 = _mm256_unpackhi_epi8(in1_raw, zero); in2_1 = _mm256_unpacklo_epi8(in2_raw, zero); in2_2 = _mm256_unpackhi_epi8(in2_raw, zero); } else if constexpr (sizeof(pixel_t) == 2) { // Load 64 bytes (32 pixels) in0_1 = _mm256_load_si256(reinterpret_cast(srcp[0] + x)); in1_1 = _mm256_load_si256(reinterpret_cast(srcp[1] + x)); in2_1 = _mm256_load_si256(reinterpret_cast(srcp[2] + x)); in0_2 = _mm256_load_si256(reinterpret_cast(srcp[0] + x + 32)); in1_2 = _mm256_load_si256(reinterpret_cast(srcp[1] + x + 32)); in2_2 = _mm256_load_si256(reinterpret_cast(srcp[2] + x + 32)); } else { // if constexpr (sizeof(pixel_t) == 4) { // this also implies full float workflow // Load 128 bytes (32 pixels) // safety! we are well beyond Avisynth's 64 byte alignment in0_1_f_lo = _mm256_load_ps(reinterpret_cast(srcp[0] + x)); in0_1_f_hi = _mm256_load_ps(reinterpret_cast(srcp[0] + x + 32)); in1_1_f_lo = _mm256_load_ps(reinterpret_cast(srcp[1] + x)); in1_1_f_hi = _mm256_load_ps(reinterpret_cast(srcp[1] + x + 32)); in2_1_f_lo = _mm256_load_ps(reinterpret_cast(srcp[2] + x)); in2_1_f_hi = _mm256_load_ps(reinterpret_cast(srcp[2] + x + 32)); if (safe_last_16float_64bytes) { in0_2_f_lo = _mm256_load_ps(reinterpret_cast(srcp[0] + x + 64)); in0_2_f_hi = _mm256_load_ps(reinterpret_cast(srcp[0] + x + 96)); in1_2_f_lo = _mm256_load_ps(reinterpret_cast(srcp[1] + x + 64)); in1_2_f_hi = _mm256_load_ps(reinterpret_cast(srcp[1] + x + 96)); in2_2_f_lo = _mm256_load_ps(reinterpret_cast(srcp[2] + x + 64)); in2_2_f_hi = _mm256_load_ps(reinterpret_cast(srcp[2] + x + 96)); } else { // fill them with something to silence the warning, they won't be stored, either. in0_2_f_lo = in0_2_f_hi = in1_2_f_lo = in1_2_f_hi = in2_2_f_lo = in2_2_f_hi = _mm256_setzero_ps(); } } if constexpr (float_matrix_workflow) { // complete float workflow, even for integer targets, do matrixes in float math. // Also for maximum accuracy. // convert integer pixels to float, only for non-float input if constexpr (sizeof(pixel_t) == 4) { // even float input can be "limited" in Avisynth, correct with offset_in as well // YUV chroma is zero centered, no offset correction needed if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::YUV_TO_YUV) { // YUV Source // Y in0_1_f_lo = _mm256_add_ps(in0_1_f_lo, offset_in_f); in0_1_f_hi = _mm256_add_ps(in0_1_f_hi, offset_in_f); in0_2_f_lo = _mm256_add_ps(in0_2_f_lo, offset_in_f); in0_2_f_hi = _mm256_add_ps(in0_2_f_hi, offset_in_f); } else { // RGB source: all channels need offset_in adjustments if studio RGB RGB_TO_RGB, RGB_TO_YUV, RGB_TO_Y in0_1_f_lo = _mm256_add_ps(in0_1_f_lo, offset_in_f); in0_1_f_hi = _mm256_add_ps(in0_1_f_hi, offset_in_f); in0_2_f_lo = _mm256_add_ps(in0_2_f_lo, offset_in_f); in0_2_f_hi = _mm256_add_ps(in0_2_f_hi, offset_in_f); in1_1_f_lo = _mm256_add_ps(in1_1_f_lo, offset_in_f); in1_1_f_hi = _mm256_add_ps(in1_1_f_hi, offset_in_f); in1_2_f_lo = _mm256_add_ps(in1_2_f_lo, offset_in_f); in1_2_f_hi = _mm256_add_ps(in1_2_f_hi, offset_in_f); in2_1_f_lo = _mm256_add_ps(in2_1_f_lo, offset_in_f); in2_1_f_hi = _mm256_add_ps(in2_1_f_hi, offset_in_f); in2_2_f_lo = _mm256_add_ps(in2_2_f_lo, offset_in_f); in2_2_f_hi = _mm256_add_ps(in2_2_f_hi, offset_in_f); } } else { // integer input // Order: move to int32, and only then adjust offset_in. // Superblacks would yield negative values that can only be sign-extend to int32 // with excessive operations, see the U and V workaround. // We've already put the input offset_in into each int32. We use add, offset_in is stored as negative. // int32->float if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::YUV_TO_YUV) { // YUV Source // Y in0_1_f_lo = _mm256_cvtepi32_ps(_mm256_add_epi32(_mm256_unpacklo_epi16(in0_1, zero), offset_in)); in0_1_f_hi = _mm256_cvtepi32_ps(_mm256_add_epi32(_mm256_unpackhi_epi16(in0_1, zero), offset_in)); in0_2_f_lo = _mm256_cvtepi32_ps(_mm256_add_epi32(_mm256_unpacklo_epi16(in0_2, zero), offset_in)); in0_2_f_hi = _mm256_cvtepi32_ps(_mm256_add_epi32(_mm256_unpackhi_epi16(in0_2, zero), offset_in)); // UV to sign extend // Though from SSE4.1 we could use _mm_cvtepi16_epi32 directly but it makes packus lane // crossing correction difficult (and slow). Mayne from avx512 _mm512_cvtepi16_ps (only signed 16 exists)? // No lane keeping cvtepi16_epi32 here either. // U,V, make signed, then int16->int32 // sign-extend int16 chroma to int32, then convert to float // using unpacklo/hi to preserve lane layout compatible with downstream packus auto chroma_to_float = [&](__m256i c, __m256& f_lo, __m256& f_hi) { c = _mm256_sub_epi16(c, half); __m256i sign = _mm256_srai_epi16(c, 15); // 0xFFFF if negative, 0x0000 if positive f_lo = _mm256_cvtepi32_ps(_mm256_unpacklo_epi16(c, sign)); f_hi = _mm256_cvtepi32_ps(_mm256_unpackhi_epi16(c, sign)); }; chroma_to_float(in1_1, in1_1_f_lo, in1_1_f_hi); // U1 chroma_to_float(in2_1, in2_1_f_lo, in2_1_f_hi); // V1 chroma_to_float(in1_2, in1_2_f_lo, in1_2_f_hi); // U2 chroma_to_float(in2_2, in2_2_f_lo, in2_2_f_hi); // V2 } else { // RGB source: only offset_in adjustment, no centering needed // Green in0_1_f_lo = _mm256_cvtepi32_ps(_mm256_add_epi32(_mm256_unpacklo_epi16(in0_1, zero), offset_in)); in0_1_f_hi = _mm256_cvtepi32_ps(_mm256_add_epi32(_mm256_unpackhi_epi16(in0_1, zero), offset_in)); in0_2_f_lo = _mm256_cvtepi32_ps(_mm256_add_epi32(_mm256_unpacklo_epi16(in0_2, zero), offset_in)); in0_2_f_hi = _mm256_cvtepi32_ps(_mm256_add_epi32(_mm256_unpackhi_epi16(in0_2, zero), offset_in)); // Blue in1_1_f_lo = _mm256_cvtepi32_ps(_mm256_add_epi32(_mm256_unpacklo_epi16(in1_1, zero), offset_in)); in1_1_f_hi = _mm256_cvtepi32_ps(_mm256_add_epi32(_mm256_unpackhi_epi16(in1_1, zero), offset_in)); in1_2_f_lo = _mm256_cvtepi32_ps(_mm256_add_epi32(_mm256_unpacklo_epi16(in1_2, zero), offset_in)); in1_2_f_hi = _mm256_cvtepi32_ps(_mm256_add_epi32(_mm256_unpackhi_epi16(in1_2, zero), offset_in)); // Red in2_1_f_lo = _mm256_cvtepi32_ps(_mm256_add_epi32(_mm256_unpacklo_epi16(in2_1, zero), offset_in)); in2_1_f_hi = _mm256_cvtepi32_ps(_mm256_add_epi32(_mm256_unpackhi_epi16(in2_1, zero), offset_in)); in2_2_f_lo = _mm256_cvtepi32_ps(_mm256_add_epi32(_mm256_unpacklo_epi16(in2_2, zero), offset_in)); in2_2_f_hi = _mm256_cvtepi32_ps(_mm256_add_epi32(_mm256_unpackhi_epi16(in2_2, zero), offset_in)); } } // end of integer to float conversion and offset_in adjustment // COMMON matrix multiply code - works for all 4 directions! auto matrix_multiply = [&]( __m256 in0_lo, __m256 in0_hi, __m256 in1_lo, __m256 in1_hi, __m256 in2_lo, __m256 in2_hi, __m256& out0_lo, __m256& out0_hi, __m256& out1_lo, __m256& out1_hi, __m256& out2_lo, __m256& out2_hi) { XP_LAMBDA_CAPTURE_FIX(coeff_out0_in0); XP_LAMBDA_CAPTURE_FIX(coeff_out0_in1); XP_LAMBDA_CAPTURE_FIX(coeff_out0_in2); XP_LAMBDA_CAPTURE_FIX(coeff_out1_in0); XP_LAMBDA_CAPTURE_FIX(coeff_out1_in1); XP_LAMBDA_CAPTURE_FIX(coeff_out1_in2); XP_LAMBDA_CAPTURE_FIX(coeff_out2_in0); XP_LAMBDA_CAPTURE_FIX(coeff_out2_in1); XP_LAMBDA_CAPTURE_FIX(coeff_out2_in2); XP_LAMBDA_CAPTURE_FIX(m_offset_out_y_or_g_f); XP_LAMBDA_CAPTURE_FIX(m_offset_out_u_or_b_f); XP_LAMBDA_CAPTURE_FIX(m_offset_out_v_or_r_f); out0_lo = _mm256_fmadd_ps(coeff_out0_in2, in2_lo, _mm256_fmadd_ps(coeff_out0_in1, in1_lo, _mm256_fmadd_ps(coeff_out0_in0, in0_lo, m_offset_out_y_or_g_f))); out0_hi = _mm256_fmadd_ps(coeff_out0_in2, in2_hi, _mm256_fmadd_ps(coeff_out0_in1, in1_hi, _mm256_fmadd_ps(coeff_out0_in0, in0_hi, m_offset_out_y_or_g_f))); if constexpr (direction != ConversionDirection::RGB_TO_Y) { out1_lo = _mm256_fmadd_ps(coeff_out1_in2, in2_lo, _mm256_fmadd_ps(coeff_out1_in1, in1_lo, _mm256_fmadd_ps(coeff_out1_in0, in0_lo, m_offset_out_u_or_b_f))); out1_hi = _mm256_fmadd_ps(coeff_out1_in2, in2_hi, _mm256_fmadd_ps(coeff_out1_in1, in1_hi, _mm256_fmadd_ps(coeff_out1_in0, in0_hi, m_offset_out_u_or_b_f))); out2_lo = _mm256_fmadd_ps(coeff_out2_in2, in2_lo, _mm256_fmadd_ps(coeff_out2_in1, in1_lo, _mm256_fmadd_ps(coeff_out2_in0, in0_lo, m_offset_out_v_or_r_f))); out2_hi = _mm256_fmadd_ps(coeff_out2_in2, in2_hi, _mm256_fmadd_ps(coeff_out2_in1, in1_hi, _mm256_fmadd_ps(coeff_out2_in0, in0_hi, m_offset_out_v_or_r_f))); } }; // output variables __m256 out0_1_f_lo, out0_1_f_hi, out1_1_f_lo, out1_1_f_hi, out2_1_f_lo, out2_1_f_hi; __m256 out0_2_f_lo, out0_2_f_hi, out1_2_f_lo, out1_2_f_hi, out2_2_f_lo, out2_2_f_hi; // SET#1: First 16 pixels matrix_multiply( in0_1_f_lo, in0_1_f_hi, in1_1_f_lo, in1_1_f_hi, in2_1_f_lo, in2_1_f_hi, // in0 in1 in2 out0_1_f_lo, out0_1_f_hi, out1_1_f_lo, out1_1_f_hi, out2_1_f_lo, out2_1_f_hi // out0 out1 out2: Pixels 0..7 in lo, 8..15 in hi ); // SET#2: Next 16 pixels matrix_multiply( in0_2_f_lo, in0_2_f_hi, in1_2_f_lo, in1_2_f_hi, in2_2_f_lo, in2_2_f_hi, // in0 in1 in2 out0_2_f_lo, out0_2_f_hi, out1_2_f_lo, out1_2_f_hi, out2_2_f_lo, out2_2_f_hi // out0 out1 out2: Pixels 16..23 in lo, 24..31 in hi ); auto process_from_float_plane_avx2 = [&](BYTE* plane_ptr, __m256 lo_1, __m256 hi_1, __m256 lo_2, __m256 hi_2) { XP_LAMBDA_CAPTURE_FIX(zero); XP_LAMBDA_CAPTURE_FIX(limit); #ifdef XP_TLS if (final_is_float) { #else if constexpr (final_is_float) { #endif // float inside path, + 32 bit float output const int pix_idx = x / sizeof(pixel_t); float* f_dst = reinterpret_cast(plane_ptr) + pix_idx; // Define the blocks (8 pixels each) correctly by healing the lanes // Remember: this is still quicker that using lane-preserving cvt's earlier. __m256 blockA, blockB, blockC, blockD; if constexpr (sizeof(pixel_t) == 1) { // 8-bit: The lanes were swapped across res1 and res2 blockA = _mm256_permute2f128_ps(lo_1, hi_1, 0x20); // Pixels 0-7 blockB = _mm256_permute2f128_ps(lo_2, hi_2, 0x20); // Pixels 8-15 blockC = _mm256_permute2f128_ps(lo_1, hi_1, 0x31); // Pixels 16-23 blockD = _mm256_permute2f128_ps(lo_2, hi_2, 0x31); // Pixels 24-31 } else if constexpr (sizeof(pixel_t) == 2) { // 16-bit: res1 is 0-15, res2 is 16-31 blockA = _mm256_permute2f128_ps(lo_1, hi_1, 0x20); // Pixels 0-7 blockB = _mm256_permute2f128_ps(lo_1, hi_1, 0x31); // Pixels 8-15 blockC = _mm256_permute2f128_ps(lo_2, hi_2, 0x20); // Pixels 16-23 blockD = _mm256_permute2f128_ps(lo_2, hi_2, 0x31); // Pixels 24-31 } else { // 32-bit: no lane swap needed, but we still need to define the blocks for the tail processing blockA = lo_1; // Pixels 0-7 blockB = hi_1; // Pixels 8-15 blockC = lo_2; // Pixels 16-23 blockD = hi_2; // Pixels 24-31 } _mm256_store_ps(f_dst, blockA); _mm256_store_ps(f_dst + 8, blockB); // Safety check: only store the first half of the 32-pixel block if row width allows if (safe_last_16float_64bytes) { _mm256_store_ps(f_dst + 16, blockC); _mm256_store_ps(f_dst + 24, blockD); } } else { // Float workflow + integer output with rounding and clamping // r,g,b = static_cast(r,g,b_f + 0.5f); // back to int32 domain __m256 float_rounder = _mm256_set1_ps(0.5f); __m256i res1_lo = _mm256_cvttps_epi32(_mm256_add_ps(lo_1, float_rounder)); __m256i res1_hi = _mm256_cvttps_epi32(_mm256_add_ps(hi_1, float_rounder)); __m256i res2_lo = _mm256_cvttps_epi32(_mm256_add_ps(lo_2, float_rounder)); __m256i res2_hi = _mm256_cvttps_epi32(_mm256_add_ps(hi_2, float_rounder)); const int pix_idx = x * sizeof(pixel_t_dst) / sizeof(pixel_t); __m256i p1 = _mm256_packus_epi32(res1_lo, res1_hi); __m256i p2 = _mm256_packus_epi32(res2_lo, res2_hi); if constexpr (sizeof(pixel_t_dst) == 1) { // X->8 bits __m256i final8 = _mm256_packus_epi16(p1, p2); if constexpr (sizeof(pixel_t) == 4) { // 32->8 bits /* res1_lo: int32 [ 0 1 2 3 | 4 5 6 7] res1_hi: int32 [ 8 9 10 11 | 12 13 14 15] res2_lo: int32 [16 17 18 19 | 20 21 22 23] res2_hi: int32 [24 25 26 27 | 28 29 30 31] - after packus_epi32: p1 = [0..3, 8..11 | 4..7, 12..15] p2 = [16..19, 24..27 | 20..23, 28..31] - after packus_epi16 p1, p2: (more lane crossing) p8 = [0..3, 8..11, 16..19, 24..27 | 4..7, 12..15, 20..23, 28..31] I need final8: 32 bytes [0,1,2..31] */ __m256i p1 = _mm256_packus_epi32(res1_lo, res1_hi); __m256i p2 = _mm256_packus_epi32(res2_lo, res2_hi); __m256i p8 = _mm256_packus_epi16(p1, p2); // p8 = [0..3, 8..11, 16..19, 24..27 | 4..7, 12..15, 20..23, 28..31] // as 8x int32: [A, B, C, D, E, F, G, H] where we need [A,E,B,F,C,G,D,H] const __m256i idx = _mm256_set_epi32(7, 3, 6, 2, 5, 1, 4, 0); final8 = _mm256_permutevar8x32_epi32(p8, idx); } else if constexpr (sizeof(pixel_t) == 2) { // 16->8 bits final8 = _mm256_permute4x64_epi64(final8, (0 << 0) | (2 << 2) | (1 << 4) | (3 << 6)); } else { // 8->8 bits, no change needed } _mm256_store_si256(reinterpret_cast<__m256i*>(plane_ptr + pix_idx), final8); } else if constexpr (sizeof(pixel_t_dst) == 2) { // x->16 bits if constexpr (lessthan16bit_target) { p1 = _mm256_min_epi16(p1, limit); p2 = _mm256_min_epi16(p2, limit); } if constexpr (sizeof(pixel_t) == 1) { // 8->16 bits: /* If we'd not pre-shuffled the input for 8->16 bit, we would need to do this shuffle at the end to heal the lanes: // p1: 0-7 16-23; p2: 8-15 24-31 // two shuffles per R G B plane would be needed, so 6 total, Pre-shuffling Y U V is only 3 __m256i temp_p1 = _mm256_permute2x128_si256(p1, p2, 0x20); // 0-7, 8-15 __m256i temp_p2 = _mm256_permute2x128_si256(p1, p2, 0x31); // 16-23, 24-31 p1 = temp_p1; p2 = temp_p2; */ } else if constexpr (sizeof(pixel_t) == 4) { // 32->16 bits p1 = _mm256_permute4x64_epi64(p1, (0 << 0) | (2 << 2) | (1 << 4) | (3 << 6)); // 0xD8 p2 = _mm256_permute4x64_epi64(p2, (0 << 0) | (2 << 2) | (1 << 4) | (3 << 6)); // 0xD8 } _mm256_store_si256(reinterpret_cast<__m256i*>(plane_ptr + pix_idx), p1); _mm256_store_si256(reinterpret_cast<__m256i*>(plane_ptr + pix_idx + 32), p2); } } }; process_from_float_plane_avx2(dstp[0], out0_1_f_lo, out0_1_f_hi, out0_2_f_lo, out0_2_f_hi); if constexpr (direction != ConversionDirection::RGB_TO_Y) { process_from_float_plane_avx2(dstp[1], out1_1_f_lo, out1_1_f_hi, out1_2_f_lo, out1_2_f_hi); process_from_float_plane_avx2(dstp[2], out2_1_f_lo, out2_1_f_hi, out2_2_f_lo, out2_2_f_hi); } // end of float_matrix_workflow } else { // start of integer matrix arithmetic path, both for integer and float target if constexpr (lessthan16bit) { // offset_in is added, stored as negative if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::RGB_TO_RGB || direction == ConversionDirection::RGB_TO_Y) { // RGB sources: same input offset for G, B and R in0_1 = _mm256_adds_epi16(in0_1, offset_in); in0_2 = _mm256_adds_epi16(in0_2, offset_in); // G1 G2 in1_1 = _mm256_adds_epi16(in1_1, offset_in); in1_2 = _mm256_adds_epi16(in1_2, offset_in); // B1 B2 in2_1 = _mm256_adds_epi16(in2_1, offset_in); in2_2 = _mm256_adds_epi16(in2_2, offset_in); // R1 R2 } else { // YUV sources: only luma. add, because offset_in is negative in0_1 = _mm256_adds_epi16(in0_1, offset_in); in0_2 = _mm256_adds_epi16(in0_2, offset_in); // Y1 Y2 } } else { // make unsigned to signed by flipping MSB if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::RGB_TO_RGB || direction == ConversionDirection::RGB_TO_Y) { // RGB sources: same pivoting offset for G, B and R // pivot the pixel, adjust the offset_in separately, if any, later in0_1 = _mm256_xor_si256(in0_1, sign_flip_mask); in0_2 = _mm256_xor_si256(in0_2, sign_flip_mask); // G1 G2 in1_1 = _mm256_xor_si256(in1_1, sign_flip_mask); in1_2 = _mm256_xor_si256(in1_2, sign_flip_mask); // B1 B2 in2_1 = _mm256_xor_si256(in2_1, sign_flip_mask); in2_2 = _mm256_xor_si256(in2_2, sign_flip_mask); // R1 R2 } else { // YUV sources: only pivot luma, chroma will be pivoted and centered together in the next step in0_1 = _mm256_xor_si256(in0_1, sign_flip_mask); in0_2 = _mm256_xor_si256(in0_2, sign_flip_mask); // Y1 Y2 } } // YUV source: move to signed UV if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::YUV_TO_YUV) { in1_1 = _mm256_sub_epi16(in1_1, half); in1_2 = _mm256_sub_epi16(in1_2, half); // U1 U2 in2_1 = _mm256_sub_epi16(in2_1, half); in2_2 = _mm256_sub_epi16(in2_2, half); // V1 V2 } // pre-unpack MADD pairs // These are common for all R, G, B planes // Pair 1: [U0 Y0 U1 Y1 ... | U8 Y8 U9 Y9 ...] __m256i uy1_lo = _mm256_unpacklo_epi16(in1_1, in0_1); __m256i uy1_hi = _mm256_unpackhi_epi16(in1_1, in0_1); __m256i uy2_lo = _mm256_unpacklo_epi16(in1_2, in0_2); __m256i uy2_hi = _mm256_unpackhi_epi16(in1_2, in0_2); // Pair 2: [V0 Rnd V1 Rnd ... | V8 Rnd V9 Rnd ...] __m256i vr1_lo = _mm256_unpacklo_epi16(in2_1, m256i_round_scale); __m256i vr1_hi = _mm256_unpackhi_epi16(in2_1, m256i_round_scale); __m256i vr2_lo = _mm256_unpacklo_epi16(in2_2, m256i_round_scale); __m256i vr2_hi = _mm256_unpackhi_epi16(in2_2, m256i_round_scale); // for 16 bit, the rgb_offset is merged into the post patch adjustment // 13 bit fixed point arithmetic rounder 0.5 is 4096. In general: INT_ARITH_SHIFT // Need1: (m.y_b m.u_b ) (m.y_b m.u_b) (m.y_b m.u_b) (m.y_b m.u_b) 8x16 bit // ( y3 u3 ) ( y2 u2 ) ( y1 u1 ) ( y0 u0 ) 8x16 bit // res1= (y_b*y3 + u_b*u3) ... 4x32 bit // Need2: (m.v_b round') (m.y_b round') (m.y_b round') (m.y_b round') // ( v3 4096 ) ( v2 4096 ) ( v1 4096 ) ( v0 4096 ) // res2= (yv_b*v3 + round' ) ... round' = round + rgb_offset // Processing lambda - checked and benchmarked to be inlined nicely -avoids code bloat // For v141_xp compatibility: forces the compiler to capture a const variable // that would otherwise be optimized out of nested lambda scopes. // integer matrix arithmetic path, followed by integer-integer shift-scaling or 32-bit float conversion. auto process_plane = [&](BYTE* plane_ptr, __m256i m_uy, __m256i m_vr, __m256i v_patch, auto apply_float_offset_out) { XP_LAMBDA_CAPTURE_FIX(limit); XP_LAMBDA_CAPTURE_FIX(safe_last_16float_64bytes); auto madd_scale = [&](__m256i uy, __m256i vr) { XP_LAMBDA_CAPTURE_FIX(v_patch); XP_LAMBDA_CAPTURE_FIX(target_shift); __m256i sum = _mm256_add_epi32(_mm256_madd_epi16(m_uy, uy), _mm256_madd_epi16(m_vr, vr)); // 16-bit adjustment (signed patch, offset_in, output rgb offset_in) if constexpr (!lessthan16bit) sum = _mm256_add_epi32(sum, v_patch); #ifdef XP_TLS if (!final_is_float) #else if constexpr (!final_is_float) #endif sum = _mm256_srai_epi32(sum, target_shift); // INT_ARITH_SHIFT - modified with bit-conversion diff, bit fixed point shift return sum; }; __m256i res1_lo = madd_scale(uy1_lo, vr1_lo); // Pixels 0-3, 8-11 __m256i res1_hi = madd_scale(uy1_hi, vr1_hi); // Pixels 4-7, 12-15 __m256i res2_lo = madd_scale(uy2_lo, vr2_lo); // Pixels 16-19, 24-27 __m256i res2_hi = madd_scale(uy2_hi, vr2_hi); // Pixels 20-23, 28-31 #ifdef XP_TLS if (final_is_float) { #else if constexpr (final_is_float) { #endif // when float output is needed, convert after scaling, mimic a post-ConvertBits const int pix_idx = x / sizeof(pixel_t); float* f_dst = reinterpret_cast(plane_ptr) + pix_idx; // Define the blocks (8 pixels each) correctly by healing the lanes __m256i blockA = _mm256_permute2x128_si256(res1_lo, res1_hi, 0x20); // Pixels 0-7 __m256i blockB, blockC, blockD; if constexpr (sizeof(pixel_t) == 1) { // 8-bit: The lanes were swapped across res1 and res2 blockB = _mm256_permute2x128_si256(res2_lo, res2_hi, 0x20); // Pixels 8-15 blockC = _mm256_permute2x128_si256(res1_lo, res1_hi, 0x31); // Pixels 16-23 blockD = _mm256_permute2x128_si256(res2_lo, res2_hi, 0x31); // Pixels 24-31 } else { // 16-bit: res1 is 0-15, res2 is 16-31 blockB = _mm256_permute2x128_si256(res1_lo, res1_hi, 0x31); // Pixels 8-15 blockC = _mm256_permute2x128_si256(res2_lo, res2_hi, 0x20); // Pixels 16-23 blockD = _mm256_permute2x128_si256(res2_lo, res2_hi, 0x31); // Pixels 24-31 } // Convert and Store auto store_block = [&](float* ptr, __m256i b, auto apply_float_offset_out) { if (apply_float_offset_out) _mm256_store_ps(ptr, _mm256_fmadd_ps(_mm256_cvtepi32_ps(b), scale_f_avx2, out_offset_f_avx2)); else // only mul, no add, when offset_out is 0 for non Y,R,G,B channels _mm256_store_ps(ptr, _mm256_mul_ps(_mm256_cvtepi32_ps(b), scale_f_avx2)); }; store_block(f_dst, blockA, apply_float_offset_out); store_block(f_dst + 8, blockB, apply_float_offset_out); // Safety check: only store the first half of the 32-pixel block if row width allows if (safe_last_16float_64bytes) { store_block(f_dst + 16, blockC, apply_float_offset_out); store_block(f_dst + 24, blockD, apply_float_offset_out); } } else { const int pix_idx = x * sizeof(pixel_t_dst) / sizeof(pixel_t); // unlike SSE2, AVX2 has packus_epi32 __m256i p1 = _mm256_packus_epi32(res1_lo, res1_hi); // Auto-heals lanes, no permute needed __m256i p2 = _mm256_packus_epi32(res2_lo, res2_hi); if constexpr (sizeof(pixel_t_dst) == 1) { // X->8 bits __m256i final8 = _mm256_packus_epi16(p1, p2); if constexpr (sizeof(pixel_t) == 2) { // 16->8 extra shuffle final8 = _mm256_permute4x64_epi64(final8, (0 << 0) | (2 << 2) | (1 << 4) | (3 << 6)); } _mm256_store_si256(reinterpret_cast<__m256i*>(plane_ptr + pix_idx), final8); } else { // X->16 bits if constexpr (lessthan16bit_target) { p1 = _mm256_min_epi16(p1, limit); p2 = _mm256_min_epi16(p2, limit); } if constexpr (sizeof(pixel_t) == 1) { // 8->16 bits: /* If we'd not pre-shuffled the input for 8->16 bit, we would need to do this shuffle at the end to heal the lanes: // p1: 0-7 16-23; p2: 8-15 24-31 // two shuffles per R G B plane would be needed, so 6 total, Pre-shuffling Y U V is only 3 __m256i temp_p1 = _mm256_permute2x128_si256(p1, p2, 0x20); // 0-7, 8-15 __m256i temp_p2 = _mm256_permute2x128_si256(p1, p2, 0x31); // 16-23, 24-31 p1 = temp_p1; p2 = temp_p2; */ } _mm256_store_si256(reinterpret_cast<__m256i*>(plane_ptr + pix_idx), p1); _mm256_store_si256(reinterpret_cast<__m256i*>(plane_ptr + pix_idx + 32), p2); } } }; // Process planes, using pre-packed coefficient, and the 16 bit patch if needed process_plane(dstp[0], m_uy_G, m_vr_G, v_patch_G, true /* apply_float_offset_out */); // only Y,R,G,B needs it uniformly, so for YUV, we call it with false // last param: apply_float_offset_out if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::RGB_TO_RGB) { process_plane(dstp[1], m_uy_B, m_vr_B, v_patch_B, true); process_plane(dstp[2], m_uy_R, m_vr_R, v_patch_R, true); } else if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::YUV_TO_YUV) { process_plane(dstp[1], m_uy_B, m_vr_B, v_patch_B, false); process_plane(dstp[2], m_uy_R, m_vr_R, v_patch_R, false); } else if constexpr (direction != ConversionDirection::RGB_TO_Y) { // no other planes } } // if float_matrix_workflow else integer_matrix_arithmetic } // x srcp[0] += srcPitch[0]; srcp[1] += srcPitch[1]; srcp[2] += srcPitch[2]; dstp[0] += dstPitch[0]; if constexpr (direction != ConversionDirection::RGB_TO_Y) { dstp[1] += dstPitch[1]; dstp[2] += dstPitch[2]; } } // y } #undef XP_LAMBDA_CAPTURE_FIX // Further separating cases inside, dispatcher remains relatively simple template void convert_yuv_to_planarrgb_avx2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float) { // Accuracy forever if (force_float || std::is_floating_point::value) { // int->float conversion // limited/full is handled automatically through scaling and offsets // lessthan16bit_target is still important due to clamping if (bits_per_pixel_target == 8) { convert_yuv_to_planarrgb_avx2_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); } else if (bits_per_pixel_target < 16) { // lessthan16bit_target is false. Need signed pack and clamping convert_yuv_to_planarrgb_avx2_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); } else if (bits_per_pixel_target == 16) { // == 16 convert_yuv_to_planarrgb_avx2_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); } else { // 32 bit float target // limited/full is handled automatically through scaling and offsets // lessthan16bit_target doesn't matter since float output has no clamping convert_yuv_to_planarrgb_avx2_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); } return; } // this is needed to avoid instantiating the full integer conversion logic when not needed, // it can result static_asssert failure. if constexpr (!std::is_floating_point::value) { const bool need_conversion = bits_per_pixel_target != bits_per_pixel; if (!need_conversion) { // no conversion, just YUV to RGB convert_yuv_to_planarrgb_avx2_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); return; } const bool full_d = m.offset_rgb == 0; if (bits_per_pixel_target >= 8 && bits_per_pixel <= 16) { // int->int conversion with range conversion (limited<->full), or upscale with no range conversion (full->full or limited->limited) if (bits_per_pixel_target == 8) { if (full_d) convert_yuv_to_planarrgb_avx2_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); else convert_yuv_to_planarrgb_avx2_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); } else if (bits_per_pixel_target < 16) { // lessthan16bit_target is false. Need signed pack and clamping if (full_d) convert_yuv_to_planarrgb_avx2_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); else convert_yuv_to_planarrgb_avx2_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); } else if (bits_per_pixel_target == 16) { // == 16 if (full_d) convert_yuv_to_planarrgb_avx2_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); else convert_yuv_to_planarrgb_avx2_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); } else { // 32 bit float target // int->float conversion // limited/full is handled automatically through scaling and offsets // lessthan16bit_target doesn't matter since float output has no clamping convert_yuv_to_planarrgb_avx2_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); } } } } //instantiate // YUV_TO_RGB template void convert_yuv_to_planarrgb_avx2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_avx2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_avx2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_avx2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); // RGB_TO_YUV template void convert_yuv_to_planarrgb_avx2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_avx2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_avx2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_avx2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); // RGB_TO_Y template void convert_yuv_to_planarrgb_avx2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_avx2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_avx2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_avx2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); // YUV_TO_YUV (for future use - e.g., BT.601 → BT.709) template void convert_yuv_to_planarrgb_avx2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_avx2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_avx2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_avx2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); DISABLE_WARNING_POP ================================================ FILE: avs_core/convert/intel/convert_planar_avx2.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __Convert_PLANAR_AVX2_H__ #define __Convert_PLANAR_AVX2_H__ #include #include "../convert_matrix.h" #include "../convert_helper.h" template void convert_yv24_to_rgb_avx2(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE* srcV, const BYTE* srcA, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t src_pitch_a, size_t width, size_t height, const ConversionMatrix& matrix); template void convert_yuv_to_planarrgb_avx2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); #endif ================================================ FILE: avs_core/convert/intel/convert_planar_sse.cpp ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. // ConvertPlanar (c) 2005 by Klaus Post #include "../convert.h" #include "../convert_matrix.h" #include "../convert_planar.h" #include "../convert_helper.h" #ifdef AVS_WINDOWS #include #else #include #endif #include // Intrinsics base header + really required extension headers #if defined(_MSC_VER) #include // MSVC #else #include // GCC/MinGW/Clang/LLVM #endif #include // SSE4.1 #include #include DISABLE_WARNING_PUSH DISABLE_WARNING_UNREFERENCED_LOCAL_VARIABLE void convert_yuy2_to_y8_sse2(const BYTE *srcp, BYTE *dstp, size_t src_pitch, size_t dst_pitch, size_t width, size_t height) { __m128i luma_mask = _mm_set1_epi16(0xFF); for(size_t y = 0; y < height; ++y) { for (size_t x = 0; x < width; x += 16) { __m128i src1 = _mm_load_si128(reinterpret_cast(srcp+x*2)); __m128i src2 = _mm_load_si128(reinterpret_cast(srcp+x*2+16)); src1 = _mm_and_si128(src1, luma_mask); src2 = _mm_and_si128(src2, luma_mask); _mm_store_si128(reinterpret_cast<__m128i*>(dstp+x), _mm_packus_epi16(src1, src2)); } dstp += dst_pitch; srcp += src_pitch; } } #if 0 // Kept for reference static AVS_FORCEINLINE __m128i convert_rgb_to_y8_sse2_core(const __m128i &pixel01, const __m128i &pixel23, const __m128i &pixel45, const __m128i &pixel67, __m128i& zero, __m128i &matrix, __m128i &round_mask, __m128i &offset) { //int Y = offset_y + ((m0 * srcp[0] + m1 * srcp[1] + m2 * srcp[2] + 16384) >> 15); // in general the algorithm is identical to MMX version, the only different part is getting r and g+b in appropriate registers. We use shuffling instead of unpacking here. __m128i pixel01m = _mm_madd_epi16(pixel01, matrix); //a1*0 + r1*cyr | g1*cyg + b1*cyb | a0*0 + r0*cyr | g0*cyg + b0*cyb __m128i pixel23m = _mm_madd_epi16(pixel23, matrix); //a3*0 + r3*cyr | g3*cyg + b3*cyb | a2*0 + r2*cyr | g2*cyg + b2*cyb __m128i pixel45m = _mm_madd_epi16(pixel45, matrix); //a5*0 + r5*cyr | g5*cyg + b5*cyb | a4*0 + r4*cyr | g4*cyg + b4*cyb __m128i pixel67m = _mm_madd_epi16(pixel67, matrix); //a7*0 + r7*cyr | g7*cyg + b7*cyb | a6*0 + r6*cyr | g6*cyg + b6*cyb __m128i pixel_0123_r = _mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(pixel01m), _mm_castsi128_ps(pixel23m), _MM_SHUFFLE(3, 1, 3, 1))); // r3*cyr | r2*cyr | r1*cyr | r0*cyr __m128i pixel_4567_r = _mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(pixel45m), _mm_castsi128_ps(pixel67m), _MM_SHUFFLE(3, 1, 3, 1))); // r7*cyr | r6*cyr | r5*cyr | r4*cyr __m128i pixel_0123 = _mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(pixel01m), _mm_castsi128_ps(pixel23m), _MM_SHUFFLE(2, 0, 2, 0))); __m128i pixel_4567 = _mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(pixel45m), _mm_castsi128_ps(pixel67m), _MM_SHUFFLE(2, 0, 2, 0))); pixel_0123 = _mm_add_epi32(pixel_0123, pixel_0123_r); pixel_4567 = _mm_add_epi32(pixel_4567, pixel_4567_r); pixel_0123 = _mm_add_epi32(pixel_0123, round_mask); pixel_4567 = _mm_add_epi32(pixel_4567, round_mask); pixel_0123 = _mm_srai_epi32(pixel_0123, 15); pixel_4567 = _mm_srai_epi32(pixel_4567, 15); __m128i result = _mm_packs_epi32(pixel_0123, pixel_4567); result = _mm_adds_epi16(result, offset); result = _mm_packus_epi16(result, zero); return result; } void convert_rgb32_to_y8_sse2(const BYTE *srcp, BYTE *dstp, size_t src_pitch, size_t dst_pitch, size_t width, size_t height, const ConversionMatrix &matrix) { __m128i matrix_v = _mm_set_epi16(0, matrix.y_r, matrix.y_g, matrix.y_b, 0, matrix.y_r, matrix.y_g, matrix.y_b); __m128i zero = _mm_setzero_si128(); __m128i offset = _mm_set1_epi16(matrix.offset_y); __m128i round_mask = _mm_set1_epi32(16384); __m128i offset_rgb = _mm_set_epi16(0, matrix.offset_rgb, matrix.offset_rgb, matrix.offset_rgb, 0, matrix.offset_rgb, matrix.offset_rgb, matrix.offset_rgb); const bool has_offset_rgb = 0 != matrix.offset_rgb; for (size_t y = 0; y < height; ++y) { for (size_t x = 0; x < width; x+=8) { __m128i src0123 = _mm_load_si128(reinterpret_cast(srcp+x*4)); //pixels 0, 1, 2 and 3 __m128i src4567 = _mm_load_si128(reinterpret_cast(srcp+x*4+16));//pixels 4, 5, 6 and 7 __m128i pixel01 = _mm_unpacklo_epi8(src0123, zero); __m128i pixel23 = _mm_unpackhi_epi8(src0123, zero); __m128i pixel45 = _mm_unpacklo_epi8(src4567, zero); __m128i pixel67 = _mm_unpackhi_epi8(src4567, zero); if (has_offset_rgb) { pixel01 = _mm_add_epi16(pixel01, offset_rgb); pixel23 = _mm_add_epi16(pixel23, offset_rgb); pixel45 = _mm_add_epi16(pixel45, offset_rgb); pixel67 = _mm_add_epi16(pixel67, offset_rgb); } _mm_storel_epi64(reinterpret_cast<__m128i*>(dstp+x), convert_rgb_to_y8_sse2_core(pixel01, pixel23, pixel45, pixel67, zero, matrix_v, round_mask, offset)); } srcp -= src_pitch; dstp += dst_pitch; } } #endif // if 0 #define XP_LAMBDA_CAPTURE_FIX(x) (void)(x) // SSE2 implementation matching AVX2 logic - processes 8 pixels per iteration // Supports all conversion directions, bit depths, and conversion types template static void convert_yuv_to_planarrgb_sse2_internal(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target) { // SSE2 version: processes 8 pixels at a time (vs 32 for AVX2) constexpr int INT_ARITH_SHIFT = (direction == ConversionDirection::YUV_TO_RGB) ? 13 : (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::RGB_TO_Y) ? 15 : (direction == ConversionDirection::YUV_TO_YUV) ? 14 : 13; static_assert(!(std::is_floating_point::value && conv_type != YuvRgbConversionType::FORCE_FLOAT), "FORCE_FLOAT conversion type is required for float input pixel type"); constexpr bool force_float = conv_type == YuvRgbConversionType::FORCE_FLOAT; constexpr bool final_is_float = std::is_floating_point::value; constexpr bool need_int_conversion_narrow_range = conv_type == YuvRgbConversionType::BITCONV_INT_LIMITED; constexpr bool need_int_conversion_full_range = conv_type == YuvRgbConversionType::BITCONV_INT_FULL; constexpr bool need_int_conversion = conv_type == YuvRgbConversionType::BITCONV_INT_FULL || conv_type == YuvRgbConversionType::BITCONV_INT_LIMITED || (conv_type == YuvRgbConversionType::FORCE_FLOAT && !final_is_float); const bool float_matrix_workflow = force_float || need_int_conversion_full_range; // quasi-constexpr, may help optimizer if constexpr (std::is_same::value) bits_per_pixel = 8; if constexpr (std::is_same::value) bits_per_pixel_target = 8; if constexpr (std::is_same::value && !lessthan16bit) bits_per_pixel = 16; if constexpr (std::is_same::value && !lessthan16bit_target) bits_per_pixel_target = 16; if constexpr (conv_type == YuvRgbConversionType::NATIVE_INT) bits_per_pixel_target = bits_per_pixel; const int bit_diff = need_int_conversion ? bits_per_pixel_target - bits_per_pixel : 0; const int target_shift = need_int_conversion_narrow_range ? INT_ARITH_SHIFT - bit_diff : INT_ARITH_SHIFT; const int ROUNDER = (final_is_float || float_matrix_workflow) ? 0 : (1 << (target_shift - 1)); const float out_offset_f = m.offset_out_f_32; const int half_pixel_offset = 1 << (bits_per_pixel - 1); const int half_pixel_offset_target = 1 << (bits_per_pixel_target - 1); const int max_pixel_value_target = (1 << bits_per_pixel_target) - 1; bits_conv_constants conversion_ranges; const bool full_scale_d = m.offset_out == 0; get_bits_conv_constants(conversion_ranges, false, full_scale_d, full_scale_d, bits_per_pixel, bits_per_pixel_target); constexpr int int_arithmetic_shift = 1 << INT_ARITH_SHIFT; float scale_f = conversion_ranges.mul_factor; if (final_is_float && !float_matrix_workflow) scale_f = scale_f / int_arithmetic_shift; __m128i half = _mm_set1_epi16((short)half_pixel_offset); __m128i limit = _mm_set1_epi16((short)max_pixel_value_target); constexpr int ROUND_SCALE = 1 << (INT_ARITH_SHIFT - 1); const __m128i m128i_round_scale = _mm_set1_epi16(ROUND_SCALE); int round_mask_plus_offset_out_scaled_i; int round_mask_plus_offset_out_chroma_scaled_i; __m128i v_patch_G, v_patch_B, v_patch_R; __m128i sign_flip_mask = _mm_set1_epi16((short)0x8000); const int offset_in_scalar = m.offset_in; const int offset_out_scalar = m.offset_out; __m128i offset_in; __m128 offset_in_f; if constexpr (float_matrix_workflow) { offset_in = _mm_set1_epi32(offset_in_scalar); offset_in_f = _mm_set1_ps(m.offset_in_f); } else if constexpr (lessthan16bit) offset_in = _mm_set1_epi16((short)offset_in_scalar); else offset_in = _mm_setzero_si128(); if constexpr (!float_matrix_workflow) { if constexpr (lessthan16bit) { round_mask_plus_offset_out_scaled_i = final_is_float ? 0 : (ROUNDER + (offset_out_scalar << INT_ARITH_SHIFT)) / ROUND_SCALE; round_mask_plus_offset_out_chroma_scaled_i = final_is_float ? 0 : (ROUNDER + (half_pixel_offset << INT_ARITH_SHIFT)) / ROUND_SCALE; v_patch_G = v_patch_B = v_patch_R = _mm_setzero_si128(); } else { round_mask_plus_offset_out_scaled_i = ROUNDER / ROUND_SCALE; round_mask_plus_offset_out_chroma_scaled_i = ROUNDER / ROUND_SCALE; const int luma_or_rgbin_pivot = 32768 + offset_in_scalar; const int chroma_pivot = 32768; const int offset_out_for_patch = final_is_float ? 0 : (offset_out_scalar << INT_ARITH_SHIFT); const int chroma_offset_out_for_patch = final_is_float ? 0 : (half_pixel_offset << INT_ARITH_SHIFT); if constexpr (direction == ConversionDirection::YUV_TO_RGB) { v_patch_G = _mm_set1_epi32(luma_or_rgbin_pivot * m.y_g + offset_out_for_patch); v_patch_B = _mm_set1_epi32(luma_or_rgbin_pivot * m.y_b + offset_out_for_patch); v_patch_R = _mm_set1_epi32(luma_or_rgbin_pivot * m.y_r + offset_out_for_patch); } else if constexpr (direction == ConversionDirection::RGB_TO_RGB) { v_patch_G = _mm_set1_epi32(luma_or_rgbin_pivot * (m.y_g + m.u_g + m.v_g) + offset_out_for_patch); v_patch_B = _mm_set1_epi32(luma_or_rgbin_pivot * (m.y_b + m.u_b + m.v_b) + offset_out_for_patch); v_patch_R = _mm_set1_epi32(luma_or_rgbin_pivot * (m.y_r + m.u_r + m.v_r) + offset_out_for_patch); } else if constexpr (direction == ConversionDirection::RGB_TO_YUV) { v_patch_G = _mm_set1_epi32(luma_or_rgbin_pivot * (m.y_r + m.y_g + m.y_b) + offset_out_for_patch); v_patch_B = _mm_set1_epi32(luma_or_rgbin_pivot * (m.u_r + m.u_g + m.u_b) + chroma_offset_out_for_patch); v_patch_R = _mm_set1_epi32(luma_or_rgbin_pivot * (m.v_r + m.v_g + m.v_b) + chroma_offset_out_for_patch); } else if constexpr (direction == ConversionDirection::RGB_TO_Y) { v_patch_G = _mm_set1_epi32(luma_or_rgbin_pivot * (m.y_r + m.y_g + m.y_b) + offset_out_for_patch); } else { // YUV_TO_YUV // FIXME: untested, no AviSynth caller yet. Suspect m.y_b/m.y_r should be // m.u_b/m.v_r (chroma diagonal), and offset should be chroma_offset_out_for_patch. v_patch_G = _mm_set1_epi32(luma_or_rgbin_pivot * m.y_g + offset_out_for_patch); v_patch_B = _mm_set1_epi32(chroma_pivot * m.y_b + offset_out_for_patch); v_patch_R = _mm_set1_epi32(chroma_pivot * m.y_r + offset_out_for_patch); } } } const __m128 out_offset_f_sse2 = _mm_set1_ps(out_offset_f); __m128i zero = _mm_setzero_si128(); const __m128 scale_f_sse2 = _mm_set1_ps(scale_f); __m128i m_uy_G, m_vr_G, m_uy_B, m_vr_B, m_uy_R, m_vr_R; __m128 coeff_out0_in0, coeff_out0_in1, coeff_out0_in2; __m128 coeff_out1_in0, coeff_out1_in1, coeff_out1_in2; __m128 coeff_out2_in0, coeff_out2_in1, coeff_out2_in2; __m128 m_offset_out_y_or_g_f, m_offset_out_u_or_b_f, m_offset_out_v_or_r_f; if constexpr (float_matrix_workflow) { __m128 m_y_g_f, m_y_b_f, m_y_r_f, m_u_g_f, m_u_b_f, m_u_r_f, m_v_g_f, m_v_b_f, m_v_r_f; m_y_g_f = _mm_mul_ps(_mm_set1_ps(m.y_g_f), scale_f_sse2); m_y_b_f = _mm_mul_ps(_mm_set1_ps(m.y_b_f), scale_f_sse2); m_y_r_f = _mm_mul_ps(_mm_set1_ps(m.y_r_f), scale_f_sse2); if constexpr (direction != ConversionDirection::RGB_TO_Y) { m_u_g_f = _mm_mul_ps(_mm_set1_ps(m.u_g_f), scale_f_sse2); m_u_b_f = _mm_mul_ps(_mm_set1_ps(m.u_b_f), scale_f_sse2); m_u_r_f = _mm_mul_ps(_mm_set1_ps(m.u_r_f), scale_f_sse2); m_v_g_f = _mm_mul_ps(_mm_set1_ps(m.v_g_f), scale_f_sse2); m_v_b_f = _mm_mul_ps(_mm_set1_ps(m.v_b_f), scale_f_sse2); m_v_r_f = _mm_mul_ps(_mm_set1_ps(m.v_r_f), scale_f_sse2); } if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::RGB_TO_RGB) { float rgb_out_offset_scaled = m.offset_out_f * scale_f; m_offset_out_y_or_g_f = _mm_set1_ps(rgb_out_offset_scaled); m_offset_out_u_or_b_f = _mm_set1_ps(rgb_out_offset_scaled); m_offset_out_v_or_r_f = _mm_set1_ps(rgb_out_offset_scaled); } else if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::YUV_TO_YUV) { float y_out_offset_scaled = m.offset_out_f * scale_f; float uv_center_offset = final_is_float ? 0.0f : (float)half_pixel_offset_target; m_offset_out_y_or_g_f = _mm_set1_ps(y_out_offset_scaled); m_offset_out_u_or_b_f = _mm_set1_ps(uv_center_offset); m_offset_out_v_or_r_f = _mm_set1_ps(uv_center_offset); } else if constexpr (direction == ConversionDirection::RGB_TO_Y) { float y_out_offset_scaled = m.offset_out_f * scale_f; m_offset_out_y_or_g_f = _mm_set1_ps(y_out_offset_scaled); } if constexpr (direction == ConversionDirection::YUV_TO_RGB) { coeff_out0_in0 = m_y_g_f; coeff_out0_in1 = m_u_g_f; coeff_out0_in2 = m_v_g_f; coeff_out1_in0 = m_y_b_f; coeff_out1_in1 = m_u_b_f; coeff_out1_in2 = m_v_b_f; coeff_out2_in0 = m_y_r_f; coeff_out2_in1 = m_u_r_f; coeff_out2_in2 = m_v_r_f; } else if constexpr (direction == ConversionDirection::RGB_TO_YUV) { coeff_out0_in0 = m_y_g_f; coeff_out0_in1 = m_y_b_f; coeff_out0_in2 = m_y_r_f; coeff_out1_in0 = m_u_g_f; coeff_out1_in1 = m_u_b_f; coeff_out1_in2 = m_u_r_f; coeff_out2_in0 = m_v_g_f; coeff_out2_in1 = m_v_b_f; coeff_out2_in2 = m_v_r_f; } else if constexpr (direction == ConversionDirection::RGB_TO_Y) { coeff_out0_in0 = m_y_g_f; coeff_out0_in1 = m_y_b_f; coeff_out0_in2 = m_y_r_f; } else if constexpr (direction == ConversionDirection::YUV_TO_YUV) { coeff_out0_in0 = m_y_g_f; coeff_out0_in1 = m_u_g_f; coeff_out0_in2 = m_v_g_f; coeff_out1_in0 = m_y_b_f; coeff_out1_in1 = m_u_b_f; coeff_out1_in2 = m_v_b_f; coeff_out2_in0 = m_y_r_f; coeff_out2_in1 = m_u_r_f; coeff_out2_in2 = m_v_r_f; } else if constexpr (direction == ConversionDirection::RGB_TO_RGB) { coeff_out0_in0 = m_y_g_f; coeff_out0_in1 = m_u_g_f; coeff_out0_in2 = m_v_g_f; coeff_out1_in0 = m_y_b_f; coeff_out1_in1 = m_u_b_f; coeff_out1_in2 = m_v_b_f; coeff_out2_in0 = m_y_r_f; coeff_out2_in1 = m_u_r_f; coeff_out2_in2 = m_v_r_f; } } else { // Integer workflow coefficient setup int round_and_out_offset_y_or_g; int round_and_out_offset_u_or_b; int round_and_out_offset_v_or_r; if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::RGB_TO_RGB) { round_and_out_offset_y_or_g = round_mask_plus_offset_out_scaled_i; round_and_out_offset_u_or_b = round_mask_plus_offset_out_scaled_i; round_and_out_offset_v_or_r = round_mask_plus_offset_out_scaled_i; } else if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::YUV_TO_YUV) { round_and_out_offset_y_or_g = round_mask_plus_offset_out_scaled_i; round_and_out_offset_u_or_b = round_mask_plus_offset_out_chroma_scaled_i; round_and_out_offset_v_or_r = round_mask_plus_offset_out_chroma_scaled_i; } else if constexpr (direction == ConversionDirection::RGB_TO_Y) { round_and_out_offset_y_or_g = round_mask_plus_offset_out_scaled_i; } if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::YUV_TO_YUV) { m_uy_G = _mm_set1_epi32((static_cast(m.y_g) << 16) | static_cast(m.u_g)); m_vr_G = _mm_set1_epi32((static_cast(round_and_out_offset_y_or_g) << 16) | static_cast(m.v_g)); m_uy_B = _mm_set1_epi32((static_cast(m.y_b) << 16) | static_cast(m.u_b)); m_vr_B = _mm_set1_epi32((static_cast(round_and_out_offset_u_or_b) << 16) | static_cast(m.v_b)); m_uy_R = _mm_set1_epi32((static_cast(m.y_r) << 16) | static_cast(m.u_r)); m_vr_R = _mm_set1_epi32((static_cast(round_and_out_offset_v_or_r) << 16) | static_cast(m.v_r)); } else if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::RGB_TO_RGB) { m_uy_G = _mm_set1_epi32((static_cast(m.y_g) << 16) | static_cast(m.y_b)); m_vr_G = _mm_set1_epi32((static_cast(round_and_out_offset_y_or_g) << 16) | static_cast(m.y_r)); m_uy_B = _mm_set1_epi32((static_cast(m.u_g) << 16) | static_cast(m.u_b)); m_vr_B = _mm_set1_epi32((static_cast(round_and_out_offset_u_or_b) << 16) | static_cast(m.u_r)); m_uy_R = _mm_set1_epi32((static_cast(m.v_g) << 16) | static_cast(m.v_b)); m_vr_R = _mm_set1_epi32((static_cast(round_and_out_offset_v_or_r) << 16) | static_cast(m.v_r)); } else if constexpr (direction == ConversionDirection::RGB_TO_Y) { m_uy_G = _mm_set1_epi32((static_cast(m.y_g) << 16) | static_cast(m.y_b)); m_vr_G = _mm_set1_epi32((static_cast(round_and_out_offset_y_or_g) << 16) | static_cast(m.y_r)); } } const int rowsize = width * sizeof(pixel_t); for (int yy = 0; yy < height; yy++) { // SSE2: 8 pixels per loop (8×1 byte = 8 bytes, 8×2 bytes = 16 bytes, 8×4 bytes = 32 bytes) for (int x = 0; x < rowsize; x += 8 * sizeof(pixel_t)) { __m128i in0, in1, in2; __m128 in0_f_lo, in0_f_hi, in1_f_lo, in1_f_hi, in2_f_lo, in2_f_hi; // Load 8 pixels if constexpr (sizeof(pixel_t) == 1) { __m128i in0_raw = _mm_loadl_epi64(reinterpret_cast(srcp[0] + x)); __m128i in1_raw = _mm_loadl_epi64(reinterpret_cast(srcp[1] + x)); __m128i in2_raw = _mm_loadl_epi64(reinterpret_cast(srcp[2] + x)); in0 = _mm_unpacklo_epi8(in0_raw, zero); in1 = _mm_unpacklo_epi8(in1_raw, zero); in2 = _mm_unpacklo_epi8(in2_raw, zero); } else if constexpr (sizeof(pixel_t) == 2) { in0 = _mm_load_si128(reinterpret_cast(srcp[0] + x)); in1 = _mm_load_si128(reinterpret_cast(srcp[1] + x)); in2 = _mm_load_si128(reinterpret_cast(srcp[2] + x)); } else { // sizeof(pixel_t) == 4 in0_f_lo = _mm_load_ps(reinterpret_cast(srcp[0] + x)); in0_f_hi = _mm_load_ps(reinterpret_cast(srcp[0] + x + 16)); in1_f_lo = _mm_load_ps(reinterpret_cast(srcp[1] + x)); in1_f_hi = _mm_load_ps(reinterpret_cast(srcp[1] + x + 16)); in2_f_lo = _mm_load_ps(reinterpret_cast(srcp[2] + x)); in2_f_hi = _mm_load_ps(reinterpret_cast(srcp[2] + x + 16)); } if constexpr (float_matrix_workflow) { // Float workflow if constexpr (sizeof(pixel_t) == 4) { // Float input - apply offset_in if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::YUV_TO_YUV) { in0_f_lo = _mm_add_ps(in0_f_lo, offset_in_f); in0_f_hi = _mm_add_ps(in0_f_hi, offset_in_f); } else { // RGB source RGB_TO_RGB, RGB_TO_YUV, RGB_TO_Y in0_f_lo = _mm_add_ps(in0_f_lo, offset_in_f); in0_f_hi = _mm_add_ps(in0_f_hi, offset_in_f); in1_f_lo = _mm_add_ps(in1_f_lo, offset_in_f); in1_f_hi = _mm_add_ps(in1_f_hi, offset_in_f); in2_f_lo = _mm_add_ps(in2_f_lo, offset_in_f); in2_f_hi = _mm_add_ps(in2_f_hi, offset_in_f); } } else { // Integer input - convert to float if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::YUV_TO_YUV) { // Y channel __m128i in0_32_lo = _mm_add_epi32(_mm_unpacklo_epi16(in0, zero), offset_in); __m128i in0_32_hi = _mm_add_epi32(_mm_unpackhi_epi16(in0, zero), offset_in); in0_f_lo = _mm_cvtepi32_ps(in0_32_lo); in0_f_hi = _mm_cvtepi32_ps(in0_32_hi); // U,V: sign-extend and convert auto chroma_to_float = [&](__m128i c, __m128& f_lo, __m128& f_hi) { c = _mm_sub_epi16(c, half); __m128i sign = _mm_srai_epi16(c, 15); f_lo = _mm_cvtepi32_ps(_mm_unpacklo_epi16(c, sign)); f_hi = _mm_cvtepi32_ps(_mm_unpackhi_epi16(c, sign)); }; chroma_to_float(in1, in1_f_lo, in1_f_hi); chroma_to_float(in2, in2_f_lo, in2_f_hi); } else { // RGB source in0_f_lo = _mm_cvtepi32_ps(_mm_add_epi32(_mm_unpacklo_epi16(in0, zero), offset_in)); in0_f_hi = _mm_cvtepi32_ps(_mm_add_epi32(_mm_unpackhi_epi16(in0, zero), offset_in)); in1_f_lo = _mm_cvtepi32_ps(_mm_add_epi32(_mm_unpacklo_epi16(in1, zero), offset_in)); in1_f_hi = _mm_cvtepi32_ps(_mm_add_epi32(_mm_unpackhi_epi16(in1, zero), offset_in)); in2_f_lo = _mm_cvtepi32_ps(_mm_add_epi32(_mm_unpacklo_epi16(in2, zero), offset_in)); in2_f_hi = _mm_cvtepi32_ps(_mm_add_epi32(_mm_unpackhi_epi16(in2, zero), offset_in)); } } // Matrix multiply (SSE2 doesn't have FMA, use mul+add) auto matrix_multiply = [&](__m128 i0_lo, __m128 i0_hi, __m128 i1_lo, __m128 i1_hi, __m128 i2_lo, __m128 i2_hi, __m128& o0_lo, __m128& o0_hi, __m128& o1_lo, __m128& o1_hi, __m128& o2_lo, __m128& o2_hi) { XP_LAMBDA_CAPTURE_FIX(coeff_out0_in0); XP_LAMBDA_CAPTURE_FIX(coeff_out0_in1); XP_LAMBDA_CAPTURE_FIX(coeff_out0_in2); XP_LAMBDA_CAPTURE_FIX(coeff_out1_in0); XP_LAMBDA_CAPTURE_FIX(coeff_out1_in1); XP_LAMBDA_CAPTURE_FIX(coeff_out1_in2); XP_LAMBDA_CAPTURE_FIX(coeff_out2_in0); XP_LAMBDA_CAPTURE_FIX(coeff_out2_in1); XP_LAMBDA_CAPTURE_FIX(coeff_out2_in2); XP_LAMBDA_CAPTURE_FIX(m_offset_out_y_or_g_f); XP_LAMBDA_CAPTURE_FIX(m_offset_out_u_or_b_f); XP_LAMBDA_CAPTURE_FIX(m_offset_out_v_or_r_f); o0_lo = _mm_add_ps(_mm_mul_ps(coeff_out0_in2, i2_lo), _mm_add_ps(_mm_mul_ps(coeff_out0_in1, i1_lo), _mm_add_ps(_mm_mul_ps(coeff_out0_in0, i0_lo), m_offset_out_y_or_g_f))); o0_hi = _mm_add_ps(_mm_mul_ps(coeff_out0_in2, i2_hi), _mm_add_ps(_mm_mul_ps(coeff_out0_in1, i1_hi), _mm_add_ps(_mm_mul_ps(coeff_out0_in0, i0_hi), m_offset_out_y_or_g_f))); if constexpr (direction != ConversionDirection::RGB_TO_Y) { o1_lo = _mm_add_ps(_mm_mul_ps(coeff_out1_in2, i2_lo), _mm_add_ps(_mm_mul_ps(coeff_out1_in1, i1_lo), _mm_add_ps(_mm_mul_ps(coeff_out1_in0, i0_lo), m_offset_out_u_or_b_f))); o1_hi = _mm_add_ps(_mm_mul_ps(coeff_out1_in2, i2_hi), _mm_add_ps(_mm_mul_ps(coeff_out1_in1, i1_hi), _mm_add_ps(_mm_mul_ps(coeff_out1_in0, i0_hi), m_offset_out_u_or_b_f))); o2_lo = _mm_add_ps(_mm_mul_ps(coeff_out2_in2, i2_lo), _mm_add_ps(_mm_mul_ps(coeff_out2_in1, i1_lo), _mm_add_ps(_mm_mul_ps(coeff_out2_in0, i0_lo), m_offset_out_v_or_r_f))); o2_hi = _mm_add_ps(_mm_mul_ps(coeff_out2_in2, i2_hi), _mm_add_ps(_mm_mul_ps(coeff_out2_in1, i1_hi), _mm_add_ps(_mm_mul_ps(coeff_out2_in0, i0_hi), m_offset_out_v_or_r_f))); } }; __m128 out0_f_lo, out0_f_hi, out1_f_lo, out1_f_hi, out2_f_lo, out2_f_hi; matrix_multiply(in0_f_lo, in0_f_hi, in1_f_lo, in1_f_hi, in2_f_lo, in2_f_hi, out0_f_lo, out0_f_hi, out1_f_lo, out1_f_hi, out2_f_lo, out2_f_hi); auto process_from_float_plane_sse2 = [&](BYTE* plane_ptr, __m128 lo, __m128 hi) { XP_LAMBDA_CAPTURE_FIX(zero); XP_LAMBDA_CAPTURE_FIX(limit); #ifdef XP_TLS if (final_is_float) { #else if constexpr (final_is_float) { #endif const int pix_idx = x / sizeof(pixel_t); float* f_dst = reinterpret_cast(plane_ptr) + pix_idx; _mm_store_ps(f_dst, lo); _mm_store_ps(f_dst + 4, hi); } else { __m128 float_rounder = _mm_set1_ps(0.5f); __m128i res_lo = _mm_cvttps_epi32(_mm_add_ps(lo, float_rounder)); __m128i res_hi = _mm_cvttps_epi32(_mm_add_ps(hi, float_rounder)); const int pix_idx = x * sizeof(pixel_t_dst) / sizeof(pixel_t); if constexpr (sizeof(pixel_t_dst) == 1) { __m128i p = _mm_packs_epi32(res_lo, res_hi); __m128i final8 = _mm_packus_epi16(p, zero); _mm_storel_epi64(reinterpret_cast<__m128i*>(plane_ptr + pix_idx), final8); } else if constexpr (sizeof(pixel_t_dst) == 2) { __m128i p; if constexpr (lessthan16bit_target) { p = _mm_packs_epi32(res_lo, res_hi); p = _mm_max_epi16(_mm_min_epi16(p, limit), zero); } else { p = _MM_PACKUS_EPI32(res_lo, res_hi); } _mm_store_si128(reinterpret_cast<__m128i*>(plane_ptr + pix_idx), p); } } }; process_from_float_plane_sse2(dstp[0], out0_f_lo, out0_f_hi); if constexpr (direction != ConversionDirection::RGB_TO_Y) { process_from_float_plane_sse2(dstp[1], out1_f_lo, out1_f_hi); process_from_float_plane_sse2(dstp[2], out2_f_lo, out2_f_hi); } } else { // Integer matrix arithmetic if constexpr (lessthan16bit) { if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::RGB_TO_RGB || direction == ConversionDirection::RGB_TO_Y) { in0 = _mm_adds_epi16(in0, offset_in); in1 = _mm_adds_epi16(in1, offset_in); in2 = _mm_adds_epi16(in2, offset_in); } else { in0 = _mm_adds_epi16(in0, offset_in); } } else { if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::RGB_TO_RGB || direction == ConversionDirection::RGB_TO_Y) { in0 = _mm_xor_si128(in0, sign_flip_mask); in1 = _mm_xor_si128(in1, sign_flip_mask); in2 = _mm_xor_si128(in2, sign_flip_mask); } else { in0 = _mm_xor_si128(in0, sign_flip_mask); } } if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::YUV_TO_YUV) { in1 = _mm_sub_epi16(in1, half); in2 = _mm_sub_epi16(in2, half); } __m128i uy_lo = _mm_unpacklo_epi16(in1, in0); __m128i uy_hi = _mm_unpackhi_epi16(in1, in0); __m128i vr_lo = _mm_unpacklo_epi16(in2, m128i_round_scale); __m128i vr_hi = _mm_unpackhi_epi16(in2, m128i_round_scale); auto process_plane = [&](BYTE* plane_ptr, __m128i m_uy, __m128i m_vr, __m128i v_patch, auto apply_float_offset_out) { XP_LAMBDA_CAPTURE_FIX(limit); auto madd_scale = [&](__m128i uy, __m128i vr) { XP_LAMBDA_CAPTURE_FIX(v_patch); XP_LAMBDA_CAPTURE_FIX(target_shift); __m128i sum = _mm_add_epi32(_mm_madd_epi16(m_uy, uy), _mm_madd_epi16(m_vr, vr)); if constexpr (!lessthan16bit) sum = _mm_add_epi32(sum, v_patch); #ifdef XP_TLS if (!final_is_float) #else if constexpr (!final_is_float) #endif sum = _mm_srai_epi32(sum, target_shift); return sum; }; __m128i res_lo = madd_scale(uy_lo, vr_lo); __m128i res_hi = madd_scale(uy_hi, vr_hi); #ifdef XP_TLS if (final_is_float) { #else if constexpr (final_is_float) { #endif const int pix_idx = x / sizeof(pixel_t); float* f_dst = reinterpret_cast(plane_ptr) + pix_idx; auto store_block = [&](float* ptr, __m128i b, auto apply_float_offset_out) { __m128 result = _mm_mul_ps(_mm_cvtepi32_ps(b), scale_f_sse2); if (apply_float_offset_out) result = _mm_add_ps(result, out_offset_f_sse2); _mm_store_ps(ptr, result); }; store_block(f_dst, res_lo, apply_float_offset_out); store_block(f_dst + 4, res_hi, apply_float_offset_out); } else { const int pix_idx = x * sizeof(pixel_t_dst) / sizeof(pixel_t); if constexpr (sizeof(pixel_t_dst) == 1) { __m128i p = _mm_packs_epi32(res_lo, res_hi); __m128i final8 = _mm_packus_epi16(p, zero); _mm_storel_epi64(reinterpret_cast<__m128i*>(plane_ptr + pix_idx), final8); } else { __m128i p; if constexpr (lessthan16bit_target) { p = _mm_packs_epi32(res_lo, res_hi); p = _mm_max_epi16(_mm_min_epi16(p, limit), zero); } else { p = _MM_PACKUS_EPI32(res_lo, res_hi); } _mm_store_si128(reinterpret_cast<__m128i*>(plane_ptr + pix_idx), p); } } }; // Process planes, using pre-packed coefficient, and the 16 bit patch if needed process_plane(dstp[0], m_uy_G, m_vr_G, v_patch_G, true /* apply_float_offset_out */); // only Y,R,G,B needs it uniformly, so for YUV, we call it with false // last param: apply_float_offset_out if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::RGB_TO_RGB) { process_plane(dstp[1], m_uy_B, m_vr_B, v_patch_B, true); process_plane(dstp[2], m_uy_R, m_vr_R, v_patch_R, true); } else if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::YUV_TO_YUV) { process_plane(dstp[1], m_uy_B, m_vr_B, v_patch_B, false); process_plane(dstp[2], m_uy_R, m_vr_R, v_patch_R, false); } else if constexpr (direction != ConversionDirection::RGB_TO_Y) { // no other planes } } } // x loop srcp[0] += srcPitch[0]; srcp[1] += srcPitch[1]; srcp[2] += srcPitch[2]; dstp[0] += dstPitch[0]; if constexpr (direction != ConversionDirection::RGB_TO_Y) { dstp[1] += dstPitch[1]; dstp[2] += dstPitch[2]; } } // y loop } #undef XP_LAMBDA_CAPTURE_FIX template void convert_yuv_to_planarrgb_sse2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float) { // Accuracy forever: forced float or float input if (force_float || std::is_floating_point::value) { if (bits_per_pixel_target == 8) { convert_yuv_to_planarrgb_sse2_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); } else if (bits_per_pixel_target < 16) { convert_yuv_to_planarrgb_sse2_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); } else if (bits_per_pixel_target == 16) { convert_yuv_to_planarrgb_sse2_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); } else { // 32 bit float target convert_yuv_to_planarrgb_sse2_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); } return; } // Integer input paths if constexpr (!std::is_floating_point::value) { const bool need_conversion = bits_per_pixel_target != bits_per_pixel; if (!need_conversion) { // No bit-depth conversion, just color space conversion convert_yuv_to_planarrgb_sse2_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); return; } const bool full_d = m.offset_out == 0; if (bits_per_pixel_target >= 8 && bits_per_pixel <= 16) { if (bits_per_pixel_target == 8) { if (full_d) convert_yuv_to_planarrgb_sse2_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); else convert_yuv_to_planarrgb_sse2_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); } else if (bits_per_pixel_target < 16) { if (full_d) convert_yuv_to_planarrgb_sse2_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); else convert_yuv_to_planarrgb_sse2_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); } else if (bits_per_pixel_target == 16) { if (full_d) convert_yuv_to_planarrgb_sse2_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); else convert_yuv_to_planarrgb_sse2_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); } else { // 32 bit float target convert_yuv_to_planarrgb_sse2_internal(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target); } } } } // Template instantiations for SSE2 // YUV_TO_RGB template void convert_yuv_to_planarrgb_sse2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_sse2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_sse2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_sse2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); // RGB_TO_YUV template void convert_yuv_to_planarrgb_sse2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_sse2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_sse2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_sse2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); // RGB_TO_Y template void convert_yuv_to_planarrgb_sse2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_sse2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_sse2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_sse2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); // YUV_TO_YUV (for future use) template void convert_yuv_to_planarrgb_sse2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_sse2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_sse2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template void convert_yuv_to_planarrgb_sse2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); // kept for reference // packed rgb helper static AVS_FORCEINLINE __m128i convert_yuv_to_rgb_sse2_core(const __m128i &px01, const __m128i &px23, const __m128i &px45, const __m128i &px67, const __m128i& zero, const __m128i &matrix, const __m128i &round_mask_plus_rgb_offset) { //int b = (((int)m[0] * Y + (int)m[1] * U + (int)m[ 2] * V + 4096)>>13); //px01 - xx xx 00 V1 00 U1 00 Y1 xx xx 00 V0 00 U0 00 Y0 __m128i low_lo = _mm_madd_epi16(px01, matrix); //xx*0 + v1*m2 | u1*m1 + y1*m0 | xx*0 + v0*m2 | u0*m1 + y0*m0 __m128i low_hi = _mm_madd_epi16(px23, matrix); //xx*0 + v3*m2 | u3*m1 + y3*m0 | xx*0 + v2*m2 | u2*m1 + y2*m0 __m128i high_lo = _mm_madd_epi16(px45, matrix); __m128i high_hi = _mm_madd_epi16(px67, matrix); __m128i low_v = _mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(low_lo), _mm_castsi128_ps(low_hi), _MM_SHUFFLE(3, 1, 3, 1))); // v3*m2 | v2*m2 | v1*m2 | v0*m2 __m128i high_v = _mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(high_lo), _mm_castsi128_ps(high_hi), _MM_SHUFFLE(3, 1, 3, 1))); __m128i low_yu = _mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(low_lo), _mm_castsi128_ps(low_hi), _MM_SHUFFLE(2, 0, 2, 0))); // u3*m1 + y3*m0 | u2*m1 + y2*m0 | u1*m1 + y1*m0 | u0*m1 + y0*m0 __m128i high_yu = _mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(high_lo), _mm_castsi128_ps(high_hi), _MM_SHUFFLE(2, 0, 2, 0))); __m128i t_lo = _mm_add_epi32(low_v, low_yu); // v3*m2 + u3*m1 + y3*m0... __m128i t_hi = _mm_add_epi32(high_v, high_yu); t_lo = _mm_add_epi32(t_lo, round_mask_plus_rgb_offset); // v3*m2 + u3*m1 + y3*m0 + 4096... t_hi = _mm_add_epi32(t_hi, round_mask_plus_rgb_offset); t_lo = _mm_srai_epi32(t_lo, 13); // (v3*m2 + u3*m1 + y3*m0 + 4096) >> 13... t_hi = _mm_srai_epi32(t_hi, 13); __m128i result = _mm_packs_epi32(t_lo, t_hi); result = _mm_packus_epi16(result, zero); //00 00 00 00 00 00 00 00 b7 b6 b5 b4 b3 b2 b1 b0 return result; } template #if defined(GCC) || defined(CLANG) __attribute__((__target__("ssse3"))) #endif void convert_yv24_to_rgb_ssse3(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, const BYTE*srcA, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t src_pitch_a, size_t width, size_t height, const ConversionMatrix &matrix) { dstp += dst_pitch * (height-1); // We start at last line size_t mod8_width = rgb_pixel_step == 3 ? width / 8 * 8 : width; // for rgb32 target we may process pixels beyond width, but we have at least 32 bytes alignment at target __m128i matrix_b = _mm_set_epi16(0, matrix.v_b, matrix.u_b, matrix.y_b, 0, matrix.v_b, matrix.u_b, matrix.y_b); __m128i matrix_g = _mm_set_epi16(0, matrix.v_g, matrix.u_g, matrix.y_g, 0, matrix.v_g, matrix.u_g, matrix.y_g); __m128i matrix_r = _mm_set_epi16(0, matrix.v_r, matrix.u_r, matrix.y_r, 0, matrix.v_r, matrix.u_r, matrix.y_r); __m128i zero = _mm_setzero_si128(); // .13 bit frac integer arithmetic int round_mask_plus_rgb_offset_i = (1 << 12) + (matrix.offset_rgb << 13); __m128i round_mask_plus_rgb_offset = _mm_set1_epi32(round_mask_plus_rgb_offset_i); __m128i offset = _mm_set_epi16(0, -128, -128, matrix.offset_y, 0, -128, -128, matrix.offset_y); __m128i pixels0123_mask = _mm_set_epi8(0, 0, 0, 0, 14, 13, 12, 10, 9, 8, 6, 5, 4, 2, 1, 0); __m128i pixels4567_mask = _mm_set_epi8(4, 2, 1, 0, 0, 0, 0, 0, 14, 13, 12, 10, 9, 8, 6, 5); __m128i ssse3_merge_mask = _mm_set_epi32(0xFFFFFFFF, 0, 0, 0); // 8 YUV(A) pixels --> 2x16 RGB quads = 32 bytes. Avisynth's alignment is 64 so we are more than safe. for (size_t y = 0; y < height; ++y) { for (size_t x = 0; x < mod8_width; x+=8) { __m128i src_y = _mm_loadl_epi64(reinterpret_cast(srcY+x)); //0 0 0 0 0 0 0 0 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 __m128i src_u = _mm_loadl_epi64(reinterpret_cast(srcU+x)); //0 0 0 0 0 0 0 0 U7 U6 U5 U4 U3 U2 U1 U0 __m128i src_v = _mm_loadl_epi64(reinterpret_cast(srcV+x)); //0 0 0 0 0 0 0 0 V7 V6 V5 V4 V3 V2 V1 V0 [[maybe_unused]] __m128i src_a; if constexpr(hasAlpha) src_a = _mm_loadl_epi64(reinterpret_cast(srcA+x)); //0 0 0 0 0 0 0 0 A7 A6 A5 A4 A3 A2 A1 A0 __m128i t1 = _mm_unpacklo_epi8(src_y, src_u); //U7 Y7 U6 Y6 U5 Y5 U4 Y4 U3 Y3 U2 Y2 U1 Y1 U0 Y0 __m128i t2 = _mm_unpacklo_epi8(src_v, zero); //00 V7 00 V6 00 V5 00 V4 00 V3 00 V2 00 V1 00 V0 __m128i low = _mm_unpacklo_epi16(t1, t2); //xx V3 U3 Y3 xx V2 U2 Y2 xx V1 U1 Y1 xx V0 U0 Y0 __m128i high = _mm_unpackhi_epi16(t1, t2); //xx V7 U7 Y7 xx V6 U6 Y6 xx V5 U5 Y5 xx V4 U4 Y4 __m128i px01 = _mm_unpacklo_epi8(low, zero); //xx xx 00 V1 00 U1 00 Y1 xx xx 00 V0 00 U0 00 Y0 __m128i px23 = _mm_unpackhi_epi8(low, zero); //xx xx 00 V3 00 U3 00 Y3 xx xx 00 V2 00 U2 00 Y2 __m128i px45 = _mm_unpacklo_epi8(high, zero); //xx xx 00 V5 00 U5 00 Y5 xx xx 00 V4 00 U4 00 Y4 __m128i px67 = _mm_unpackhi_epi8(high, zero); //xx xx 00 V7 00 U7 00 Y7 xx xx 00 V6 00 U6 00 Y6 px01 = _mm_add_epi16(px01, offset); px23 = _mm_add_epi16(px23, offset); px45 = _mm_add_epi16(px45, offset); px67 = _mm_add_epi16(px67, offset); __m128i result_b = convert_yuv_to_rgb_sse2_core(px01, px23, px45, px67, zero, matrix_b, round_mask_plus_rgb_offset); //00 00 00 00 00 00 00 00 b7 b6 b5 b4 b3 b2 b1 b0 __m128i result_g = convert_yuv_to_rgb_sse2_core(px01, px23, px45, px67, zero, matrix_g, round_mask_plus_rgb_offset); //00 00 00 00 00 00 00 00 g7 g6 g5 g4 g3 g2 g1 g0 __m128i result_r = convert_yuv_to_rgb_sse2_core(px01, px23, px45, px67, zero, matrix_r, round_mask_plus_rgb_offset); //00 00 00 00 00 00 00 00 r7 r6 r5 r4 r3 r2 r1 r0 __m128i result_bg = _mm_unpacklo_epi8(result_b, result_g); //g7 b7 g6 b6 g5 b5 g4 b4 g3 b3 g2 b2 g1 b1 g0 b0 __m128i alpha; if constexpr(hasAlpha) alpha = src_a; // a7 .. a0 else alpha = _mm_cmpeq_epi32(result_r, result_r); // FF FF FF FF ... default alpha transparent __m128i result_ra = _mm_unpacklo_epi8(result_r, alpha); //a7 r7 a6 r6 a5 r5 a4 r4 a3 r3 a2 r2 a1 r1 a0 r0 __m128i result_lo = _mm_unpacklo_epi16(result_bg, result_ra); __m128i result_hi = _mm_unpackhi_epi16(result_bg, result_ra); if constexpr(rgb_pixel_step == 4) { //rgb32 _mm_store_si128(reinterpret_cast<__m128i*>(dstp+x*4), result_lo); _mm_store_si128(reinterpret_cast<__m128i*>(dstp+x*4+16), result_hi); } else { //rgb24 //"fast" SSSE3 version __m128i px0123 = _mm_shuffle_epi8(result_lo, pixels0123_mask); //xxxx xxxx b3g3 r3b2 g2r2 b1g1 r1b0 g0r0 __m128i dst567 = _mm_shuffle_epi8(result_hi, pixels4567_mask); //r5b4 g4r4 xxxx xxxx b7g7 r7b6 g6r6 b5g5 __m128i dst012345 = _mm_or_si128( _mm_andnot_si128(ssse3_merge_mask, px0123), _mm_and_si128(ssse3_merge_mask, dst567) ); //r5b4 g4r4 b3g3 r3b2 g2r2 b1g1 r1b0 g0r0 _mm_storeu_si128(reinterpret_cast<__m128i*>(dstp + x * 3), dst012345); _mm_storel_epi64(reinterpret_cast<__m128i*>(dstp + x * 3 + 16), dst567); } } if constexpr(rgb_pixel_step == 3) { // for rgb32 (pixel_step == 4) we processed full width and more, including padded 8 bytes for (size_t x = mod8_width; x < width; ++x) { int Y = srcY[x] + matrix.offset_y; int U = srcU[x] - 128; int V = srcV[x] - 128; int b = (((int)matrix.y_b * Y + (int)matrix.u_b * U + (int)matrix.v_b * V + round_mask_plus_rgb_offset_i) >> 13); int g = (((int)matrix.y_g * Y + (int)matrix.u_g * U + (int)matrix.v_g * V + round_mask_plus_rgb_offset_i) >> 13); int r = (((int)matrix.y_r * Y + (int)matrix.u_r * U + (int)matrix.v_r * V + round_mask_plus_rgb_offset_i) >> 13); dstp[x*rgb_pixel_step + 0] = PixelClip(b); dstp[x*rgb_pixel_step + 1] = PixelClip(g); dstp[x*rgb_pixel_step + 2] = PixelClip(r); if constexpr(rgb_pixel_step == 4) { // n/a dstp[x * 4 + 3] = 255; } } } dstp -= dst_pitch; srcY += src_pitch_y; srcU += src_pitch_uv; srcV += src_pitch_uv; if(hasAlpha) srcA += src_pitch_a; } } //instantiate //template template void convert_yv24_to_rgb_ssse3<3, false>(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, const BYTE*srcA, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t src_pitch_a, size_t width, size_t height, const ConversionMatrix &matrix); template void convert_yv24_to_rgb_ssse3<4, false>(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, const BYTE*srcA, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t src_pitch_a, size_t width, size_t height, const ConversionMatrix &matrix); template void convert_yv24_to_rgb_ssse3<3, true>(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, const BYTE*srcA, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t src_pitch_a, size_t width, size_t height, const ConversionMatrix &matrix); template void convert_yv24_to_rgb_ssse3<4, true>(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, const BYTE*srcA, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t src_pitch_a, size_t width, size_t height, const ConversionMatrix &matrix); template void convert_yv24_to_rgb_sse2(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, const BYTE*srcA, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t src_pitch_a, size_t width, size_t height, const ConversionMatrix &matrix) { dstp += dst_pitch * (height - 1); // We start at last line size_t mod8_width = rgb_pixel_step == 3 ? width / 8 * 8 : width; // for rgb32 target we may process pixels beyond width, but we have at least 32 bytes alignment at target __m128i matrix_b = _mm_set_epi16(0, matrix.v_b, matrix.u_b, matrix.y_b, 0, matrix.v_b, matrix.u_b, matrix.y_b); __m128i matrix_g = _mm_set_epi16(0, matrix.v_g, matrix.u_g, matrix.y_g, 0, matrix.v_g, matrix.u_g, matrix.y_g); __m128i matrix_r = _mm_set_epi16(0, matrix.v_r, matrix.u_r, matrix.y_r, 0, matrix.v_r, matrix.u_r, matrix.y_r); __m128i zero = _mm_setzero_si128(); // .13 bit frac integer arithmetic int round_mask_plus_rgb_offset_i = (1 << 12) + (matrix.offset_rgb << 13); __m128i round_mask_plus_rgb_offset = _mm_set1_epi32(round_mask_plus_rgb_offset_i); __m128i offset = _mm_set_epi16(0, -128, -128, matrix.offset_y, 0, -128, -128, matrix.offset_y); for (size_t y = 0; y < height; ++y) { for (size_t x = 0; x < mod8_width; x += 8) { __m128i src_y = _mm_loadl_epi64(reinterpret_cast(srcY + x)); //0 0 0 0 0 0 0 0 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 __m128i src_u = _mm_loadl_epi64(reinterpret_cast(srcU + x)); //0 0 0 0 0 0 0 0 U7 U6 U5 U4 U3 U2 U1 U0 __m128i src_v = _mm_loadl_epi64(reinterpret_cast(srcV + x)); //0 0 0 0 0 0 0 0 V7 V6 V5 V4 V3 V2 V1 V0 __m128i src_a; if (hasAlpha) src_a = _mm_loadl_epi64(reinterpret_cast(srcA + x)); //0 0 0 0 0 0 0 0 A7 A6 A5 A4 A3 A2 A1 A0 __m128i t1 = _mm_unpacklo_epi8(src_y, src_u); //U7 Y7 U6 Y6 U5 Y5 U4 Y4 U3 Y3 U2 Y2 U1 Y1 U0 Y0 __m128i t2 = _mm_unpacklo_epi8(src_v, zero); //00 V7 00 V6 00 V5 00 V4 00 V3 00 V2 00 V1 00 V0 __m128i low = _mm_unpacklo_epi16(t1, t2); //xx V3 U3 Y3 xx V2 U2 Y2 xx V1 U1 Y1 xx V0 U0 Y0 __m128i high = _mm_unpackhi_epi16(t1, t2); //xx V7 U7 Y7 xx V6 U6 Y6 xx V5 U5 Y5 xx V4 U4 Y4 __m128i px01 = _mm_unpacklo_epi8(low, zero); //xx xx 00 V1 00 U1 00 Y1 xx xx 00 V0 00 U0 00 Y0 __m128i px23 = _mm_unpackhi_epi8(low, zero); //xx xx 00 V3 00 U3 00 Y3 xx xx 00 V2 00 U2 00 Y2 __m128i px45 = _mm_unpacklo_epi8(high, zero); //xx xx 00 V5 00 U5 00 Y5 xx xx 00 V4 00 U4 00 Y4 __m128i px67 = _mm_unpackhi_epi8(high, zero); //xx xx 00 V7 00 U7 00 Y7 xx xx 00 V6 00 U6 00 Y6 px01 = _mm_add_epi16(px01, offset); px23 = _mm_add_epi16(px23, offset); px45 = _mm_add_epi16(px45, offset); px67 = _mm_add_epi16(px67, offset); __m128i result_b = convert_yuv_to_rgb_sse2_core(px01, px23, px45, px67, zero, matrix_b, round_mask_plus_rgb_offset); //00 00 00 00 00 00 00 00 b7 b6 b5 b4 b3 b2 b1 b0 __m128i result_g = convert_yuv_to_rgb_sse2_core(px01, px23, px45, px67, zero, matrix_g, round_mask_plus_rgb_offset); //00 00 00 00 00 00 00 00 g7 g6 g5 g4 g3 g2 g1 g0 __m128i result_r = convert_yuv_to_rgb_sse2_core(px01, px23, px45, px67, zero, matrix_r, round_mask_plus_rgb_offset); //00 00 00 00 00 00 00 00 r7 r6 r5 r4 r3 r2 r1 r0 __m128i result_bg = _mm_unpacklo_epi8(result_b, result_g); //g7 b7 g6 b6 g5 b5 g4 b4 g3 b3 g2 b2 g1 b1 g0 b0 __m128i alpha; if (hasAlpha) alpha = src_a; // a7 .. a0 else alpha = _mm_cmpeq_epi32(result_r, result_r); // FF FF FF FF ... default alpha transparent __m128i result_ra = _mm_unpacklo_epi8(result_r, alpha); //a7 r7 a6 r6 a5 r5 a4 r4 a3 r3 a2 r2 a1 r1 a0 r0 __m128i result_lo = _mm_unpacklo_epi16(result_bg, result_ra); __m128i result_hi = _mm_unpackhi_epi16(result_bg, result_ra); if constexpr (rgb_pixel_step == 4) { //rgb32 _mm_store_si128(reinterpret_cast<__m128i*>(dstp + x * 4), result_lo); _mm_store_si128(reinterpret_cast<__m128i*>(dstp + x * 4 + 16), result_hi); } else { //rgb24 alignas(16) BYTE temp[32]; //slow SSE2 version _mm_store_si128(reinterpret_cast<__m128i*>(temp), result_lo); _mm_store_si128(reinterpret_cast<__m128i*>(temp + 16), result_hi); for (int i = 0; i < 7; ++i) { *reinterpret_cast(dstp + (x + i) * 3) = *reinterpret_cast(temp + i * 4); } //last pixel dstp[(x + 7) * 3 + 0] = temp[7 * 4 + 0]; dstp[(x + 7) * 3 + 1] = temp[7 * 4 + 1]; dstp[(x + 7) * 3 + 2] = temp[7 * 4 + 2]; } } if constexpr (rgb_pixel_step == 3) { // for rgb32 (pixel_step == 4) we processed full width and more, including padded 8 bytes for (size_t x = mod8_width; x < width; ++x) { int Y = srcY[x] + matrix.offset_y; int U = srcU[x] - 128; int V = srcV[x] - 128; int b = (((int)matrix.y_b * Y + (int)matrix.u_b * U + (int)matrix.v_b * V + round_mask_plus_rgb_offset_i) >> 13); int g = (((int)matrix.y_g * Y + (int)matrix.u_g * U + (int)matrix.v_g * V + round_mask_plus_rgb_offset_i) >> 13); int r = (((int)matrix.y_r * Y + (int)matrix.u_r * U + (int)matrix.v_r * V + round_mask_plus_rgb_offset_i) >> 13); dstp[x*rgb_pixel_step + 0] = PixelClip(b); dstp[x*rgb_pixel_step + 1] = PixelClip(g); dstp[x*rgb_pixel_step + 2] = PixelClip(r); if constexpr (rgb_pixel_step == 4) { // n/a dstp[x * 4 + 3] = 255; } } } dstp -= dst_pitch; srcY += src_pitch_y; srcU += src_pitch_uv; srcV += src_pitch_uv; if (hasAlpha) srcA += src_pitch_a; } } //instantiate //template template void convert_yv24_to_rgb_sse2<3, false>(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, const BYTE*srcA, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t src_pitch_a, size_t width, size_t height, const ConversionMatrix &matrix); template void convert_yv24_to_rgb_sse2<4, false>(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, const BYTE*srcA, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t src_pitch_a, size_t width, size_t height, const ConversionMatrix &matrix); template void convert_yv24_to_rgb_sse2<3, true>(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, const BYTE*srcA, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t src_pitch_a, size_t width, size_t height, const ConversionMatrix &matrix); template void convert_yv24_to_rgb_sse2<4, true>(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, const BYTE*srcA, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t src_pitch_a, size_t width, size_t height, const ConversionMatrix &matrix); #ifdef X86_32 static AVS_FORCEINLINE __m64 convert_yuv_to_rgb_mmx_core(const __m64 &px0, const __m64 &px1, const __m64 &px2, const __m64 &px3, const __m64& zero, const __m64 &matrix, const __m64 &round_mask_plus_rgb_offset) { //int b = (((int)m[0] * Y + (int)m[1] * U + (int)m[ 2] * V + 4096)>>13); //px01 - xx xx 00 V0 00 U0 00 Y0 __m64 low_lo = _mm_madd_pi16(px0, matrix); //xx*0 + v1*m2 | u1*m1 + y1*m0 | xx*0 + v0*m2 | u0*m1 + y0*m0 __m64 low_hi = _mm_madd_pi16(px1, matrix); //xx*0 + v3*m2 | u3*m1 + y3*m0 | xx*0 + v2*m2 | u2*m1 + y2*m0 __m64 high_lo = _mm_madd_pi16(px2, matrix); __m64 high_hi = _mm_madd_pi16(px3, matrix); __m64 low_v = _mm_unpackhi_pi32(low_lo, low_hi); // v1*m2 | v0*m2 __m64 high_v = _mm_unpackhi_pi32(high_lo, high_hi); __m64 low_yu = _mm_unpacklo_pi32(low_lo, low_hi); // u1*m1 + y1*m0 | u0*m1 + y0*m0 __m64 high_yu = _mm_unpacklo_pi32(high_lo, high_hi); __m64 t_lo = _mm_add_pi32(low_v, low_yu); // v3*m2 + u3*m1 + y3*m0... __m64 t_hi = _mm_add_pi32(high_v, high_yu); t_lo = _mm_add_pi32(t_lo, round_mask_plus_rgb_offset); // v3*m2 + u3*m1 + y3*m0 + 4096... t_hi = _mm_add_pi32(t_hi, round_mask_plus_rgb_offset); t_lo = _mm_srai_pi32(t_lo, 13); // (v3*m2 + u3*m1 + y3*m0 + 4096) >> 13... t_hi = _mm_srai_pi32(t_hi, 13); __m64 result = _mm_packs_pi32(t_lo, t_hi); result = _mm_packs_pu16(result, zero); //00 00 00 00 b3 b2 b1 b0 return result; } template void convert_yv24_to_rgb_mmx(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t width, size_t height, const ConversionMatrix &matrix) { dstp += dst_pitch * (height-1); // We start at last line size_t mod4_width = rgb_pixel_step == 3 ? width / 4 * 4 : width; __m64 matrix_b = _mm_set_pi16(0, matrix.v_b, matrix.u_b, matrix.y_b); __m64 matrix_g = _mm_set_pi16(0, matrix.v_g, matrix.u_g, matrix.y_g); __m64 matrix_r = _mm_set_pi16(0, matrix.v_r, matrix.u_r, matrix.y_r); __m64 zero = _mm_setzero_si64(); int round_mask_plus_rgb_offset_i = 4096 + (matrix.offset_rgb << 13); __m64 round_mask_plus_rgb_offset = _mm_set1_pi32(round_mask_plus_rgb_offset_i); __m64 ff = _mm_set1_pi32(0xFFFFFFFF); __m64 offset = _mm_set_pi16(0, -128, -128, matrix.offset_y); __m64 low_pixel_mask = _mm_set_pi32(0, 0x00FFFFFF); __m64 high_pixel_mask = _mm_set_pi32(0x00FFFFFF, 0); for (size_t y = 0; y < height; ++y) { for (size_t x = 0; x < mod4_width; x+=4) { __m64 src_y = _mm_cvtsi32_si64(*reinterpret_cast(srcY+x)); //0 0 0 0 Y3 Y2 Y1 Y0 __m64 src_u = _mm_cvtsi32_si64(*reinterpret_cast(srcU+x)); //0 0 0 0 U3 U2 U1 U0 __m64 src_v = _mm_cvtsi32_si64(*reinterpret_cast(srcV+x)); //0 0 0 0 V3 V2 V1 V0 __m64 t1 = _mm_unpacklo_pi8(src_y, src_u); //U3 Y3 U2 Y2 U1 Y1 U0 Y0 __m64 t2 = _mm_unpacklo_pi8(src_v, zero); //00 V3 00 V2 00 V1 00 V0 __m64 low = _mm_unpacklo_pi16(t1, t2); //xx V1 U1 Y1 xx V0 U0 Y0 __m64 high = _mm_unpackhi_pi16(t1, t2); //xx V3 U3 Y3 xx V2 U2 Y2 __m64 px0 = _mm_unpacklo_pi8(low, zero); //xx xx 00 V0 00 U0 00 Y0 __m64 px1 = _mm_unpackhi_pi8(low, zero); //xx xx 00 V1 00 U1 00 Y1 __m64 px2 = _mm_unpacklo_pi8(high, zero); //xx xx 00 V2 00 U2 00 Y2 __m64 px3 = _mm_unpackhi_pi8(high, zero); //xx xx 00 V3 00 U3 00 Y3 px0 = _mm_add_pi16(px0, offset); px1 = _mm_add_pi16(px1, offset); px2 = _mm_add_pi16(px2, offset); px3 = _mm_add_pi16(px3, offset); __m64 result_b = convert_yuv_to_rgb_mmx_core(px0, px1, px2, px3, zero, matrix_b, round_mask_plus_rgb_offset); //00 00 00 00 b3 b2 b1 b0 __m64 result_g = convert_yuv_to_rgb_mmx_core(px0, px1, px2, px3, zero, matrix_g, round_mask_plus_rgb_offset); //00 00 00 00 g3 g2 g1 g0 __m64 result_r = convert_yuv_to_rgb_mmx_core(px0, px1, px2, px3, zero, matrix_r, round_mask_plus_rgb_offset); //00 00 00 00 r3 r2 r1 r0 __m64 result_bg = _mm_unpacklo_pi8(result_b, result_g); //g3 b3 g2 b2 g1 b1 g0 b0 __m64 result_ra = _mm_unpacklo_pi8(result_r, ff); //a3 r3 a2 r2 a1 r1 a0 r0 __m64 result_lo = _mm_unpacklo_pi16(result_bg, result_ra); __m64 result_hi = _mm_unpackhi_pi16(result_bg, result_ra); if (rgb_pixel_step == 4) { //rgb32 *reinterpret_cast<__m64*>(dstp+x*4) = result_lo; *reinterpret_cast<__m64*>(dstp+x*4+8) = result_hi; } else { __m64 p0 = _mm_and_si64(result_lo, low_pixel_mask); //0000 0000 00r0 g0b0 __m64 p1 = _mm_and_si64(result_lo, high_pixel_mask); //00r1 g1b1 0000 0000 __m64 p2 = _mm_and_si64(result_hi, low_pixel_mask); //0000 0000 00r2 g2b2 __m64 p3 = _mm_and_si64(result_hi, high_pixel_mask); //00r3 g3b3 0000 0000 __m64 dst01 = _mm_or_si64(p0, _mm_srli_si64(p1, 8)); //0000 r1g1 b1r0 g0b0 p3 = _mm_srli_si64(p3, 24); //0000 0000 r3g3 b300 __m64 dst012 = _mm_or_si64(dst01, _mm_slli_si64(p2, 48)); //g2b2 r1g1 b1r0 g0b0 __m64 dst23 = _mm_or_si64(p3, _mm_srli_si64(p2, 16)); //0000 0000 r3g3 b3r2 *reinterpret_cast<__m64*>(dstp+x*3) = dst012; *reinterpret_cast(dstp+x*3+8) = _mm_cvtsi64_si32(dst23); } } if (rgb_pixel_step == 3) { for (size_t x = mod4_width; x < width; ++x) { int Y = srcY[x] + matrix.offset_y; int U = srcU[x] - 128; int V = srcV[x] - 128; int b = (((int)matrix.y_b * Y + (int)matrix.u_b * U + (int)matrix.v_b * V + round_mask_plus_rgb_offset_i) >> 13); int g = (((int)matrix.y_g * Y + (int)matrix.u_g * U + (int)matrix.v_g * V + round_mask_plus_rgb_offset_i) >> 13); int r = (((int)matrix.y_r * Y + (int)matrix.u_r * U + (int)matrix.v_r * V + round_mask_plus_rgb_offset_i) >> 13); dstp[x*rgb_pixel_step + 0] = PixelClip(b); dstp[x*rgb_pixel_step + 1] = PixelClip(g); dstp[x*rgb_pixel_step + 2] = PixelClip(r); if (rgb_pixel_step == 4) { dstp[x * 4 + 3] = 255; } } } dstp -= dst_pitch; srcY += src_pitch_y; srcU += src_pitch_uv; srcV += src_pitch_uv; } _mm_empty(); } //instantiate //template template void convert_yv24_to_rgb_mmx<3>(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t width, size_t height, const ConversionMatrix &matrix); template void convert_yv24_to_rgb_mmx<4>(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t width, size_t height, const ConversionMatrix &matrix); #endif void convert_yuy2_to_yv16_sse2(const BYTE *srcp, BYTE *dstp_y, BYTE *dstp_u, BYTE *dstp_v, size_t src_pitch, size_t dst_pitch_y, size_t dst_pitch_uv, size_t width, size_t height) { width /= 2; for (size_t y = 0; y < height; ++y) { for (size_t x = 0; x < width; x += 8) { __m128i p0 = _mm_load_si128(reinterpret_cast(srcp + x * 4)); // V3 Y7 U3 Y6 V2 Y5 U2 Y4 V1 Y3 U1 Y2 V0 Y1 U0 Y0 __m128i p1 = _mm_load_si128(reinterpret_cast(srcp + x * 4 + 16)); // V7 Yf U7 Ye V6 Yd U6 Yc V5 Yb U5 Ya V4 Y9 U4 Y8 __m128i p2 = _mm_unpacklo_epi8(p0, p1); // V5 V1 Yb Y3 U5 U1 Ya Y2 V4 V0 Y9 Y1 U4 U0 Y8 Y0 __m128i p3 = _mm_unpackhi_epi8(p0, p1); // V7 V3 Yf Y7 U7 U3 Ye Y6 V6 V2 Yd Y5 U6 U2 Yc Y4 p0 = _mm_unpacklo_epi8(p2, p3); // V6 V4 V2 V0 Yd Y9 Y5 Y1 U6 U4 U2 U0 Yc Y8 Y4 Y0 p1 = _mm_unpackhi_epi8(p2, p3); // V7 V5 V3 V1 Yf Yb Y7 Y3 U7 U5 U3 U1 Ye Ya Y6 Y2 p2 = _mm_unpacklo_epi8(p0, p1); // U7 U6 U5 U4 U3 U2 U1 U0 Ye Yc Ya Y8 Y6 Y4 Y2 Y0 p3 = _mm_unpackhi_epi8(p0, p1); // V7 V6 V5 V4 V3 V2 V1 V0 Yf Yd Yb Y9 Y7 Y5 Y3 Y1 _mm_storel_epi64(reinterpret_cast<__m128i*>(dstp_u + x), _mm_srli_si128(p2, 8)); _mm_storel_epi64(reinterpret_cast<__m128i*>(dstp_v + x), _mm_srli_si128(p3, 8)); _mm_store_si128(reinterpret_cast<__m128i*>(dstp_y + x * 2), _mm_unpacklo_epi8(p2, p3)); } srcp += src_pitch; dstp_y += dst_pitch_y; dstp_u += dst_pitch_uv; dstp_v += dst_pitch_uv; } } #ifdef X86_32 void convert_yuy2_to_yv16_mmx(const BYTE *srcp, BYTE *dstp_y, BYTE *dstp_u, BYTE *dstp_v, size_t src_pitch, size_t dst_pitch_y, size_t dst_pitch_uv, size_t width, size_t height) { width /= 2; for (size_t y = 0; y < height; ++y) { for (size_t x = 0; x < width; x += 4) { __m64 p0 = *reinterpret_cast(srcp + x * 4); // V1 Y3 U1 Y2 V0 Y1 U0 Y0 __m64 p1 = *reinterpret_cast(srcp + x * 4 + 8); // V3 Y7 U3 Y6 V2 Y5 U2 Y4 __m64 p2 = _mm_unpacklo_pi8(p0, p1); // V2 V0 Y5 Y1 U2 U0 Y4 Y0 __m64 p3 = _mm_unpackhi_pi8(p0, p1); // V3 V1 Y7 Y3 U3 U1 Y6 Y2 p0 = _mm_unpacklo_pi8(p2, p3); // U3 U2 U1 U0 Y6 Y4 Y2 Y0 p1 = _mm_unpackhi_pi8(p2, p3); // V3 V2 V1 V0 Y7 Y5 Y3 Y1 *reinterpret_cast(dstp_u + x) = _mm_cvtsi64_si32(_mm_srli_si64(p0, 32)); *reinterpret_cast(dstp_v + x) = _mm_cvtsi64_si32(_mm_srli_si64(p1, 32)); *reinterpret_cast<__m64*>(dstp_y + x * 2) = _mm_unpacklo_pi8(p0, p1); } srcp += src_pitch; dstp_y += dst_pitch_y; dstp_u += dst_pitch_uv; dstp_v += dst_pitch_uv; } _mm_empty(); } #endif void convert_yv16_to_yuy2_sse2(const BYTE *srcp_y, const BYTE *srcp_u, const BYTE *srcp_v, BYTE *dstp, size_t src_pitch_y, size_t src_pitch_uv, size_t dst_pitch, size_t width, size_t height) { width /= 2; for (size_t yy=0; yy(srcp_y + x*2)); __m128i u = _mm_loadl_epi64(reinterpret_cast(srcp_u + x)); __m128i v = _mm_loadl_epi64(reinterpret_cast(srcp_v + x)); __m128i uv = _mm_unpacklo_epi8(u, v); __m128i yuv_lo = _mm_unpacklo_epi8(y, uv); __m128i yuv_hi = _mm_unpackhi_epi8(y, uv); _mm_stream_si128(reinterpret_cast<__m128i*>(dstp + x*4), yuv_lo); _mm_stream_si128(reinterpret_cast<__m128i*>(dstp + x*4 + 16), yuv_hi); } srcp_y += src_pitch_y; srcp_u += src_pitch_uv; srcp_v += src_pitch_uv; dstp += dst_pitch; } } #ifdef X86_32 void convert_yv16_to_yuy2_mmx(const BYTE *srcp_y, const BYTE *srcp_u, const BYTE *srcp_v, BYTE *dstp, size_t src_pitch_y, size_t src_pitch_uv, size_t dst_pitch, size_t width, size_t height) { width /= 2; for (size_t y=0; y(srcp_y + x*2); __m64 u = *reinterpret_cast(srcp_u + x); __m64 v = *reinterpret_cast(srcp_v + x); __m64 uv = _mm_unpacklo_pi8(u, v); __m64 yuv_lo = _mm_unpacklo_pi8(y, uv); __m64 yuv_hi = _mm_unpackhi_pi8(y, uv); *reinterpret_cast<__m64*>(dstp + x*4) = yuv_lo; *reinterpret_cast<__m64*>(dstp + x*4+8) = yuv_hi; } srcp_y += src_pitch_y; srcp_u += src_pitch_uv; srcp_v += src_pitch_uv; dstp += dst_pitch; } _mm_empty(); } #endif DISABLE_WARNING_POP ================================================ FILE: avs_core/convert/intel/convert_planar_sse.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __Convert_PLANAR_sse_H__ #define __Convert_PLANAR_sse_H__ #include #include "../convert_matrix.h" #include "../convert_helper.h" void convert_yuy2_to_y8_sse2(const BYTE *srcp, BYTE *dstp, size_t src_pitch, size_t dst_pitch, size_t width, size_t height); template void convert_yuv_to_planarrgb_sse2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float); template #if defined(GCC) || defined(CLANG) __attribute__((__target__("ssse3"))) #endif void convert_yv24_to_rgb_ssse3(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, const BYTE*srcA, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t src_pitch_a, size_t width, size_t height, const ConversionMatrix &matrix); template void convert_yv24_to_rgb_sse2(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, const BYTE*srcA, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t src_pitch_a, size_t width, size_t height, const ConversionMatrix &matrix); #ifdef X86_32 template void convert_yv24_to_rgb_mmx(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t width, size_t height, const ConversionMatrix &matrix); #endif void convert_yuy2_to_yv16_sse2(const BYTE *srcp, BYTE *dstp_y, BYTE *dstp_u, BYTE *dstp_v, size_t src_pitch, size_t dst_pitch_y, size_t dst_pitch_uv, size_t width, size_t height); #ifdef X86_32 void convert_yuy2_to_yv16_mmx(const BYTE *srcp, BYTE *dstp_y, BYTE *dstp_u, BYTE *dstp_v, size_t src_pitch, size_t dst_pitch_y, size_t dst_pitch_uv, size_t width, size_t height); #endif void convert_yv16_to_yuy2_sse2(const BYTE *srcp_y, const BYTE *srcp_u, const BYTE *srcp_v, BYTE *dstp, size_t src_pitch_y, size_t src_pitch_uv, size_t dst_pitch, size_t width, size_t height); #ifdef X86_32 void convert_yv16_to_yuy2_mmx(const BYTE *srcp_y, const BYTE *srcp_u, const BYTE *srcp_v, BYTE *dstp, size_t src_pitch_y, size_t src_pitch_uv, size_t dst_pitch, size_t width, size_t height); #endif #endif // __Convert_PLANAR_sse_H__ ================================================ FILE: avs_core/convert/intel/convert_rgb_avx2.cpp ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include #ifdef _MSC_VER #include #else #include #endif #include #ifndef _mm256_set_m128i #define _mm256_set_m128i(v0, v1) _mm256_insertf128_si256(_mm256_castsi128_si256(v1), (v0), 1) #endif #ifndef _mm256_set_m128 #define _mm256_set_m128(v0, v1) _mm256_insertf128_ps(_mm256_castps128_ps256(v1), (v0), 1) #endif #include "convert_rgb_avx2.h" // minimum width: 48*2 bytes template void convert_rgb_to_rgbp_avx2(const BYTE *srcp, BYTE * (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height) { // RGB24: 2x3x16 bytes cycle, 2x16*(RGB) 8bit pixels // RGB48: 2x3x16 bytes cycle, 2x8*(RGB) 16bit pixels // 0123456789ABCDEF 0123456789ABCDEF 0123456789ABCDEF // BGRBGRBGRBGRBGRB GRBGRBGRBGRBGRBG RBGRBGRBGRBGRBGR // 8 bit // B G R B G R B G R B G R B G R B G R B G R B G R // 16 bit // 1111111111112222 2222222233333333 3333444444444444 constexpr int pixels_at_a_time = (sizeof(pixel_t) == 1) ? 32 : 16; const int wmod = (width / pixels_at_a_time) * pixels_at_a_time; // 8 pixels for 8 bit, 4 pixels for 16 bit __m256i mask; if constexpr(sizeof(pixel_t) == 1) mask = _mm256_set_epi8(15, 14, 13, 12, 11, 8, 5, 2, 10, 7, 4, 1, 9, 6, 3, 0, 15, 14, 13, 12, 11, 8, 5, 2, 10, 7, 4, 1, 9, 6, 3, 0); // same for both lanes else mask = _mm256_set_epi8(15, 14, 13, 12, 11, 10, 5, 4, 9, 8, 3, 2, 7, 6, 1, 0, 15, 14, 13, 12, 11, 10, 5, 4, 9, 8, 3, 2, 7, 6, 1, 0); // same for both lanes __m256i max_pixel_value; if constexpr(sizeof(pixel_t) == 1) max_pixel_value = _mm256_set1_epi8((char)0xFF); else max_pixel_value = _mm256_set1_epi16((short)0xFFFF); // bits_per_pixel is 16 // read-optimized #define SRC_ADDRESS_ADVANCES #ifdef SRC_ADDRESS_ADVANCES srcp -= src_pitch * (height - 1); // source packed RGB is upside down dstp[0] += dst_pitch[0] * (height - 1); dstp[1] += dst_pitch[1] * (height - 1); dstp[2] += dst_pitch[2] * (height - 1); if (targetHasAlpha) dstp[3] += dst_pitch[3] * (height - 1); #endif for (int y = 0; y < height; y++) { for (int x = 0; x < wmod; x += pixels_at_a_time) { auto BGRA_1_Lo48 = _mm_load_si128(reinterpret_cast(srcp + x * 2 * 48 / pixels_at_a_time)); auto BGRA_2_Lo48 = _mm_load_si128(reinterpret_cast(srcp + x * 2 * 48 / pixels_at_a_time + 16)); auto BGRA_3_Lo48 = _mm_load_si128(reinterpret_cast(srcp + x * 2 * 48 / pixels_at_a_time + 32)); auto BGRA_1_Hi48 = _mm_load_si128(reinterpret_cast(srcp + x * 2 * 48 / pixels_at_a_time + 0 + 48)); auto BGRA_2_Hi48 = _mm_load_si128(reinterpret_cast(srcp + x * 2 * 48 / pixels_at_a_time + 16 + 48)); auto BGRA_3_Hi48 = _mm_load_si128(reinterpret_cast(srcp + x * 2 * 48 / pixels_at_a_time + 32 + 48)); auto BGRA_1 = _mm256_set_m128i(BGRA_1_Hi48, BGRA_1_Lo48); auto BGRA_2 = _mm256_set_m128i(BGRA_2_Hi48, BGRA_2_Lo48); auto BGRA_3 = _mm256_set_m128i(BGRA_3_Hi48, BGRA_3_Lo48); auto pack_lo = _mm256_shuffle_epi8(BGRA_1, mask); // 111111111111: BBBBGGGGRRRR and rest: BGRB | BBGGRR and rest: BBGG BGRA_1 = _mm256_alignr_epi8(BGRA_2, BGRA_1, 12); auto pack_hi = _mm256_shuffle_epi8(BGRA_1, mask); // 222222222222: BBBBGGGGRRRR | BBGGRR BGRA_2 = _mm256_alignr_epi8(BGRA_3, BGRA_2, 8); auto pack_lo2 = _mm256_shuffle_epi8(BGRA_2, mask); // 333333333333: BBBBGGGGRRRR | BBGGRR BGRA_3 = _mm256_srli_si256(BGRA_3, 4); // to use the same mask auto pack_hi2 = _mm256_shuffle_epi8(BGRA_3, mask); // 444444444444: BBBBGGGGRRRR | BBGGRR auto BG1 = _mm256_unpacklo_epi32(pack_lo, pack_hi); // BBBB_lo BBBB_hi GGGG_lo GGGG_hi auto BG2 = _mm256_unpacklo_epi32(pack_lo2, pack_hi2); // BBBB_lo BBBB_hi GGGG_lo GGGG_hi auto RA1 = _mm256_unpackhi_epi32(pack_lo, pack_hi); // RRRR_lo RRRR_hi AAAA_lo AAAA_hi auto RA2 = _mm256_unpackhi_epi32(pack_lo2, pack_hi2); // RRRR_lo RRRR_hi AAAA_lo AAAA_hi auto B = _mm256_unpacklo_epi64(BG1, BG2); _mm256_stream_si256(reinterpret_cast<__m256i *>(dstp[1] + x * sizeof(pixel_t)), B); // B auto G = _mm256_unpackhi_epi64(BG1, BG2); _mm256_stream_si256(reinterpret_cast<__m256i *>(dstp[0] + x * sizeof(pixel_t)), G); // G auto R = _mm256_unpacklo_epi64(RA1, RA2); _mm256_stream_si256(reinterpret_cast<__m256i *>(dstp[2] + x * sizeof(pixel_t)), R); // R if (targetHasAlpha) _mm256_stream_si256(reinterpret_cast<__m256i *>(dstp[3] + x * sizeof(pixel_t)), max_pixel_value); // A } // rest, unaligned but simd if (wmod != width) { size_t x = (width - pixels_at_a_time); auto BGRA_1_Lo48 = _mm_loadu_si128(reinterpret_cast(srcp + x * 2 * 48 / pixels_at_a_time)); auto BGRA_2_Lo48 = _mm_loadu_si128(reinterpret_cast(srcp + x * 2 * 48 / pixels_at_a_time + 16)); auto BGRA_3_Lo48 = _mm_loadu_si128(reinterpret_cast(srcp + x * 2 * 48 / pixels_at_a_time + 32)); auto BGRA_1_Hi48 = _mm_loadu_si128(reinterpret_cast(srcp + x * 2 * 48 / pixels_at_a_time + 0 + 48)); auto BGRA_2_Hi48 = _mm_loadu_si128(reinterpret_cast(srcp + x * 2 * 48 / pixels_at_a_time + 16 + 48)); auto BGRA_3_Hi48 = _mm_loadu_si128(reinterpret_cast(srcp + x * 2 * 48 / pixels_at_a_time + 32 + 48)); auto BGRA_1 = _mm256_set_m128i(BGRA_1_Hi48, BGRA_1_Lo48); auto BGRA_2 = _mm256_set_m128i(BGRA_2_Hi48, BGRA_2_Lo48); auto BGRA_3 = _mm256_set_m128i(BGRA_3_Hi48, BGRA_3_Lo48); auto pack_lo = _mm256_shuffle_epi8(BGRA_1, mask); // 111111111111: BBBBGGGGRRRR and rest: BGRB | BBGGRR and rest: BBGG BGRA_1 = _mm256_alignr_epi8(BGRA_2, BGRA_1, 12); auto pack_hi = _mm256_shuffle_epi8(BGRA_1, mask); // 222222222222: BBBBGGGGRRRR | BBGGRR BGRA_2 = _mm256_alignr_epi8(BGRA_3, BGRA_2, 8); auto pack_lo2 = _mm256_shuffle_epi8(BGRA_2, mask); // 333333333333: BBBBGGGGRRRR | BBGGRR BGRA_3 = _mm256_srli_si256(BGRA_3, 4); // to use the same mask auto pack_hi2 = _mm256_shuffle_epi8(BGRA_3, mask); // 444444444444: BBBBGGGGRRRR | BBGGRR auto BG1 = _mm256_unpacklo_epi32(pack_lo, pack_hi); // BBBB_lo BBBB_hi GGGG_lo GGGG_hi auto BG2 = _mm256_unpacklo_epi32(pack_lo2, pack_hi2); // BBBB_lo BBBB_hi GGGG_lo GGGG_hi auto RA1 = _mm256_unpackhi_epi32(pack_lo, pack_hi); // RRRR_lo RRRR_hi AAAA_lo AAAA_hi auto RA2 = _mm256_unpackhi_epi32(pack_lo2, pack_hi2); // RRRR_lo RRRR_hi AAAA_lo AAAA_hi auto B = _mm256_unpacklo_epi64(BG1, BG2); _mm256_storeu_si256(reinterpret_cast<__m256i*>(dstp[1] + x * sizeof(pixel_t)), B); // B auto G = _mm256_unpackhi_epi64(BG1, BG2); _mm256_storeu_si256(reinterpret_cast<__m256i*>(dstp[0] + x * sizeof(pixel_t)), G); // G auto R = _mm256_unpacklo_epi64(RA1, RA2); _mm256_storeu_si256(reinterpret_cast<__m256i*>(dstp[2] + x * sizeof(pixel_t)), R); // R if (targetHasAlpha) _mm256_storeu_si256(reinterpret_cast<__m256i*>(dstp[3] + x * sizeof(pixel_t)), max_pixel_value); // A } #ifdef SRC_ADDRESS_ADVANCES srcp += src_pitch; // source packed RGB is upside down dstp[0] -= dst_pitch[0]; dstp[1] -= dst_pitch[1]; dstp[2] -= dst_pitch[2]; if (targetHasAlpha) dstp[3] -= dst_pitch[3]; #else srcp -= src_pitch; // source packed RGB is upside down dstp[0] += dst_pitch[0]; dstp[1] += dst_pitch[1]; dstp[2] += dst_pitch[2]; if (targetHasAlpha) dstp[3] += dst_pitch[3]; #endif } #undef SRC_ADDRESS_ADVANCES } // Instantiate them template void convert_rgb_to_rgbp_avx2(const BYTE *srcp, BYTE * (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height); template void convert_rgb_to_rgbp_avx2(const BYTE *srcp, BYTE * (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height); template void convert_rgb_to_rgbp_avx2(const BYTE *srcp, BYTE * (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height); template void convert_rgb_to_rgbp_avx2(const BYTE *srcp, BYTE * (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height); template void convert_rgba_to_rgbp_avx2(const BYTE* srcp, BYTE* (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height) { const int pixels_per_iter = (sizeof(pixel_t) == 1) ? 16 : 8; // 8-bit: process 16 pixels per loop (64 bytes in -> four 16-byte stores out) // 16-bit: process 8 pixels per loop (64 bytes in -> four 16-byte stores out) __m128i mask128; if constexpr (sizeof(pixel_t) == 1) mask128 = _mm_set_epi8(15, 11, 7, 3, 14, 10, 6, 2, 13, 9, 5, 1, 12, 8, 4, 0); else mask128 = _mm_set_epi8(15, 14, 7, 6, 13, 12, 5, 4, 11, 10, 3, 2, 9, 8, 1, 0); __m256i vmask = _mm256_broadcastsi128_si256(mask128); // Avisynth's scanline alignment is 64 bytes, so no remainder hanfling is needed for 16 RGB32 or 8 RGB64 pixels for (int y = 0; y < height; ++y) { for (int x = 0; x < width; x += pixels_per_iter) { __m256i srcA = _mm256_load_si256(reinterpret_cast(srcp + x * 4 * sizeof(pixel_t))); __m256i srcB = _mm256_load_si256(reinterpret_cast(srcp + (x + pixels_per_iter / 2) * 4 * sizeof(pixel_t))); __m256i shufA = _mm256_shuffle_epi8(srcA, vmask); __m256i shufB = _mm256_shuffle_epi8(srcB, vmask); __m128i a_lo = _mm256_castsi256_si128(shufA); __m128i a_hi = _mm256_extracti128_si256(shufA, 1); __m128i b_lo = _mm256_castsi256_si128(shufB); __m128i b_hi = _mm256_extracti128_si256(shufB, 1); __m128i bg_0 = _mm_unpacklo_epi32(a_lo, a_hi); __m128i ra_0 = _mm_unpackhi_epi32(a_lo, a_hi); __m128i bg_1 = _mm_unpacklo_epi32(b_lo, b_hi); __m128i ra_1 = _mm_unpackhi_epi32(b_lo, b_hi); __m128i chB = _mm_unpacklo_epi64(bg_0, bg_1); __m128i chG = _mm_unpackhi_epi64(bg_0, bg_1); __m128i chR = _mm_unpacklo_epi64(ra_0, ra_1); __m128i chA = _mm_unpackhi_epi64(ra_0, ra_1); _mm_store_si128(reinterpret_cast<__m128i*>(dstp[1] + x * sizeof(pixel_t)), chB); _mm_store_si128(reinterpret_cast<__m128i*>(dstp[0] + x * sizeof(pixel_t)), chG); _mm_store_si128(reinterpret_cast<__m128i*>(dstp[2] + x * sizeof(pixel_t)), chR); if constexpr (targetHasAlpha) _mm_store_si128(reinterpret_cast<__m128i*>(dstp[3] + x * sizeof(pixel_t)), chA); } srcp -= src_pitch; // source packed RGB is upside down dstp[0] += dst_pitch[0]; dstp[1] += dst_pitch[1]; dstp[2] += dst_pitch[2]; if constexpr (targetHasAlpha) dstp[3] += dst_pitch[3]; } } // Instantiate them template void convert_rgba_to_rgbp_avx2(const BYTE* srcp, BYTE* (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height); template void convert_rgba_to_rgbp_avx2(const BYTE* srcp, BYTE* (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height); template void convert_rgba_to_rgbp_avx2(const BYTE* srcp, BYTE* (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height); template void convert_rgba_to_rgbp_avx2(const BYTE* srcp, BYTE* (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height); ================================================ FILE: avs_core/convert/intel/convert_rgb_avx2.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __Convert_RGB_AVX2_H__ #define __Convert_RGB_AVX2_H__ #include template void convert_rgb_to_rgbp_avx2(const BYTE *srcp, BYTE * (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height); template void convert_rgba_to_rgbp_avx2(const BYTE* srcp, BYTE* (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height); #endif // __Convert_RGB_AVX2_H__ ================================================ FILE: avs_core/convert/intel/convert_rgb_avx512.cpp ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include #include #include #include "../../filters/intel/check_avx512.h" // compiler avx512 directives check #include "convert_rgb_avx512.h" #include // Includes AVX-512 intrinsics template void convert_rgba_to_rgbp_avx512vbmi(const BYTE *srcp, BYTE * (&dstp)[4], int src_pitch, int (&dst_pitch)[4], int width, int height) { // 8-bit: 16 BGRA8 pixels = 64 bytes fits in one ZMM // 16-bit: 8 BGRA16 pixels = 64 bytes fits in one ZMM const int pixels_at_a_time = (sizeof(pixel_t) == 1) ? 16 : 8; // Build the vpermb index vector, constant, computed once __m512i perm; if constexpr (sizeof(pixel_t) == 1) { // B channel: bytes 0,4,8,...,60 (stride 4, offset 0) // G channel: bytes 1,5,9,...,61 (stride 4, offset 1) // R channel: bytes 2,6,10,...,62 (stride 4, offset 2) // A channel: bytes 3,7,11,...,63 (stride 4, offset 3) alignas(64) uint8_t idx[64]; for (int i = 0; i < 16; i++) idx[i] = i * 4 + 0; // B for (int i = 0; i < 16; i++) idx[16+i] = i * 4 + 1; // G for (int i = 0; i < 16; i++) idx[32+i] = i * 4 + 2; // R for (int i = 0; i < 16; i++) idx[48+i] = i * 4 + 3; // A perm = _mm512_load_si512(reinterpret_cast(idx)); } else { alignas(64) uint8_t idx[64]; for (int i = 0; i < 8; i++) { idx[i * 2 + 0] = (uint8_t)(i * 8 + 0); // B low byte idx[i * 2 + 1] = (uint8_t)(i * 8 + 1); // B high byte idx[16 + i * 2 + 0] = (uint8_t)(i * 8 + 2); // G low byte idx[16 + i * 2 + 1] = (uint8_t)(i * 8 + 3); // G high byte idx[32 + i * 2 + 0] = (uint8_t)(i * 8 + 4); // R low byte idx[32 + i * 2 + 1] = (uint8_t)(i * 8 + 5); // R high byte idx[48 + i * 2 + 0] = (uint8_t)(i * 8 + 6); // A low byte idx[48 + i * 2 + 1] = (uint8_t)(i * 8 + 7); // A high byte } perm = _mm512_load_si512(reinterpret_cast(idx)); } // No remainder: BGRA source is 4 bytes/pixel, 64-byte aligned scanlines guarantee width is a multiple of 16 (8-bit) or 8 (16-bit) for (int y = height; y > 0; --y) { for (int x = 0; x < width; x += pixels_at_a_time) { __m512i src = _mm512_load_si512( reinterpret_cast(srcp + x * 4 * sizeof(pixel_t))); // 64-byte cross-lane permutation // Result layout: // bytes 0-15: B0..B15 (8-bit) or B0..B7 as pairs (16-bit) // bytes 16-31: G channel // bytes 32-47: R channel // bytes 48-63: A channel __m512i result = _mm512_permutexvar_epi8(perm, src); // Extract each 128-bit quarter and store // _mm512_extracti32x4_epi32: extract 128-bit lane 0,1,2,3 __m128i B = _mm512_extracti32x4_epi32(result, 0); __m128i G = _mm512_extracti32x4_epi32(result, 1); __m128i R = _mm512_extracti32x4_epi32(result, 2); __m128i A = _mm512_extracti32x4_epi32(result, 3); _mm_store_si128(reinterpret_cast<__m128i *>(dstp[1] + x * sizeof(pixel_t)), B); _mm_store_si128(reinterpret_cast<__m128i *>(dstp[0] + x * sizeof(pixel_t)), G); _mm_store_si128(reinterpret_cast<__m128i *>(dstp[2] + x * sizeof(pixel_t)), R); if constexpr (targetHasAlpha) _mm_store_si128(reinterpret_cast<__m128i *>(dstp[3] + x * sizeof(pixel_t)), A); } srcp -= src_pitch; dstp[0] += dst_pitch[0]; dstp[1] += dst_pitch[1]; dstp[2] += dst_pitch[2]; if constexpr (targetHasAlpha) dstp[3] += dst_pitch[3]; } } // Instantiations template void convert_rgba_to_rgbp_avx512vbmi(const BYTE* srcp, BYTE* (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height); template void convert_rgba_to_rgbp_avx512vbmi(const BYTE* srcp, BYTE* (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height); template void convert_rgba_to_rgbp_avx512vbmi(const BYTE* srcp, BYTE* (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height); template void convert_rgba_to_rgbp_avx512vbmi(const BYTE* srcp, BYTE* (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height); ================================================ FILE: avs_core/convert/intel/convert_rgb_avx512.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __Convert_RGB_AVX512_H__ #define __Convert_RGB_AVX512_H__ #include template void convert_rgba_to_rgbp_avx512vbmi(const BYTE* srcp, BYTE* (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height); #endif // __Convert_RGB_AVX512_H__ ================================================ FILE: avs_core/convert/intel/convert_rgb_sse.cpp ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include "../convert_rgb.h" // Intrinsics base header + really required extension headers #if defined(_MSC_VER) #include // MSVC #else #include // GCC/MinGW/Clang/LLVM #endif #include // SSSE3 #include #if defined(GCC) || defined(CLANG) __attribute__((__target__("ssse3"))) #endif void convert_rgb48_to_rgb64_ssse3(const BYTE *srcp, BYTE *dstp, size_t src_pitch, size_t dst_pitch, size_t width, size_t height) { size_t mod16_width = sizeof(uint16_t)*(width & (~size_t(7))); __m128i mask0 = _mm_set_epi8((char)0x80, (char)0x80, 11, 10, 9, 8, 7, 6, (char)0x80, (char)0x80, 5, 4, 3, 2, 1, 0); __m128i mask1 = _mm_set_epi8((char)0x80, (char)0x80, 15, 14, 13, 12, 11, 10, (char)0x80, (char)0x80, 9, 8, 7, 6, 5, 4); __m128i alpha = _mm_set_epi32(0xFFFF0000,0x00000000,0xFFFF0000,0x00000000); for (size_t y = 0; y < height; ++y) { for (size_t x = 0; x < mod16_width; x+= 16) { __m128i src0 = _mm_load_si128(reinterpret_cast(srcp+x*3)); // 7... ...0 // B G|R B G R B G #0 #1 (#2) x*3+0 // G R B G|R B G R (#2) #3 #4 (#5) x*3+16 // R B G R B G|R B (#5) #6 #7 x*3+32 __m128i dst = _mm_or_si128(alpha, _mm_shuffle_epi8(src0, mask0)); _mm_stream_si128(reinterpret_cast<__m128i*>(dstp+4*x), dst); __m128i src1 = _mm_load_si128(reinterpret_cast(srcp+x*3+16)); __m128i tmp = _mm_alignr_epi8(src1, src0, 12); dst = _mm_or_si128(alpha, _mm_shuffle_epi8(tmp, mask0)); _mm_stream_si128(reinterpret_cast<__m128i*>(dstp+x*4+16), dst); __m128i src2 = _mm_load_si128(reinterpret_cast(srcp+x*3+32)); tmp = _mm_alignr_epi8(src2, src1, 8); dst = _mm_or_si128(alpha, _mm_shuffle_epi8(tmp, mask0)); _mm_stream_si128(reinterpret_cast<__m128i*>(dstp+x*4+32), dst); dst = _mm_or_si128(alpha, _mm_shuffle_epi8(src2, mask1)); _mm_stream_si128(reinterpret_cast<__m128i*>(dstp+x*4+48), dst); } for (size_t x = mod16_width/sizeof(uint16_t); x < width; ++x) { reinterpret_cast(dstp)[x*4+0] = reinterpret_cast(srcp)[x*3+0]; reinterpret_cast(dstp)[x*4+1] = reinterpret_cast(srcp)[x*3+1]; reinterpret_cast(dstp)[x*4+2] = reinterpret_cast(srcp)[x*3+2]; reinterpret_cast(dstp)[x*4+3] = 65535; } srcp += src_pitch; dstp += dst_pitch; } } #if defined(GCC) || defined(CLANG) __attribute__((__target__("ssse3"))) #endif void convert_rgb24_to_rgb32_ssse3(const BYTE *srcp, BYTE *dstp, size_t src_pitch, size_t dst_pitch, size_t width, size_t height) { size_t mod16_width = (width + 3) & (~size_t(15)); //when the modulo is more than 13, a problem does not happen __m128i mask0 = _mm_set_epi8((char)0x80, 11, 10, 9, (char)0x80, 8, 7, 6, (char)0x80, 5, 4, 3, (char)0x80, 2, 1, 0); __m128i mask1 = _mm_set_epi8((char)0x80, 15, 14, 13, (char)0x80, 12, 11, 10, (char)0x80, 9, 8, 7, (char)0x80, 6, 5, 4); __m128i alpha = _mm_set1_epi32(0xFF000000); for (size_t y = 0; y < height; ++y) { for (size_t x = 0; x < mod16_width; x+= 16) { __m128i src0 = _mm_load_si128(reinterpret_cast(srcp+x*3)); __m128i dst = _mm_or_si128(alpha, _mm_shuffle_epi8(src0, mask0)); _mm_stream_si128(reinterpret_cast<__m128i*>(dstp+4*x), dst); __m128i src1 = _mm_load_si128(reinterpret_cast(srcp+x*3+16)); __m128i tmp = _mm_alignr_epi8(src1, src0, 12); dst = _mm_or_si128(alpha, _mm_shuffle_epi8(tmp, mask0)); _mm_stream_si128(reinterpret_cast<__m128i*>(dstp+x*4+16), dst); __m128i src2 = _mm_load_si128(reinterpret_cast(srcp+x*3+32)); tmp = _mm_alignr_epi8(src2, src1, 8); dst = _mm_or_si128(alpha, _mm_shuffle_epi8(tmp, mask0)); _mm_stream_si128(reinterpret_cast<__m128i*>(dstp+x*4+32), dst); dst = _mm_or_si128(alpha, _mm_shuffle_epi8(src2, mask1)); _mm_stream_si128(reinterpret_cast<__m128i*>(dstp+x*4+48), dst); } for (size_t x = mod16_width; x < width; ++x) { dstp[x*4+0] = srcp[x*3+0]; dstp[x*4+1] = srcp[x*3+1]; dstp[x*4+2] = srcp[x*3+2]; dstp[x*4+3] = 255; } srcp += src_pitch; dstp += dst_pitch; } } #if defined(GCC) || defined(CLANG) __attribute__((__target__("ssse3"))) #endif void convert_rgb64_to_rgb48_ssse3(const BYTE *srcp, BYTE *dstp, size_t src_pitch, size_t dst_pitch, size_t width, size_t height) { size_t mod16_width = sizeof(uint16_t) * ((width) & (~size_t(7))); // perhaps width+2 is still o.k __m128i mask0 = _mm_set_epi8(13, 12, 11, 10, 9, 8, 5, 4, 3, 2, 1, 0, 15, 14, 7, 6); // BBGGRRBBGGRRAAAA __m128i mask1 = _mm_set_epi8(15, 14, 7, 6, 13, 12, 11, 10, 9, 8, 5, 4, 3, 2, 1, 0); // AAAABBGGRRBBGGRR for (size_t y = 0; y < height; ++y) { for (size_t x = 0; x < mod16_width; x+= 16) { __m128i src0 = _mm_load_si128(reinterpret_cast(srcp+x*4)); //a1b1 g1r1 a0b0 g0r0 __m128i src1 = _mm_load_si128(reinterpret_cast(srcp+x*4+16)); //a3b3 g3r3 a2b2 g2r2 src0 = _mm_shuffle_epi8(src0, mask0); //b1g1 r1b0 g0r0 a1a0 src1 = _mm_shuffle_epi8(src1, mask1); //a3a2 b3g3 r3b2 g2r2 __m128i dst = _mm_alignr_epi8(src1, src0, 4); //g2r2 b1g1 r1b0 g0r0 _mm_stream_si128(reinterpret_cast<__m128i*>(dstp+x*3), dst); src0 = _mm_slli_si128(src1, 4); // b3g3 r3b2 g2r2 XXXX src1 = _mm_load_si128(reinterpret_cast(srcp + x * 4 + 32)); // a5b5 g5r5 a4b4 g4r4 src1 = _mm_shuffle_epi8(src1, mask1); // a5a4 b5g5 r5b4 g4r4 dst = _mm_alignr_epi8(src1, src0, 8); // r5b4 g4r4 b3g3 r3b2 _mm_stream_si128(reinterpret_cast<__m128i*>(dstp+x*3+16), dst); src0 = _mm_slli_si128(src1, 4); // b5g5 r5b4 g4r4 XXXX src1 = _mm_load_si128(reinterpret_cast(srcp+x*4+48)); // a7b7 g7r7 a6b6 g6r6 src1 = _mm_shuffle_epi8(src1, mask1); // a7a6 b7g7 r7b6 g6r6 dst = _mm_alignr_epi8(src1, src0, 12); // b7g7 r7b6 g6r6 b5g5 _mm_stream_si128(reinterpret_cast<__m128i*>(dstp+x*3+32), dst); } for (size_t x = mod16_width/sizeof(uint16_t); x < width; ++x) { reinterpret_cast(dstp)[x*3+0] = reinterpret_cast(srcp)[x*4+0]; reinterpret_cast(dstp)[x*3+1] = reinterpret_cast(srcp)[x*4+1]; reinterpret_cast(dstp)[x*3+2] = reinterpret_cast(srcp)[x*4+2]; } srcp += src_pitch; dstp += dst_pitch; } } //todo: think how to port to sse2 without tons of shuffles or (un)packs #if defined(GCC) || defined(CLANG) __attribute__((__target__("ssse3"))) #endif void convert_rgb32_to_rgb24_ssse3(const BYTE *srcp, BYTE *dstp, size_t src_pitch, size_t dst_pitch, size_t width, size_t height) { size_t mod16_width = (width + 3) & (~size_t(15)); //when the modulo is more than 13, a problem does not happen __m128i mask0 = _mm_set_epi8(14, 13, 12, 10, 9, 8, 6, 5, 4, 2, 1, 0, 15, 11, 7, 3); __m128i mask1 = _mm_set_epi8(15, 11, 7, 3, 14, 13, 12, 10, 9, 8, 6, 5, 4, 2, 1, 0); for (size_t y = 0; y < height; ++y) { for (size_t x = 0; x < mod16_width; x+= 16) { __m128i src0 = _mm_load_si128(reinterpret_cast(srcp+x*4)); //a3b3 g3r3 a2b2 g2r2 a1b1 g1r1 a0b0 g0r0 __m128i src1 = _mm_load_si128(reinterpret_cast(srcp+x*4+16)); //a7b7 g7r7 a6b6 g6r6 a5b5 g5r5 a4b4 g4r4 src0 = _mm_shuffle_epi8(src0, mask0); //b3g3 r3b2 g2r2 b1g1 r1b0 g0r0 a3a2 a1a0 src1 = _mm_shuffle_epi8(src1, mask1); //a7a6 a5a4 b7g7 r7b6 g6r6 b5g5 r5b4 g4r4 __m128i dst = _mm_alignr_epi8(src1, src0, 4); //r5b4 g4r4 b3g3 r3b2 g2r2 b1g1 r1b0 g0r0 _mm_stream_si128(reinterpret_cast<__m128i*>(dstp+x*3), dst); src0 = _mm_slli_si128(src1, 4); //b7g7 r7b6 g6r6 b5g5 r5b4 g4r4 XXXX XXXX src1 = _mm_load_si128(reinterpret_cast(srcp + x * 4 + 32)); //aBbB gBrB aAbA gArA a9b9 g9r9 a8b8 g8r8 src1 = _mm_shuffle_epi8(src1, mask1); //aBaA a9a8 bBgB rBbA gArA b9g9 r9b8 g8r8 dst = _mm_alignr_epi8(src1, src0, 8); //gArA b9g9 r9b8 g8r8 b7g7 r7b6 g6r6 b5g5 _mm_stream_si128(reinterpret_cast<__m128i*>(dstp+x*3+16), dst); src0 = _mm_slli_si128(src1, 4); //bBgB rBbA gArA b9g9 r9b8 g8r8 XXXX XXXX src1 = _mm_load_si128(reinterpret_cast(srcp+x*4+48)); //aFbF gFrF aEbE gErE aDbD gDrD aCbC gCrC src1 = _mm_shuffle_epi8(src1, mask1); //aFaE aDaC bFgF rFbE gErE bDgD rDbC gCrC dst = _mm_alignr_epi8(src1, src0, 12); //bFgF rFbE gErE bDgD rDbC gCrC bBgB rBbA _mm_stream_si128(reinterpret_cast<__m128i*>(dstp+x*3+32), dst); } for (size_t x = mod16_width; x < width; ++x) { dstp[x*3+0] = srcp[x*4+0]; dstp[x*3+1] = srcp[x*4+1]; dstp[x*3+2] = srcp[x*4+2]; } srcp += src_pitch; dstp += dst_pitch; } } void convert_rgb32_to_rgb24_sse2(const BYTE* srcp, BYTE* dstp, size_t src_pitch, size_t dst_pitch, size_t width, size_t height) { size_t mod4_width = width & (~size_t(3)); for (size_t y = 0; y < height; ++y) { for (size_t x = 0; x < mod4_width; x += 4) { // Load 4 pixels (16 bytes) __m128i src = _mm_loadu_si128(reinterpret_cast(srcp + x * 4)); // Pixel 0 (bytes 0,1,2) and Pixel 1 (bytes 4,5,6) // Goal: [ 00 00 r1 g1 b1 r0 g0 b0 ] in the low 64 bits __m128i p0 = _mm_and_si128(src, _mm_set_epi32(0, 0, 0, 0x00FFFFFF)); __m128i p1 = _mm_and_si128(src, _mm_set_epi32(0, 0, 0x00FFFFFF, 0)); __m128i dst01 = _mm_or_si128(p0, _mm_srli_si128(p1, 1)); // Pixel 2 (bytes 8,9,10) and Pixel 3 (bytes 12,13,14) __m128i p2 = _mm_and_si128(src, _mm_set_epi32(0, 0x00FFFFFF, 0, 0)); __m128i p3 = _mm_and_si128(src, _mm_set_epi32(0x00FFFFFF, 0, 0, 0)); // Shift p2 down to byte 6 and p3 down to byte 9 __m128i dst23 = _mm_or_si128(_mm_srli_si128(p2, 2), _mm_srli_si128(p3, 3)); // Combine them __m128i final = _mm_or_si128(dst01, dst23); // final now contains: [ B3 G3 R3 | B2 G2 R2 | B1 G1 R1 | B0 G0 R0 ] // In the first 12 bytes. // We store 8 bytes (64-bit) then 4 bytes (32-bit) _mm_storel_epi64(reinterpret_cast<__m128i*>(dstp + x * 3), final); *reinterpret_cast(dstp + x * 3 + 8) = _mm_cvtsi128_si32(_mm_srli_si128(final, 8)); } // Standard remainder loop for (size_t x = mod4_width; x < width; ++x) { dstp[x * 3 + 0] = srcp[x * 4 + 0]; dstp[x * 3 + 1] = srcp[x * 4 + 1]; dstp[x * 3 + 2] = srcp[x * 4 + 2]; } srcp += src_pitch; dstp += dst_pitch; } } // ============================================================ // SSE2 emulation of _mm_alignr_epi8(hi, lo, N) // Concatenates [hi:lo] as 32 bytes, returns bytes [N..N+15] // ============================================================ template static AVS_FORCEINLINE __m128i sse2_alignr(__m128i hi, __m128i lo) { return _mm_or_si128(_mm_srli_si128(lo, N), _mm_slli_si128(hi, 16 - N)); } // ============================================================ // 8-bit helper: gather B, G, R from 4 BGR8 pixels // // Input 'grp': low 12 bytes hold 4 BGR8 pixels // byte: 0 1 2 3 4 5 6 7 8 9 10 11 // data: B0 G0 R0 B1 G1 R1 B2 G2 R2 B3 G3 R3 // // Output bOut, gOut, rOut: valid bytes in positions 0..3 only // bOut[0..3] = B0 B1 B2 B3 // gOut[0..3] = G0 G1 G2 G3 // rOut[0..3] = R0 R1 R2 R3 // ============================================================ static AVS_FORCEINLINE void gather_bgr8_4px(__m128i grp, __m128i& bOut, __m128i& gOut, __m128i& rOut) { // B is at bytes 0, 3, 6, 9. We shift them to 0, 1, 2, 3. __m128i b = _mm_and_si128(grp, _mm_set_epi32(0, 0, 0, 0x000000FF)); // B0 b = _mm_or_si128(b, _mm_and_si128(_mm_srli_si128(grp, 2), _mm_set_epi32(0, 0, 0, 0x0000FF00))); // B1 b = _mm_or_si128(b, _mm_and_si128(_mm_srli_si128(grp, 4), _mm_set_epi32(0, 0, 0, 0x00FF0000))); // B2 b = _mm_or_si128(b, _mm_and_si128(_mm_srli_si128(grp, 6), _mm_set_epi32(0, 0, 0, 0xFF000000))); // B3 bOut = b; // G is at bytes 1, 4, 7, 10. __m128i g = _mm_and_si128(_mm_srli_si128(grp, 1), _mm_set_epi32(0, 0, 0, 0x000000FF)); // G0 g = _mm_or_si128(g, _mm_and_si128(_mm_srli_si128(grp, 3), _mm_set_epi32(0, 0, 0, 0x0000FF00))); // G1 g = _mm_or_si128(g, _mm_and_si128(_mm_srli_si128(grp, 5), _mm_set_epi32(0, 0, 0, 0x00FF0000))); // G2 g = _mm_or_si128(g, _mm_and_si128(_mm_srli_si128(grp, 7), _mm_set_epi32(0, 0, 0, 0xFF000000))); // G3 gOut = g; // R is at bytes 2, 5, 8, 11. __m128i r = _mm_and_si128(_mm_srli_si128(grp, 2), _mm_set_epi32(0, 0, 0, 0x000000FF)); // R0 r = _mm_or_si128(r, _mm_and_si128(_mm_srli_si128(grp, 4), _mm_set_epi32(0, 0, 0, 0x0000FF00))); // R1 r = _mm_or_si128(r, _mm_and_si128(_mm_srli_si128(grp, 6), _mm_set_epi32(0, 0, 0, 0x00FF0000))); // R2 r = _mm_or_si128(r, _mm_and_si128(_mm_srli_si128(grp, 8), _mm_set_epi32(0, 0, 0, 0xFF000000))); // R3 rOut = r; } // ============================================================ // 8-bit: deinterleave 16 BGR8 pixels from 3 × 16-byte registers // into full 16-byte B, G, R output registers // ============================================================ static AVS_FORCEINLINE void deinterleave_bgr8_16px( __m128i r0, __m128i r1, __m128i r2, __m128i& B, __m128i& G, __m128i& R) { // Split 48-byte stream into 4 groups of 12 bytes (4 pixels each), // each aligned to byte 0 of a 128-bit register: // group0: r0[0..11] // group1: r0[12..15] ++ r1[0..7] = alignr(r1, r0, 12) // group2: r1[8..15] ++ r2[0..3] = alignr(r2, r1, 8) // group3: r2[4..15] = srli(r2, 4) __m128i g0 = r0; __m128i g1 = sse2_alignr<12>(r1, r0); __m128i g2 = sse2_alignr<8>(r2, r1); __m128i g3 = _mm_srli_si128(r2, 4); // Extract channels from each group (4 valid bytes each in positions 0..3) __m128i B0, G0, R0, B1, G1, R1, B2, G2, R2, B3, G3, R3; gather_bgr8_4px(g0, B0, G0, R0); gather_bgr8_4px(g1, B1, G1, R1); gather_bgr8_4px(g2, B2, G2, R2); gather_bgr8_4px(g3, B3, G3, R3); // Combine 4 groups × 4 bytes into one 16-byte register per channel. // Each Bx/Gx/Rx has its 4 bytes in the low dword (bytes 0..3). // unpacklo_epi32 interleaves low dwords of two registers: // unpacklo_epi32(A, B) = [A.dw0, B.dw0, A.dw1, B.dw1] // unpacklo_epi64 combines low qwords: // unpacklo_epi64(A, B) = [A.qw0, B.qw0] __m128i B01 = _mm_unpacklo_epi32(B0, B1); // [B_g0(4B), B_g1(4B), ...] __m128i B23 = _mm_unpacklo_epi32(B2, B3); B = _mm_unpacklo_epi64(B01, B23); // all 16 B bytes __m128i G01 = _mm_unpacklo_epi32(G0, G1); __m128i G23 = _mm_unpacklo_epi32(G2, G3); G = _mm_unpacklo_epi64(G01, G23); __m128i R01 = _mm_unpacklo_epi32(R0, R1); __m128i R23 = _mm_unpacklo_epi32(R2, R3); R = _mm_unpacklo_epi64(R01, R23); } // ============================================================ // 16-bit helper: gather B, G, R from 2 BGR16 pixels // // Input 'grp': low 12 bytes hold 2 BGR16 pixels // word: 0 1 2 3 4 5 // data: B0 G0 R0 B1 G1 R1 // // Output bOut, gOut, rOut: valid words in positions 0..1 only // bOut[0..1] = B0 B1 // gOut[0..1] = G0 G1 // rOut[0..1] = R0 R1 // ============================================================ static AVS_FORCEINLINE void gather_bgr16_2px(__m128i grp, __m128i& bOut, __m128i& gOut, __m128i& rOut) { // Words in grp: B0 G0 R0 B1 G1 R1 x x // Blue: w0, w3. Use shuffle to bring them to low dword. bOut = _mm_shufflelo_epi16(grp, _MM_SHUFFLE(3, 3, 3, 0)); // Green: w1, w4. gOut = _mm_shufflelo_epi16(_mm_srli_si128(grp, 2), _MM_SHUFFLE(3, 3, 3, 0)); // Red: w2, w5. rOut = _mm_shufflelo_epi16(_mm_srli_si128(grp, 4), _MM_SHUFFLE(3, 3, 3, 0)); // Mask out the upper 3 dwords if necessary (though unpacklo handles it) __m128i mask = _mm_set_epi32(0, 0, 0, 0xFFFFFFFF); bOut = _mm_and_si128(bOut, mask); gOut = _mm_and_si128(gOut, mask); rOut = _mm_and_si128(rOut, mask); } // ============================================================ // 16-bit: deinterleave 8 BGR16 pixels from 3 × 16-byte registers // into full 16-byte B, G, R output registers // ============================================================ static AVS_FORCEINLINE void deinterleave_bgr16_8px( __m128i r0, __m128i r1, __m128i r2, __m128i& B, __m128i& G, __m128i& R) { // Same group extraction as 8-bit case (48 bytes, same offsets) __m128i g0 = r0; __m128i g1 = sse2_alignr<12>(r1, r0); __m128i g2 = sse2_alignr<8>(r2, r1); __m128i g3 = _mm_srli_si128(r2, 4); // Each group: 12 bytes = 6 words = 2 BGR16 pixels // Each output xB/xG/xR has 2 valid words (4 bytes) in dword 0 __m128i B0, G0, R0, B1, G1, R1, B2, G2, R2, B3, G3, R3; gather_bgr16_2px(g0, B0, G0, R0); gather_bgr16_2px(g1, B1, G1, R1); gather_bgr16_2px(g2, B2, G2, R2); gather_bgr16_2px(g3, B3, G3, R3); // Combine: 4 groups × 2 words = 8 words = 16 bytes per channel __m128i B01 = _mm_unpacklo_epi32(B0, B1); __m128i B23 = _mm_unpacklo_epi32(B2, B3); B = _mm_unpacklo_epi64(B01, B23); __m128i G01 = _mm_unpacklo_epi32(G0, G1); __m128i G23 = _mm_unpacklo_epi32(G2, G3); G = _mm_unpacklo_epi64(G01, G23); __m128i R01 = _mm_unpacklo_epi32(R0, R1); __m128i R23 = _mm_unpacklo_epi32(R2, R3); R = _mm_unpacklo_epi64(R01, R23); } // ============================================================ // Main conversion function // ============================================================ // RGB24/48 -> RGBP(A)8/16 SSE2 implementation. Ugly and not very quick. template void convert_rgb_to_rgbp_sse2(const BYTE* srcp, BYTE* (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height) { const int pixels_at_a_time = (sizeof(pixel_t) == 1) ? 16 : 8; const int wmod = (width / pixels_at_a_time) * pixels_at_a_time; __m128i max_pixel_value; if constexpr (sizeof(pixel_t) == 1) max_pixel_value = _mm_set1_epi8((char)0xFF); else max_pixel_value = _mm_set1_epi16((short)0xFFFF); for (int y = height; y > 0; --y) { for (int x = 0; x < wmod; x += pixels_at_a_time) { const BYTE* src = srcp + x * 3 * sizeof(pixel_t); __m128i r0 = _mm_load_si128(reinterpret_cast(src)); __m128i r1 = _mm_load_si128(reinterpret_cast(src + 16)); __m128i r2 = _mm_load_si128(reinterpret_cast(src + 32)); __m128i B, G, R; if constexpr (sizeof(pixel_t) == 1) deinterleave_bgr8_16px(r0, r1, r2, B, G, R); else deinterleave_bgr16_8px(r0, r1, r2, B, G, R); _mm_store_si128(reinterpret_cast<__m128i*>(dstp[1] + x * sizeof(pixel_t)), B); _mm_store_si128(reinterpret_cast<__m128i*>(dstp[0] + x * sizeof(pixel_t)), G); _mm_store_si128(reinterpret_cast<__m128i*>(dstp[2] + x * sizeof(pixel_t)), R); if constexpr (targetHasAlpha) _mm_store_si128(reinterpret_cast<__m128i*>(dstp[3] + x * sizeof(pixel_t)), max_pixel_value); } if (wmod != width) { size_t x = width - pixels_at_a_time; const BYTE* src = srcp + x * 3 * sizeof(pixel_t); __m128i r0 = _mm_loadu_si128(reinterpret_cast(src)); __m128i r1 = _mm_loadu_si128(reinterpret_cast(src + 16)); __m128i r2 = _mm_loadu_si128(reinterpret_cast(src + 32)); __m128i B, G, R; if constexpr (sizeof(pixel_t) == 1) deinterleave_bgr8_16px(r0, r1, r2, B, G, R); else deinterleave_bgr16_8px(r0, r1, r2, B, G, R); _mm_storeu_si128(reinterpret_cast<__m128i*>(dstp[1] + x * sizeof(pixel_t)), B); _mm_storeu_si128(reinterpret_cast<__m128i*>(dstp[0] + x * sizeof(pixel_t)), G); _mm_storeu_si128(reinterpret_cast<__m128i*>(dstp[2] + x * sizeof(pixel_t)), R); if constexpr (targetHasAlpha) _mm_storeu_si128(reinterpret_cast<__m128i*>(dstp[3] + x * sizeof(pixel_t)), max_pixel_value); } srcp -= src_pitch; dstp[0] += dst_pitch[0]; dstp[1] += dst_pitch[1]; dstp[2] += dst_pitch[2]; if constexpr (targetHasAlpha) dstp[3] += dst_pitch[3]; } } // Instantiations template void convert_rgb_to_rgbp_sse2(const BYTE*, BYTE* (&)[4], int, int(&)[4], int, int); template void convert_rgb_to_rgbp_sse2(const BYTE*, BYTE* (&)[4], int, int(&)[4], int, int); template void convert_rgb_to_rgbp_sse2(const BYTE*, BYTE* (&)[4], int, int(&)[4], int, int); template void convert_rgb_to_rgbp_sse2(const BYTE*, BYTE* (&)[4], int, int(&)[4], int, int); // minimum width: 48 bytes template #if defined(GCC) || defined(CLANG) __attribute__((__target__("ssse3"))) #endif void convert_rgb_to_rgbp_ssse3(const BYTE *srcp, BYTE * (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height) { // RGB24: 3x16 bytes cycle, 16*(RGB) 8bit pixels // RGB48: 3x16 bytes cycle, 8*(RGB) 16bit pixels // 0123456789ABCDEF 0123456789ABCDEF 0123456789ABCDEF // BGRBGRBGRBGRBGRB GRBGRBGRBGRBGRBG RBGRBGRBGRBGRBGR // 8 bit // B G R B G R B G R B G R B G R B G R B G R B G R // 16 bit // 1111111111112222 2222222233333333 3333444444444444 const int pixels_at_a_time = (sizeof(pixel_t) == 1) ? 16 : 8; const int wmod = (width / pixels_at_a_time) * pixels_at_a_time; // 8 pixels for 8 bit, 4 pixels for 16 bit __m128i mask; if constexpr(sizeof(pixel_t) == 1) mask = _mm_set_epi8(15, 14, 13, 12, 11, 8, 5, 2, 10, 7, 4, 1, 9, 6, 3, 0); else mask = _mm_set_epi8(15, 14, 13, 12, 11, 10, 5, 4, 9, 8, 3, 2, 7, 6, 1, 0); __m128i max_pixel_value; if constexpr(sizeof(pixel_t) == 1) max_pixel_value = _mm_set1_epi8((char)0xFF); else max_pixel_value = _mm_set1_epi16((short)0xFFFF); // bits_per_pixel is 16 for (int y = height; y > 0; --y) { __m128i BGRA_1, BGRA_2, BGRA_3; for (int x = 0; x < wmod; x += pixels_at_a_time) { BGRA_1 = _mm_load_si128(reinterpret_cast(srcp + x * 48 / pixels_at_a_time)); BGRA_2 = _mm_load_si128(reinterpret_cast(srcp + x * 48 / pixels_at_a_time + 16)); BGRA_3 = _mm_load_si128(reinterpret_cast(srcp + x * 48 / pixels_at_a_time + 32)); auto pack_lo = _mm_shuffle_epi8(BGRA_1, mask); // 111111111111: BBBBGGGGRRRR and rest: BGRB | BBGGRR and rest: BBGG BGRA_1 = _mm_alignr_epi8(BGRA_2, BGRA_1, 12); auto pack_hi = _mm_shuffle_epi8(BGRA_1, mask); // 222222222222: BBBBGGGGRRRR | BBGGRR BGRA_2 = _mm_alignr_epi8(BGRA_3, BGRA_2, 8); auto pack_lo2 = _mm_shuffle_epi8(BGRA_2, mask); // 333333333333: BBBBGGGGRRRR | BBGGRR BGRA_3 = _mm_srli_si128(BGRA_3, 4); // to use the same mask auto pack_hi2 = _mm_shuffle_epi8(BGRA_3, mask); // 444444444444: BBBBGGGGRRRR | BBGGRR __m128i BG1 = _mm_unpacklo_epi32(pack_lo, pack_hi); // BBBB_lo BBBB_hi GGGG_lo GGGG_hi __m128i BG2 = _mm_unpacklo_epi32(pack_lo2, pack_hi2); // BBBB_lo BBBB_hi GGGG_lo GGGG_hi __m128i RA1 = _mm_unpackhi_epi32(pack_lo, pack_hi); // RRRR_lo RRRR_hi AAAA_lo AAAA_hi __m128i RA2 = _mm_unpackhi_epi32(pack_lo2, pack_hi2); // RRRR_lo RRRR_hi AAAA_lo AAAA_hi __m128i B = _mm_unpacklo_epi64(BG1, BG2); _mm_store_si128(reinterpret_cast<__m128i *>(dstp[1] + x * sizeof(pixel_t)), B); // B __m128i G = _mm_unpackhi_epi64(BG1, BG2); _mm_store_si128(reinterpret_cast<__m128i *>(dstp[0] + x * sizeof(pixel_t)), G); // G __m128i R = _mm_unpacklo_epi64(RA1, RA2); _mm_store_si128(reinterpret_cast<__m128i *>(dstp[2] + x * sizeof(pixel_t)), R); // R if (targetHasAlpha) _mm_store_si128(reinterpret_cast<__m128i *>(dstp[3] + x * sizeof(pixel_t)), max_pixel_value); // A } // rest, unaligned but simd // RGB24/48 source is 3 bytes/pixel: no power-of-2 stride, 64-byte alignment does not guarantee width is a multiple of 16/8 // So we cannot spare the last chunk if (wmod != width) { // width = 17: 0..7 8..15, 16 // last_start = 1 (9..16 8 pixels) width - pixels_at_a_time size_t x = (width - pixels_at_a_time); BGRA_1 = _mm_loadu_si128(reinterpret_cast(srcp + x * 48 / pixels_at_a_time)); BGRA_2 = _mm_loadu_si128(reinterpret_cast(srcp + x * 48 / pixels_at_a_time + 16)); BGRA_3 = _mm_loadu_si128(reinterpret_cast(srcp + x * 48 / pixels_at_a_time + 32)); auto pack_lo = _mm_shuffle_epi8(BGRA_1, mask); // 111111111111: BBBBGGGGRRRR and rest: BGRB | BBGGRR and rest: BBGG BGRA_1 = _mm_alignr_epi8(BGRA_2, BGRA_1, 12); auto pack_hi = _mm_shuffle_epi8(BGRA_1, mask); // 222222222222: BBBBGGGGRRRR | BBGGRR BGRA_2 = _mm_alignr_epi8(BGRA_3, BGRA_2, 8); auto pack_lo2 = _mm_shuffle_epi8(BGRA_2, mask); // 333333333333: BBBBGGGGRRRR | BBGGRR BGRA_3 = _mm_srli_si128(BGRA_3, 4); // to use the same mask auto pack_hi2 = _mm_shuffle_epi8(BGRA_3, mask); // 444444444444: BBBBGGGGRRRR | BBGGRR __m128i BG1 = _mm_unpacklo_epi32(pack_lo, pack_hi); // BBBB_lo BBBB_hi GGGG_lo GGGG_hi __m128i BG2 = _mm_unpacklo_epi32(pack_lo2, pack_hi2); // BBBB_lo BBBB_hi GGGG_lo GGGG_hi __m128i RA1 = _mm_unpackhi_epi32(pack_lo, pack_hi); // RRRR_lo RRRR_hi AAAA_lo AAAA_hi __m128i RA2 = _mm_unpackhi_epi32(pack_lo2, pack_hi2); // RRRR_lo RRRR_hi AAAA_lo AAAA_hi __m128i B = _mm_unpacklo_epi64(BG1, BG2); _mm_storeu_si128(reinterpret_cast<__m128i *>(dstp[1] + x * sizeof(pixel_t)), B); // B __m128i G = _mm_unpackhi_epi64(BG1, BG2); _mm_storeu_si128(reinterpret_cast<__m128i *>(dstp[0] + x * sizeof(pixel_t)), G); // G __m128i R = _mm_unpacklo_epi64(RA1, RA2); _mm_storeu_si128(reinterpret_cast<__m128i *>(dstp[2] + x * sizeof(pixel_t)), R); // R if (targetHasAlpha) _mm_storeu_si128(reinterpret_cast<__m128i *>(dstp[3] + x * sizeof(pixel_t)), max_pixel_value); // A } srcp -= src_pitch; // source packed RGB is upside down dstp[0] += dst_pitch[0]; dstp[1] += dst_pitch[1]; dstp[2] += dst_pitch[2]; if (targetHasAlpha) dstp[3] += dst_pitch[3]; } } //instantiate //template template void convert_rgb_to_rgbp_ssse3(const BYTE* srcp, BYTE* (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height); template void convert_rgb_to_rgbp_ssse3(const BYTE* srcp, BYTE* (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height); template void convert_rgb_to_rgbp_ssse3(const BYTE* srcp, BYTE* (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height); template void convert_rgb_to_rgbp_ssse3(const BYTE* srcp, BYTE* (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height); // minimum width: 32 bytes (8 RGBA pixels for 8 bits, 4 RGBA pixels for 16 bits) // RGB32/64 -> RGBP(A)8/16 SSE2 implementation. Ugly and not very quick. template void convert_rgba_to_rgbp_sse2(const BYTE* srcp, BYTE* (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height) { const int pixels_at_a_time = (sizeof(pixel_t) == 1) ? 8 : 4; __m128i zero = _mm_setzero_si128(); for (int y = height; y > 0; --y) { // Avisynth's scanline alignment is 64 bytes, so no remainder handling is needed for 8-bit (16 pixels) and 16-bit (8 pixels) formats. for (int x = 0; x < width; x += pixels_at_a_time) { const BYTE* src = srcp + x * 4 * sizeof(pixel_t); __m128i lo = _mm_load_si128(reinterpret_cast(src)); __m128i hi = _mm_load_si128(reinterpret_cast(src + 16)); __m128i ch0, ch1; if constexpr (sizeof(pixel_t) == 1) { __m128i w0 = _mm_unpacklo_epi8(lo, zero); __m128i w1 = _mm_unpackhi_epi8(lo, zero); __m128i c0 = _mm_unpacklo_epi16(w0, w1); __m128i c1 = _mm_unpackhi_epi16(w0, w1); __m128i lo_bg = _mm_unpacklo_epi16(c0, c1); __m128i lo_ra = _mm_unpackhi_epi16(c0, c1); __m128i w2 = _mm_unpacklo_epi8(hi, zero); __m128i w3 = _mm_unpackhi_epi8(hi, zero); __m128i c2 = _mm_unpacklo_epi16(w2, w3); __m128i c3 = _mm_unpackhi_epi16(w2, w3); __m128i hi_bg = _mm_unpacklo_epi16(c2, c3); __m128i hi_ra = _mm_unpackhi_epi16(c2, c3); ch0 = _mm_shuffle_epi32(_mm_packus_epi16(lo_bg, hi_bg), _MM_SHUFFLE(3, 1, 2, 0)); ch1 = _mm_shuffle_epi32(_mm_packus_epi16(lo_ra, hi_ra), _MM_SHUFFLE(3, 1, 2, 0)); } else { __m128i t0 = _mm_unpacklo_epi16(lo, hi); __m128i t1 = _mm_unpackhi_epi16(lo, hi); ch0 = _mm_unpacklo_epi16(t0, t1); ch1 = _mm_unpackhi_epi16(t0, t1); } // Stores 8 byte per channel, so we can use storel_epi64. The high 64 bits of ch0/ch1 are ignored. _mm_storel_epi64(reinterpret_cast<__m128i*>(dstp[1] + x * sizeof(pixel_t)), ch0); // B _mm_storeh_pd(reinterpret_cast(dstp[0] + x * sizeof(pixel_t)),_mm_castsi128_pd(ch0)); // G _mm_storel_epi64(reinterpret_cast<__m128i*>(dstp[2] + x * sizeof(pixel_t)), ch1); // R if constexpr (targetHasAlpha) _mm_storeh_pd(reinterpret_cast(dstp[3] + x * sizeof(pixel_t)), _mm_castsi128_pd(ch1)); // A } srcp -= src_pitch; dstp[0] += dst_pitch[0]; dstp[1] += dst_pitch[1]; dstp[2] += dst_pitch[2]; if constexpr (targetHasAlpha) dstp[3] += dst_pitch[3]; } } // Instantiations template void convert_rgba_to_rgbp_sse2(const BYTE*, BYTE* (&)[4], int, int(&)[4], int, int); template void convert_rgba_to_rgbp_sse2(const BYTE*, BYTE* (&)[4], int, int(&)[4], int, int); template void convert_rgba_to_rgbp_sse2(const BYTE*, BYTE* (&)[4], int, int(&)[4], int, int); template void convert_rgba_to_rgbp_sse2(const BYTE*, BYTE* (&)[4], int, int(&)[4], int, int); template #if defined(GCC) || defined(CLANG) __attribute__((__target__("ssse3"))) #endif void convert_rgba_to_rgbp_ssse3(const BYTE* srcp, BYTE* (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height) { const int pixels_at_a_time = (sizeof(pixel_t) == 1) ? 8 : 4; __m128i mask; if constexpr (sizeof(pixel_t) == 1) mask = _mm_set_epi8(15, 11, 7, 3, 14, 10, 6, 2, 13, 9, 5, 1, 12, 8, 4, 0); else mask = _mm_set_epi8(15, 14, 7, 6, 13, 12, 5, 4, 11, 10, 3, 2, 9, 8, 1, 0); for (int y = height; y > 0; --y) { // Avisynth's scanline alignment is 64 bytes, so no remainder handling is needed for 8 RGB32 or 4 RGB64 pixels for (int x = 0; x < width; x += pixels_at_a_time) { __m128i BGRA_lo = _mm_load_si128(reinterpret_cast(srcp + x * 4 * sizeof(pixel_t))); __m128i BGRA_hi = _mm_load_si128(reinterpret_cast(srcp + x * 4 * sizeof(pixel_t) + 16)); __m128i pack_lo = _mm_shuffle_epi8(BGRA_lo, mask); __m128i pack_hi = _mm_shuffle_epi8(BGRA_hi, mask); __m128i eightbytes_of_pixels = _mm_unpacklo_epi32(pack_lo, pack_hi); _mm_storel_epi64(reinterpret_cast<__m128i*>(dstp[1] + x * sizeof(pixel_t)), eightbytes_of_pixels); // B _mm_storeh_pd(reinterpret_cast(dstp[0] + x * sizeof(pixel_t)), _mm_castsi128_pd(eightbytes_of_pixels)); // G eightbytes_of_pixels = _mm_unpackhi_epi32(pack_lo, pack_hi); _mm_storel_epi64(reinterpret_cast<__m128i*>(dstp[2] + x * sizeof(pixel_t)), eightbytes_of_pixels); // R if constexpr (targetHasAlpha) _mm_storeh_pd(reinterpret_cast(dstp[3] + x * sizeof(pixel_t)), _mm_castsi128_pd(eightbytes_of_pixels)); // A } srcp -= src_pitch; dstp[0] += dst_pitch[0]; dstp[1] += dst_pitch[1]; dstp[2] += dst_pitch[2]; if constexpr (targetHasAlpha) dstp[3] += dst_pitch[3]; } } //instantiate //template template void convert_rgba_to_rgbp_ssse3(const BYTE* srcp, BYTE* (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height); template void convert_rgba_to_rgbp_ssse3(const BYTE* srcp, BYTE* (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height); template void convert_rgba_to_rgbp_ssse3(const BYTE* srcp, BYTE* (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height); template void convert_rgba_to_rgbp_ssse3(const BYTE* srcp, BYTE* (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height); template void convert_rgbp_to_rgba_sse2(const BYTE* (&srcp)[4], BYTE* dstp, int(&src_pitch)[4], int dst_pitch, int width, int height) { const int pixels_at_a_time = 8 / sizeof(pixel_t); // 8x uint8_t, 4x uint16_t const __m128i transparent = _mm_set1_epi8((char)0xFF); // Avisynth's scanline alignment is 64 bytes, so no remainder handling is needed for 8 RGB32 or 4 RGB64 pixels for (int y = 0; y < height; y++) { for (int x = 0; x < width; x += pixels_at_a_time) { __m128i R, G, B, A; G = _mm_loadl_epi64(reinterpret_cast(srcp[0] + x * sizeof(pixel_t))); B = _mm_loadl_epi64(reinterpret_cast(srcp[1] + x * sizeof(pixel_t))); R = _mm_loadl_epi64(reinterpret_cast(srcp[2] + x * sizeof(pixel_t))); if constexpr (hasSrcAlpha) A = _mm_loadl_epi64(reinterpret_cast(srcp[3] + x * sizeof(pixel_t))); else A = transparent; if constexpr (sizeof(pixel_t) == 1) { __m128i BG = _mm_unpacklo_epi8(B, G); __m128i RA = _mm_unpacklo_epi8(R, A); _mm_store_si128(reinterpret_cast<__m128i*>(dstp + x * 4), _mm_unpacklo_epi16(BG, RA)); // pixels 0..3 _mm_store_si128(reinterpret_cast<__m128i*>(dstp + x * 4 + 16), _mm_unpackhi_epi16(BG, RA)); // pixels 4..7 } else { __m128i BG = _mm_unpacklo_epi16(B, G); __m128i RA = _mm_unpacklo_epi16(R, A); _mm_store_si128(reinterpret_cast<__m128i*>(dstp + x * 8), _mm_unpacklo_epi32(BG, RA)); // pixels 0..1 _mm_store_si128(reinterpret_cast<__m128i*>(dstp + x * 8 + 16), _mm_unpackhi_epi32(BG, RA)); // pixels 2..3 } } dstp -= dst_pitch; srcp[0] += src_pitch[0]; srcp[1] += src_pitch[1]; srcp[2] += src_pitch[2]; if constexpr (hasSrcAlpha) srcp[3] += src_pitch[3]; } } //instantiate //template template void convert_rgbp_to_rgba_sse2(const BYTE* (&srcp)[4], BYTE* dstp, int(&src_pitch)[4], int dst_pitch, int width, int height); template void convert_rgbp_to_rgba_sse2(const BYTE* (&srcp)[4], BYTE* dstp, int(&src_pitch)[4], int dst_pitch, int width, int height); template void convert_rgbp_to_rgba_sse2(const BYTE* (&srcp)[4], BYTE* dstp, int(&src_pitch)[4], int dst_pitch, int width, int height); template void convert_rgbp_to_rgba_sse2(const BYTE* (&srcp)[4], BYTE* dstp, int(&src_pitch)[4], int dst_pitch, int width, int height); ================================================ FILE: avs_core/convert/intel/convert_rgb_sse.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __Convert_RGB_sse_H__ #define __Convert_RGB_sse_H__ #include #if defined(GCC) || defined(CLANG) __attribute__((__target__("ssse3"))) #endif void convert_rgb48_to_rgb64_ssse3(const BYTE *srcp, BYTE *dstp, size_t src_pitch, size_t dst_pitch, size_t width, size_t height); #if defined(GCC) || defined(CLANG) __attribute__((__target__("ssse3"))) #endif void convert_rgb24_to_rgb32_ssse3(const BYTE *srcp, BYTE *dstp, size_t src_pitch, size_t dst_pitch, size_t width, size_t height); #if defined(GCC) || defined(CLANG) __attribute__((__target__("ssse3"))) #endif void convert_rgb64_to_rgb48_ssse3(const BYTE *srcp, BYTE *dstp, size_t src_pitch, size_t dst_pitch, size_t width, size_t height); #if defined(GCC) || defined(CLANG) __attribute__((__target__("ssse3"))) #endif void convert_rgb32_to_rgb24_ssse3(const BYTE *srcp, BYTE *dstp, size_t src_pitch, size_t dst_pitch, size_t width, size_t height); void convert_rgb32_to_rgb24_sse2(const BYTE *srcp, BYTE *dstp, size_t src_pitch, size_t dst_pitch, size_t width, size_t height); template #if defined(GCC) || defined(CLANG) __attribute__((__target__("ssse3"))) #endif void convert_rgb_to_rgbp_ssse3(const BYTE *srcp, BYTE * (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height); template void convert_rgb_to_rgbp_sse2(const BYTE* srcp, BYTE* (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height); template #if defined(GCC) || defined(CLANG) __attribute__((__target__("ssse3"))) #endif void convert_rgba_to_rgbp_ssse3(const BYTE *srcp, BYTE * (&dstp)[4], int src_pitch, int (&dst_pitch)[4], int width, int height); template void convert_rgba_to_rgbp_sse2(const BYTE* srcp, BYTE* (&dstp)[4], int src_pitch, int(&dst_pitch)[4], int width, int height); template void convert_rgbp_to_rgba_sse2(const BYTE *(&srcp)[4], BYTE * dstp, int (&src_pitch)[4], int dst_pitch, int width, int height); #endif // __Convert_RGB_sse_H__ ================================================ FILE: avs_core/core/AVSMap.h ================================================ #pragma once /* This program is free software; you can redistribute it and /or modify it under the terms of the GNU General Public License as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Helper structures for frame properties a.k.a VSMap. Based on VapourSynth API4, copyright (c) Fredrik Mellbin */ #include #include #include #include "avisynth.h" #include #include #include #include // VS node ~ Avisynth clip, VSMap-AVSMap // See also in Avisynth.cpp // INTRUSIVE_PTR_H #include template class vs_intrusive_ptr { private: T* obj; public: vs_intrusive_ptr(T* ptr = nullptr, bool add_ref = false) noexcept { obj = ptr; if (add_ref && obj) obj->add_ref(); } vs_intrusive_ptr(const vs_intrusive_ptr& ptr) noexcept { obj = ptr.obj; if (obj) obj->add_ref(); } vs_intrusive_ptr(vs_intrusive_ptr&& ptr) noexcept { obj = ptr.obj; ptr.obj = nullptr; } ~vs_intrusive_ptr() noexcept { if (obj) obj->release(); } vs_intrusive_ptr& operator=(vs_intrusive_ptr const& ptr) noexcept { if (obj) obj->release(); obj = ptr.obj; if (obj) obj->add_ref(); return *this; } T* operator->() const noexcept { return obj; } T& operator*() const noexcept { return *obj; } operator bool() const noexcept { return !!obj; } T* get() const noexcept { return obj; } void reset() noexcept { if (obj) { obj->release(); obj = nullptr; } } void swap(vs_intrusive_ptr& ptr) noexcept { std::swap(obj, ptr.obj); } }; #define AVS_NOEXCEPT noexcept // enums for frame property functions // VS: typedef enum VSPropertyType typedef enum AVSPropertyType { PROPERTYTYPE_UNSET = 0, // ptUnset = 0, PROPERTYTYPE_INT = 1, // ptInt = 1, PROPERTYTYPE_FLOAT = 2, // ptFloat = 2, PROPERTYTYPE_DATA = 3, // ptData = 3, // ptFunction = 4, // Avisynth: functions not supported here PROPERTYTYPE_CLIP = 5, // ptVideoNode = 5, // ptAudioNode = 6, // Avisynth: no special audio clip PROPERTYTYPE_FRAME = 7, // ptVideoFrame = 7, // ptAudioFrame = 8 // Avisynth: no special audio frame } AVSPropertyType; class VSArrayBase { protected: std::atomic refcount; AVSPropertyType ftype; size_t fsize = 0; explicit VSArrayBase(AVSPropertyType type) : refcount(1), ftype(type) {} virtual ~VSArrayBase() {} public: AVSPropertyType type() const { return ftype; } size_t size() const { return fsize; } bool unique() const noexcept { return (refcount == 1); } void add_ref() noexcept { ++refcount; } void release() noexcept { assert(refcount > 0); if (--refcount == 0) delete this; } virtual VSArrayBase* copy() const noexcept = 0; }; typedef vs_intrusive_ptr PVSArrayBase; template class VSArray final : public VSArrayBase { private: T singleData = {}; std::vector data; public: explicit VSArray() noexcept : VSArrayBase(propType) {} explicit VSArray(const VSArray& other) noexcept : VSArrayBase(other.ftype) { fsize = other.fsize; if (fsize == 1) singleData = other.singleData; else if (fsize > 1) data = other.data; } explicit VSArray(const T* val, size_t count) noexcept : VSArrayBase(propType) { // only enable for POD types fsize = count; if (count == 1) { singleData = *val; } else { data.resize(count); memcpy(data.data(), val, sizeof(T) * count); } } virtual VSArrayBase* copy() const noexcept { return new VSArray(*this); } const T* getDataPointer() const noexcept { // only enable for POD types if (fsize == 1) return &singleData; else return data.data(); } void push_back(const T& val) noexcept { if (fsize == 0) { singleData = val; } else if (fsize == 1) { data.reserve(8); data.push_back(std::move(singleData)); data.push_back(val); } else { if (data.capacity() == data.size()) data.reserve(data.capacity() * 2); data.push_back(val); } fsize++; } const T& at(size_t pos) const noexcept { assert(pos < fsize); if (fsize == 1) return singleData; else return data.at(pos); } }; // variant types class VSMapData { public: AVSPropDataTypeHint typeHint; std::string data; }; typedef VSArray VSIntArray; // ptInt typedef VSArray VSFloatArray; // ptFloat typedef VSArray VSDataArray; // ptData typedef VSArray VSVideoNodeArray; // ptVideoNode typedef VSArray VSVideoFrameArray; // ptVideoFrame //typedef VSArray VSFunctionArray; typedef std::vector IntList; typedef std::vector FloatList; typedef std::vector DataList; typedef std::vector ClipList; typedef std::vector FrameList; //typedef std::vector FuncList; class VSMapStorage { private: std::atomic refcount; public: std::map data; bool error; explicit VSMapStorage() : refcount(1), error(false) {} explicit VSMapStorage(const VSMapStorage& s) : refcount(1), data(s.data), error(s.error) { } void clear() noexcept { data.clear(); error = false; } bool unique() noexcept { return (refcount == 1); }; void add_ref() noexcept { ++refcount; } void release() noexcept { assert(refcount > 0); if (--refcount == 0) delete this; } }; typedef vs_intrusive_ptr PVSMapStorage; // This one is referenced in avisynth.h. // For avoiding dual plugin name collisions, renamed VSMap->AVSMap struct AVSMap { private: PVSMapStorage data; public: AVSMap(const AVSMap* map = nullptr) : data(map ? map->data : new VSMapStorage()) { } AVSMap& operator=(const AVSMap& map) { data = map.data; return *this; } bool detach() { if (!data->unique()) { data = new VSMapStorage(*data); return true; } return false; } VSArrayBase* find(const std::string& key) const { auto it = data->data.find(key); return (it == data->data.end()) ? nullptr : it->second.get(); } VSArrayBase* detach(const std::string& key) { detach(); auto it = data->data.find(key); if (it != data->data.end()) { if (!it->second->unique()) it->second = it->second->copy(); return it->second.get(); } return nullptr; } bool erase(const std::string& key) { auto it = data->data.find(key); if (it != data->data.end()) { if (detach()) it = data->data.find(key); data->data.erase(it); return true; } return false; } void insert(const std::string& key, VSArrayBase* val) { detach(); auto it = data->data.find(key); if (it != data->data.end()) { it->second = val; } else { data->data.insert(std::make_pair(key, val)); } } void copy(const AVSMap* src) { if (src == this) return; detach(); for (auto& iter : src->data->data) data->data[iter.first] = iter.second; } size_t size() const { return data->data.size(); } void clear() { if (data->unique()) data->clear(); else data = new VSMapStorage(); } const char* key(size_t n) const { if (n >= size()) return nullptr; auto iter = data->data.cbegin(); std::advance(iter, n); return iter->first.c_str(); } void setError(const std::string& errMsg) { clear(); VSDataArray* arr = new VSDataArray(); arr->push_back({ AVSPropDataTypeHint::PROPDATATYPEHINT_UTF8, errMsg }); // dtUtf8 data->data.insert(std::make_pair("_Error", arr)); data->error = true; } bool hasError() const { return data->error; } const char* getErrorMessage() const { if (data->error) { return reinterpret_cast(data->data.at("_Error").get())->at(0).data.c_str(); } else { return nullptr; } } //bool isV3Compatible() const noexcept; // VS special }; ================================================ FILE: avs_core/core/AviHelper.cpp ================================================ // Avisynth v2.5. Copyright 2007 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include #include "internal.h" #ifdef INTEL_INTRINSICS // Intrinsics base header + really required extension headers #if defined(_MSC_VER) #include // MSVC #else #include // GCC/MinGW/Clang/LLVM #endif #include // SSE4.1 #endif int AviHelper_ImageSize(const VideoInfo *vi, bool AVIPadScanlines, bool v210, bool v410, bool r210, bool R10k, bool v308, bool v408, bool Y410) { int image_size; if (vi->pixel_type == VideoInfo::CS_YUV444P16 || vi->pixel_type == VideoInfo::CS_YUVA444P16) { // Y416 packed 4444 U,Y,V,A image_size = vi->width * vi->height * 4 * sizeof(uint16_t); } else if (vi->pixel_type == VideoInfo::CS_RGBP10 && r210) { // 3x10bit packed RGB, 64 aligned image_size = ((vi->width + 63) / 64) * 256 * vi->height; // 4 byte/pixel: 32bits for 3x10 bits } else if (vi->pixel_type == VideoInfo::CS_RGBP10 && R10k) { // 3x10bit packed RGB, no aligment image_size = vi->width * 4 * vi->height; // 4 byte/pixel: 32bits for 3x10 bits } else if (vi->pixel_type == VideoInfo::CS_YV24 && v308) { // v308 packed 444 image_size = vi->width * vi->height * 3 * sizeof(uint8_t); } else if (vi->pixel_type == VideoInfo::CS_YUVA444 && v408) { // v408 packed 4444 image_size = vi->width * vi->height * 4 * sizeof(uint8_t); } else if (vi->pixel_type == VideoInfo::CS_YUV444P10 && v410) { // v410 packed 444 U,Y,V image_size = vi->width * vi->height * 4; // 4 byte/pixel: 32bits for 3x10 bits } else if ((vi->pixel_type == VideoInfo::CS_YUV444P10 || vi->pixel_type == VideoInfo::CS_YUVA444P10) && Y410) { // Y410 packed 10 bit 444 U,Y,V,A (Alpha is 2 bits) image_size = vi->width * vi->height * 4; // 4 byte/pixel: 32bits for 3x10+2 bits } else if (vi->pixel_type == VideoInfo::CS_YUV422P10 && v210) { image_size = ((16 * ((vi->width + 5) / 6) + 127) & ~127); image_size *= vi->height; } else if ((vi->IsRGB() && !vi->IsPlanar()) || vi->IsYUY2() || vi->IsY() || AVIPadScanlines) { // incl. all packed RGBs image_size = vi->BMPSize(); } else { // Packed size if (vi->IsPlanar() && vi->IsRGB()) { image_size = (vi->RowSize(PLANAR_G) * vi->height); if (vi->IsPlanarRGBA()) // not supported yet, but for the sake of completeness image_size *= 4; else image_size *= 3; } else { image_size = vi->RowSize(PLANAR_U); if (image_size) { image_size *= vi->height; image_size >>= vi->GetPlaneHeightSubsampling(PLANAR_U); image_size *= 2; } image_size += vi->RowSize(PLANAR_Y) * vi->height; } } return image_size; } #ifdef INTEL_INTRINSICS template void ToY416_sse2(uint8_t *outbuf, int out_pitch, const uint8_t *yptr, int ypitch, const uint8_t *uptr, const uint8_t *vptr, int uvpitch, const uint8_t *aptr, int apitch, int width, int height) { // out_pitch may not be mod16 const int wmod4 = (width / 4) * 4; // UYVA for (int y = 0; y < height; y++) { for (int x = 0; x < wmod4; x += 4) { // read 4x4 pixels, store 2x(4x2) pixels auto u = _mm_loadl_epi64(reinterpret_cast(uptr + x * sizeof(uint16_t))); auto y = _mm_loadl_epi64(reinterpret_cast(yptr + x * sizeof(uint16_t))); auto v = _mm_loadl_epi64(reinterpret_cast(vptr + x * sizeof(uint16_t))); __m128i a; if (hasAlpha) a = _mm_loadl_epi64(reinterpret_cast(aptr + x * sizeof(uint16_t))); else a = _mm_set1_epi16(-1); // transparent alpha 0xFFFF auto uy = _mm_unpacklo_epi16(u, y); auto va = _mm_unpacklo_epi16(v, a); auto uyva_lo = _mm_unpacklo_epi32(uy, va); _mm_storeu_si128(reinterpret_cast<__m128i *>(outbuf + 4 * sizeof(uint16_t) * x), uyva_lo); auto uyva_hi = _mm_unpackhi_epi32(uy, va); _mm_storeu_si128(reinterpret_cast<__m128i *>(outbuf + 16 + 4 * sizeof(uint16_t) * x), uyva_hi); } for (int x = wmod4; x < width; x++) { reinterpret_cast(outbuf)[x * 4 + 0] = reinterpret_cast(uptr)[x]; reinterpret_cast(outbuf)[x * 4 + 1] = reinterpret_cast(yptr)[x]; reinterpret_cast(outbuf)[x * 4 + 2] = reinterpret_cast(vptr)[x]; reinterpret_cast(outbuf)[x * 4 + 3] = hasAlpha ? reinterpret_cast(aptr)[x] : 0xFFFF; } outbuf += out_pitch; yptr += ypitch; uptr += uvpitch; vptr += uvpitch; aptr += apitch; } } // instantiate template void ToY416_sse2(uint8_t *outbuf, int out_pitch, const uint8_t *yptr, int ypitch, const uint8_t *uptr, const uint8_t *vptr, int uvpitch, const uint8_t *aptr, int apitch, int width, int height); template void ToY416_sse2(uint8_t *outbuf, int out_pitch, const uint8_t *yptr, int ypitch, const uint8_t *uptr, const uint8_t *vptr, int uvpitch, const uint8_t *aptr, int apitch, int width, int height); #endif template void ToY416_c(uint8_t *outbuf8, int out_pitch, const uint8_t *yptr, int ypitch, const uint8_t *uptr, const uint8_t *vptr, int uvpitch, const uint8_t *aptr, int apitch, int width, int height) { uint16_t *outbuf = reinterpret_cast(outbuf8); out_pitch /= sizeof(uint16_t); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { outbuf[x * 4 + 0] = reinterpret_cast(uptr)[x]; outbuf[x * 4 + 1] = reinterpret_cast(yptr)[x]; outbuf[x * 4 + 2] = reinterpret_cast(vptr)[x]; outbuf[x * 4 + 3] = hasAlpha ? reinterpret_cast(aptr)[x] : 0xFFFF; } outbuf += out_pitch; yptr += ypitch; uptr += uvpitch; vptr += uvpitch; aptr += apitch; } } // instantiate template void ToY416_c(uint8_t *outbuf, int out_pitch, const uint8_t *yptr, int ypitch, const uint8_t *uptr, const uint8_t *vptr, int uvpitch, const uint8_t *aptr, int apitch, int width, int height); template void ToY416_c(uint8_t *outbuf, int out_pitch, const uint8_t *yptr, int ypitch, const uint8_t *uptr, const uint8_t *vptr, int uvpitch, const uint8_t *aptr, int apitch, int width, int height); template void FromY416_c(uint8_t *yptr, int ypitch, uint8_t *uptr, uint8_t *vptr, int uvpitch, uint8_t *aptr, int apitch, const uint8_t *srcp8, int srcpitch, int width, int height) { const uint16_t *srcp = reinterpret_cast(srcp8); srcpitch /= sizeof(uint16_t); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { reinterpret_cast(uptr)[x] = srcp[x * 4 + 0]; reinterpret_cast(yptr)[x] = srcp[x * 4 + 1]; reinterpret_cast(vptr)[x] = srcp[x * 4 + 2]; if(hasAlpha) reinterpret_cast(aptr)[x] = srcp[x * 4 + 3]; } srcp += srcpitch; yptr += ypitch; uptr += uvpitch; vptr += uvpitch; aptr += apitch; } } // instantiate template void FromY416_c(uint8_t *yptr, int ypitch, uint8_t *uptr, uint8_t *vptr, int uvpitch, uint8_t *aptr, int apitch, const uint8_t *srcp8, int srcpitch, int width, int height); template void FromY416_c(uint8_t *yptr, int ypitch, uint8_t *uptr, uint8_t *vptr, int uvpitch, uint8_t *aptr, int apitch, const uint8_t *srcp8, int srcpitch, int width, int height); template void ToY410_c(uint8_t* outbuf8, int out_pitch, const uint8_t* yptr, int ypitch, const uint8_t* uptr, const uint8_t* vptr, int uvpitch, const uint8_t* aptr, int apitch, int width, int height) { uint32_t* outbuf = reinterpret_cast(outbuf8); out_pitch /= sizeof(uint32_t); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { uint32_t uyva = reinterpret_cast(uptr)[x] + (reinterpret_cast(yptr)[x] << 10) + (reinterpret_cast(vptr)[x] << 20); if constexpr(hasAlpha) uyva += (reinterpret_cast(aptr)[x] >> 8) << 30; // 2 bits only else uyva += 0x03 << 30; // 2 bits only outbuf[x] = uyva; } outbuf += out_pitch; yptr += ypitch; uptr += uvpitch; vptr += uvpitch; aptr += apitch; } } // instantiate template void ToY410_c(uint8_t* outbuf, int out_pitch, const uint8_t* yptr, int ypitch, const uint8_t* uptr, const uint8_t* vptr, int uvpitch, const uint8_t* aptr, int apitch, int width, int height); template void ToY410_c(uint8_t* outbuf, int out_pitch, const uint8_t* yptr, int ypitch, const uint8_t* uptr, const uint8_t* vptr, int uvpitch, const uint8_t* aptr, int apitch, int width, int height); template void FromY410_c(uint8_t* yptr, int ypitch, uint8_t* uptr, uint8_t* vptr, int uvpitch, uint8_t* aptr, int apitch, const uint8_t* srcp8, int srcpitch, int width, int height) { const uint32_t* srcp = reinterpret_cast(srcp8); srcpitch /= sizeof(uint32_t); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { const uint32_t uyva = srcp[x]; reinterpret_cast(uptr)[x] = (uyva >> 0) & 0x3FF; reinterpret_cast(yptr)[x] = (uyva >> 10) & 0x3FF; reinterpret_cast(vptr)[x] = (uyva >> 20) & 0x3FF; if constexpr(hasAlpha) { const int alpha = (uyva >> 30) & 0x3; // keep 03 as 3FF full transparent reinterpret_cast(aptr)[x] = alpha == 3 ? 0x3FF : alpha << 8; } } srcp += srcpitch; yptr += ypitch; uptr += uvpitch; vptr += uvpitch; aptr += apitch; } } // instantiate template void FromY410_c(uint8_t* yptr, int ypitch, uint8_t* uptr, uint8_t* vptr, int uvpitch, uint8_t* aptr, int apitch, const uint8_t* srcp8, int srcpitch, int width, int height); template void FromY410_c(uint8_t* yptr, int ypitch, uint8_t* uptr, uint8_t* vptr, int uvpitch, uint8_t* aptr, int apitch, const uint8_t* srcp8, int srcpitch, int width, int height); // Helpers for 10 bit RGB -> Planar RGB static AVS_FORCEINLINE uint32_t avs_swap32(uint32_t x) { x = (x & 0x0000FFFFu) << 16 | (x & 0xFFFF0000u) >> 16; x = (x & 0x00FF00FFu) << 8 | (x & 0xFF00FF00u) >> 8; return x; } void From_r210_c(uint8_t *rptr, uint8_t *gptr, uint8_t *bptr, int pitch, uint8_t *srcp8, int srcpitch, int width, int height) { // XXrrrrrr rrrrgggg ggggggbb bbbbbbbb // BigEndian const uint32_t *srcp = reinterpret_cast(srcp8); srcpitch /= sizeof(uint32_t); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { const uint32_t rgb = avs_swap32(srcp[x]); reinterpret_cast(bptr)[x] = (rgb >> 0) & 0x3FF; reinterpret_cast(gptr)[x] = (rgb >> 10) & 0x3FF; reinterpret_cast(rptr)[x] = (rgb >> 20) & 0x3FF; } srcp += srcpitch; gptr += pitch; rptr += pitch; bptr += pitch; } } void From_R10k_c(uint8_t *rptr, uint8_t *gptr, uint8_t *bptr, int pitch, uint8_t *srcp8, int srcpitch, int width, int height) { // rrrrrrrr rrgggggg ggggbbbb bbbbbbxx // BigEndian const uint32_t *srcp = reinterpret_cast(srcp8); srcpitch /= sizeof(uint32_t); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { const uint32_t rgb = avs_swap32(srcp[x]); reinterpret_cast(bptr)[x] = (rgb >> 2) & 0x3FF; reinterpret_cast(gptr)[x] = (rgb >> 12) & 0x3FF; reinterpret_cast(rptr)[x] = (rgb >> 22) & 0x3FF; } srcp += srcpitch; gptr += pitch; rptr += pitch; bptr += pitch; } } // Helpers for b64a <-> RGB64 static AVS_FORCEINLINE uint64_t avs_swap64(uint64_t x) { x = (x & 0x00000000FFFFFFFFULL) << 32 | (x & 0xFFFFFFFF00000000ULL) >> 32; x = (x & 0x0000FFFF0000FFFFULL) << 16 | (x & 0xFFFF0000FFFF0000ULL) >> 16; x = (x & 0x00FF00FF00FF00FFULL) << 8 | (x & 0xFF00FF00FF00FF00ULL) >> 8; return x; } #ifdef INTEL_INTRINSICS #if defined(GCC) || defined(CLANG) __attribute__((__target__("ssse3"))) #endif static AVS_FORCEINLINE __m128i _mm_bswap_epi64_ssse3(__m128i x) { // Reverse order of bytes in each 64-bit word. return _mm_shuffle_epi8(x, _mm_set_epi8(8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7)); } static AVS_FORCEINLINE __m128i _mm_bswap_epi64_sse2(__m128i x) { // Reverse order of bytes in each 64-bit word. // Swap bytes in each 16-bit word: __m128i a = _mm_or_si128( _mm_slli_epi16(x, 8), _mm_srli_epi16(x, 8)); // Reverse all 16-bit words in 64-bit halves: a = _mm_shufflelo_epi16(a, _MM_SHUFFLE(0, 1, 2, 3)); a = _mm_shufflehi_epi16(a, _MM_SHUFFLE(0, 1, 2, 3)); return a; } #endif // INTEL_INTRINSICS static AVS_FORCEINLINE uint16_t avs_swap16(uint16_t x) { return (x & 0x00FF) << 8 | (x & 0xFF00) >> 8; } // 3x1 void bgr_to_rgbBE_c(uint8_t* pdst, int dstpitch, const uint8_t *src, int srcpitch, int width, int height) { // todo sse2 // R G B R G B R G // B R G B R G B R // G B R G B R G B for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { uint16_t r = avs_swap16(reinterpret_cast(src)[x * 3 + 0]); uint16_t g = avs_swap16(reinterpret_cast(src)[x * 3 + 1]); uint16_t b = avs_swap16(reinterpret_cast(src)[x * 3 + 2]); reinterpret_cast(pdst)[x * 3 + 0] = b; reinterpret_cast(pdst)[x * 3 + 1] = g; reinterpret_cast(pdst)[x * 3 + 2] = r; } src += srcpitch; pdst += dstpitch; } } #ifdef INTEL_INTRINSICS // 4x16: two-way symmetric #if defined(GCC) || defined(CLANG) __attribute__((__target__("ssse3"))) #endif void bgra_to_argbBE_ssse3(uint8_t* pdst, int dstpitch, const uint8_t *src, int srcpitch, int width, int height) { // srcpitch or dstpitch may not be mod16 const int wmod2 = (width / 2) * 2; // 2x64bit for (int y = 0; y < height; y++) { for (int x = 0; x < wmod2; x += 2) { __m128i a = _mm_loadu_si128(reinterpret_cast(src + 8 * x)); a = _mm_bswap_epi64_ssse3(a); _mm_storeu_si128(reinterpret_cast<__m128i *>(pdst + 8 * x), a); } if (wmod2 < width) { __m128i a = _mm_loadl_epi64(reinterpret_cast(src + 8 * wmod2)); a = _mm_bswap_epi64_ssse3(a); _mm_storel_epi64(reinterpret_cast<__m128i *>(pdst + 8 * wmod2), a); } src += srcpitch; pdst += dstpitch; } } void bgra_to_argbBE_sse2(uint8_t* pdst, int dstpitch, const uint8_t *src, int srcpitch, int width, int height) { // dstpitch may not be mod16 const int wmod2 = (width / 2) * 2; // 2x64bit for (int y = 0; y < height; y++) { for (int x = 0; x < wmod2; x += 2) { __m128i a = _mm_loadu_si128(reinterpret_cast(src + 8 * x)); a = _mm_bswap_epi64_sse2(a); _mm_storeu_si128(reinterpret_cast<__m128i *>(pdst + 8 * x), a); } if (wmod2 < width) { __m128i a = _mm_loadl_epi64(reinterpret_cast(src + 8 * wmod2)); a = _mm_bswap_epi64_sse2(a); _mm_storel_epi64(reinterpret_cast<__m128i *>(pdst + 8 * wmod2), a); } src += srcpitch; pdst += dstpitch; } } #endif // INTEL_INTRINSICS // 4x16: two-way symmetric void bgra_to_argbBE_c(uint8_t* pdst, int dstpitch, const uint8_t *src, int srcpitch, int width, int height) { for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { uint64_t a = reinterpret_cast(src)[x]; // bgra -> argb+byte swap a = avs_swap64(a); reinterpret_cast(pdst)[x] = a; } src += srcpitch; pdst += dstpitch; } } // Helpers for YUV420(422)P10<->P010 and YUV420(422)P16<->P016 conversion template static void prepare_luma_shift6_c(uint8_t* pdst, int dstpitch, const uint8_t *src, int srcpitch, int width, int height) { for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { if (before) reinterpret_cast(pdst)[x] = reinterpret_cast(src)[x] << 6; else reinterpret_cast(pdst)[x] = reinterpret_cast(src)[x] >> 6; } src += srcpitch; pdst += dstpitch; } } #ifdef INTEL_INTRINSICS template static void prepare_luma_shift6_sse2(uint8_t* pdst, int dstpitch, const uint8_t *src, int srcpitch, int width, int height) { // srcpitch or dstpitch may not be mod16 const int modw = (width / 8) * 8; // 8 uv pairs at a time for (int y = 0; y < height; y++) { for (int x = 0; x < modw; x += 8) { __m128i y = _mm_loadu_si128(reinterpret_cast(reinterpret_cast(src) + x)); if (before) y = _mm_slli_epi16(y, 6); // make 10->16 bits else y = _mm_srli_epi16(y, 6); // make 16->10 bits _mm_storeu_si128(reinterpret_cast<__m128i *>(reinterpret_cast(pdst) + x), y); } for (int x = modw; x < width; x++) { if (before) reinterpret_cast(pdst)[x] = reinterpret_cast(src)[x] << 6; else reinterpret_cast(pdst)[x] = reinterpret_cast(src)[x] >> 6; } src += srcpitch; pdst += dstpitch; } } #endif // INTEL_INTRINSICS template static void prepare_to_interleaved_uv_c(uint8_t* pdst, int dstpitch, const uint8_t *srcu, const uint8_t *srcv, int pitchUV, int width, int height) { for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { uint16_t u, v; if (shift6) { u = reinterpret_cast(srcu)[x] << 6; // make 10->16 bits v = reinterpret_cast(srcv)[x] << 6; // make 10->16 bits } else { u = reinterpret_cast(srcu)[x]; v = reinterpret_cast(srcv)[x]; } uint32_t uv = (v << 16) | u; reinterpret_cast(pdst)[x] = uv; } srcu += pitchUV; srcv += pitchUV; pdst += dstpitch; } } #ifdef INTEL_INTRINSICS template static void prepare_to_interleaved_uv_sse2(uint8_t* pdst, int dstpitch, const uint8_t *srcu, const uint8_t *srcv, int pitchUV, int width, int height) { // dstpitch may not be mod16 const int modw = (width / 8) * 8; // 8 uv pairs at a time for (int y = 0; y < height; y++) { for (int x = 0; x < modw; x += 8) { __m128i u = _mm_load_si128(reinterpret_cast(reinterpret_cast(srcu) + x)); __m128i v = _mm_load_si128(reinterpret_cast(reinterpret_cast(srcv) + x)); if (shift6) { u = _mm_slli_epi16(u, 6); // make 10->16 bits v = _mm_slli_epi16(v, 6); } __m128i uv; uv = _mm_unpacklo_epi16(u, v); // (v << 16) | u; _mm_storeu_si128(reinterpret_cast<__m128i *>(reinterpret_cast(pdst) + x), uv); uv = _mm_unpackhi_epi16(u, v); // (v << 16) | u; _mm_storeu_si128(reinterpret_cast<__m128i *>(reinterpret_cast(pdst) + x + 4), uv); } for (int x = modw; x < width; x++) { uint16_t u, v; if (shift6) { u = reinterpret_cast(srcu)[x] << 6; // make 10->16 bits v = reinterpret_cast(srcv)[x] << 6; // make 10->16 bits } else { u = reinterpret_cast(srcu)[x]; v = reinterpret_cast(srcv)[x]; } uint32_t uv = (v << 16) | u; reinterpret_cast(pdst)[x] = uv; } srcu += pitchUV; srcv += pitchUV; pdst += dstpitch; } } #endif // INTEL_INTRINSICS template static void prepare_from_interleaved_uv_c(uint8_t* pdstu, uint8_t* pdstv, int pitchUV, const uint8_t *src, int srcpitch, int width, int height) { for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { uint32_t uv = reinterpret_cast(src)[x]; uint16_t u = uv & 0xFFFF; uint16_t v = uv >> 16; if (shift6) { u >>= 6; v >>= 6; } reinterpret_cast(pdstu)[x] = u; reinterpret_cast(pdstv)[x] = v; } pdstu += pitchUV; pdstv += pitchUV; src += srcpitch; } } #ifdef INTEL_INTRINSICS template static void prepare_from_interleaved_uv_sse2(uint8_t* pdstu, uint8_t* pdstv, int pitchUV, const uint8_t *src, int srcpitch, int width, int height) { // srcpitch may not be mod16 const int modw = (width / 8) * 8; auto mask0000FFFF = _mm_set1_epi32(0x0000FFFF); for (int y = 0; y < height; y++) { for (int x = 0; x < modw; x += 8) { auto uv_lo = _mm_loadu_si128(reinterpret_cast(reinterpret_cast(src) + x)); auto uv_hi = _mm_loadu_si128(reinterpret_cast(reinterpret_cast(src) + x + 4)); if (shift6) { uv_lo = _mm_srli_epi16(uv_lo, 6); uv_hi = _mm_srli_epi16(uv_hi, 6); } auto u_lo = _mm_and_si128(uv_lo, mask0000FFFF); auto u_hi = _mm_and_si128(uv_hi, mask0000FFFF); auto u = shift6 ? _mm_packs_epi32(u_lo, u_hi) : _MM_PACKUS_EPI32(u_lo, u_hi); // sse41 simul _mm_store_si128(reinterpret_cast<__m128i *>(reinterpret_cast(pdstu) + x), u); auto v_lo = _mm_srli_epi32(uv_lo, 16); auto v_hi = _mm_srli_epi32(uv_hi, 16); auto v = shift6 ? _mm_packs_epi32(v_lo, v_hi) : _MM_PACKUS_EPI32(v_lo, v_hi); // sse41 simul _mm_store_si128(reinterpret_cast<__m128i *>(reinterpret_cast(pdstv) + x), v); } for (int x = modw; x < width; x++) { uint32_t uv = reinterpret_cast(src)[x]; uint16_t u = uv & 0xFFFF; uint16_t v = uv >> 16; if (shift6) { u >>= 6; v >>= 6; } reinterpret_cast(pdstu)[x] = u; reinterpret_cast(pdstv)[x] = v; } pdstu += pitchUV; pdstv += pitchUV; src += srcpitch; } } template #if defined(GCC) || defined(CLANG) __attribute__((__target__("sse4.1"))) #endif static void prepare_from_interleaved_uv_sse41(uint8_t* pdstu, uint8_t* pdstv, int pitchUV, const uint8_t *src, int srcpitch, int width, int height) { // srcpitch may not be mod16 const int modw = (width / 8) * 8; auto mask0000FFFF = _mm_set1_epi32(0x0000FFFF); for (int y = 0; y < height; y++) { for (int x = 0; x < modw; x += 8) { auto uv_lo = _mm_loadu_si128(reinterpret_cast(reinterpret_cast(src) + x)); auto uv_hi = _mm_loadu_si128(reinterpret_cast(reinterpret_cast(src) + x + 4)); if (shift6) { uv_lo = _mm_srli_epi16(uv_lo, 6); uv_hi = _mm_srli_epi16(uv_hi, 6); } auto u_lo = _mm_and_si128(uv_lo, mask0000FFFF); auto u_hi = _mm_and_si128(uv_hi, mask0000FFFF); auto u = shift6 ? _mm_packs_epi32(u_lo, u_hi) : _mm_packus_epi32(u_lo, u_hi); // sse41 _mm_store_si128(reinterpret_cast<__m128i *>(reinterpret_cast(pdstu) + x), u); auto v_lo = _mm_srli_epi32(uv_lo, 16); auto v_hi = _mm_srli_epi32(uv_hi, 16); auto v = shift6 ? _mm_packs_epi32(v_lo, v_hi) : _mm_packus_epi32(v_lo, v_hi); // sse41 _mm_store_si128(reinterpret_cast<__m128i *>(reinterpret_cast(pdstv) + x), v); } for (int x = modw; x < width; x++) { uint32_t uv = reinterpret_cast(src)[x]; uint16_t u = uv & 0xFFFF; uint16_t v = uv >> 16; if (shift6) { u >>= 6; v >>= 6; } reinterpret_cast(pdstu)[x] = u; reinterpret_cast(pdstv)[x] = v; } pdstu += pitchUV; pdstv += pitchUV; src += srcpitch; } } #endif // INTEL_INTRINSICS void yuv422p10_to_v210(BYTE *dstp, const BYTE *srcp_y, int srcpitch, const BYTE *srcp_u, const BYTE *srcp_v, int srcpitch_uv, int width, int height) { int ppitch_y = srcpitch / sizeof(uint16_t); int ppitch_uv = srcpitch_uv / sizeof(uint16_t); const uint16_t *yptr = (const uint16_t *)srcp_y; const uint16_t *uptr = (const uint16_t *)srcp_u; const uint16_t *vptr = (const uint16_t *)srcp_v; uint32_t *outbuf = (uint32_t *)dstp; const int out_pitch = ((16 * ((width + 5) / 6) + 127) & ~127) / 4; for (int y = 0; y < height; y++) { const uint16_t *yline = yptr; const uint16_t *uline = uptr; const uint16_t *vline = vptr; uint32_t *out_line = outbuf; for (int x = 0; x < width + 5; x += 6) { out_line[0] = (uline[0] | (yline[0] << 10) | (vline[0] << 20)); out_line[1] = (yline[1] | (uline[1] << 10) | (yline[2] << 20)); out_line[2] = (vline[1] | (yline[3] << 10) | (uline[2] << 20)); out_line[3] = (yline[4] | (vline[2] << 10) | (yline[5] << 20)); out_line += 4; yline += 6; uline += 3; vline += 3; } outbuf += out_pitch; yptr += ppitch_y; uptr += ppitch_uv; vptr += ppitch_uv; } } void v210_to_yuv422p10(BYTE *dstp_y, int dstpitch, BYTE *dstp_u, BYTE *dstp_v, int dstpitch_uv, const BYTE *srcp, int width, int height) { /* v210: packed YUV 4:2:2 (UYVY) 10 bits per component. Data is stored in blocks of 32 bit values in little-endian. Each such block contains 3 components, one each in bits 0 - 9, 10 - 19 and 20 - 29, the remaining two bits are unused. Six pixels in a pattern that repeats every 4 32-bits blocks: block 1, bits 0 - 9: U0-1 block 1, bits 10 - 19: Y0 block 1, bits 20 - 29: V0-1 block 2, bits 0 - 9: Y1 block 2, bits 10 - 19: U2-3 block 2, bits 20 - 29: Y2 block 3, bits 0 - 9: V2-3 block 3, bits 10 - 19: Y3 block 3, bits 20 - 29: U4-5 block 4, bits 0 - 9: Y4 block 4, bits 10 - 19: V4-5 block 4, bits 20 - 29: Y5 */ int ppitch_y = dstpitch / sizeof(uint16_t); int ppitch_uv = dstpitch_uv / sizeof(uint16_t); uint16_t *yptr = (uint16_t *)dstp_y; uint16_t *uptr = (uint16_t *)dstp_u; uint16_t *vptr = (uint16_t *)dstp_v; const int srcpitch = ((16 * ((width + 5) / 6) + 127) & ~127); const int width6 = (width / 6) * 6; const int width_rest = width - width6; for (int y = 0; y < height; y++) { uint16_t *yline = yptr; uint16_t *uline = uptr; uint16_t *vline = vptr; const uint32_t *srcline = reinterpret_cast(srcp); for (int x = 0; x < width6; x += 6) { uint32_t block1 = srcline[0]; uint32_t block2 = srcline[1]; uint32_t block3 = srcline[2]; uint32_t block4 = srcline[3]; uline[0] = (block1) & 0x3FF; vline[0] = (block1 >> 20) & 0x3FF; yline[0] = (block1 >> 10) & 0x3FF; yline[1] = (block2) & 0x3FF; uline[1] = (block2 >> 10) & 0x3FF; vline[1] = (block3) & 0x3FF; yline[2] = (block2 >> 20) & 0x3FF; yline[3] = (block3 >> 10) & 0x3FF; uline[2] = (block3 >> 20) & 0x3FF; vline[2] = (block4 >> 10) & 0x3FF; yline[4] = (block4) & 0x3FF; yline[5] = (block4 >> 20) & 0x3FF; srcline += 4; yline += 6; uline += 3; vline += 3; } // rest 2 or 4 pixels if (width_rest >= 2) { uint32_t block1 = srcline[0]; uint32_t block2 = srcline[1]; uline[0] = (block1) & 0x3FF; vline[0] = (block1 >> 20) & 0x3FF; yline[0] = (block1 >> 10) & 0x3FF; yline[1] = (block2) & 0x3FF; if (width_rest >= 4) { uint32_t block3 = srcline[2]; uline[1] = (block2 >> 10) & 0x3FF; vline[1] = (block3) & 0x3FF; yline[2] = (block2 >> 20) & 0x3FF; yline[3] = (block3 >> 10) & 0x3FF; } } srcp += srcpitch; yptr += ppitch_y; uptr += ppitch_uv; vptr += ppitch_uv; } } void v408_to_yuva444p8(BYTE* dstp_y, int dstpitch, BYTE* dstp_u, BYTE* dstp_v, BYTE* dstp_a, int dstpitch_uv, int dstpitch_a, const BYTE* srcp, int width, int height) { int ppitch_y = dstpitch; int ppitch_uv = dstpitch_uv; int ppitch_a = dstpitch_a; uint8_t* yptr = dstp_y; uint8_t* uptr = dstp_u; uint8_t* vptr = dstp_v; uint8_t* aptr = dstp_a; const int srcpitch = width * 4; for (int y = 0; y < height; y++) { uint8_t* yline = yptr; uint8_t* uline = uptr; uint8_t* vline = vptr; uint8_t* aline = aptr; const uint32_t* srcline = reinterpret_cast(srcp); for (int x = 0; x < width; x++) { uint32_t block = srcline[x]; // 4x8 bit uline[x] = (block) & 0xFF; vline[x] = (block >> 16) & 0xFF; yline[x] = (block >> 8) & 0xFF; aline[x] = (block >> 24) & 0xFF; } srcp += srcpitch; yptr += ppitch_y; uptr += ppitch_uv; vptr += ppitch_uv; aptr += ppitch_a; } } void v308_to_yuv444p8(BYTE* dstp_y, int dstpitch, BYTE* dstp_u, BYTE* dstp_v, int dstpitch_uv, const BYTE* srcp, int width, int height) { int ppitch_y = dstpitch; int ppitch_uv = dstpitch_uv; uint8_t* yptr = dstp_y; uint8_t* uptr = dstp_u; uint8_t* vptr = dstp_v; const int srcpitch = width * 3; for (int y = 0; y < height; y++) { uint8_t* yline = yptr; uint8_t* uline = uptr; uint8_t* vline = vptr; const uint8_t* srcline = srcp; for (int x = 0; x < width; x++) { vline[x] = srcline[x * 3 + 0]; yline[x] = srcline[x * 3 + 1]; uline[x] = srcline[x * 3 + 2]; } srcp += srcpitch; yptr += ppitch_y; uptr += ppitch_uv; vptr += ppitch_uv; } } void v410_to_yuv444p10(BYTE* dstp_y, int dstpitch, BYTE* dstp_u, BYTE* dstp_v, int dstpitch_uv, const BYTE* srcp, int width, int height) { int ppitch_y = dstpitch / sizeof(uint16_t); int ppitch_uv = dstpitch_uv / sizeof(uint16_t); uint16_t* yptr = (uint16_t*)dstp_y; uint16_t* uptr = (uint16_t*)dstp_u; uint16_t* vptr = (uint16_t*)dstp_v; const int srcpitch = width * 4; for (int y = 0; y < height; y++) { uint16_t* yline = yptr; uint16_t* uline = uptr; uint16_t* vline = vptr; const uint32_t* srcline = reinterpret_cast(srcp); for (int x = 0; x < width; x++) { uint32_t block = srcline[x]; yline[x] = (block >> 12) & 0x3FF; uline[x] = (block >> 2) & 0x3FF; vline[x] = (block >> 22) & 0x3FF; } srcp += srcpitch; yptr += ppitch_y; uptr += ppitch_uv; vptr += ppitch_uv; } } void yuv42xp10_16_to_Px10_16(BYTE *dstp, int dstpitch, const BYTE *srcp_y, int srcpitch, const BYTE *srcp_u, const BYTE *srcp_v, int srcpitch_uv, int width, int height, int cheight, bool semi_packed_p16, IScriptEnvironment *env) { // P010/P016/P210/P216 format: // Single buffer // n lines YYYYYYYYYYYYYY // n/2 lines UVUVUVUVUVUVUV (4:2:0) // or n lines UVUVUVUVUVUVUV (4:2:2) // Pitch is common. P010/P210 is upshifted to 16 bits #ifdef INTEL_INTRINSICS const bool sse2 = !!(env->GetCPUFlags() & CPUF_SSE2); #endif // dstpitch may not be mod16 // luma if (semi_packed_p16) { // no shift, native copy env->BitBlt(dstp, dstpitch, srcp_y, srcpitch, width * sizeof(uint16_t), height); } else { // shift by 6 make 10->16 bits #ifdef INTEL_INTRINSICS if (sse2) prepare_luma_shift6_sse2(dstp, dstpitch, srcp_y, srcpitch, width, height); // true: conv to P016 else #endif // INTEL_INTRINSICS prepare_luma_shift6_c(dstp, dstpitch, srcp_y, srcpitch, width, height); // true: conv to P016 } dstp += dstpitch * height; // Chroma int cwidth = width / 2; #ifdef INTEL_INTRINSICS if (sse2) { if (semi_packed_p16) prepare_to_interleaved_uv_sse2(dstp, dstpitch, srcp_u, srcp_v, srcpitch_uv, cwidth, cheight); else prepare_to_interleaved_uv_sse2(dstp, dstpitch, srcp_u, srcp_v, srcpitch_uv, cwidth, cheight); // shift6 inside } else { #endif // INTEL_INTRINSICS if (semi_packed_p16) prepare_to_interleaved_uv_c(dstp, dstpitch, srcp_u, srcp_v, srcpitch_uv, cwidth, cheight); else prepare_to_interleaved_uv_c(dstp, dstpitch, srcp_u, srcp_v, srcpitch_uv, cwidth, cheight); // shift6 inside #ifdef INTEL_INTRINSICS } #endif // INTEL_INTRINSICS } void Px10_16_to_yuv42xp10_16(BYTE *dstp_y, int dstpitch, BYTE *dstp_u, BYTE *dstp_v, int dstpitch_uv, const BYTE *srcp, int srcpitch, int width, int height, int cheight, bool semi_packed_p16, IScriptEnvironment *env) { #ifdef INTEL_INTRINSICS const bool sse2 = !!(env->GetCPUFlags() & CPUF_SSE2); const bool sse41 = !!(env->GetCPUFlags() & CPUF_SSE4_1); #endif // srcpitch may not be mod16 // convert P010, P016, P210 and P216 formats back to Avisynth YUV420P10 and P16 or YUV422P10 and P16 formats // Luma if (semi_packed_p16) { env->BitBlt(dstp_y, dstpitch, srcp, srcpitch, width * sizeof(uint16_t), height); } else { // shift by 6 make 10->16 bits #ifdef INTEL_INTRINSICS if (sse2) prepare_luma_shift6_sse2(dstp_y, dstpitch, srcp, srcpitch, width, height); // false: after else #endif prepare_luma_shift6_c(dstp_y, dstpitch, srcp, srcpitch, width, height); // false: after } srcp += srcpitch * height; // Chroma int cwidth = width / 2; // 422 or 420 #ifdef INTEL_INTRINSICS if (sse41) { if (semi_packed_p16) prepare_from_interleaved_uv_sse41(dstp_u, dstp_v, dstpitch_uv, srcp, srcpitch, cwidth, cheight); else prepare_from_interleaved_uv_sse41(dstp_u, dstp_v, dstpitch_uv, srcp, srcpitch, cwidth, cheight); // true: shift 6 } else if (sse2) { if (semi_packed_p16) prepare_from_interleaved_uv_sse2(dstp_u, dstp_v, dstpitch_uv, srcp, srcpitch, cwidth, cheight); else prepare_from_interleaved_uv_sse2(dstp_u, dstp_v, dstpitch_uv, srcp, srcpitch, cwidth, cheight); // true: shift 6 } else { #endif // INTEL_INTRINSICS if (semi_packed_p16) prepare_from_interleaved_uv_c(dstp_u, dstp_v, dstpitch_uv, srcp, srcpitch, cwidth, cheight); else prepare_from_interleaved_uv_c(dstp_u, dstp_v, dstpitch_uv, srcp, srcpitch, cwidth, cheight); // true: shift 6 #ifdef INTEL_INTRINSICS } #endif } ================================================ FILE: avs_core/core/AviHelper.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __AviHelper_H__ #define __AviHelper_H__ #include #include int AviHelper_ImageSize(const VideoInfo *vi, bool AVIPadScanlines, bool v210, bool v410, bool r210, bool R10k, bool v308, bool v408, bool Y410); template void ToY416_sse2(uint8_t *outbuf, int out_pitch, const uint8_t *yptr, int ypitch, const uint8_t *uptr, const uint8_t *vptr, int uvpitch, const uint8_t *aptr, int apitch, int width, int height); template void ToY416_c(uint8_t *outbuf8, int out_pitch, const uint8_t *yptr, int ypitch, const uint8_t *uptr, const uint8_t *vptr, int uvpitch, const uint8_t *aptr, int apitch, int width, int height); template void FromY416_c(uint8_t *yptr, int ypitch, uint8_t *uptr, uint8_t *vptr, int uvpitch, uint8_t *aptr, int apitch, const uint8_t *srcp8, int srcpitch, int width, int height); template void ToY410_c(uint8_t* outbuf8, int out_pitch, const uint8_t* yptr, int ypitch, const uint8_t* uptr, const uint8_t* vptr, int uvpitch, const uint8_t* aptr, int apitch, int width, int height); template void FromY410_c(uint8_t* yptr, int ypitch, uint8_t* uptr, uint8_t* vptr, int uvpitch, uint8_t* aptr, int apitch, const uint8_t* srcp8, int srcpitch, int width, int height); void From_r210_c(uint8_t *rptr, uint8_t *gptr, uint8_t *bptr, int pitch, uint8_t *srcp8, int srcpitch, int width, int height); void From_R10k_c(uint8_t *rptr, uint8_t *gptr, uint8_t *bptr, int pitch, uint8_t *srcp8, int srcpitch, int width, int height); void bgr_to_rgbBE_c(uint8_t* pdst, int dstpitch, const uint8_t *src, int srcpitch, int width, int height); void bgra_to_argbBE_ssse3(uint8_t* pdst, int dstpitch, const uint8_t *src, int srcpitch, int width, int height); void bgra_to_argbBE_sse2(uint8_t* pdst, int dstpitch, const uint8_t *src, int srcpitch, int width, int height); void bgra_to_argbBE_c(uint8_t* pdst, int dstpitch, const uint8_t *src, int srcpitch, int width, int height); void v410_to_yuv444p10(BYTE *dstp_y, int dstpitch, BYTE *dstp_u, BYTE *dstp_v, int dstpitch_uv, const BYTE *srcp, int width, int height); void v210_to_yuv422p10(BYTE *dstp_y, int dstpitch, BYTE *dstp_u, BYTE *dstp_v, int dstpitch_uv, const BYTE *srcp, int width, int height); void v308_to_yuv444p8(BYTE* dstp_y, int dstpitch, BYTE* dstp_u, BYTE* dstp_v, int dstpitch_uv, const BYTE* srcp, int width, int height); void v408_to_yuva444p8(BYTE* dstp_y, int dstpitch, BYTE* dstp_u, BYTE* dstp_v, BYTE* dstp_a, int dstpitch_uv, int dstpitch_a, const BYTE* srcp, int width, int height); void yuv422p10_to_v210(BYTE *dstp, const BYTE *srcp_y, int srcpitch, const BYTE *srcp_u, const BYTE *srcp_v, int srcpitch_uv, int width, int height); void yuv42xp10_16_to_Px10_16(BYTE *dstp, int dstpitch, const BYTE *srcp_y, int srcpitch, const BYTE *srcp_u, const BYTE *srcp_v, int srcpitch_uv, int width, int height, int cheight, bool semi_packed_p16, IScriptEnvironment *env); void Px10_16_to_yuv42xp10_16(BYTE *dstp_y, int dstpitch, BYTE *dstp_u, BYTE *dstp_v, int dstpitch_uv, const BYTE *srcp, int srcpitch, int width, int height, int cheight, bool semi_packed_p16, IScriptEnvironment *env); #endif // __AviHelper_H__ ================================================ FILE: avs_core/core/BufferPool.cpp ================================================ #include "BufferPool.h" #include #include #include #include #include "InternalEnvironment.h" #define BUFFER_GUARD_VALUE 0x55555555 struct BufferPool::BufferDesc { void* ptr; size_t size; size_t alignment; bool in_use; }; static inline void CheckGuards(void* ptr) { #ifndef NDEBUG size_t lower_guard = (size_t)(((void**)ptr)[-5]); assert(lower_guard == BUFFER_GUARD_VALUE); size_t upper_guard = (size_t)(((void**)ptr)[-1]); assert(upper_guard == BUFFER_GUARD_VALUE); #endif } static inline void* GetUserData(void* ptr) { return ((void**)ptr)[-4]; } static inline size_t GetRealSize(void* ptr) { return (size_t)(((void**)ptr)[-3]); } static inline void* GetRealPtr(void* ptr) { return ((void**)ptr)[-2]; } void* BufferPool::PrivateAlloc(size_t nBytes, size_t alignment, void* user) { /* Number of extra data fields to allocate. * Current field assignment: * [-1] = upper guard (size_t) * [-2] = original buffer pointer (void*) * [-3] = original buffer size (size_t) * [-4] = user data (void*) * [-5] = lower guard (size_t) */ const int NUM_EXTRA_FIELDS = 5; alignment = max(alignment, sizeof(void*)); if (!IS_POWER2(alignment)) return NULL; size_t offset = NUM_EXTRA_FIELDS * sizeof(void*) + alignment - 1; nBytes += offset; void *orig = malloc(nBytes); if (orig == NULL) return NULL; void **aligned = (void**)(((uintptr_t)orig + (uintptr_t)offset) & (~(uintptr_t)(alignment-1))); aligned[-5] = (void*)BUFFER_GUARD_VALUE; aligned[-4] = user; aligned[-3] = (void*)nBytes; aligned[-2] = orig; aligned[-1] = (void*)BUFFER_GUARD_VALUE; Env->AdjustMemoryConsumption(nBytes, false); return aligned; } void BufferPool::PrivateFree(void* buffer) { CheckGuards(buffer); Env->AdjustMemoryConsumption(GetRealSize(buffer), true); free(GetRealPtr(buffer)); } BufferPool::BufferPool(InternalEnvironment* env) : Env(env) { } BufferPool::~BufferPool() { const MapType::iterator end_it = Map.end(); for ( MapType::iterator it = Map.begin(); it != end_it; ++it) { BufferDesc* desc = it->second; PrivateFree(desc->ptr); delete desc; } } void* BufferPool::Allocate(size_t nBytes, size_t alignment, bool pool) { if (pool) { // First, check if we can return a buffer from the pool const MapType::iterator end_it = Map.end(); for ( MapType::iterator it = Map.lower_bound(nBytes); it != end_it; ++it) { BufferDesc* desc = it->second; if ( !desc->in_use && (desc->alignment >= alignment) ) { desc->in_use = true; return desc->ptr; } } // None found, allocate new one BufferDesc* desc = new BufferDesc(); void* ptr = PrivateAlloc(nBytes, alignment, reinterpret_cast(desc)); if (ptr == NULL) { delete desc; return NULL; } desc->alignment = alignment; desc->in_use = true; desc->ptr = ptr; desc->size = nBytes; Map.emplace(nBytes, desc); return ptr; } else { return PrivateAlloc(nBytes, alignment, NULL); } } void BufferPool::Free(void* ptr) { // Mirroring free()'s semantic requires us to accept NULLs if (ptr == NULL) return; CheckGuards(ptr); BufferDesc* data = reinterpret_cast(GetUserData(ptr)); if (data != NULL) { // Getting into this branch means this buffer is pooled data->in_use = false; } else { PrivateFree(ptr); } } ================================================ FILE: avs_core/core/BufferPool.h ================================================ #ifndef _AVS_BUFFERPOOL_H #define _AVS_BUFFERPOOL_H #include #include class InternalEnvironment; class BufferPool { private: struct BufferDesc; typedef std::multimap MapType; InternalEnvironment* Env; MapType Map; void* PrivateAlloc(size_t nBytes, size_t alignment, void* user); void PrivateFree(void* buffer); public: BufferPool(InternalEnvironment* env); ~BufferPool(); void* Allocate(size_t nBytes, size_t alignment, bool pool); void Free(void* ptr); }; #endif // _AVS_BUFFERPOOL_H ================================================ FILE: avs_core/core/CompatEnvironment.h ================================================ // Avisynth v2.5. Copyright 2002-2009 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef _AVS_COMPATENVIRONMENT_H_INCLUDED #define _AVS_COMPATENVIRONMENT_H_INCLUDED #include // IScriptEnvironment_Avs25, IScriptEnvironment_AvsPreV11C are used internally. // Entries 100% match with IScriptEnvironment to allow typecasting to IScriptEnvironment_Avs25/AvsPreV11. // While IScriptEnvironment_Avs25 ends at interface V6 changes, PreV11C version is full copy of IScriptEnvironment. // Differences involve three functions: // 1. AddFunction25/PreV11C: Marks the added function as originating from // an Avs2.5/PreV11C plugin, see also: arrays-deep-copy, 64-bit params. // 2. Invoke25/PreV11C: Argument arrays, which must not be deep-freed, // baked AVSValue code incompatible with deep-array concept and 64 bit data. // 3. ManageCache25/PreV11C: Specially returns 1 for key MC_QueryAvs25/PreV11C // to check if called from AVS2.5/PreV11C interface for cache GetFrame/GetAudio. // See also: InternalEnvironment interface conversion methods comment. // Compatibility camouflage classes are *passed in place of the original IScriptEnvironment, // providing the same function orders to match their VMT tables with the original. // Differently named functions appear at specific indexes to perform different compatibility behaviors. // *In real they all are static casted from InternalEnvironment, where all these pure virtual methods are implemented. class IScriptEnvironment_Avs25 { public: virtual ~IScriptEnvironment_Avs25() {} virtual /*static*/ int __stdcall GetCPUFlags() = 0; virtual char* __stdcall SaveString(const char* s, int length = -1) = 0; virtual char* Sprintf(const char* fmt, ...) = 0; virtual char* __stdcall VSprintf(const char* fmt, va_list val) = 0; #ifdef AVS_WINDOWS __declspec(noreturn) virtual void ThrowError(const char* fmt, ...) = 0; #else virtual void ThrowError(const char* fmt, ...) = 0; #endif class NotFound /*exception*/ {}; // thrown by Invoke and GetVar typedef AVSValue(__cdecl* ApplyFunc)(AVSValue args, void* user_data, IScriptEnvironment* env); virtual void __stdcall AddFunction25(const char* name, const char* params, ApplyFunc apply, void* user_data) = 0; virtual bool __stdcall FunctionExists(const char* name) = 0; virtual AVSValue __stdcall Invoke25(const char* name, const AVSValue args, const char* const* arg_names = 0) = 0; virtual AVSValue __stdcall GetVar(const char* name) = 0; virtual bool __stdcall SetVar(const char* name, const AVSValue& val) = 0; virtual bool __stdcall SetGlobalVar(const char* name, const AVSValue& val) = 0; virtual void __stdcall PushContext(int level = 0) = 0; virtual void __stdcall PopContext() = 0; virtual PVideoFrame __stdcall NewVideoFrame(const VideoInfo& vi, int align = FRAME_ALIGN) = 0; virtual bool __stdcall MakeWritable(PVideoFrame* pvf) = 0; virtual void __stdcall BitBlt(BYTE* dstp, int dst_pitch, const BYTE* srcp, int src_pitch, int row_size, int height) = 0; typedef void(__cdecl* ShutdownFunc)(void* user_data, IScriptEnvironment* env); virtual void __stdcall AtExit(ShutdownFunc function, void* user_data) = 0; virtual void __stdcall CheckVersion(int version = AVISYNTH_CLASSIC_INTERFACE_VERSION_25) = 0; virtual PVideoFrame __stdcall Subframe(PVideoFrame src, int rel_offset, int new_pitch, int new_row_size, int new_height) = 0; virtual int __stdcall SetMemoryMax(int mem) = 0; virtual int __stdcall SetWorkingDir(const char* newdir) = 0; // specially returns 1 for key MC_QueryAvs25 to check if called from AVS2.5 interface virtual void* __stdcall ManageCache25(int key, void* data) = 0; enum PlanarChromaAlignmentMode { PlanarChromaAlignmentOff, PlanarChromaAlignmentOn, PlanarChromaAlignmentTest }; virtual bool __stdcall PlanarChromaAlignment(IScriptEnvironment::PlanarChromaAlignmentMode key) = 0; virtual PVideoFrame __stdcall SubframePlanar(PVideoFrame src, int rel_offset, int new_pitch, int new_row_size, int new_height, int rel_offsetU, int rel_offsetV, int new_pitchUV) = 0; // Despite the name, we provide entries up to V6 in case someone requests // a V3 interface and still wants to use V5-V6 functions // **** AVISYNTH_INTERFACE_VERSION 5 **** defined since classic Avisynth 2.6 beta virtual void __stdcall DeleteScriptEnvironment() = 0; virtual void __stdcall ApplyMessage(PVideoFrame* frame, const VideoInfo& vi, const char* message, int size, int textcolor, int halocolor, int bgcolor) = 0; virtual const AVS_Linkage* __stdcall GetAVSLinkage() = 0; // **** AVISYNTH_INTERFACE_VERSION 6 **** defined since classic Avisynth 2.6 // noThrow version of GetVar virtual AVSValue __stdcall GetVarDef(const char* name, const AVSValue& def = AVSValue()) = 0; }; // end class IScriptEnvironment_Avs25. Order is important. // Unlike IScriptEnvironment_Avs25 which ends at the V6 changes, // IScriptEnvironment_AvsPreV11C is a complete copy of IScriptEnvironment, // except the name of the above mentioned three methods. class IScriptEnvironment_AvsPreV11C { public: virtual ~IScriptEnvironment_AvsPreV11C() {} virtual int __stdcall GetCPUFlags() = 0; virtual char* __stdcall SaveString(const char* s, int length = -1) = 0; virtual char* Sprintf(const char* fmt, ...) = 0; virtual char* __stdcall VSprintf(const char* fmt, va_list val) = 0; #ifdef AVS_WINDOWS __declspec(noreturn) virtual void ThrowError(const char* fmt, ...) = 0; #else virtual void ThrowError(const char* fmt, ...) = 0; #endif class NotFound /*exception*/ {}; // thrown by Invoke and GetVar typedef AVSValue(__cdecl* ApplyFunc)(AVSValue args, void* user_data, IScriptEnvironment* env); virtual void __stdcall AddFunctionPreV11C(const char* name, const char* params, ApplyFunc apply, void* user_data) = 0; virtual bool __stdcall FunctionExists(const char* name) = 0; virtual AVSValue __stdcall InvokePreV11C(const char* name, const AVSValue args, const char* const* arg_names = 0) = 0; virtual AVSValue __stdcall GetVar(const char* name) = 0; virtual bool __stdcall SetVar(const char* name, const AVSValue& val) = 0; virtual bool __stdcall SetGlobalVar(const char* name, const AVSValue& val) = 0; virtual void __stdcall PushContext(int level = 0) = 0; virtual void __stdcall PopContext() = 0; virtual PVideoFrame __stdcall NewVideoFrame(const VideoInfo& vi, int align = FRAME_ALIGN) = 0; virtual bool __stdcall MakeWritable(PVideoFrame* pvf) = 0; virtual void __stdcall BitBlt(BYTE* dstp, int dst_pitch, const BYTE* srcp, int src_pitch, int row_size, int height) = 0; typedef void(__cdecl* ShutdownFunc)(void* user_data, IScriptEnvironment* env); virtual void __stdcall AtExit(ShutdownFunc function, void* user_data) = 0; virtual void __stdcall CheckVersion(int version = AVISYNTH_CLASSIC_INTERFACE_VERSION_25) = 0; virtual PVideoFrame __stdcall Subframe(PVideoFrame src, int rel_offset, int new_pitch, int new_row_size, int new_height) = 0; virtual int __stdcall SetMemoryMax(int mem) = 0; virtual int __stdcall SetWorkingDir(const char* newdir) = 0; // specially returns 1 for key MC_QueryAvsPreV11C to check if called from C interface virtual void* __stdcall ManageCachePreV11C(int key, void* data) = 0; enum PlanarChromaAlignmentMode { PlanarChromaAlignmentOff, PlanarChromaAlignmentOn, PlanarChromaAlignmentTest }; virtual bool __stdcall PlanarChromaAlignment(IScriptEnvironment::PlanarChromaAlignmentMode key) = 0; virtual PVideoFrame __stdcall SubframePlanar(PVideoFrame src, int rel_offset, int new_pitch, int new_row_size, int new_height, int rel_offsetU, int rel_offsetV, int new_pitchUV) = 0; // **** AVISYNTH_INTERFACE_VERSION 5 **** defined since classic Avisynth 2.6 beta virtual void __stdcall DeleteScriptEnvironment() = 0; virtual void __stdcall ApplyMessage(PVideoFrame* frame, const VideoInfo& vi, const char* message, int size, int textcolor, int halocolor, int bgcolor) = 0; virtual const AVS_Linkage* __stdcall GetAVSLinkage() = 0; // **** AVISYNTH_INTERFACE_VERSION 6 **** defined since classic Avisynth 2.6 // noThrow version of GetVar virtual AVSValue __stdcall GetVarDef(const char* name, const AVSValue& def = AVSValue()) = 0; // **** AVISYNTH_INTERFACE_VERSION 8 **** AviSynth+ 3.6.0- virtual PVideoFrame __stdcall SubframePlanarA(PVideoFrame src, int rel_offset, int new_pitch, int new_row_size, int new_height, int rel_offsetU, int rel_offsetV, int new_pitchUV, int rel_offsetA) = 0; virtual void __stdcall copyFrameProps(const PVideoFrame& src, PVideoFrame& dst) = 0; virtual const AVSMap* __stdcall getFramePropsRO(const PVideoFrame& frame) = 0; virtual AVSMap* __stdcall getFramePropsRW(PVideoFrame& frame) = 0; virtual int __stdcall propNumKeys(const AVSMap* map) = 0; virtual const char* __stdcall propGetKey(const AVSMap* map, int index) = 0; virtual int __stdcall propNumElements(const AVSMap* map, const char* key) = 0; virtual char __stdcall propGetType(const AVSMap* map, const char* key) = 0; virtual int64_t __stdcall propGetInt(const AVSMap* map, const char* key, int index, int* error) = 0; virtual double __stdcall propGetFloat(const AVSMap* map, const char* key, int index, int* error) = 0; virtual const char* __stdcall propGetData(const AVSMap* map, const char* key, int index, int* error) = 0; virtual int __stdcall propGetDataSize(const AVSMap* map, const char* key, int index, int* error) = 0; virtual PClip __stdcall propGetClip(const AVSMap* map, const char* key, int index, int* error) = 0; virtual const PVideoFrame __stdcall propGetFrame(const AVSMap* map, const char* key, int index, int* error) = 0; virtual int __stdcall propDeleteKey(AVSMap* map, const char* key) = 0; virtual int __stdcall propSetInt(AVSMap* map, const char* key, int64_t i, int append) = 0; virtual int __stdcall propSetFloat(AVSMap* map, const char* key, double d, int append) = 0; virtual int __stdcall propSetData(AVSMap* map, const char* key, const char* d, int length, int append) = 0; virtual int __stdcall propSetClip(AVSMap* map, const char* key, PClip& clip, int append) = 0; virtual int __stdcall propSetFrame(AVSMap* map, const char* key, const PVideoFrame& frame, int append) = 0; virtual const int64_t* __stdcall propGetIntArray(const AVSMap* map, const char* key, int* error) = 0; virtual const double* __stdcall propGetFloatArray(const AVSMap* map, const char* key, int* error) = 0; virtual int __stdcall propSetIntArray(AVSMap* map, const char* key, const int64_t* i, int size) = 0; virtual int __stdcall propSetFloatArray(AVSMap* map, const char* key, const double* d, int size) = 0; virtual AVSMap* __stdcall createMap() = 0; virtual void __stdcall freeMap(AVSMap* map) = 0; virtual void __stdcall clearMap(AVSMap* map) = 0; // NewVideoFrame with frame property source. virtual PVideoFrame __stdcall NewVideoFrameP(const VideoInfo& vi, const PVideoFrame* prop_src, int align = FRAME_ALIGN) = 0; // Generic query to ask for various system properties virtual size_t __stdcall GetEnvProperty(AvsEnvProperty prop) = 0; // Support functions virtual void* __stdcall Allocate(size_t nBytes, size_t alignment, AvsAllocType type) = 0; virtual void __stdcall Free(void* ptr) = 0; // these GetVar versions (renamed differently) were moved from IScriptEnvironment2 // Returns TRUE and the requested variable. If the method fails, returns FALSE and does not touch 'val'. virtual bool __stdcall GetVarTry(const char* name, AVSValue* val) const = 0; // ex virtual bool __stdcall GetVar(const char* name, AVSValue* val) const = 0; // Return the value of the requested variable. // If the variable was not found or had the wrong type, // return the supplied default value. virtual bool __stdcall GetVarBool(const char* name, bool def) const = 0; virtual int __stdcall GetVarInt(const char* name, int def) const = 0; virtual double __stdcall GetVarDouble(const char* name, double def) const = 0; virtual const char* __stdcall GetVarString(const char* name, const char* def) const = 0; // brand new in v8 - v11: real int64 support virtual int64_t __stdcall GetVarLong(const char* name, int64_t def) const = 0; // 'Invoke' functions moved here from internal ScriptEnvironments are renamed in order to keep vtable order // Invoke functions with 'Try' will return false instead of throwing NotFound(). // ex-IScriptEnvironment2 virtual bool __stdcall InvokeTry(AVSValue* result, const char* name, const AVSValue& args, const char* const* arg_names = 0) = 0; // Since V8 virtual AVSValue __stdcall Invoke2(const AVSValue& implicit_last, const char* name, const AVSValue args, const char* const* arg_names = 0) = 0; // Ex-INeo virtual bool __stdcall Invoke2Try(AVSValue* result, const AVSValue& implicit_last, const char* name, const AVSValue args, const char* const* arg_names = 0) = 0; virtual AVSValue __stdcall Invoke3(const AVSValue& implicit_last, const PFunction& func, const AVSValue args, const char* const* arg_names = 0) = 0; virtual bool __stdcall Invoke3Try(AVSValue* result, const AVSValue& implicit_last, const PFunction& func, const AVSValue args, const char* const* arg_names = 0) = 0; // V9 virtual bool __stdcall MakePropertyWritable(PVideoFrame* pvf) = 0; // V11 virtual int __stdcall propGetIntSaturated(const AVSMap* map, const char* key, int index, int* error) = 0; virtual float __stdcall propGetFloatSaturated(const AVSMap* map, const char* key, int index, int* error) = 0; virtual int __stdcall propGetDataTypeHint(const AVSMap* map, const char* key, int index, int* error) = 0; // returns AVSPropDataTypeHint virtual int __stdcall propSetDataH(AVSMap* map, const char* key, const char* d, int length, int type, int append) = 0; // V12 // New Global Lock API for cross-plugin synchronization. // Plugins must ensure these calls are balanced (acquire followed by release), virtual bool __stdcall AcquireGlobalLock(const char* name) = 0; virtual void __stdcall ReleaseGlobalLock(const char* name) = 0; virtual void __stdcall ApplyMessageEx(PVideoFrame* frame, const VideoInfo& vi, const char* message, int size, int textcolor, int halocolor, int bgcolor, bool utf8) = 0; virtual int64_t __stdcall GetCPUFlagsEx() = 0; }; // end class IScriptEnvironment_AvsPreV11C. Order is important. #endif // _AVS_COMPATENVIRONMENT_H_INCLUDED ================================================ FILE: avs_core/core/DeviceManager.cpp ================================================ #include "DeviceManager.h" #include "internal.h" #include "InternalEnvironment.h" #include #include #include #include #include #include "LruCache.h" #include "ThreadPool.h" #include "AVSMap.h" #include "parser/scriptparser.h" #ifndef MINGW_HAS_SECURE_API #define sprintf_s sprintf #endif #define ENABLE_CUDA_COMPUTE_STREAM 0 #ifdef ENABLE_CUDA #include #endif // #ifdef ENABLE_CUDA #define CUDA_CHECK(call) \ do { \ cudaError_t err__ = call; \ if (err__ != cudaSuccess) { \ env->ThrowError("[CUDA Error] %d: %s @%d", err__, cudaGetErrorString(err__), __LINE__); \ } \ } while (0) int GetDeviceTypes(const PClip& child) { if (child->GetVersion() < 5) { return DEV_TYPE_CPU; } int deviceflags = child->SetCacheHints(CACHE_GET_DEV_TYPE, 0); if (deviceflags == 0) { // if not implement CACHE_GET_DEVICE_TYPE, we assume CPU only filter. deviceflags = DEV_TYPE_CPU; } return deviceflags; } int GetTargetDeviceTypes(const PClip& clip) { if (clip->GetVersion() < 5) { return DEV_TYPE_CPU; } int deviceflags = clip->SetCacheHints(CACHE_GET_CHILD_DEV_TYPE, 0); if (deviceflags == 0) { deviceflags = clip->SetCacheHints(CACHE_GET_DEV_TYPE, 0); if (deviceflags == 0) { // if not implement CACHE_GET_DEVICE_TYPE, we assume CPU only filter. deviceflags = DEV_TYPE_CPU; } } return deviceflags; } std::string DeviceTypesString(int devicetypes) { std::vector typesstr; if (devicetypes & DEV_TYPE_CPU) { typesstr.push_back("CPU"); } if (devicetypes & DEV_TYPE_CUDA) { typesstr.push_back("CUDA"); } std::ostringstream oss; for (int i = 0; i < (int)typesstr.size(); ++i) { if (i > 0) oss << ","; oss << typesstr[i]; } return oss.str(); } static void CheckDeviceTypes(const char* name, int devicetypes, const AVSValue& last, const AVSValue& arr, InternalEnvironment* env) { for (int i = -1; i < arr.ArraySize(); ++i) { const AVSValue& val = (i == -1) ? last : arr[i]; if (val.IsClip()) { int childtypes = GetDeviceTypes(val.AsClip()); if ((devicetypes & childtypes) == 0) { std::string parentdevstr = DeviceTypesString(devicetypes); std::string childdevstr = DeviceTypesString(childtypes); // e.g.. Device unmatch: XYfilter[CPU] does not support [CUDA] frame env->ThrowError( "Device unmatch: %s[%s] does not support [%s] frame", name, parentdevstr.c_str(), childdevstr.c_str()); } } else if (val.IsArray()) { CheckDeviceTypes(name, devicetypes, AVSValue(), val, env); } } } void CheckChildDeviceTypes(const PClip& clip, const char* name, const AVSValue& last, const AVSValue& args, const char* const* argnames, InternalEnvironment* env) { int deviceflags = GetTargetDeviceTypes(clip); if (args.IsArray()) { CheckDeviceTypes(name, deviceflags, last, args, env); } else { CheckDeviceTypes(name, deviceflags, last, AVSValue(&args, 1), env); } } size_t GetFrameHead(const PVideoFrame& vf) { int head = vf->GetOffset(); if (vf->GetPitch(PLANAR_U)) { head = min(head, vf->GetOffset(PLANAR_U)); } if (vf->GetPitch(PLANAR_V)) { head = min(head, vf->GetOffset(PLANAR_V)); } if (vf->GetPitch(PLANAR_A)) { head = min(head, vf->GetOffset(PLANAR_A)); } return head; } size_t GetFrameTail(const PVideoFrame& vf) { int tail = vf->GetOffset() + vf->GetPitch() * vf->GetHeight(); if (vf->GetPitch(PLANAR_U)) { tail = max(tail, vf->GetOffset(PLANAR_U) + vf->GetPitch(PLANAR_U) * vf->GetHeight(PLANAR_U)); } if (vf->GetPitch(PLANAR_V)) { tail = max(tail, vf->GetOffset(PLANAR_V) + vf->GetPitch(PLANAR_V) * vf->GetHeight(PLANAR_V)); } if (vf->GetPitch(PLANAR_A)) { tail = max(tail, vf->GetOffset(PLANAR_A) + vf->GetPitch(PLANAR_A) * vf->GetHeight(PLANAR_A)); } return min(tail, vf->GetFrameBuffer()->GetDataSize() + (int)GetFrameHead(vf)); } class CPUDevice : public Device { public: CPUDevice(InternalEnvironment* env) : Device(DEV_TYPE_CPU, 0, 0, env) { } virtual int SetMemoryMax(int mem) { // memory_max for CPU device is not implemented here. env->ThrowError("Not implemented ..."); return 0; } virtual BYTE* Allocate(size_t size, int margin) { size += margin; // Allocate a bit more, so we can safely use a 64 byte (512 bits AVX512) load even from // the last pixel of VideoFrameBuffer. Note: NaN contamination over valid scanlines are still a concern // when using 32-bit float data. // Pre 3.7.6 used only 16 bytes (SSE2) constexpr size_t SIMD_OVERREAD_EXTRA_SAFETY = 64; #ifdef _DEBUG BYTE* data = new BYTE[size + SIMD_OVERREAD_EXTRA_SAFETY]; // fill extra space with recognizable pattern for (auto i = 0; i < SIMD_OVERREAD_EXTRA_SAFETY / 8; ++i) { ((uint64_t*)(data + size))[i] = 0xDEADBEEFDEADBEEF; } // fill allocated memory with recognizable pattern // AllOCA7ED, uneven 5-byte pattern to catch overruns static const BYTE filler[] = { 0x0A, 0x11, 0x0C, 0xA7, 0xED }; BYTE* pByte = data; BYTE* q = pByte + size / 5 * 5; for (; pByte < q; pByte += 5) { pByte[0] = filler[0]; pByte[1] = filler[1]; pByte[2] = filler[2]; pByte[3] = filler[3]; pByte[4] = filler[4]; } return data; #else return new BYTE[size + SIMD_OVERREAD_EXTRA_SAFETY]; #endif } virtual void Free(BYTE* ptr) { if (ptr != nullptr) { delete[] ptr; } } virtual const char* GetName() const { return "CPU"; } virtual void AddCompleteCallback(DeviceCompleteCallbackData cbdata) { // no need to delay, call immediately cbdata.cb(cbdata.user_data); } virtual std::unique_ptr> GetAndClearCallbacks() { return nullptr; } virtual void SetActiveToCurrentThread(InternalEnvironment* env) { // do nothing } virtual void* GetComputeStream() { return nullptr; } virtual void SetDeviceOpt(DeviceOpt opt, int val, InternalEnvironment* env) { // do nothing } virtual void GetAlignmentRequirement(int* memoryAlignment, int* pitchAlignment) { *memoryAlignment = FRAME_ALIGN; *pitchAlignment = FRAME_ALIGN; } }; #ifdef ENABLE_CUDA class CUDACPUDevice : public CPUDevice { int num_cuda_devices; bool allocated; bool enable_pinned; public: CUDACPUDevice(InternalEnvironment* env, int num_cuda_devices) : CPUDevice(env) , num_cuda_devices(num_cuda_devices) , allocated() , enable_pinned() { } virtual BYTE* Allocate(size_t size, int margin) { allocated = true; if (!enable_pinned) { return CPUDevice::Allocate(size, margin); } //unsigned int flags = (prop.canMapHostMemory && prop.unifiedAddressing) // ? cudaHostAllocMapped : cudaHostAllocDefault; // Without portable flag, allocated memory is associated with one cuda context, // i.e. one GPU. portable flag is required to use this memory with all GPUs. unsigned int flags = (num_cuda_devices > 1) ? cudaHostAllocPortable : cudaHostAllocDefault; BYTE* data = nullptr; size += margin; // FIXME check: is extra safety needed for pinned memory like CPUDevice::Allocate // adds extra 64 bytes for SIMD overread safety instead of 16 bytes? #ifdef _DEBUG CUDA_CHECK(cudaHostAlloc((void**)&data, size + 16, flags)); int *pInt = (int *)(data + size); pInt[0] = 0xDEADBEEF; pInt[1] = 0xDEADBEEF; pInt[2] = 0xDEADBEEF; pInt[3] = 0xDEADBEEF; static const BYTE filler[] = { 0x0A, 0x11, 0x0C, 0xA7, 0xED }; BYTE* pByte = data; BYTE* q = pByte + size / 5 * 5; for (; pByte < q; pByte += 5) { pByte[0] = filler[0]; pByte[1] = filler[1]; pByte[2] = filler[2]; pByte[3] = filler[3]; pByte[4] = filler[4]; } #else CUDA_CHECK(cudaHostAlloc((void**)&data, size + 16, flags)); #endif return data; } virtual void Free(BYTE* ptr) { if (!enable_pinned) { CPUDevice::Free(ptr); } else { if (ptr != nullptr) { CUDA_CHECK(cudaFreeHost(ptr)); } } } virtual const char* GetName() const { return "CPU(CUDAAware)"; } void SetDeviceOpt(DeviceOpt opt, int val, InternalEnvironment* env) { if (opt == DEV_CUDA_PINNED_HOST) { if (!enable_pinned) { if (allocated) { env->ThrowError("SetDeviceOpt: Allocation mode change must be done before any frame allocation."); } enable_pinned = true; } } if (opt == DEV_FREE_THRESHOLD) { free_thresh = val; } } virtual void GetAlignmentRequirement(int* memoryAlignment, int* pitchAlignment) { *memoryAlignment = FRAME_ALIGN; *pitchAlignment = FRAME_ALIGN; } }; #endif #ifdef ENABLE_CUDA class CUDADevice : public Device { class ScopedCUDADevice { int old_device; int tgt_device; public: ScopedCUDADevice(int device_index, IScriptEnvironment* env) : tgt_device(device_index) { CUDA_CHECK(cudaGetDevice(&old_device)); if (tgt_device != old_device) { CUDA_CHECK(cudaSetDevice(tgt_device)); } } ~ScopedCUDADevice() { if (tgt_device != old_device) { cudaSetDevice(old_device); } } }; char name[32]; cudaDeviceProp prop; std::mutex mutex; std::vector callbacks; #if ENABLE_CUDA_COMPUTE_STREAM cudaStream_t computeStream; cudaEvent_t computeEvent; #endif public: CUDADevice(int id, int n, InternalEnvironment* env) : Device(DEV_TYPE_CUDA, id, n, env) { sprintf_s(name, "CUDA %d", n); ScopedCUDADevice d(device_index, env); CUDA_CHECK(cudaGetDeviceProperties(&prop, device_index)); SetMemoryMax(768); // start with 768MB #if ENABLE_CUDA_COMPUTE_STREAM CUDA_CHECK(cudaStreamCreate(&computeStream)); CUDA_CHECK(cudaEventCreate(&computeEvent)); #endif } ~CUDADevice() { #if ENABLE_CUDA_COMPUTE_STREAM cudaStreamDestroy(computeStream); cudaEventDestroy(computeEvent); #endif } virtual int SetMemoryMax(int mem) { if (mem > 0) { uint64_t requested = mem * 1048576ull; uint64_t mem_limit = prop.totalGlobalMem; memory_max = clamp(requested, (uint64_t)(64 * 1024 * 1024ull), (uint64_t)(mem_limit - 128 * 1024 * 1024ull)); } return (int)(memory_max / 1048576ull); } virtual BYTE* Allocate(size_t size, int margin) { BYTE* data = nullptr; ScopedCUDADevice d(device_index, env); CUDA_CHECK(cudaMalloc((void**)&data, size)); return data; } virtual void Free(BYTE* ptr) { if (ptr != NULL) { ScopedCUDADevice d(device_index, env); CUDA_CHECK(cudaFree(ptr)); } } virtual const char* GetName() const { return name; } virtual void AddCompleteCallback(DeviceCompleteCallbackData cbdata) { std::lock_guard lock(mutex); callbacks.push_back(cbdata); } virtual std::unique_ptr> GetAndClearCallbacks() { std::lock_guard lock(mutex); if (callbacks.size() > 0) { auto *ret = new std::vector(std::move(callbacks)); callbacks.clear(); return std::unique_ptr>(ret); } return nullptr; } virtual void SetActiveToCurrentThread(InternalEnvironment* env) { CUDA_CHECK(cudaSetDevice(device_index)); } virtual void* GetComputeStream() { #if ENABLE_CUDA_COMPUTE_STREAM return computeStream; #else return nullptr; #endif } void MakeStreamWaitCompute(cudaStream_t stream, InternalEnvironment* env) { #if ENABLE_CUDA_COMPUTE_STREAM std::lock_guard lock(mutex); CUDA_CHECK(cudaEventRecord(computeEvent, computeStream)); CUDA_CHECK(cudaStreamWaitEvent(stream, computeEvent, 0)); #endif } void SetDeviceOpt(DeviceOpt opt, int val, InternalEnvironment* env) { if (opt == DEV_FREE_THRESHOLD) { free_thresh = val; } } virtual void GetAlignmentRequirement(int* memoryAlignment, int* pitchAlignment) { *memoryAlignment = (int)prop.textureAlignment; *pitchAlignment = (int)prop.texturePitchAlignment; } }; #endif DeviceManager::DeviceManager(InternalEnvironment* env) : env(env) { // 0 is CPU device, start from 1 for other devices. int next_device_id = 1; #ifdef ENABLE_CUDA int cuda_device_count = 0; cudaError_t status = cudaGetDeviceCount(&cuda_device_count); if (status == cudaSuccess) { // _RPT0(0, "cudaGetDeviceCount = %d\r\n", cuda_device_count); for (int i = 0; i < cuda_device_count; ++i) { cudaDevices.emplace_back(new CUDADevice(next_device_id++, i, env)); } } else { if (status == cudaErrorInitializationError) { // We probably get this error because of current Nvidia driver version is lower than // the minimum required version by the used CUDA SDK, or a Computing Capability is too low. // Example: GTX460: Latest driver is 391.35, latest supporting CUDA SDK is 9.1.85 // Consequence: since SDK 9 is unsupported in VS2019, no GTX460 support // As of Jan.2021 Avisynth+ is is using CUDA Toolkit version 11.2. int version; status = cudaRuntimeGetVersion(&version); if(status == cudaSuccess) _RPT1(0, "cudaGetDeviceCount: cudaErrorInitializationError!\r\nMaybe CUDA Runtime version (%d) does not support old drivers. \r\n", version); else _RPT0(0, "cudaGetDeviceCount: cudaErrorInitializationError! Runtime version request failed\r\n"); } else { _RPT1(0, "cudaGetDeviceCount failed (%d)\r\n", (int)status); } } // do not modify CUDADevices after this since it causes pointer change cpuDevice = std::unique_ptr((cuda_device_count > 0) ? new CUDACPUDevice(env, cuda_device_count) : new CPUDevice(env)); #else // ENABLE_CUDA cpuDevice = std::unique_ptr(new CPUDevice(env)); #endif // ENABLE_CUDA numDevices = next_device_id; } Device* DeviceManager::GetDevice(AvsDeviceType device_type, int device_index) const { switch (device_type) { case DEV_TYPE_CPU: return cpuDevice.get(); case DEV_TYPE_CUDA: #ifdef ENABLE_CUDA if (device_index < 0) { env->ThrowError("Invalid device index %d", device_index); } if (cudaDevices.size() == 0) { env->ThrowError("No CUDA devices ..."); } // wrap index device_index %= (int)cudaDevices.size(); return cudaDevices[device_index].get(); #else env->ThrowError("This Avisynth does not support memory type %d (CUDA)", device_type); #endif default: env->ThrowError("Not supported memory type %d", device_type); } return nullptr; } int DeviceManager::GetNumDevices(AvsDeviceType device_type) const { switch (device_type) { case DEV_TYPE_CPU: return 1; case DEV_TYPE_CUDA: return (int)cudaDevices.size(); default: env->ThrowError("Not supported memory type %d", device_type); } return 0; } void DeviceManager::SetDeviceOpt(DeviceOpt opt, int val, InternalEnvironment* env) { cpuDevice->SetDeviceOpt(opt, val, env); #ifdef ENABLE_CUDA for (auto& dev : cudaDevices) { dev->SetDeviceOpt(opt, val, env); } #endif // #ifdef ENABLE_CUDA } DeviceSetter::DeviceSetter(InternalEnvironment* env, Device* upstreamDevice) : env(env) { downstreamDevice = env->SetCurrentDevice(upstreamDevice); if (downstreamDevice == nullptr) { env->ThrowError("This thread is not created by AviSynth. It is not allowed to invoke script on this thread ..."); } } DeviceSetter::~DeviceSetter() { env->SetCurrentDevice(downstreamDevice); } class QueuePrefetcher { PClip child; VideoInfo vi; int prefetchFrames; int numThreads; ThreadPool* threadPool; Device* device; typedef LruCache CacheType; std::shared_ptr videoCache; std::mutex mutex; // do not acceess to videoCache during locked by this mutex std::deque> prefetchQueue; int numWorkers; std::exception_ptr workerException; bool workerExceptionPresent; static AVSValue ThreadWorker_(IScriptEnvironment2* env, void* data) { return static_cast(data)->ThreadWorker( static_cast(env)); } AVSValue ThreadWorker(InternalEnvironment* env) { device->SetActiveToCurrentThread(env); while (true) { std::pair work; { std::lock_guard lock(mutex); if (prefetchQueue.size() == 0) { // there are no prefetch work --numWorkers; break; } work = prefetchQueue.front(); prefetchQueue.pop_front(); } try { work.second.first->value = child->GetFrame((int)work.first, env); videoCache->commit_value(&work.second); } catch (...) { { std::lock_guard lock(mutex); workerException = std::current_exception(); workerExceptionPresent = true; } videoCache->rollback(&work.second); } } return AVSValue(); } void SchedulePrefetch(int currentN, InternalEnvironment* env) { int numQueued = 0; for (int n = currentN + 1; (n < currentN + prefetchFrames) && (n < vi.num_frames); ++n) { PVideoFrame result; CacheType::handle cacheHandle; switch (videoCache->lookup(n, &cacheHandle, false, result)) { case LRU_LOOKUP_NOT_FOUND: { std::lock_guard lock(mutex); prefetchQueue.emplace_back(n, cacheHandle); ++numQueued; break; } case LRU_LOOKUP_FOUND_AND_READY: // Fall-through intentional case LRU_LOOKUP_NO_CACHE: // Fall-through intentional case LRU_LOOKUP_FOUND_BUT_NOTAVAIL: { break; } default: { env->ThrowError("Invalid Program"); break; } } } // wake up sleeping thread if (numQueued > 0) { std::lock_guard lock(mutex); for (; numWorkers < numThreads && numQueued > 0; ++numWorkers, --numQueued) { threadPool->QueueJob(ThreadWorker_, this, env, nullptr); } } } public: QueuePrefetcher(PClip child, int prefetchFrames, int numThreads, Device* device, InternalEnvironment* env) : child(child), vi(child->GetVideoInfo()), prefetchFrames(prefetchFrames), numThreads(numThreads), threadPool(NULL), device(device), videoCache(NULL), numWorkers(0), workerExceptionPresent(false) { if (numThreads > 0 && prefetchFrames > 0) { threadPool = env->NewThreadPool(numThreads); videoCache = std::shared_ptr(new CacheType(prefetchFrames - 1, CACHE_NO_RESIZE)); } else { numThreads = prefetchFrames = 0; } } ~QueuePrefetcher() { if (numThreads > 0) { // finish threadpool threadPool->Finish(); // cancel queue while (prefetchQueue.size() > 0) { videoCache->rollback(&prefetchQueue.front().second); prefetchQueue.pop_front(); } } } VideoInfo GetVideoInfo() const { return vi; } PVideoFrame GetFrame(int n, InternalEnvironment* env) { // do not use thread when invoke running if (prefetchFrames == 0 || env->GetSuppressThreadCount() > 0) { return child->GetFrame(n, env); } PVideoFrame result; CacheType::handle cacheHandle; switch (videoCache->lookup(n, &cacheHandle, true, result)) { case LRU_LOOKUP_FOUND_AND_READY: break; case LRU_LOOKUP_NOT_FOUND: { try { { std::lock_guard lock(mutex); // check error if (workerExceptionPresent) { std::rethrow_exception(workerException); } } cacheHandle.first->value = child->GetFrame(n, env); result = cacheHandle.first->value; videoCache->commit_value(&cacheHandle); } catch (...) { videoCache->rollback(&cacheHandle); throw; } break; } case LRU_LOOKUP_NO_CACHE: result = child->GetFrame(n, env); break; case LRU_LOOKUP_FOUND_BUT_NOTAVAIL: // Fall-through intentional default: env->ThrowError("Invalid Program"); break; } SchedulePrefetch(n, env); return result; } }; class FrameTransferEngine { public: QueuePrefetcher& child; VideoInfo vi; Device* upstreamDevice; Device* downstreamDevice; FrameTransferEngine(QueuePrefetcher& child, Device* upstreamDevice, Device* downstreamDevice) : child(child), vi(child.GetVideoInfo()), upstreamDevice(upstreamDevice), downstreamDevice(downstreamDevice) { } virtual ~FrameTransferEngine() { } virtual PVideoFrame GetFrame(int n, InternalEnvironment* env) = 0; }; #ifdef ENABLE_CUDA class CUDAFrameTransferEngine : public FrameTransferEngine { typedef LruCache CacheType; struct QueueItem { size_t n; PVideoFrame src; CacheType::handle cacheHandle; cudaEvent_t completeEvent; std::unique_ptr> completeCallbacks; }; int prefetchFrames; std::shared_ptr videoCache; std::mutex mutex; cudaStream_t stream; std::deque prefetchQueue; cudaMemcpyKind GetMemcpyKind() { if (upstreamDevice->device_type == DEV_TYPE_CPU && downstreamDevice->device_type == DEV_TYPE_CUDA) { // Host to Device return cudaMemcpyHostToDevice; } if (upstreamDevice->device_type == DEV_TYPE_CUDA && downstreamDevice->device_type == DEV_TYPE_CPU) { // Device to Host return cudaMemcpyDeviceToHost; } if (upstreamDevice->device_type == DEV_TYPE_CUDA && downstreamDevice->device_type == DEV_TYPE_CUDA) { // Device to Device return cudaMemcpyDeviceToDevice; } _ASSERT(false); return cudaMemcpyDefault; } void ExecuteCallbacks(const std::vector* callbacks) { if (callbacks != nullptr) { for (auto cbdata : *callbacks) { cbdata.cb(cbdata.user_data); } } } void TransferFrameData(PVideoFrame& dst, PVideoFrame& src, bool async, InternalEnvironment* env) { size_t srchead = GetFrameHead(src); size_t sz = GetFrameTail(src) - srchead; const BYTE* srcptr = src->GetFrameBuffer()->GetReadPtr() + srchead; BYTE* dstptr = dst->GetFrameBuffer()->GetWritePtr() + GetFrameHead(dst); cudaMemcpyKind kind = GetMemcpyKind(); if (async) { CUDA_CHECK(cudaMemcpyAsync(dstptr, srcptr, sz, kind, stream)); } else { CUDA_CHECK(cudaMemcpy(dstptr, srcptr, sz, kind)); } } PVideoFrame GetFrameImmediate(int n, InternalEnvironment* env) { PVideoFrame src = child.GetFrame(n, env); PVideoFrame dst = env->GetOnDeviceFrame(src, downstreamDevice); TransferFrameData(dst, src, false, env); #if 1 AVSMap* mapv = env->getFramePropsRW(dst); const int numKeys = env->propNumKeys(mapv); for (int i = 0; i < numKeys; i++) { const char* key = env->propGetKey(mapv, i); if (env->propGetType(mapv, key) == AVSPropTypes::PROPTYPE_FRAME) { // isFrame true const int numElements = env->propNumElements(mapv, key); std::vector frameset; int error; // avs+: can be more frames in a frame property array for (int index = 0; index < numElements; index++) { const PVideoFrame srcframe = env->propGetFrame(mapv, key, index, &error); frameset.push_back(srcframe); } env->propDeleteKey(mapv, key); for (int index = 0; index < numElements; index++) { PVideoFrame src = frameset[index]; PVideoFrame dst = env->GetOnDeviceFrame(src, downstreamDevice); TransferFrameData(dst, src, false, env); env->propSetFrame(mapv, key, dst, AVSPropAppendMode::PROPAPPENDMODE_APPEND); } } } #else // kept for reference from neo fork, a single frame in frame properties. No array of frames here AVSMap* mapv = env->GetAVSMap(dst); for (auto it = mapv->data.begin(), end = mapv->data.end(); it != end; ++it) { if (it->second.IsFrame()) { PVideoFrame src = it->second.GetFrame(); PVideoFrame dst = env->GetOnDeviceFrame(src, downstreamDevice); TransferFrameData(dst, src, false, env); it->second = dst; } } #endif ExecuteCallbacks(downstreamDevice->GetAndClearCallbacks().get()); return dst; } QueueItem SetupTransfer(int n, CacheType::handle& cacheHandle, InternalEnvironment* env) { QueueItem item = { (size_t)n, child.GetFrame(n, env), cacheHandle, nullptr, nullptr }; cacheHandle.first->value = env->GetOnDeviceFrame(item.src, downstreamDevice); CUDA_CHECK(cudaEventCreate(&item.completeEvent)); item.completeCallbacks = upstreamDevice->GetAndClearCallbacks(); if (upstreamDevice->device_type == DEV_TYPE_CUDA) { static_cast(upstreamDevice)->MakeStreamWaitCompute(stream, env); } TransferFrameData(cacheHandle.first->value, item.src, true, env); #if 1 AVSMap* mapv = env->getFramePropsRW(cacheHandle.first->value); const int numKeys = env->propNumKeys(mapv); for (int i = 0; i < numKeys; i++) { const char* key = env->propGetKey(mapv, i); if (env->propGetType(mapv, key) == AVSPropTypes::PROPTYPE_FRAME) { // isFrame true const int numElements = env->propNumElements(mapv, key); std::vector frameset; int error; // avs+: can be more frames in a frame property array for (int index = 0; index < numElements; index++) { const PVideoFrame srcframe = env->propGetFrame(mapv, key, index, &error); frameset.push_back(srcframe); } env->propDeleteKey(mapv, key); for (int index = 0; index < numElements; index++) { PVideoFrame src = frameset[index]; PVideoFrame dst = env->GetOnDeviceFrame(src, downstreamDevice); TransferFrameData(dst, src, true, env); env->propSetFrame(mapv, key, dst, AVSPropAppendMode::PROPAPPENDMODE_APPEND); } } } #else // kept for reference from neo fork, a single frame in frame properties. No frame arrays here AVSMap* mapv = env->GetAVSMap(cacheHandle.first->value); for (auto it = mapv->data.begin(), end = mapv->data.end(); it != end; ++it) { if (it->second.IsFrame()) { PVideoFrame src = it->second.GetFrame(); PVideoFrame dst = env->GetOnDeviceFrame(src, downstreamDevice); TransferFrameData(dst, src, true, env); it->second = dst; } } #endif CUDA_CHECK(cudaEventRecord(item.completeEvent, stream)); return std::move(item); } int SchedulePrefetch(int currentN, int prefetchStart, InternalEnvironment* env) { int numQueued = 0; int n = prefetchStart; for (; n < currentN + prefetchFrames && n < vi.num_frames; ++n) { PVideoFrame result; CacheType::handle cacheHandle; switch (videoCache->lookup(n, &cacheHandle, false, result)) { case LRU_LOOKUP_NOT_FOUND: { try { prefetchQueue.emplace_back(SetupTransfer(n, cacheHandle, env)); } catch (...) { videoCache->rollback(&cacheHandle); throw; } break; } case LRU_LOOKUP_FOUND_AND_READY: // Fall-through intentional case LRU_LOOKUP_NO_CACHE: // Fall-through intentional case LRU_LOOKUP_FOUND_BUT_NOTAVAIL: { break; } default: { env->ThrowError("Invalid Program"); break; } } } return n; } void FinishCompleted(InternalEnvironment* env) { while (prefetchQueue.size() > 0) { QueueItem& item = prefetchQueue.front(); cudaError_t err = cudaEventQuery(item.completeEvent); if (err == cudaErrorNotReady) { break; } try { CUDA_CHECK(err); // transfer is complete CUDA_CHECK(cudaEventDestroy(item.completeEvent)); ExecuteCallbacks(item.completeCallbacks.get()); videoCache->commit_value(&item.cacheHandle); } catch (...) { videoCache->rollback(&item.cacheHandle); throw; } prefetchQueue.pop_front(); } } PVideoFrame WaitUntil(int n, InternalEnvironment* env) { while (prefetchQueue.size() > 0) { QueueItem& item = prefetchQueue.front(); try { CUDA_CHECK(cudaEventSynchronize(item.completeEvent)); CUDA_CHECK(cudaEventDestroy(item.completeEvent)); ExecuteCallbacks(item.completeCallbacks.get()); PVideoFrame frame = item.cacheHandle.first->value; // fill before Commit !!! videoCache->commit_value(&item.cacheHandle); if (item.n == n) { prefetchQueue.pop_front(); return frame; } prefetchQueue.pop_front(); } catch (...) { videoCache->rollback(&item.cacheHandle); throw; } } env->ThrowError("invalid program"); return PVideoFrame(); } void CheckDevicePair(InternalEnvironment* env) { if (upstreamDevice->device_type == DEV_TYPE_CPU && downstreamDevice->device_type == DEV_TYPE_CUDA) { // Host to Device return; } if (upstreamDevice->device_type == DEV_TYPE_CUDA && downstreamDevice->device_type == DEV_TYPE_CPU) { // Device to Host return; } if (upstreamDevice->device_type == DEV_TYPE_CUDA && downstreamDevice->device_type == DEV_TYPE_CUDA) { // Device to Device return; } env->ThrowError("[CUDAFrameTransferEngine] invalid device pair up:%s down:%d", upstreamDevice->GetName(), downstreamDevice->GetName()); } public: CUDAFrameTransferEngine(QueuePrefetcher& child, Device* upstreamDevice, Device* downstreamDevice, int prefetchFrames, InternalEnvironment* env) : FrameTransferEngine(child, upstreamDevice, downstreamDevice), prefetchFrames(prefetchFrames), videoCache(new CacheType(std::max(0, prefetchFrames - 1), CACHE_NO_RESIZE)), stream(nullptr) { CheckDevicePair(env); // note: stream belongs to a device upstreamDevice->SetActiveToCurrentThread(env); CUDA_CHECK(cudaStreamCreate(&stream)); } ~CUDAFrameTransferEngine() { for (auto& item : prefetchQueue) { cudaEventSynchronize(item.completeEvent); cudaEventDestroy(item.completeEvent); ExecuteCallbacks(item.completeCallbacks.get()); videoCache->commit_value(&item.cacheHandle); } prefetchQueue.clear(); cudaStreamDestroy(stream); } virtual PVideoFrame GetFrame(int n, InternalEnvironment* env) { // Giant lock. This is OK because all transfer is done asynchronously std::lock_guard lock(mutex); // set upstream device upstreamDevice->SetActiveToCurrentThread(env); // do not use thread when invoke running if (prefetchFrames == 0 || env->GetSuppressThreadCount() > 0) { return GetFrameImmediate(n, env); } FinishCompleted(env); SchedulePrefetch(n, n, env); // Get requested frame PVideoFrame result; CacheType::handle cacheHandle; // fill result if LRU_LOOKUP_FOUND_AND_READY switch (videoCache->lookup(n, &cacheHandle, false, result)) { case LRU_LOOKUP_FOUND_AND_READY: { break; } case LRU_LOOKUP_NO_CACHE: { result = GetFrameImmediate(n, env); break; } case LRU_LOOKUP_FOUND_BUT_NOTAVAIL: { // now transferring, wait until completion result = WaitUntil(n, env); break; } case LRU_LOOKUP_NOT_FOUND: { env->ThrowError("Oh.. maybe cache size is too small ..."); break; } default: { env->ThrowError("Invalid Program"); break; } } // set downstreamdevice downstreamDevice->SetActiveToCurrentThread(env); return result; } }; #endif FrameTransferEngine* CreateTransferEngine(QueuePrefetcher& child, Device* upstreamDevice, Device* downstreamDevice, int prefetchFrames, InternalEnvironment* env) { #ifdef ENABLE_CUDA if (upstreamDevice->device_type == DEV_TYPE_CPU && downstreamDevice->device_type == DEV_TYPE_CUDA) { // CPU to CUDA return new CUDAFrameTransferEngine(child, upstreamDevice, downstreamDevice, prefetchFrames, env); } if (upstreamDevice->device_type == DEV_TYPE_CUDA && downstreamDevice->device_type == DEV_TYPE_CPU) { // CUDA to CPU return new CUDAFrameTransferEngine(child, upstreamDevice, downstreamDevice, prefetchFrames, env); } if (upstreamDevice->device_type == DEV_TYPE_CUDA && downstreamDevice->device_type == DEV_TYPE_CUDA) { // CUDA to CUDA return new CUDAFrameTransferEngine(child, upstreamDevice, downstreamDevice, prefetchFrames, env); } #endif env->ThrowError("Not supported frame data transfer. up:%s down:%d", upstreamDevice->GetName(), downstreamDevice->GetName()); return nullptr; } class OnDevice : public GenericVideoFilter { Device* upstreamDevice; int prefetchFrames; QueuePrefetcher prefetcher; std::mutex mutex; std::map> transferEngines; FrameTransferEngine* GetOrCreateTransferEngine(Device* downstreamDevice, InternalEnvironment* env) { std::lock_guard lock(mutex); auto it = transferEngines.find(downstreamDevice); if (it != transferEngines.end()) { return it->second.get(); } int transferPrefetch = (prefetchFrames == 1) ? 2 : prefetchFrames; auto pEngine = CreateTransferEngine(prefetcher, upstreamDevice, downstreamDevice, transferPrefetch, env); transferEngines[downstreamDevice] = std::unique_ptr(pEngine); return pEngine; } public: OnDevice(PClip child, int prefetchFrames, Device* upstreamDevice, InternalEnvironment* env) : GenericVideoFilter(child), upstreamDevice(upstreamDevice), prefetchFrames(prefetchFrames), prefetcher(child, (prefetchFrames >= 2) ? 2 : 0, (prefetchFrames >= 2) ? 1 : 0, upstreamDevice, env) { } PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env_) { InternalEnvironment* env = GetAndRevealCamouflagedEnv(env_); Device* downstreamDevice = env->SetCurrentDevice(upstreamDevice); if (downstreamDevice == nullptr) { env->ThrowError("This thread is not created by AviSynth. It is not allowed to call GetFrame on this thread ..."); } if (downstreamDevice == upstreamDevice) { // shortcut return child->GetFrame(n, env); } // Get frame via transfer engine PVideoFrame frame = GetOrCreateTransferEngine(downstreamDevice, env)->GetFrame(n, env); env->SetCurrentDevice(downstreamDevice); return frame; } void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env_) { InternalEnvironment* env = GetAndRevealCamouflagedEnv(env_); Device* downstreamDevice = env->SetCurrentDevice(upstreamDevice); try { child->GetAudio(buf, start, count, env); env->SetCurrentDevice(downstreamDevice); } catch (...) { env->SetCurrentDevice(downstreamDevice); throw; } } int __stdcall SetCacheHints(int cachehints, int frame_range) { if (cachehints == CACHE_GET_MTMODE) { return MT_NICE_FILTER; } if (cachehints == CACHE_GET_DEV_TYPE) { return DEV_TYPE_ANY; } if (cachehints == CACHE_GET_CHILD_DEV_TYPE) { return upstreamDevice->device_type; } return 0; } static AVSValue __cdecl Create(AVSValue args, void* user_data, IScriptEnvironment* env_) { AvsDeviceType upstreamType = (AvsDeviceType)(size_t)user_data; InternalEnvironment* env = static_cast(env_); if (args[0].IsClip()) { PClip clip = args[0].AsClip(); int numPrefetch = args[1].Defined() ? args[1].AsInt() : 1; int upstreamIndex = (args.ArraySize() >= 3 && args[2].Defined()) ? args[2].AsInt() : 0; if (numPrefetch < 0) { numPrefetch = 0; } switch (upstreamType) { case DEV_TYPE_CPU: return new OnDevice(clip, numPrefetch, (Device*)(void*)env->GetDevice(DEV_TYPE_CPU, 0), env); case DEV_TYPE_CUDA: return new OnDevice(clip, numPrefetch, (Device*)(void*)env->GetDevice(DEV_TYPE_CUDA, upstreamIndex), env); default: env->ThrowError("Not supported device ..."); return AVSValue(); } } else { assert(args[0].IsFunction()); PFunction func = args[0].AsFunction(); int upstreamIndex = (args.ArraySize() >= 2 && args[1].Defined()) ? args[1].AsInt() : 0; Device* upstreamDevice = nullptr; switch (upstreamType) { case DEV_TYPE_CPU: upstreamDevice = (Device*)(void*)env->GetDevice(DEV_TYPE_CPU, 0); break; case DEV_TYPE_CUDA: upstreamDevice = (Device*)(void*)env->GetDevice(DEV_TYPE_CUDA, upstreamIndex); break; default: env->ThrowError("Not supported device ..."); break; } DeviceSetter setter(env, upstreamDevice); try { AVSValue ret = env->Invoke3(AVSValue(), func, AVSValue(nullptr, 0)); return ret; } catch (IScriptEnvironment::NotFound) { const char* name = (upstreamType == DEV_TYPE_CPU) ? "OnCPU" : "OnCUDA"; env->ThrowError( "%s: Invalid function parameter type '%s'(%s)\n" "Function should have no argument", name, func->GetDefinition()->param_types, func->ToString(env)); } return AVSValue(); } } }; void CopyCUDAFrame(const PVideoFrame& dst, const PVideoFrame& src, InternalEnvironment* env, bool sync) { #ifdef ENABLE_CUDA size_t srchead = GetFrameHead(src); size_t sz = GetFrameTail(src) - srchead; const BYTE* srcptr = src->GetFrameBuffer()->GetReadPtr() + srchead; BYTE* dstptr = dst->GetFrameBuffer()->GetWritePtr() + GetFrameHead(dst); AvsDeviceType srcDevice = src->GetDevice()->device_type; AvsDeviceType dstDevice = dst->GetDevice()->device_type; cudaMemcpyKind kind = cudaMemcpyHostToHost; if (srcDevice == DEV_TYPE_CPU && dstDevice == DEV_TYPE_CUDA) { kind = cudaMemcpyHostToDevice; } if (srcDevice == DEV_TYPE_CUDA && dstDevice == DEV_TYPE_CPU) { kind = cudaMemcpyDeviceToHost; } if (srcDevice == DEV_TYPE_CUDA && dstDevice == DEV_TYPE_CUDA) { kind = cudaMemcpyDeviceToDevice; } if (sync) { CUDA_CHECK(cudaMemcpy(dstptr, srcptr, sz, kind)); } else { CUDA_CHECK(cudaMemcpyAsync(dstptr, srcptr, sz, kind)); } #else env->ThrowError("CopyCUDAFrame: CUDA support is disabled ..."); #endif } PVideoFrame GetFrameOnDevice(PClip& c, int n, const PDevice& device, InternalEnvironment* env) { DeviceSetter setter(env, (Device*)(void*)device); return c->GetFrame(n, env); } extern const AVSFunction Device_filters[] = { { "OnCPU", BUILTIN_FUNC_PREFIX, "c[num_prefetch]i", OnDevice::Create, (void*)DEV_TYPE_CPU }, { "OnCUDA", BUILTIN_FUNC_PREFIX, "c[num_prefetch]i[device_index]i", OnDevice::Create, (void*)DEV_TYPE_CUDA }, { "OnCPU", BUILTIN_FUNC_PREFIX, "n", OnDevice::Create, (void*)DEV_TYPE_CPU }, { "OnCUDA", BUILTIN_FUNC_PREFIX, "n[device_index]i", OnDevice::Create, (void*)DEV_TYPE_CUDA }, { 0 } }; ================================================ FILE: avs_core/core/DeviceManager.h ================================================ #pragma once #include #include #include #include class InternalEnvironment; enum DeviceOpt: int; // forward enum w/o underlying types are MS specific struct DeviceCompleteCallbackData { void(*cb)(void*); void* user_data; }; class Device { protected: InternalEnvironment* env; public: const AvsDeviceType device_type; const int device_id; const int device_index; uint64_t memory_max; std::atomic memory_used; int free_thresh; Device(AvsDeviceType type, int id, int index, InternalEnvironment* env) : env(env), device_type(type), device_id(id), device_index(index), memory_max(0), memory_used(0), free_thresh(0) { } virtual ~Device() { } virtual int SetMemoryMax(int mem) = 0; virtual BYTE* Allocate(size_t sz, int margin) = 0; virtual void Free(BYTE* ptr) = 0; virtual const char* GetName() const = 0; virtual void AddCompleteCallback(DeviceCompleteCallbackData cbdata) = 0; virtual std::unique_ptr> GetAndClearCallbacks() = 0; virtual void SetActiveToCurrentThread(InternalEnvironment* env) = 0; virtual void* GetComputeStream() = 0; virtual void SetDeviceOpt(DeviceOpt opt, int val, InternalEnvironment* env) = 0; virtual void GetAlignmentRequirement(int* memoryAlignment, int* pitchAlignment) = 0; }; class DeviceManager { private: InternalEnvironment *env; std::unique_ptr cpuDevice; std::vector> cudaDevices; int numDevices; public: DeviceManager(InternalEnvironment* env); ~DeviceManager() { } Device* GetDevice(AvsDeviceType device_type, int device_index) const; Device* GetCPUDevice() { return GetDevice(DEV_TYPE_CPU, 0); } int GetNumDevices() const { return numDevices; } int GetNumDevices(AvsDeviceType device_type) const; void SetDeviceOpt(DeviceOpt opt, int val, InternalEnvironment* env); }; class DeviceSetter { InternalEnvironment* env; Device* downstreamDevice; public: DeviceSetter(InternalEnvironment* env, Device* upstreamDevice); ~DeviceSetter(); }; void CheckChildDeviceTypes(const PClip& child, const char* name, const AVSValue& last, const AVSValue& args, const char* const* argnames, InternalEnvironment* env); void CopyCUDAFrame(const PVideoFrame& dst, const PVideoFrame& src, InternalEnvironment* env, bool sync = false); ================================================ FILE: avs_core/core/FilterConstructor.cpp ================================================ #include "FilterConstructor.h" #include "avisynth.h" FilterConstructor::FilterConstructor(IScriptEnvironment2 * env, IScriptEnvironment_Avs25* env25, IScriptEnvironment_AvsPreV11C* envPreV11C, const Function *func, std::vector* argStorage, std::vector* ctorArgs) : Env(env), Env25(env25), EnvPreV11C(envPreV11C), Func(func), #if 1 ArgStorage(std::move(*argStorage)), CtorArgs(std::move(*ctorArgs)) #else // no need to move, subarrays could not be returned ArgStorage(*argStorage), CtorArgs(*ctorArgs) #endif { } AVSValue FilterConstructor::InstantiateFilter() const { // funcArgs is passed to the function as an array. // Calls the plugin's instance creator, which is usually Filter_Create(AVSValue args, void *user_data, IScriptEnvironment *env) // or create_c_filter AVSValue funcArgs; // isPluginAvs25 and isPluginPreV11C cannot accept long and double types in // their parameters passed to them. // Such plugins don't recognize 'l' and 'd' 64-bit types due to direct type field checks in AVSValue/AVS_Value. // IsInt/avs_is_int and IsFloat/avs_is_float check the type field directly in the old header, without an interface call. // New avisynth_c.h supports these types, but old plugins don't. // Thus we convert 64-bit types in the parameter list to 32-bit ones. if (Func->isPluginAvs25 || Func->isPluginPreV11C) { std::vector funcArgs_temp(CtorArgs.size(), AVSValue()); for (auto i = 0; i < (int)CtorArgs.size(); i++) { if (CtorArgs[i].GetType() == AvsValueType::VALUE_TYPE_LONG) // long int64 -> 32 bit int funcArgs_temp[i] = CtorArgs[i].AsInt(); else if (CtorArgs[i].GetType() == AvsValueType::VALUE_TYPE_DOUBLE) // double -> float funcArgs_temp[i] = CtorArgs[i].AsFloatf(); else funcArgs_temp[i] = CtorArgs[i]; } funcArgs = AVSValue(funcArgs_temp.data(), (int)funcArgs_temp.size()); } else { funcArgs = AVSValue(CtorArgs.data(), (int)CtorArgs.size()); } AVSValue retval = Func->apply(funcArgs, Func->user_data, Func->isPluginAvs25 ? (IScriptEnvironment *)Env25 : Func->isPluginPreV11C ? (IScriptEnvironment*)EnvPreV11C : Env); // pass back proper ScriptEnvironment, because a 2.5 plugin e.g. GRunT can back-Invoke ScriptClip if (Func->isPluginAvs25) { // After instantiate a v2.5 "baked code" function, // manually release Clips or else clip variables get stuck in memory on exit if (funcArgs.IsArray()) { for (int i = 0; i < funcArgs.ArraySize(); i++) { if (funcArgs[i].IsClip()) { IClip* rawClip = (IClip*)(void*)funcArgs[i].AsClip(); // de-smart pointering rawClip->Release(); } } } // Problem: AVS 2.5 plugins have "baked code", their interface contains direct manipulation, refcount, free of AVSValue resources. // So they do not know about array deep copy and deep free mechanism. // Thus array sub-elements of the parameter AVSValue won't be freed up on exiting of such functions. // Example: CtorArgs contains clip(s) with reference count N // Upon creating funcArgs the "smart" array creation will copy the subarray as well. // Because of the deep copy the reference count of these PClip values are increased by 1. // Then funcArgs will be passed to the CPP 2.5 function which won't release the Array content, only destroys the // 'holder' array-typed AVSValue, array elements will be untouched. // So if there is a PClip parameters the Clip's reference count remains N+1, causing memory leak. // This is why we have to release them manually, deferencing the Clip by one, instead of the plugin's code. // If this reference count decrease is not done then env->DeleteScriptEnvironment will not free up everything. // ScriptEnvironment destroy is freeing up variables as well. // If a variable contains such a clip (e.g. "last"), it will fail to be released, because such Clip will not reached refcount==0. // e.g. VirtualDub consecutively press "script reload"s. Memory will leak even 50-80Mbytes so after a while // memory gets full. } return retval; } ================================================ FILE: avs_core/core/FilterConstructor.h ================================================ #ifndef _AVS_FILTER_CONSTRUCTOR_H #define _AVS_FILTER_CONSTRUCTOR_H #include "internal.h" #include class FilterConstructor { private: IScriptEnvironment2* const Env; IScriptEnvironment_Avs25* const Env25; IScriptEnvironment_AvsPreV11C* const EnvPreV11C; const Function* const Func; const std::vector ArgStorage; const std::vector CtorArgs; public: FilterConstructor(IScriptEnvironment2 * env, IScriptEnvironment_Avs25* env25, IScriptEnvironment_AvsPreV11C* envPreV11C, const Function *func, std::vector* argStorage, std::vector* ctorArgs); AVSValue InstantiateFilter() const; const char* GetFilterName() const { return Func->name; } bool IsScriptFunction() const { return AVSFunction::IsScriptFunction(Func); } const Function* GetAvsFunction() const { return Func; } }; #endif // _AVS_FILTER_CONSTRUCTOR_H ================================================ FILE: avs_core/core/FilterGraph.cpp ================================================ #include "avs/config.h" #include "FilterGraph.h" #include "DeviceManager.h" #include "InternalEnvironment.h" #include "strings.h" #ifdef AVS_WINDOWS #include #else #include #endif #include #include #include #include #include #include static AVSValue DeepCopyValue(std::vector>& arrays, const AVSValue& src) { if (src.IsArray()) { AVSValue* copy = new AVSValue[src.ArraySize()]; for (int i = 0; i < src.ArraySize(); ++i) { copy[i] = src[i]; // NEW_AVSVALUE is already doing deep copy // copy[i] = DeepCopyValue(arrays, src[i]); } arrays.emplace_back(std::unique_ptr(copy)); return AVSValue(copy, src.ArraySize()); } return src; } FilterGraphNode::FilterGraphNode(PClip child, const char* name, const AVSValue& last_, const AVSValue& args_, const char* const* argnames_, IScriptEnvironment* env) : Env(env) , child(child) , name(name) , memory(new GraphMemoryNode()) { if (last_.Defined()) { std::vector argstmp; argstmp.push_back(last_); if (argnames_) { argnames.push_back(std::string()); } for (int i = 0; i < args_.ArraySize(); ++i) { argstmp.push_back(args_[i]); } args = DeepCopyValue(arrays, AVSValue(argstmp.data(), (int)argstmp.size())); } else { args = DeepCopyValue(arrays, args_.IsArray() ? args_ : AVSValue(args_, 1)); } if (argnames_) { for (int i = 0; i < args_.ArraySize(); ++i) { argnames.push_back(argnames_[i] ? std::string(argnames_[i]) : std::string()); } } Env->ManageCache(MC_RegisterGraphNode, this); } FilterGraphNode::~FilterGraphNode() { Env->ManageCache(MC_UnRegisterGraphNode, this); } struct ScopedGraphNode { FilterGraphNode*& target; FilterGraphNode* prev; ScopedGraphNode(FilterGraphNode*& target, FilterGraphNode* node) : target(target) { prev = target; target = node; } ~ScopedGraphNode() { target = prev; } }; PVideoFrame __stdcall FilterGraphNode::GetFrame(int n, IScriptEnvironment* env_) { InternalEnvironment* env = GetAndRevealCamouflagedEnv(env_); ScopedGraphNode scope(env->GetCurrentGraphNode(), this); return child->GetFrame(n, env); } void GraphMemoryNode::OnAllocate(size_t bytes, Device* dev) { auto it = memory.find(dev); if (it == memory.end()) { memory[dev] = MemoryInfo(); it = memory.find(dev); } it->second.numAllocation++; it->second.totalBytes += bytes; } void GraphMemoryNode::OnFree(size_t bytes, Device* dev) { auto it = memory.find(dev); if (it == memory.end()) { printf("Unexpected behavior ...\n"); return; } it->second.numAllocation--; it->second.totalBytes -= bytes; } class FilterGraph { protected: IScriptEnvironment * env; struct NodeInfo { bool isFunction; int number; std::string name; std::string args; std::vector refNodes; int cacheSize; int cacheCapacity; std::map memory; NodeInfo() { } NodeInfo(int number) : number(number) { } }; std::map nodeMap; int DoClip(IClip* pclip) { if (nodeMap.find(pclip) == nodeMap.end()) { nodeMap.insert(std::make_pair(pclip, (int)nodeMap.size())); FilterGraphNode* node = dynamic_cast(pclip); if (node != nullptr) { NodeInfo& info = nodeMap[node]; info.isFunction = false; info.name = node->name; info.args = "(" + DoArray(info, nullptr, node->argnames.data(), node->args) + ")"; info.cacheSize = node->SetCacheHints(CACHE_GET_SIZE, 0); info.cacheCapacity = node->SetCacheHints(CACHE_GET_CAPACITY, 0); info.memory = node->memory->memory; } OutClip(nodeMap[node]); } return nodeMap[pclip].number; } int DoFunc(IFunction* pfunc) { if (nodeMap.find(pfunc) == nodeMap.end()) { nodeMap.insert(std::make_pair(pfunc, (int)nodeMap.size())); NodeInfo& info = nodeMap[pfunc]; info.isFunction = true; auto captures = pfunc->GetCaptures(); info.name = pfunc->ToString(env); info.args = "[" + DoArray(info, captures.var_names, nullptr, AVSValue(captures.var_data, captures.count)) + "]"; info.cacheSize = 0; info.cacheCapacity = 0; OutFunc(info); } return nodeMap[pfunc].number; } std::string DoArray(NodeInfo& info, const char** argnames_c, std::string* argnames_s, const AVSValue& arr) { std::stringstream ss; int breakpos = 0; int maxlen = 60; for (int i = 0; i < arr.ArraySize(); ++i) { if (i != 0) { ss << ","; } if (argnames_c && argnames_c[i]) { ss << argnames_c[i] << "="; } if (argnames_s && argnames_s[i].size() > 0) { ss << argnames_s[i] << "="; } const AVSValue& v = arr[i]; if (!v.Defined()) { ss << "default"; } else if (v.IsClip()) { IClip* pclip = (IClip*)(void*)v.AsClip(); int clipnum = DoClip(pclip); ss << "clip" << (clipnum + 1); info.refNodes.push_back(pclip); } else if (v.IsFunction()) { IFunction* pfunc = (IFunction*)(void*)v.AsFunction(); int funcnum = DoFunc(pfunc); ss << "func" << (funcnum + 1); info.refNodes.push_back(pfunc); } else if (v.IsArray()) { ss << OutArray("(" + DoArray(info, nullptr, nullptr, v) + ")"); } else if (v.IsBool()) { ss << (v.AsBool() ? "True" : "False"); } else if (v.IsInt()) { ss << v.AsInt(); } else if (v.IsFloat()) { ss << std::setprecision(8) << v.AsFloat(); } else if (v.IsString()) { ss << "\"" << v.AsString() << "\""; } else { ss << ""; } if ((int)ss.tellp() - breakpos > maxlen) { ss << "\n"; breakpos = (int)ss.tellp(); } } return ss.str(); } virtual void OutClip(const NodeInfo& info) = 0; virtual void OutFunc(const NodeInfo& info) = 0; virtual std::string OutArray(const std::string& args) = 0; public: int Construct(FilterGraphNode* root, IScriptEnvironment* env_) { env = env_; nodeMap.clear(); return DoClip(root); } void Construct(const std::vector& roots, IScriptEnvironment* env_) { env = env_; nodeMap.clear(); for (auto node : roots) { if (node != nullptr) { DoClip(node); } } } }; static void ReplaceAll(std::string& str, const std::string& from, const std::string& to) { size_t start_pos = 0; while ((start_pos = str.find(from, start_pos)) != std::string::npos) { str.replace(start_pos, from.length(), to); start_pos += to.length(); } } class AvsScriptFilterGraph : private FilterGraph { std::stringstream ss; protected: virtual void OutClip(const NodeInfo& info) { int num = info.number + 1; if (info.name.size() == 0) { ss << "clip" << num << ": Failed to get information" << std::endl; } else { auto args = info.args; ReplaceAll(args, "\n", ""); ss << "clip" << num << " = " << info.name << args << std::endl; } } virtual void OutFunc(const NodeInfo& info) { int num = info.number + 1; auto args = info.args; ReplaceAll(args, "\n", ""); ss << "func" << num << " = function" << args << "(){ " << info.name << " }" << std::endl; } int nextArrayNumber = 0; virtual std::string OutArray(const std::string& args) { std::string name = std::string("array") + std::to_string(++nextArrayNumber); ss << name; ss << " = ArrayCreate" << args << std::endl; return name; } public: void Construct(FilterGraphNode* root, IScriptEnvironment* env) { int last = FilterGraph::Construct(root, env); ss << "return clip" << (last + 1) << std::endl; } std::string GetOutput() { return ss.str(); } }; class DotFilterGraph : private FilterGraph { bool enableArgs; bool enableMemory; std::stringstream ss; protected: void printfcomma(size_t n) { if (n < 1000) { ss << n; return; } printfcomma(n / 1000); ss << ',' << std::setfill('0') << std::setw(3) << (n % 1000); } virtual void OutClip(const NodeInfo& info) { int num = info.number + 1; ss << "clip" << num; if (info.name.size() == 0) { ss << " [label = \"...\"];" << std::endl; } else { if (enableArgs) { std::string label = info.name + info.args; ReplaceAll(label, "\\", "\\\\"); ReplaceAll(label, "\"", "\\\""); ReplaceAll(label, "\n", "\\n"); ss << " [label = \"" << label << "\"];" << std::endl; } else { if (info.cacheCapacity != 0) { ss << " [label = \"" << info.name << "(caching " << info.cacheSize << " frames with capacity " << info.cacheCapacity << ")"; } else { ss << " [label = \"" << info.name; } if (enableMemory) { for (auto entry : info.memory) { ss << "\\n" << entry.first->GetName() << ": " << entry.second.numAllocation << " frames, "; printfcomma(entry.second.totalBytes); ss << " bytes"; } } ss << "\"];" << std::endl;; } } for (void* pclip : info.refNodes) { auto& node = nodeMap[pclip]; int refnum = node.number + 1; if (node.isFunction) { ss << "func" << refnum << " -> " << "clip" << num << ";" << std::endl; } else { ss << "clip" << refnum << " -> " << "clip" << num << ";" << std::endl; } } } virtual void OutFunc(const NodeInfo& info) { int num = info.number + 1; ss << "func" << num; if (enableArgs) { std::string label = info.name + "\n" + info.args; ReplaceAll(label, "\\", "\\\\"); ReplaceAll(label, "\"", "\\\""); ReplaceAll(label, "\n", "\\n"); ss << " [label = \"" << label << "\"];" << std::endl; } else { ss << " [label = \"" << info.name << "\"];" << std::endl; } for (void* pclip : info.refNodes) { auto& node = nodeMap[pclip]; int refnum = node.number + 1; if (node.isFunction) { ss << "func" << refnum << " -> " << "func" << num << ";" << std::endl; } else { ss << "clip" << refnum << " -> " << "func" << num << ";" << std::endl; } } } int nextArrayNumber = 0; virtual std::string OutArray(const std::string& args) { std::string name = std::string("array") + std::to_string(++nextArrayNumber); //ss << name; //ss << " = ArrayCreate" << args << std::endl; return name; } public: void Construct(FilterGraphNode* root, bool enableArgs, bool enableMemory, IScriptEnvironment* env) { this->enableArgs = enableArgs; this->enableMemory = enableMemory; ss << "digraph avs_filter_graph {" << std::endl; ss << "node [ shape = box ];" << std::endl; int last = FilterGraph::Construct(root, env); ss << "GOAL;" << std::endl; ss << "clip" << (last + 1) << " -> GOAL" << std::endl; ss << "}" << std::endl; } void Construct(const std::vector& roots, bool enableArgs, bool enableMemory, IScriptEnvironment* env) { this->enableArgs = enableArgs; this->enableMemory = enableMemory; ss << "digraph avs_filter_graph {" << std::endl; ss << "node [ shape = box ];" << std::endl; FilterGraph::Construct(roots, env); ss << "}" << std::endl; } std::string GetOutput() { return ss.str(); } }; // Helper: open a file whose path is encoded as UTF-8. // On Windows convert to wide string and use _wfopen; on POSIX just call fopen. static FILE* OpenFileUtf8(const std::string& path_utf8, const char* mode) { #ifdef AVS_WINDOWS if (path_utf8.empty() || mode == nullptr) return nullptr; // Convert UTF-8 path to wide string using helper from strings.h std::wstring wpath = Utf8ToWideChar(path_utf8.c_str()).get(); if (wpath.empty()) return nullptr; // Convert mode to wide string. Mode is usually ASCII but convert via Utf8 helper for consistency. std::wstring wmode = Utf8ToWideChar(mode).get(); if (wmode.empty()) return nullptr; return _wfopen(wpath.c_str(), wmode.c_str()); #else return fopen(path_utf8.c_str(), mode); #endif } void DoDumpGraph(const std::vector& roots, const char* path_utf8, IScriptEnvironment* env) { DotFilterGraph graph; graph.Construct(roots, true, true, env); std::string ret = graph.GetOutput(); FILE* fp = OpenFileUtf8(std::string(path_utf8), "w"); if (fp == nullptr) { env->ThrowError("Could not open output file ..."); } fwrite(ret.data(), ret.size(), 1, fp); fclose(fp); } static void DoDumpGraph(PClip clip, int mode, const char* path_utf8, IScriptEnvironment* env) { FilterGraphNode* root = dynamic_cast((IClip*)(void*)clip); std::string ret; if (mode == 0) { AvsScriptFilterGraph graph; graph.Construct(root, env); ret = graph.GetOutput(); } else if (mode == 1 || mode == 2) { DotFilterGraph graph; graph.Construct(root, mode == 1, true, env); ret = graph.GetOutput(); } else { env->ThrowError("Unknown mode (%d)", mode); } FILE* fp = OpenFileUtf8(std::string(path_utf8), "w"); if (fp == nullptr) { env->ThrowError("Could not open output file ..."); } fwrite(ret.data(), ret.size(), 1, fp); fclose(fp); } class DelayedDump : public GenericVideoFilter { std::string outpath_utf8; int mode; int nframes; bool repeat; std::vector fired; public: DelayedDump(PClip clip, const std::string& outpath_utf8, int mode, int nframes, bool repeat) : GenericVideoFilter(clip) , outpath_utf8(outpath_utf8) , mode(mode) , nframes(nframes) , repeat(repeat) { if (repeat) { fired.resize((clip->GetVideoInfo().num_frames + nframes - 1) / nframes); } else { fired.resize(1); } } PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) { if (repeat) { int slot = std::max(0, std::min(n / nframes, (int)fired.size() - 1)); if (fired[slot] == false) { fired[slot] = true; // Build path by inserting "-" before extension (if any), preserve UTF-8 std::string basename = outpath_utf8; size_t pos = basename.find_last_of('.'); std::string path; if (pos != std::string::npos) { path = basename.substr(0, pos) + "-" + std::to_string(n) + basename.substr(pos); } else { path = basename + "-" + std::to_string(n); } DoDumpGraph(child, mode, path.c_str(), env); } } else { if (n == nframes && fired[0] == false) { fired[0] = true; DoDumpGraph(child, mode, outpath_utf8.c_str(), env); } } return child->GetFrame(n, env); } }; static AVSValue DumpFilterGraph(AVSValue args, void* user_data, IScriptEnvironment* env) { PClip clip = args[0].AsClip(); FilterGraphNode* root = dynamic_cast((IClip*)(void*)clip); if (root == nullptr) { env->ThrowError("clip is not a FilterChainNode. Ensure you have enabled the chain analysis by SetGraphAnalysis(true)."); } int mode = args[2].AsInt(0); const char* path = args[1].AsString(""); int nframes = args[3].AsInt(-1); bool repeat = args[4].AsBool(false); const bool utf8 = args[5].AsBool(false); // DumpFiltergraph can also support yet forced UTF-8 mode in ANSI-only processes. std::string path_utf8; #ifdef AVS_WINDOWS // internally use UTF-8 path if (!utf8) path_utf8 = AnsiToUtf8(path).get(); else path_utf8 = path; #else path_utf8 = path; #endif if (nframes >= 0) { return new DelayedDump(clip, GetFullPathNameWrapUtf8(path_utf8), mode, nframes, repeat); } // For immediate dumps, normalize and let DoDumpGraph handle UTF-8 aware opening. DoDumpGraph(clip, mode, path_utf8.c_str(), env); return clip; } static AVSValue __cdecl SetGraphAnalysis(AVSValue args, void* user_data, IScriptEnvironment* env_) { InternalEnvironment* env = GetAndRevealCamouflagedEnv(env_); env->SetGraphAnalysis(args[0].AsBool()); return AVSValue(); } extern const AVSFunction FilterGraph_filters[] = { { "SetGraphAnalysis", BUILTIN_FUNC_PREFIX, "b", SetGraphAnalysis, nullptr }, { "DumpFilterGraph", BUILTIN_FUNC_PREFIX, "c[outfile]s[mode]i[nframes]i[repeat]b[utf8]b", DumpFilterGraph, nullptr }, { 0 } }; ================================================ FILE: avs_core/core/FilterGraph.h ================================================ #ifndef _AVS_FILTER_GRAPH_H #define _AVS_FILTER_GRAPH_H #include "internal.h" #include #include #include #include class FilterGraph; class Device; // no DeviceManager classic avs+ class GraphMemoryNode { public: struct MemoryInfo { int numAllocation; size_t totalBytes; }; std::map memory; void OnAllocate(size_t bytes, Device* dev); void OnFree(size_t bytes, Device* dev); private: friend class PGraphMemoryNode; int refcnt; void AddRef() { ++refcnt; } void Release() { if (--refcnt <= 0) delete this; } }; class PGraphMemoryNode { public: PGraphMemoryNode() { Init(0); } PGraphMemoryNode(GraphMemoryNode* p) { Init(p); } PGraphMemoryNode(const PGraphMemoryNode& p) { Init(p.e); } PGraphMemoryNode& operator=(GraphMemoryNode* p) { Set(p); return *this; } PGraphMemoryNode& operator=(const PGraphMemoryNode& p) { Set(p.e); return *this; } int operator!() const { return !e; } operator void*() const { return e; } GraphMemoryNode* operator->() const { return e; } ~PGraphMemoryNode() { Release(); } private: GraphMemoryNode* e; void Init(GraphMemoryNode* p) { e = p; if (e) e->AddRef(); } void Set(GraphMemoryNode* p) { if (p) p->AddRef(); if (e) e->Release(); e = p; } void Release() { if (e) e->Release(); } }; class FilterGraphNode : public IClip { IScriptEnvironment* Env; PClip child; std::string name; AVSValue args; std::vector> arrays; std::vector argnames; PGraphMemoryNode memory; friend FilterGraph; public: FilterGraphNode(PClip child, const char* name, const AVSValue& last, const AVSValue& args, const char* const* arg_names, IScriptEnvironment* env); ~FilterGraphNode(); virtual int __stdcall GetVersion() { return child->GetVersion(); } virtual PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); virtual bool __stdcall GetParity(int n) { return child->GetParity(n); } virtual void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) { return child->GetAudio(buf, start, count, env); } virtual int __stdcall SetCacheHints(int cachehints, int frame_range) { return child->SetCacheHints(cachehints, frame_range); } virtual const VideoInfo& __stdcall GetVideoInfo() { return child->GetVideoInfo(); } PGraphMemoryNode GetMemoryNode() { return memory; } }; void DoDumpGraph(const std::vector& roots, const char* path, IScriptEnvironment* env); #endif // _AVS_FILTER_GRAPH_H ================================================ FILE: avs_core/core/InternalEnvironment.h ================================================ #ifndef _AVS_SCRIPTENVIRONMENT_H_INCLUDED #define _AVS_SCRIPTENVIRONMENT_H_INCLUDED #include #include #include #include #include "function.h" #include "CompatEnvironment.h" class ClipDataStore; typedef enum _ELogLevel { LOGLEVEL_NONE = 0, LOGLEVEL_ERROR = 1, LOGLEVEL_WARNING = 2, LOGLEVEL_INFO = 3, LOGLEVEL_DEBUG = 4 } ELogLevel; typedef enum _ELogTicketType { LOGTICKET_W1000 = 1000, // leaks during shutdown LOGTICKET_W1001 = 1001, // source plugin with no mt-mode LOGTICKET_W1002 = 1002, // buggy SetCacheHints() LOGTICKET_W1003 = 1003, // too stringent memory limit LOGTICKET_W1004 = 1004, // filter completely without mt-mode LOGTICKET_W1005 = 1005, // filter with inconsequent MT-modes LOGTICKET_W1006 = 1006, // filter with redundant MT-modes LOGTICKET_W1007 = 1007, // user should try 64-bit AVS for more memory LOGTICKET_W1008 = 1008, // multiple plugins define the same function LOGTICKET_W1009 = 1009, // a filter is using forced alignment LOGTICKET_W1010 = 1010, // MT-mode specified for script function LOGTICKET_W1100 = 1100, // memory reallocation occurs } ELogTicketType; enum CacheMode { CACHE_FAST_START, // start up time and size balanced mode CACHE_OPTIMAL_SIZE, // slow start up but optimal speed and cache size CACHE_NO_RESIZE, // internal use only CACHE_DEFAULT = CACHE_FAST_START, }; enum DeviceOpt: int { DEV_CUDA_PINNED_HOST, // allocate CPU frame with CUDA pinned host memory DEV_FREE_THRESHOLD, // free request count threshold to free frame }; class OneTimeLogTicket { public: ELogTicketType _type; const Function *_function = nullptr; const std::string _string; OneTimeLogTicket(ELogTicketType type); OneTimeLogTicket(ELogTicketType type, const Function *func); OneTimeLogTicket(ELogTicketType type, const std::string &str); bool operator==(const OneTimeLogTicket &other) const; }; class Device; class ThreadPool; class ConcurrentVarStringFrame; class FilterGraphNode; class ScopedCounter { int& counter; public: ScopedCounter(int& counter) : counter(counter) { ++counter; } ~ScopedCounter() { --counter; } }; #ifdef ALTERNATIVE_VFB_TIMESTAMP class VideoFrameBuffer; // Forward declarations - don't expose full classes class ScriptEnvironment; namespace VFBHelper { // Wrapper function to call the nested static method void UpdateVFBFreeTimestamp(VideoFrameBuffer* vfb); } #endif // Interface transformation hack class InternalEnvironment; // forward InternalEnvironment* GetAndRevealCamouflagedEnv(IScriptEnvironment* env); // Strictly for Avisynth core only. // Neither host applications nor plugins should use // these interfaces. class InternalEnvironment : public IScriptEnvironment2, public IScriptEnvironment_Avs25, public IScriptEnvironment_AvsPreV11C, public INeoEnv { protected: virtual ~InternalEnvironment() {} public: // define commons to fix ambiguous error typedef IScriptEnvironment::NotFound NotFound; typedef IScriptEnvironment::ApplyFunc ApplyFunc; // IScriptEnvironment virtual int __stdcall GetCPUFlags() = 0; virtual char* __stdcall SaveString(const char* s, int length = -1) = 0; virtual char* Sprintf(const char* fmt, ...) = 0; virtual char* __stdcall VSprintf(const char* fmt, va_list val) = 0; __declspec(noreturn) virtual void ThrowError(const char* fmt, ...) = 0; virtual void __stdcall AddFunction(const char* name, const char* params, INeoEnv::ApplyFunc apply, void* user_data) = 0; virtual bool __stdcall FunctionExists(const char* name) = 0; virtual AVSValue __stdcall Invoke(const char* name, const AVSValue args, const char* const* arg_names = 0) = 0; virtual AVSValue __stdcall GetVar(const char* name) = 0; virtual bool __stdcall SetVar(const char* name, const AVSValue& val) = 0; virtual bool __stdcall SetGlobalVar(const char* name, const AVSValue& val) = 0; virtual void __stdcall PushContext(int level = 0) = 0; virtual void __stdcall PopContext() = 0; // NewVideoFrame is replaced with new one virtual bool __stdcall MakeWritable(PVideoFrame* pvf) = 0; virtual void __stdcall BitBlt(BYTE* dstp, int dst_pitch, const BYTE* srcp, int src_pitch, int row_size, int height) = 0; virtual void __stdcall AtExit(INeoEnv::ShutdownFunc function, void* user_data) = 0; virtual void __stdcall CheckVersion(int version = AVISYNTH_INTERFACE_VERSION) = 0; virtual PVideoFrame __stdcall Subframe(PVideoFrame src, int rel_offset, int new_pitch, int new_row_size, int new_height) = 0; virtual int __stdcall SetMemoryMax(int mem) = 0; virtual int __stdcall SetWorkingDir(const char * newdir) = 0; virtual void* __stdcall ManageCache(int key, void* data) = 0; virtual bool __stdcall PlanarChromaAlignment(IScriptEnvironment::PlanarChromaAlignmentMode key) = 0; virtual PVideoFrame __stdcall SubframePlanar(PVideoFrame src, int rel_offset, int new_pitch, int new_row_size, int new_height, int rel_offsetU, int rel_offsetV, int new_pitchUV) = 0; // AVISYNTH_INTERFACE_VERSION 5 virtual void __stdcall DeleteScriptEnvironment() = 0; virtual void __stdcall ApplyMessage(PVideoFrame* frame, const VideoInfo& vi, const char* message, int size, int textcolor, int halocolor, int bgcolor) = 0; virtual const AVS_Linkage* __stdcall GetAVSLinkage() = 0; // AVISYNTH_INTERFACE_VERSION 6 virtual AVSValue __stdcall GetVarDef(const char* name, const AVSValue& def = AVSValue()) = 0; // AVISYNTH_INTERFACE_VERSION 8 virtual PVideoFrame __stdcall SubframePlanarA(PVideoFrame src, int rel_offset, int new_pitch, int new_row_size, int new_height, int rel_offsetU, int rel_offsetV, int new_pitchUV, int rel_offsetA) = 0; // frame properties support virtual void __stdcall copyFrameProps(const PVideoFrame& src, PVideoFrame& dst) = 0; virtual const AVSMap* __stdcall getFramePropsRO(const PVideoFrame& frame) = 0; virtual AVSMap* __stdcall getFramePropsRW(PVideoFrame &frame) = 0; virtual int __stdcall propNumKeys(const AVSMap* map) = 0; virtual const char* __stdcall propGetKey(const AVSMap* map, int index) = 0; virtual int __stdcall propDeleteKey(AVSMap* map, const char* key) = 0; virtual int __stdcall propNumElements(const AVSMap* map, const char* key) = 0; virtual char __stdcall propGetType(const AVSMap* map, const char* key) = 0; virtual int64_t __stdcall propGetInt(const AVSMap* map, const char* key, int index, int* error) = 0; virtual double __stdcall propGetFloat(const AVSMap* map, const char* key, int index, int* error) = 0; virtual const char* __stdcall propGetData(const AVSMap* map, const char* key, int index, int* error) = 0; virtual int __stdcall propGetDataSize(const AVSMap* map, const char* key, int index, int* error) = 0; virtual PClip __stdcall propGetClip(const AVSMap* map, const char* key, int index, int* error) = 0; virtual const PVideoFrame __stdcall propGetFrame(const AVSMap* map, const char* key, int index, int* error) = 0; virtual int __stdcall propSetInt(AVSMap* map, const char* key, int64_t i, int append) = 0; virtual int __stdcall propSetFloat(AVSMap* map, const char* key, double d, int append) = 0; virtual int __stdcall propSetData(AVSMap* map, const char* key, const char* d, int length, int append) = 0; virtual int __stdcall propSetClip(AVSMap* map, const char* key, PClip& clip, int append) = 0; virtual int __stdcall propSetFrame(AVSMap* map, const char* key, const PVideoFrame& frame, int append) = 0; virtual const int64_t* __stdcall propGetIntArray(const AVSMap* map, const char* key, int* error) = 0; virtual const double* __stdcall propGetFloatArray(const AVSMap* map, const char* key, int* error) = 0; virtual int __stdcall propSetIntArray(AVSMap* map, const char* key, const int64_t* i, int size) = 0; virtual int __stdcall propSetFloatArray(AVSMap* map, const char* key, const double* d, int size) = 0; virtual AVSMap* __stdcall createMap() = 0; virtual void __stdcall freeMap(AVSMap* map) = 0; virtual void __stdcall clearMap(AVSMap* map) = 0; // NewVideoFrame with frame prop source is replaced with new one virtual size_t __stdcall GetEnvProperty(AvsEnvProperty prop) = 0; virtual void* __stdcall Allocate(size_t nBytes, size_t alignment, AvsAllocType type) = 0; virtual void __stdcall Free(void* ptr) = 0; // Returns TRUE and the requested variable. If the method fails, returns FALSE and does not touch 'val'. virtual bool __stdcall GetVarTry(const char* name, AVSValue* val) const = 0; // ex virtual bool __stdcall GetVar(const char* name, AVSValue* val) const = 0; virtual bool __stdcall GetVarBool(const char* name, bool def) const = 0; // ex: virtual bool __stdcall GetVar(const char* name, bool def) const = 0; virtual int __stdcall GetVarInt(const char* name, int def) const = 0; // ex: int __stdcall GetVar(const char* name, int def) const = 0; virtual double __stdcall GetVarDouble(const char* name, double def) const = 0; // ex: virtual double __stdcall GetVar(const char* name, double def) const = 0; virtual const char* __stdcall GetVarString(const char* name, const char* def) const = 0; // ex: virtual const char* __stdcall GetVar(const char* name, const char* def) const = 0; virtual int64_t __stdcall GetVarLong(const char* name, int64_t def) const = 0; // brand new in v8 - v11: real int64 support // Invoke functions renamed for keeping vtable order in IS // moved from IS2 virtual bool __stdcall InvokeTry(AVSValue* result, const char* name, const AVSValue& args, const char* const* arg_names = 0) = 0; // Since V8 virtual AVSValue __stdcall Invoke2(const AVSValue& implicit_last, const char* name, const AVSValue args, const char* const* arg_names = 0) = 0; // moved from INeo virtual bool __stdcall Invoke2Try(AVSValue* result, const AVSValue& implicit_last, const char* name, const AVSValue args, const char* const* arg_names = 0) = 0; virtual AVSValue __stdcall Invoke3(const AVSValue& implicit_last, const PFunction& func, const AVSValue args, const char* const* arg_names = 0) = 0; virtual bool __stdcall Invoke3Try(AVSValue* result, const AVSValue& implicit_last, const PFunction& func, const AVSValue args, const char* const* arg_names = 0) = 0; // V9 virtual bool __stdcall MakePropertyWritable(PVideoFrame* pvf) = 0; // V11 virtual int __stdcall propGetIntSaturated(const AVSMap* map, const char* key, int index, int* error) = 0; virtual float __stdcall propGetFloatSaturated(const AVSMap* map, const char* key, int index, int* error) = 0; virtual int __stdcall propGetDataTypeHint(const AVSMap* map, const char* key, int index, int* error) = 0; /* returns AVSPropDataTypeHint */ virtual int __stdcall propSetDataH(AVSMap* map, const char* key, const char* d, int length, int type, int append) = 0; // V12 virtual bool __stdcall AcquireGlobalLock(const char* name) = 0; virtual void __stdcall ReleaseGlobalLock(const char* name) = 0; virtual void __stdcall ApplyMessageEx(PVideoFrame* frame, const VideoInfo& vi, const char* message, int size, int textcolor, int halocolor, int bgcolor, bool utf8) = 0; virtual int64_t __stdcall GetCPUFlagsEx() = 0; // IScriptEnvironment2 virtual bool __stdcall LoadPlugin(const char* filePath, bool throwOnError, AVSValue *result) = 0; virtual void __stdcall AddAutoloadDir(const char* dirPath, bool toFront) = 0; virtual void __stdcall ClearAutoloadDirs() = 0; virtual void __stdcall AutoloadPlugins() = 0; virtual void __stdcall AddFunction(const char* name, const char* params, INeoEnv::ApplyFunc apply, void* user_data, const char *exportVar) = 0; virtual bool __stdcall InternalFunctionExists(const char* name) = 0; virtual void __stdcall SetFilterMTMode(const char* filter, MtMode mode, bool force) = 0; virtual IJobCompletion* __stdcall NewCompletion(size_t capacity) = 0; virtual void __stdcall ParallelJob(ThreadWorkerFuncPtr jobFunc, void* jobData, IJobCompletion* completion) = 0; // InternalEnvironment virtual char *__stdcall ListAutoloadDirs() = 0; virtual int __stdcall IncrImportDepth() = 0; virtual int __stdcall DecrImportDepth() = 0; virtual void __stdcall AdjustMemoryConsumption(size_t amount, bool minus) = 0; virtual bool __stdcall FilterHasMtMode(const Function* filter) const = 0; virtual MtMode __stdcall GetFilterMTMode(const Function* filter, bool* is_forced) const = 0; // If filter is "", gets the default MT mode virtual ClipDataStore* __stdcall ClipData(IClip *clip) = 0; virtual MtMode __stdcall GetDefaultMtMode() const = 0; virtual void __stdcall SetLogParams(const char *target, int level) = 0; virtual void LogMsg(int level, const char* fmt, ...) = 0; virtual void __stdcall LogMsg_valist(int level, const char* fmt, va_list va) = 0; virtual void LogMsgOnce(const OneTimeLogTicket &ticket, int level, const char* fmt, ...) = 0; virtual void __stdcall LogMsgOnce_valist(const OneTimeLogTicket &ticket, int level, const char* fmt, va_list va) = 0; virtual void __stdcall VThrowError(const char* fmt, va_list va) = 0; virtual void __stdcall SetMaxCPU(const char *feature) = 0; virtual void __stdcall SetFilterProp(const char* filter, const char* key, const AVSValue& value, int mode) = 0; virtual void __stdcall SetFilterPropConditional(const char* filter, const char* param_name, const AVSValue& param_match, const char* key, const AVSValue& value, int mode) = 0; virtual const char* __stdcall GetFilterProps() = 0; virtual void __stdcall SetFilterPropPassthrough(const char* filter) = 0; /* How casting down works in Avisynth, when passing differently typed IScriptEnvironment variant pointers to plugins. We have one big InternalEnvironment (further inherited by ThreadScriptEnvironment). InternalEnvironment inherits all IScriptEnvironment variants, which have strictly identical function order of their pure virtual functions. When we pass an IScriptEnvironment variant to a plugin/client (who is just seeing Avisynth's standard IScriptEnvironment), then really we pass the proper VMT table. Let's see an example for IScriptEnvironment_Avs25. For the static_cast to work correctly, the IScriptEnvironment_Avs25 interface must have the same order of methods as they appear in the InternalEnvironment class. This ensures that the VMT entries align properly, allowing the cast pointer to correctly access the methods defined in IScriptEnvironment_Avs25. In C++, the order of methods in the VMT is determined by the order in which they are declared in the class or interface. Therefore, as long as IScriptEnvironment_Avs25 is a base class of InternalEnvironment and the methods are declared in the same order, the static_cast will work as expected. When we cast a Derived* to a Base*, e.g. InternalEnvironment* to IScriptEnvironment2*, the pointer might be adjusted to point to the Base sub-object within Derived. This ensures that the VMT entries for Base methods are correctly aligned. If we have multiple base classes with the same pure virtual function names (NewVideoFrame, MakeWritable, etc..), and the derived class (InternalEnvironment) provides the implementation, the VMT entries for all those base classes will point to the same implementation in the derived class. The implemented pure virtual function addresses will be written back to all IScriptEnvironmentXXXXX variant's VMT entries. So the same NewVideoFrame address will appear in IScriptEnvironment2 and IScriptEnvironment_Avs25 VMT table. Trick: There are differences, that must handle differently for different IScriptEnvironment types. E.g. IScriptEnvironment_Avs25 implements its own AddFunction. Place of AddFunction in VMT table is fixed (VMT index N). In the class definition we use the name AddFunction25 instead of AddFunction. It will appear at VMT index N in IScriptEnvironment_Avs25, since the order is kept similar to IScriptEnvironment's order. Because if was named differently, InternalEnvironment's implementation will put a different address into IScriptEnvironment_Avs25's VMT table. When this pointer is passed to a plugin, (which sees only an IScriptEnvironment*) when it calles AddFunction (that is VMT index N), it hiddenly will call AddFunction25 instead. */ // interface conversions virtual IScriptEnvironment2* __stdcall GetEnv2() final { return static_cast(this); } virtual IScriptEnvironment_Avs25* __stdcall GetEnv25() final { return static_cast(this); } virtual IScriptEnvironment_AvsPreV11C* __stdcall GetEnvPreV11C() final { return static_cast(this); } virtual void __stdcall SetGraphAnalysis(bool enable) = 0; virtual Device* __stdcall SetCurrentDevice(Device* device) = 0; virtual Device* __stdcall GetCurrentDevice() const = 0; // replacement of NewVideoFrame virtual PVideoFrame __stdcall NewVideoFrameOnDevice(const VideoInfo& vi, int align, Device* device) = 0; virtual PVideoFrame __stdcall NewVideoFrameOnDevice(const VideoInfo& vi, int align, Device* device, const PVideoFrame *prop_src) = 0; virtual PVideoFrame __stdcall GetOnDeviceFrame(const PVideoFrame& src, Device* device) = 0; using INeoEnv::SetMemoryMax; using INeoEnv::Invoke; using INeoEnv::NewVideoFrame; using INeoEnv::SaveString; // Nekopanda: support multiple prefetcher // // to allow thread to submit with their env virtual void __stdcall ParallelJob(ThreadWorkerFuncPtr jobFunc, void* jobData, IJobCompletion* completion, InternalEnvironment *env) = 0; virtual ThreadPool* __stdcall NewThreadPool(size_t nThreads) = 0; virtual void __stdcall AddRef() = 0; virtual void __stdcall Release() = 0; virtual ConcurrentVarStringFrame* __stdcall GetTopFrame() = 0; // Nekopanda: new cache control mechanism virtual void __stdcall SetCacheMode(CacheMode mode) = 0; virtual CacheMode __stdcall GetCacheMode() = 0; virtual bool& __stdcall GetSupressCaching() = 0; // useful to detect chainedCtor virtual size_t __stdcall GetInvokeStackSize() = 0; virtual void __stdcall SetDeviceOpt(DeviceOpt mode, int val) = 0; virtual void __stdcall UpdateFunctionExports(const char* funcName, const char* funcParams, const char *exportVar) = 0; virtual bool __stdcall Invoke_(AVSValue *result, const AVSValue& implicit_last, const char* name, const Function *f, const AVSValue& args, const char* const* arg_names) = 0; virtual InternalEnvironment* __stdcall NewThreadScriptEnvironment(int thread_id) = 0; // per thread data access virtual int __stdcall GetThreadId() = 0; virtual int& __stdcall GetFrameRecursiveCount() = 0; virtual int& __stdcall GetSuppressThreadCount() = 0; virtual FilterGraphNode*& GetCurrentGraphNode() = 0; }; struct InternalEnvironmentDeleter { void operator()(InternalEnvironment* ptr) const { ptr->Release(); } }; typedef std::unique_ptr PInternalEnvironment; #endif // _AVS_SCRIPTENVIRONMENT_H_INCLUDED ================================================ FILE: avs_core/core/LruCache.h ================================================ #ifndef AVS_LRUCACHE_H #define AVS_LRUCACHE_H #include #include #include #include #include "ObjectPool.h" #include "SimpleLruCache.h" #include "InternalEnvironment.h" enum LruLookupResult { LRU_LOOKUP_NOT_FOUND, // Item has not been found, storage is reserved to be used by caller LRU_LOOKUP_FOUND_AND_READY, // Item has been found and returned LRU_LOOKUP_FOUND_BUT_NOTAVAIL, // Item has been found, but is waiting for completion and is not yet ready LRU_LOOKUP_NO_CACHE // Item will not be cached, no storage is returned }; template class LruCache : public std::enable_shared_from_this > { private: enum LruEntryState { LRU_ENTRY_EMPTY, LRU_ENTRY_AVAILABLE, LRU_ENTRY_ROLLED_BACK }; struct LruGhostEntry { K key; size_t ghosted; LruGhostEntry() : key(0), ghosted(0) { } LruGhostEntry(K key, size_t ghosted) : key(key), ghosted(ghosted) { } }; struct LruEntry { K key; V value; size_t locks; // the number of threads waiting on this entry. used to prevent eviction when readers are waiting on it size_t ghosted; // the number of times this entry has entered the ghost list std::condition_variable ready_cond; enum LruEntryState state; LruEntry(const K& key) { reset(key, V()); } void reset(const K& k, const V& v) { key = k; value = v; locks = 0; ghosted = 0; state = LRU_ENTRY_EMPTY; } private: LruEntry(const LruEntry&); LruEntry& operator=(const LruEntry&); }; const int GHOSTS_MIN_CAPACITY; typedef LruEntry entry_type; typedef entry_type* entry_ptr; typedef SimpleLruCache CacheType; typedef SimpleLruCache GhostCacheType; typedef size_t size_type; CacheMode mode; CacheType MainCache; GhostCacheType Ghosts; ObjectPool EntryPool; mutable std::mutex mutex; static bool MainEvictEvent(CacheType* cache, const typename CacheType::Entry& entry, void* userData) { if (entry.value->locks > 0) return false; LruCache* me = reinterpret_cast(userData); bool ghost_found; auto *g = me->Ghosts.lookup(entry.key, &ghost_found); if (!ghost_found) { *g = LruGhostEntry(entry.key, entry.value->ghosted + 1); } else { g->ghosted++; } entry.value->reset(0, NULL); me->EntryPool.Destruct(entry.value); return true; } public: typedef std::pair > handle; LruCache(size_type capacity, CacheMode mode) : GHOSTS_MIN_CAPACITY(50), mode(mode), MainCache(capacity, &MainEvictEvent, reinterpret_cast(this)), Ghosts(GHOSTS_MIN_CAPACITY, typename GhostCacheType::EvictEventType(), reinterpret_cast(this)) { } size_type size() const { return MainCache.size(); } size_t requested_capacity() const { return MainCache.requested_capacity(); } size_t capacity() const { return MainCache.capacity(); } void limits(size_t* min, size_t* max) const { std::unique_lock global_lock(mutex); MainCache.limits(min, max); } void set_limits(size_t min, size_t max) { std::unique_lock global_lock(mutex); MainCache.set_limits(min, max); } LruLookupResult lookup(const K& key, handle *hndl, bool block_for_completion, V& foundItem, bool* suppressCaching = nullptr) { bool suppress = (suppressCaching != nullptr) && *suppressCaching; hndl->first = nullptr; // clear handle std::unique_lock global_lock(mutex); bool found; entry_ptr* entryp = MainCache.lookup(key, &found, suppress); if (found) { entry_ptr entry = *entryp; if (!block_for_completion && (entry->state != LRU_ENTRY_AVAILABLE)) { return LRU_LOOKUP_FOUND_BUT_NOTAVAIL; } // wait until data becomes available ++(entry->locks); while (entry->state == LRU_ENTRY_EMPTY) { entry->ready_cond.wait(global_lock); switch (entry->state) { case LRU_ENTRY_EMPTY: // do nothing, spurious wakeup break; case LRU_ENTRY_AVAILABLE: // finally, data available break; case LRU_ENTRY_ROLLED_BACK: // whoever we were waiting for decided to step back. we take over his place. entry->state = LRU_ENTRY_EMPTY; *hndl = handle(entry, this->shared_from_this()); return LRU_LOOKUP_NOT_FOUND; default: assert(0); } } // copy and return entry->value before releasing lock foundItem = entry->value; --(entry->locks); return LRU_LOOKUP_FOUND_AND_READY; } else if (suppress == false) { // ghost: self-tuning caching algorithm bool ghost_found; auto *g = Ghosts.lookup(key, &ghost_found); assert(g != NULL); if (!ghost_found) { *g = LruGhostEntry(key, 0); } else if (g->ghosted > 1) { // Fix for Issues #270 and #379: require a frame to have been evicted // at least twice (ghosted > 1) before triggering a cache resize. // // With the old condition (ghosted > 0), any single eviction + re-request // caused a +1 resize. This led to unbounded cache growth in two cases: // // 1. Backward seeking (Issue #379): frames played forward get evicted and // ghosted=1. Every backstep hits a ghost (1 > 0 was true) → +1 on each // step. // // 2. Bob()/SeparateFields access pattern (Issue #270): the n, n/2 pattern // keeps evicting the same frames with ghosted=1, so every GetFrame call // triggered a resize. // Infinite cache growth occured when the requested frame number pattern from // source filter is something like that: // 0,0, 0,1, 1,2, 1,3, 2,4, 2,5, 3,6, 3,7, 4,8,... // Sample script: // ConvertToY8() // org = last // Bob() // Merge(last, org) // With ghosted > 1: both cases are suppressed because frames evicted only // once stay at ghosted=1 (1 > 1 is false). An undersized cache // still grows: frames that keep cycling will be evicted a second time, // pushing ghosted to 2, and growth resumes from that point forward. if (mode != CACHE_NO_RESIZE) { #ifdef CACHE_GROWTH_INFINITELY_TEST // When the above (g->ghosted > 1) was (g->ghosted > 0) _RPT1(0, "Not in cache but in ghost! g->ghosted > 0 => resize! MainCache.capacity()=%d -> += 1", MainCache.capacity() + 1); #endif MainCache.resize(MainCache.capacity() + 1); Ghosts.resize(GHOSTS_MIN_CAPACITY + MainCache.capacity() * 2); } // Nekopanda: reduce amount of cache. // when this filter increased the cache, we prevent lower filters increase their cache // because the requests to the lower filters were not needed if this filter cached the frame. if (mode == CACHE_OPTIMAL_SIZE && suppressCaching != nullptr) { *suppressCaching = true; } } else { // This cannot happen //assert(0); LOL maybe it can... } if (entryp != NULL) { *entryp = EntryPool.Construct(key); entry_ptr entry = *entryp; *hndl = handle(entry, this->shared_from_this()); entry->locks = 1; entry->ghosted = g->ghosted; entry->value = NULL; return LRU_LOOKUP_NOT_FOUND; } else { g->ghosted++; return LRU_LOOKUP_NO_CACHE; } } // if else { assert(entryp == nullptr); return LRU_LOOKUP_NO_CACHE; } } void commit_value(handle *hndl) { std::unique_lock global_lock(mutex); // mark data as ready entry_ptr e = hndl->first; e->state = LRU_ENTRY_AVAILABLE; --(e->locks); // notify waiters global_lock.unlock(); e->ready_cond.notify_all(); hndl->second.reset(); } void rollback(handle *hndl) { std::unique_lock global_lock(mutex); entry_ptr e = hndl->first; assert(e->locks > 0); if (e->locks == 1) { MainCache.remove(e->key); } else { // others have started waiting for this data, so another one will have to take over --(e->locks); e->state = LRU_ENTRY_ROLLED_BACK; // notify one waiter global_lock.unlock(); e->ready_cond.notify_one(); } hndl->second.reset(); } }; #endif // AVS_LRUCACHE_H ================================================ FILE: avs_core/core/MTGuard.cpp ================================================ // Avisynth v2.6. Copyright 2002-2009 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include "MTGuard.h" #include "cache.h" #include "internal.h" #include "FilterConstructor.h" #include "InternalEnvironment.h" #include #include #ifdef X86_32 #include #endif struct MTGuardChildFilter { PClip filter; std::mutex mutex; }; #ifdef AVS_WINDOWS MTGuard::MTGuard(PClip firstChild, MtMode mtmode, std::unique_ptr&& funcCtor, const wchar_t* current_directory, InternalEnvironment* env) : #else MTGuard::MTGuard(PClip firstChild, MtMode mtmode, std::unique_ptr&& funcCtor, const char* current_directory, InternalEnvironment* env) : #endif Env(env), nThreads(1), mt_enabled(false), FilterCtor(std::move(funcCtor)), #ifdef AVS_WINDOWS CurrentDirectory(current_directory ? current_directory : L""), #else CurrentDirectory(current_directory ? current_directory : ""), #endif MTMode(mtmode) { assert( ((int)mtmode > (int)MT_INVALID) && ((int)mtmode < (int)MT_MODE_COUNT) ); ChildFilters = std::unique_ptr(new MTGuardChildFilter[1]); ChildFilters[0].filter = firstChild; vi = ChildFilters[0].filter->GetVideoInfo(); Env->ManageCache(MC_RegisterMTGuard, reinterpret_cast(this)); } MTGuard::~MTGuard() { Env->ManageCache(MC_UnRegisterMTGuard, reinterpret_cast(this)); } void MTGuard::EnableMT(size_t nThreads) { // called for each filter in the chain, starting from the top-level filter // even if their mt_enabled were set by an earlier Prefetch. assert(nThreads >= 1); if (nThreads > 1) { switch (MTMode) { case MT_NICE_FILTER: { // already created single instance, just set the thread count if (!this->mt_enabled) ChildFilters[0].filter->SetCacheHints(CACHE_INFORM_NUM_THREADS, (int)nThreads); break; } case MT_MULTI_INSTANCE: { // creates the extra filter instances needed for the actual thread count // set only when unset if (!this->mt_enabled) { auto newchilds = std::unique_ptr(new MTGuardChildFilter[nThreads]); // copy existing for (size_t i = 0; i < this->nThreads; ++i) { newchilds[i].filter = ChildFilters[i].filter; } if (CurrentDirectory.empty()) { // create the rest for (size_t i = this->nThreads; i < nThreads; ++i) { newchilds[i].filter = FilterCtor->InstantiateFilter().AsClip(); } } else { // switch to the original CurrentDirectory to instantiate the threaded filters // in order to their constructor to be able to see the original current directory CWDChanger change_cwd(CurrentDirectory.c_str()); // wstring on Windows, string on Linux // create the rest for (size_t i = this->nThreads; i < nThreads; ++i) { newchilds[i].filter = FilterCtor->InstantiateFilter().AsClip(); } } // inform all filter instances about the threading for (size_t i = 0; i < nThreads; ++i) newchilds[i].filter->SetCacheHints(CACHE_INFORM_NUM_THREADS, (int)nThreads); ChildFilters = std::move(newchilds); } break; } case MT_SERIALIZED: { // already created single instance, just set the thread count if (!this->mt_enabled) ChildFilters[0].filter->SetCacheHints(CACHE_INFORM_NUM_THREADS, 1); break; } default: { assert(0); break; } } } else if (nThreads == 1) { if (!this->mt_enabled) ChildFilters[0].filter->SetCacheHints(CACHE_INFORM_NUM_THREADS, 1); } if (!this->mt_enabled) { this->nThreads = std::max(this->nThreads, nThreads); this->mt_enabled = true; } // We don't need the stored parameters any more, // free their memory. //FilterCtor.reset(); } PVideoFrame __stdcall MTGuard::GetFrame(int n, IScriptEnvironment* env_) { assert(nThreads > 0); /* // We can't call child filter without mutex guards even when nThreads is 1, // because a lately invoked filter may call GetFrame again, see // MT_SERIALIZED considerations below. // Code left here intentionally but commented out. if (nThreads == 1) return ChildFilters[0].filter->GetFrame(n, env); */ InternalEnvironment* IEnv = GetAndRevealCamouflagedEnv(env_); IScriptEnvironment* env = static_cast(IEnv); PVideoFrame frame = NULL; switch (MTMode) { case MT_NICE_FILTER: { frame = ChildFilters[0].filter->GetFrame(n, env); break; } case MT_MULTI_INSTANCE: { // When called from thread pool then thread IDs are one-to-one mapped to ChildFilters array. // 'modulo' method ensures that no over-addressing can happen. // The number of filter instances are created in EnableMT as such. // Thread pool thread IDs are consecutive numbers, starting with 1. // Prefetch threads are consecutive numbers, starting with 0. // Here we cannot differentiate from where was the filter called. // Note: // when called from Prefetcher (which has 'num_of_logical_processors' threads instead of nThreads) // the mapping is not ideal. It can be less or more than the actual instance count. // E.g. when mapping a thread on a CPU with 8 logical cores // to a instance count of 3 (nThread=3) the mapping is uneven (modulo example): [0,3,6]->[0] [1,4,7]->[1] [2,5]->[2] size_t clipIndex = IEnv->GetThreadId() % nThreads; auto& child = ChildFilters[clipIndex]; std::lock_guard lock(child.mutex); frame = child.filter->GetFrame(n, env); break; } case MT_SERIALIZED: { std::lock_guard lock(ChildFilters[0].mutex); // Deadlock situation when GetFrame(0) was called from an Invoke // solved in 3.7.2 by separating memory_mutex from invoke_mutex. frame = ChildFilters[0].filter->GetFrame(n, env); break; } default: { assert(0); env->ThrowError("Invalid Avisynth logic."); break; } } // switch #ifdef X86_32 _mm_empty(); #endif return frame; } void __stdcall MTGuard::GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env_) { assert(nThreads > 0); /* commented out, see MTGuard::GetFrame comments for MT_SERIALIZED if (nThreads == 1) { ChildFilters[0].filter->GetAudio(buf, start, count, env); return; } */ InternalEnvironment* IEnv = GetAndRevealCamouflagedEnv(env_); IScriptEnvironment* env = static_cast(IEnv); switch (MTMode) { case MT_NICE_FILTER: { ChildFilters[0].filter->GetAudio(buf, start, count, env); break; } case MT_MULTI_INSTANCE: { size_t clipIndex = IEnv->GetThreadId() % nThreads; auto& child = ChildFilters[clipIndex]; std::lock_guard lock(child.mutex); child.filter->GetAudio(buf, start, count, env); break; } case MT_SERIALIZED: { std::lock_guard lock(ChildFilters[0].mutex); ChildFilters[0].filter->GetAudio(buf, start, count, env); break; } default: { assert(0); env->ThrowError("Invalid Avisynth logic."); break; } } // switch #ifdef X86_32 _mm_empty(); #endif } const VideoInfo& __stdcall MTGuard::GetVideoInfo() { return vi; } bool __stdcall MTGuard::GetParity(int n) { return ChildFilters[0].filter->GetParity(n); } int __stdcall MTGuard::SetCacheHints(int cachehints, int frame_range) { AVS_UNUSED(frame_range); if (CACHE_GET_MTMODE == cachehints) { return MT_NICE_FILTER; } if (CACHE_IS_MTGUARD_REQ == cachehints) { return CACHE_IS_MTGUARD_ANS; } // Filter-MTGuard-CacheGuard(Cache or nothing) // MTGuard is just a helper over real filters, we pass these requests upstream if (CACHE_GET_AUDIO_POLICY == cachehints || CACHE_GET_AUDIO_SIZE == cachehints || CACHE_GETCHILD_AUDIO_MODE == cachehints || CACHE_GETCHILD_AUDIO_SIZE == cachehints) return (ChildFilters[0].filter->GetVersion() >= 5) ? ChildFilters[0].filter->SetCacheHints(cachehints, 0) : 0; if (CACHE_GET_DEV_TYPE == cachehints || CACHE_GET_CHILD_DEV_TYPE == cachehints) { return (ChildFilters[0].filter->GetVersion() >= 5) ? ChildFilters[0].filter->SetCacheHints(cachehints, 0) : 0; } return 0; } bool __stdcall MTGuard::IsMTGuard(const PClip& p) { return ((p->GetVersion() >= 5) && (p->SetCacheHints(CACHE_IS_MTGUARD_REQ, 0) == CACHE_IS_MTGUARD_ANS)); } #ifdef AVS_WINDOWS PClip MTGuard::Create(MtMode mode, PClip filterInstance, std::unique_ptr funcCtor, const wchar_t* current_directory, InternalEnvironment* env) #else PClip MTGuard::Create(MtMode mode, PClip filterInstance, std::unique_ptr funcCtor, const char* current_directory, InternalEnvironment* env) #endif { switch (mode) { case MT_NICE_FILTER: { // Put a guard even around MT_NICE_FILTER mode filters, in order EnableMT to // be able to inform the filter (CACHE_SET_NUM_OF_THREAD) about the actual (Prefetch) thread count. return new MTGuard(filterInstance, mode, nullptr, nullptr, env); } case MT_MULTI_INSTANCE: // Fall-through intentional { return new MTGuard(filterInstance, mode, std::move(funcCtor), current_directory, env); // args2 and args3 are not valid after this point anymore } case MT_SERIALIZED: { // Put a guard even around MT_SERIALIZED mode filters, in order EnableMT to // be able to inform the filter (CACHE_SET_NUM_OF_THREAD) about the actual // (1) thread count. return new MTGuard(filterInstance, mode, nullptr, nullptr, env); // args2 and args3 are not valid after this point anymore } default: // There are broken plugins out there in the wild that have (GetVersion() >= 5), but still // return garbage for SetCacheHints(). However, this case should be recognized and // handled earlier, so we can never get to this default-branch. If we do, assume the worst. assert(0); return new MTGuard(filterInstance, MT_SERIALIZED, nullptr, nullptr, env); } } ================================================ FILE: avs_core/core/MTGuard.h ================================================ #ifndef _AVS_MTGUARD_H #define _AVS_MTGUARD_H #include "internal.h" #include #include #include class InternalEnvironment; class FilterConstructor; struct MTGuardChildFilter; class MTGuard : public IClip { private: IScriptEnvironment2* Env; std::unique_ptr ChildFilters; size_t nThreads; bool mt_enabled; VideoInfo vi; std::unique_ptr FilterCtor; #ifdef AVS_WINDOWS std::wstring CurrentDirectory; #else std::string CurrentDirectory; #endif const MtMode MTMode; public: ~MTGuard(); #ifdef AVS_WINDOWS MTGuard(PClip firstChild, MtMode mtmode, std::unique_ptr&& funcCtor, const wchar_t* current_directory, InternalEnvironment* env); #else MTGuard(PClip firstChild, MtMode mtmode, std::unique_ptr&& funcCtor, const char* current_directory, InternalEnvironment* env); #endif void EnableMT(size_t nThreads); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env); const VideoInfo& __stdcall GetVideoInfo(); bool __stdcall GetParity(int n); int __stdcall SetCacheHints(int cachehints,int frame_range); static bool __stdcall IsMTGuard(const PClip& p); #ifdef AVS_WINDOWS static PClip Create(MtMode mode, PClip filterInstance, std::unique_ptr funcCtor, const wchar_t* current_directory, InternalEnvironment* env); #else static PClip Create(MtMode mode, PClip filterInstance, std::unique_ptr funcCtor, const char* current_directory, InternalEnvironment* env); #endif }; #endif // _AVS_MTGUARD_H ================================================ FILE: avs_core/core/MappedList.h ================================================ #ifndef _AVS_MAPPED_LIST #define _AVS_MAPPED_LIST #include #include template class mapped_list { private: typedef std::list ListType; std::list list; std::unordered_map map; public: typedef typename ListType::iterator iterator; void push_back(const T& elem) { iterator it = list.insert(list.end(), elem); map.emplace(elem, it); } void push_front(const T& elem) { iterator it = list.insert(list.begin(), elem); map.emplace(elem, it); } bool empty() const { return list.empty(); } size_t size() const { return list.size(); } void remove(const T& elem) { auto map_it = map.find(elem); assert(map_it != map.end()); iterator list_it = map_it->second; map.erase(map_it); list.erase(list_it); } void move_to_back(const T& elem) { auto map_it = map.find(elem); assert(map_it != map.end()); iterator list_it = map_it->second; list.splice(list.end(), list, list_it); } iterator begin() { return list.begin(); } iterator end() { return list.end(); } }; #endif // _AVS_MAPPED_LIST ================================================ FILE: avs_core/core/ObjectPool.h ================================================ #ifndef _AVS_OBJECTPOOL_H #define _AVS_OBJECTPOOL_H #include #include #include #include template class ObjectPool { private: typedef std::list ListType; ListType UseList; ListType FreeList; typedef std::unordered_map MapType; MapType Map; static void DestructList(ListType* list, bool call_dtor) { const ListType::iterator end_it = list->end(); if (call_dtor) { for (ListType::iterator it = list->begin(); it != end_it; ++it) { T* obj = (T*)(*it); obj->~T(); delete [] (*it); } } else { for (ListType::iterator it = list->begin(); it != end_it; ++it) { delete [] (*it); } } } char * Alloc() { char* buff = NULL; if (!FreeList.empty()) { buff = FreeList.front(); UseList.splice(UseList.begin(), FreeList, FreeList.begin()); } else { buff = new(std::nothrow) char[sizeof(T)]; if (buff == NULL) return NULL; UseList.emplace_front(buff); } Map[buff] = UseList.begin(); return buff; } void Free(char* obj) { MapType::iterator mit = Map.find(obj); assert(mit != Map.end()); ListType::iterator lit = mit->second; assert(*lit == obj); FreeList.splice(FreeList.begin(), UseList, lit); // This line is actually not needed, but very cheap and results in a fully consistent map mit->second = FreeList.begin(); // Needed because MSVC violates spec and invalidates old list iterator } public: // For the unfortunate lack of variadic templates in MSVC++2012 T* Construct() { char* buff = Alloc(); if (buff == NULL) throw std::bad_alloc(); try { return new(buff) T(); } catch(...) { Free(buff); throw; } } // For the unfortunate lack of variadic templates in MSVC++2012 template T* Construct(const K& param0) { char* buff = Alloc(); if (buff == NULL) throw std::bad_alloc(); try { return new(buff) T(param0); } catch(...) { Free(buff); throw; } } void Destruct(T* obj) { obj->~T(); Free((char*)obj); } ~ObjectPool() { DestructList(&FreeList, false); DestructList(&UseList, true); } }; #endif // _AVS_OBJECTPOOL_H ================================================ FILE: avs_core/core/PluginManager.cpp ================================================ #include "PluginManager.h" #include #include #include #include "strings.h" #include "InternalEnvironment.h" #include #include "function.h" #include #ifdef AVS_WINDOWS #include #else #include #endif #ifdef AVS_WINDOWS #include #endif #include "parser/script.h" #include "parser/expression.h" // TODO we only need FunctionInstance from here typedef const char* (__stdcall *AvisynthPluginInit3Func)(IScriptEnvironment* env, const AVS_Linkage* const vectors); typedef const char* (__stdcall *AvisynthPluginInit2Func)(IScriptEnvironment_Avs25* env); typedef const char* (AVSC_CC *AvisynthCPluginInitFunc)(AVS_ScriptEnvironment* env); #ifdef AVS_WINDOWS // only Windows has a registry we care about const char RegAvisynthKey[] = "Software\\Avisynth"; #if defined (AVS_WINDOWS_X86) #if defined (__GNUC__) const char RegPluginDirPlus_GCC[] = "PluginDir+GCC"; #if defined(X86_32) #define GCC_WIN32 #endif // X86_32 #endif // __GNUC__ #endif // AVS_WINDOWS_X86 const char RegPluginDirClassic[] = "PluginDir2_5"; const char RegPluginDirPlus[] = "PluginDir+"; #endif // AVS_WINDOWS #ifdef AVS_POSIX #include // Redifining these is easier than adding several ifdefs. #define HMODULE void* #define FreeLibrary dlclose #if defined(AVS_MACOS) || defined(AVS_BSD) #include #endif #endif #ifdef AVS_MACOS #include #endif /* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- Static helpers --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- */ void IFunction::AddRef() { InterlockedIncrement(&refcnt); } void IFunction::Release() { if (InterlockedDecrement(&refcnt) <= 0) delete this; } #ifdef AVS_WINDOWS // translate to Linux error handling // Translates a Windows error code to a human-readable text message. static std::string GetLastErrorText(DWORD nErrorCode) { wchar_t* msg; // Ask Windows to prepare a standard message for a GetLastError() code: if (0 == FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, nErrorCode, 0, (LPWSTR)&msg, 0, NULL)) return("Unknown error"); else { auto msg_utf8 = WideCharToUtf8(msg); std::string ret(msg_utf8.get()); LocalFree(msg); return ret; } } // utf8 output static bool GetRegString(HKEY rootKey, const char path[], const char entry[], std::string* result_utf8) { HKEY AvisynthKey; // Convert input path/entry (UTF-8/ANSI) to wide char for Unicode registry API auto path_w = Utf8ToWideChar(path); auto entry_w = Utf8ToWideChar(entry); if (RegOpenKeyExW(rootKey, path_w.get(), 0, KEY_READ, &AvisynthKey) != ERROR_SUCCESS) return false; DWORD type = 0; DWORD sizeBytes = 0; LONG rc = RegQueryValueExW(AvisynthKey, entry_w.get(), NULL, &type, NULL, &sizeBytes); if (rc != ERROR_SUCCESS) { RegCloseKey(AvisynthKey); return false; } // Handle empty value if (sizeBytes == 0) { *result_utf8 = std::string(); RegCloseKey(AvisynthKey); return true; } // If value is stored as wide string, read via wide API and convert to UTF-8 if (type == REG_SZ || type == REG_EXPAND_SZ) { // sizeBytes is number of bytes; number of wchar_t elements: size_t wcharCount = (sizeBytes / sizeof(wchar_t)); // Ensure space for a terminating wchar_t std::vector buf(wcharCount + 1); // Initialize to zero for safety buf.assign(wcharCount + 1, L'\0'); rc = RegQueryValueExW(AvisynthKey, entry_w.get(), NULL, &type, reinterpret_cast(buf.data()), &sizeBytes); if (rc != ERROR_SUCCESS) { RegCloseKey(AvisynthKey); return false; } // Ensure null-termination (sizeBytes may include or exclude terminator) size_t charsRead = (sizeBytes / sizeof(wchar_t)); if (charsRead == 0) buf[0] = L'\0'; else buf[std::min(charsRead, buf.size() - 1)] = L'\0'; auto utf8 = WideCharToUtf8(buf.data()); *result_utf8 = std::string(utf8.get()); RegCloseKey(AvisynthKey); return true; } // Fallback: read ANSI data and convert to UTF-8 { DWORD sizeA = 0; rc = RegQueryValueExA(AvisynthKey, entry, NULL, NULL, NULL, &sizeA); if (rc != ERROR_SUCCESS) { RegCloseKey(AvisynthKey); return false; } std::vector bufA(sizeA + 1); if (sizeA > 0) memset(bufA.data(), 0, sizeA + 1); rc = RegQueryValueExA(AvisynthKey, entry, NULL, NULL, reinterpret_cast(bufA.data()), &sizeA); if (rc != ERROR_SUCCESS) { RegCloseKey(AvisynthKey); return false; } // Ensure null-terminated bufA[std::min(sizeA, bufA.size() - 1)] = '\0'; // Convert ANSI -> wide (system codepage) -> UTF-8 int wideLen = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, bufA.data(), -1, NULL, 0); if (wideLen <= 0) { RegCloseKey(AvisynthKey); return false; } std::vector wbuf(wideLen + 1); MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, bufA.data(), -1, wbuf.data(), wideLen); wbuf[wideLen] = L'\0'; auto utf8 = WideCharToUtf8(wbuf.data()); *result_utf8 = std::string(utf8.get()); RegCloseKey(AvisynthKey); return true; } } #endif // AVS_WINDOWS // see also: AVSFunction::TypeMatch static bool IsParameterTypeSpecifier(char c) { switch (c) { case 'b': case 'i': case 'f': case 's': case 'c': case '.': // case 'd': case 'l': // from v11 f and i will accept 64 bit data as well case 'n': case 'a': // Arrays as function parameters return true; default: return false; } } static bool IsParameterTypeModifier(char c) { switch (c) { case '+': case '*': return true; default: return false; } } static bool IsValidParameterString(const char* p) { // does not check for logical errors such as // when unnamed untyped array (.+) is followed by additional parameters int state = 0; char c; while ((c = *p++) != '\0' && state != -1) { switch (state) { case 0: if (IsParameterTypeSpecifier(c)) { state = 1; } else if (c == '[') { state = 2; } else { state = -1; } break; case 1: if (IsParameterTypeSpecifier(c)) { // do nothing; stay in the current state } else if (c == '[') { state = 2; } else if (IsParameterTypeModifier(c)) { state = 0; } else { state = -1; } break; case 2: if (c == ']') { state = 3; } else { // do nothing; stay in the current state } break; case 3: if (IsParameterTypeSpecifier(c)) { state = 1; } else { state = -1; } break; } } // states 0, 1 are the only ending states we accept return state == 0 || state == 1; } /* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- AVSFunction --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- */ AVSFunction::AVSFunction(void*) : AVSFunction(NULL, NULL, NULL, NULL, NULL, NULL, false, false) {} AVSFunction::AVSFunction(const char* _name, const char* _plugin_basename, const char* _param_types, apply_func_t _apply) : AVSFunction(_name, _plugin_basename, _param_types, _apply, NULL, NULL, false, false) {} AVSFunction::AVSFunction(const char* _name, const char* _plugin_basename, const char* _param_types, apply_func_t _apply, void *_user_data) : AVSFunction(_name, _plugin_basename, _param_types, _apply, _user_data, NULL, false, false) {} AVSFunction::AVSFunction(const char* _name, const char* _plugin_basename, const char* _param_types, apply_func_t _apply, void *_user_data, const char* _dll_path, bool _isPluginAvs25, bool _isPluginPreV11C) : Function() { apply = _apply; user_data = _user_data; isPluginAvs25 = _isPluginAvs25; isPluginPreV11C = _isPluginPreV11C; if (NULL != _dll_path) { size_t len = strlen(_dll_path); auto tmp = new char[len + 1]; memcpy(tmp, _dll_path, len); tmp[len] = 0; dll_path = tmp; } if (NULL != _name) { size_t len = strlen(_name); auto tmp = new char[len + 1]; memcpy(tmp, _name, len); tmp[len] = 0; name = tmp; } if ( NULL != _param_types ) { size_t len = strlen(_param_types); auto tmp = new char[len+1]; memcpy(tmp, _param_types, len); tmp[len] = 0; param_types = tmp; } if ( NULL != _name ) { std::string cn(NULL != _plugin_basename ? _plugin_basename : ""); cn.append("_").append(_name); auto tmp = new char[cn.size()+1]; memcpy(tmp, cn.c_str(), cn.size()); tmp[cn.size()] = 0; canon_name = tmp; } } AVSFunction::~AVSFunction() { delete [] canon_name; delete [] name; delete [] param_types; delete [] dll_path; } bool AVSFunction::empty() const { return NULL == name; } bool AVSFunction::IsScriptFunction(const Function* func) { return ( (func->apply == &(FunctionInstance::Execute_)) || (func->apply == &(ScriptFunction::Execute)) || (func->apply == &Eval) || (func->apply == &EvalOop) || (func->apply == &Import) ); } bool AVSFunction::SingleTypeMatch(char type, const AVSValue& arg, bool strict) { switch (type) { case '.': return true; case 'b': return arg.IsBool(); case 'i': return arg.IsInt(); // IsInt is true for long (int64) parameters as well, worst case they will be AsInt-ed, or can use AsLong case 'f': return arg.IsFloat() && (!strict || !arg.IsInt()); // IsFloat is true for 'double' as well case 's': return arg.IsString(); case 'c': return arg.IsClip(); case 'n': return arg.IsFunction(); case 'a': return arg.IsArray(); // PF 161028 AVS+ script arrays default: return false; } } bool AVSFunction::SingleTypeMatchArray(char type, const AVSValue& arg, bool strict) { if (!arg.IsArray()) return false; for (int i = 0; i < arg.ArraySize(); i++) { if (!SingleTypeMatch(type, arg[i], strict)) return false; } return true; } bool AVSFunction::TypeMatch(const char* param_types, const AVSValue* args, size_t num_args, bool strict, IScriptEnvironment* env) { bool optional = false; /* examples { "StackHorizontal", BUILTIN_FUNC_PREFIX, "cc+", StackHorizontal::Create }, { "Spline", BUILTIN_FUNC_PREFIX, "[x]ff+[cubic]b", Spline }, { "Select", BUILTIN_FUNC_PREFIX, "i.+", Select }, { "Array", BUILTIN_FUNC_PREFIX, ".*", ArrayCreate }, { "IsArray", BUILTIN_FUNC_PREFIX, ".", IsArray }, { "ArrayGet", BUILTIN_FUNC_PREFIX, ".s", ArrayGet }, { "ArrayGet", BUILTIN_FUNC_PREFIX, ".i+", ArrayGet }, // .+i+ syntax is not possible. { "ArraySize", BUILTIN_FUNC_PREFIX, ".", ArraySize }, */ // arguments are provided in a flattened way (flattened=array elements extracted) // e.g. string array is provided here string,string,string // '*' or '+' to indicate "zero or more" or "one or more" // '.' matches a single argument of any type. To match multiple arguments of any type, use ".*" or ".+". size_t i = 0; while (i < num_args) { if (*param_types == '\0') { // more args than params return false; } if (*param_types == '[') { // named arg: skip over the name param_types = strchr(param_types+1, ']'); if (param_types == NULL) { env->ThrowError("TypeMatch: unterminated parameter name (bug in filter)"); } ++param_types; optional = true; if (*param_types == '\0') { env->ThrowError("TypeMatch: no type specified for optional parameter (bug in filter)"); } } if (param_types[1] == '*') { // skip over initial test of type for '*' (since zero matches is ok) ++param_types; } // see also: IsParameterTypeSpecifier switch (*param_types) { case 'b': case 'i': case 'f': case 's': case 'c': // case 'd': case 'l': // from v11 f and i will accept 64 bit data as well case 'n': case 'a': // PF 2016: 'a' is special letter for script arrays, but if possible we are using .* and .+ (legacy Avisynth style) instead // Note (2021): 'a' is still not used // cons: no z or nz (+ or *) possibility // no type check (array of int) // cannot be used in plugins which are intended to work for Avisynth 2.6 Classic. ("a" is invalid in function signature -> plugin load error) // pros: clean syntax, accept _only_ arrays when required, no comma-delimited-list-to-array option (like in old Avisynth syntax) // array arguments are not necessarily "flattened" when TypeMatch is called. if (param_types[1] == '+' // parameter indicates an array-type args[i] && args[i].IsArray() // allow single e.g. 'c' parameter in place of a 'c+' requirement && *param_types != 'a' ) { ++param_types; // will be found in case '+' section break; } if ( (!optional || args[i].Defined()) && !SingleTypeMatch(*param_types, args[i], strict)) return false; ++param_types; ++i; break; case '.': // any type // This allows even an array in the place of a "." // Use cases: IsArray "." can be fed with any AvsValue. ArrayGet ".i+" requires an array in the place of "." as well. // Array-ness of such AVSValue parameters can be checked in the function itself. ++param_types; ++i; break; case '+': case '*': // check array content type if required if (args[i].IsArray() && param_types[-1] != '.') { // A script can provide an array argument in an direct array-type variable. // e.g. a user defined script function function Summa(int_array "x") will translate to "[x]i*" // parameter list. Passing an integer array directly e.g. [1,2,3] will be handled here. // All elements in the array should match with the type character preceding '+' or '*' // (There was another option in legacy AviSynth: the comma separated values e.g. 1,2,3 // could be recognized and moved to an unnamed array, this is check later) if (!SingleTypeMatchArray(param_types[-1], args[i], strict)) return false; ++param_types; ++i; } else // Legacy Avisynth array check. // Array of arguments of known types last until an argument of another type is found. // This is the reason why an .+ or .* (array of anything) must only appear at the end // of the parameter list since we cannot detect type-change in an any-type argument sequence. if (!SingleTypeMatch(param_types[-1], args[i], strict)) { // we're done with the + or *, parameter type has been changed ++param_types; } else { // parameter type matched, step parameter pointer but leave type pointer ++i; } break; default: env->ThrowError("TypeMatch: invalid character in parameter list (bug in filter)"); } } // We're out of args. We have a match if one of the following is true: // (a) we're out of params. // (b) remaining params are named i.e. optional. // (c) we're at a '+' or '*' and any remaining params are optional. if (*param_types == '+' || *param_types == '*') param_types += 1; if (*param_types == '\0' || *param_types == '[') return true; while (param_types[1] == '*') { param_types += 2; if (*param_types == '\0' || *param_types == '[') return true; } return false; } bool AVSFunction::ArgNameMatch(const char* param_types, size_t args_names_count, const char* const* arg_names) { for (size_t i=0; i slash_pos) BaseName = FilePath.substr(slash_pos+1, dot_pos - slash_pos - 1); else BaseName = FilePath.substr(slash_pos+1, std::string::npos); } else if ((dot_pos == std::string::npos) && (slash_pos != std::string::npos)) {// we have a slash but no dot // Extract basename BaseName = FilePath.substr(slash_pos+1, std::string::npos); } else {// everything else // Because we have used GetFullPathName, FilePath should contain an absolute path, // meaning that this case should be unreachable, but the devil never sleeps. assert(0); BaseName = FilePath; } } /* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- PluginManager --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- */ PluginManager::PluginManager(InternalEnvironment* env) : Env(env), PluginInLoad(NULL), AutoloadExecuted(false), Autoloading(false) { env->SetGlobalVar("$PluginFunctions$", AVSValue("")); } void PluginManager::ClearAutoloadDirs() { if (AutoloadExecuted) Env->ThrowError("Cannot modify directory list after the autoload procedure has already executed."); AutoloadDirs.clear(); } static fs::path PathFromUtf8(const std::string& utf8) { #ifdef AVS_WINDOWS if (utf8.empty()) return fs::path(); auto wstr = Utf8ToWideChar(utf8.c_str()); return fs::path(wstr.get()); #else return fs::path(utf8); #endif } void PluginManager::AddAutoloadDir(const std::string &dirPath_utf8, bool toFront) { if (AutoloadExecuted) Env->ThrowError("Cannot modify directory list after the autoload procedure has already executed."); std::string dir(dirPath_utf8); #if !defined(AVS_BSD) // Any use of /proc should be avoided on BSD, since // most of them have removed it or discourage its use. // Thankfully, it actually looks like the need for it // is to simply populate the PROGRAMDIR variable for // AddAutoloadDirs, but on POSIX systems this variable // should probably not be expected to be as flexible // as it is on Windows, negating the need for pulling // it out programmatically. Since the macOS and Linux // forms of the code still function, leave those alone. std::string ExeFilePath; #ifdef AVS_WINDOWS // get folder of our executable as wide char and convert to UTF-8 { WCHAR ExeFilePathW[AVS_MAX_PATH]; // Ensure buffer is zeroed (older Windows may not null-terminate) // e.g. WinXP does not terminate the result of GetModuleFileName with a zero, so me must zero our buffer memset(ExeFilePathW, 0, sizeof(ExeFilePathW)); DWORD len = GetModuleFileNameW(NULL, ExeFilePathW, AVS_MAX_PATH); if (len == 0) { // Fallback to empty string on failure ExeFilePath.clear(); } else { // Convert wide-char path to UTF-8 for internal use auto exe_utf8 = WideCharToUtf8(ExeFilePathW); ExeFilePath = exe_utf8.get(); } } #else // AVS_POSIX char buf[PATH_MAX + 1] {}; #ifdef AVS_LINUX if (readlink("/proc/self/exe", buf, sizeof(buf) - 1) != -1) #elif defined(AVS_MACOS) uint32_t size = sizeof(buf) - 1; if (_NSGetExecutablePath(buf, &size) == 0) #endif // AVS_LINUX { ExeFilePath = buf; } #endif std::string ExeFileDir(ExeFilePath); replace(ExeFileDir, '\\', '/'); #ifndef AVS_HAIKU // Haiku's exe path stuff differs enough from the *nix OSes // that it fails spectacularly when loading the library in a client // like avs2yuv or FFmpeg. Try to skip this for now and hope // this doesn't cause more errors. ExeFileDir = ExeFileDir.erase(ExeFileDir.rfind('/'), std::string::npos); #endif #endif // !AVS_BSD // variable expansion // now "dir" is utf8, so we can use utf8 variants of macros replace_beginning(dir, "SCRIPTDIR", Env->GetVarString("$ScriptDirUtf8$", "")); replace_beginning(dir, "MAINSCRIPTDIR", Env->GetVarString("$MainScriptDirUtf8$", "")); #if !defined(AVS_BSD) replace_beginning(dir, "PROGRAMDIR", ExeFileDir); #endif // further macro expansions on Windows std::string plugin_dir; #ifdef AVS_WINDOWS // folders are read as utf8, can contain non-ansi characters as well // where registry entry does not exist, delete the whole macro string if it contains only that macro #if defined (AVS_WINDOWS_X86) #if defined (__GNUC__) if (GetRegString(HKEY_CURRENT_USER, RegAvisynthKey, RegPluginDirPlus_GCC, &plugin_dir)) replace_beginning(dir, "USER_PLUS_PLUGINS", plugin_dir); else replace_beginning(dir, "USER_PLUS_PLUGINS", ""); if (GetRegString(HKEY_LOCAL_MACHINE, RegAvisynthKey, RegPluginDirPlus_GCC, &plugin_dir)) replace_beginning(dir, "MACHINE_PLUS_PLUGINS", plugin_dir); else replace_beginning(dir, "MACHINE_PLUS_PLUGINS", ""); #else // note: if e.g HKCU/PluginDir+ does not exist, USER_PLUS_PLUGINS as a string remain in search path if (GetRegString(HKEY_CURRENT_USER, RegAvisynthKey, RegPluginDirPlus, &plugin_dir)) replace_beginning(dir, "USER_PLUS_PLUGINS", plugin_dir); else replace_beginning(dir, "USER_PLUS_PLUGINS", ""); if (GetRegString(HKEY_LOCAL_MACHINE, RegAvisynthKey, RegPluginDirPlus, &plugin_dir)) replace_beginning(dir, "MACHINE_PLUS_PLUGINS", plugin_dir); else replace_beginning(dir, "MACHINE_PLUS_PLUGINS", ""); if (GetRegString(HKEY_CURRENT_USER, RegAvisynthKey, RegPluginDirClassic, &plugin_dir)) replace_beginning(dir, "USER_CLASSIC_PLUGINS", plugin_dir); else replace_beginning(dir, "USER_CLASSIC_PLUGINS", ""); if (GetRegString(HKEY_LOCAL_MACHINE, RegAvisynthKey, RegPluginDirClassic, &plugin_dir)) replace_beginning(dir, "MACHINE_CLASSIC_PLUGINS", plugin_dir); else replace_beginning(dir, "MACHINE_CLASSIC_PLUGINS", ""); #endif // _GNUC_ #else if (GetRegString(HKEY_CURRENT_USER, RegAvisynthKey, RegPluginDirPlus, &plugin_dir)) replace_beginning(dir, "USER_PLUS_PLUGINS", plugin_dir); else replace_beginning(dir, "USER_PLUS_PLUGINS", ""); if (GetRegString(HKEY_LOCAL_MACHINE, RegAvisynthKey, RegPluginDirPlus, &plugin_dir)) replace_beginning(dir, "MACHINE_PLUS_PLUGINS", plugin_dir); else replace_beginning(dir, "MACHINE_PLUS_PLUGINS", ""); #endif // AVS_WINDOWS_X86 #endif // AVS_WINDOWS // replace backslashes with forward slashes replace(dir, '\\', '/'); // append terminating slash if needed if (dir.size() > 0 && dir[dir.size()-1] != '/') dir.append("/"); // remove double slashes while(replace(dir, "//", "/")); if (dir.empty()) return; if (toFront) AutoloadDirs.insert(AutoloadDirs.begin(), GetFullPathNameWrapUtf8(dir)); else AutoloadDirs.push_back(GetFullPathNameWrapUtf8(dir)); } void PluginManager::AutoloadPlugins() { if (AutoloadExecuted) return; AutoloadExecuted = true; Autoloading = true; // Load binary plugins // AutoLoadDirs are utf8 on Windows as well for (const std::string& dir : AutoloadDirs) { std::error_code ec; #ifdef AVS_POSIX #ifdef AVS_MACOS const char* binaryFilter = ".dylib"; #else const char* binaryFilter = ".so"; #endif #else const char* binaryFilter = ".dll"; #endif // Build platform-native path from UTF-8 directory string fs::path dir_path = PathFromUtf8(dir); if (dir_path.empty()) continue; for (auto& file : fs::directory_iterator(dir_path, fs::directory_options::skip_permission_denied | fs::directory_options::follow_directory_symlink, ec)) { #ifdef AVS_POSIX const bool extensionsMatch = file.path().extension() == binaryFilter; // case sensitive #else auto ext_w = file.path().extension().wstring(); auto ext_utf8 = WideCharToUtf8(ext_w.c_str()); const bool extensionsMatch = streqi(ext_utf8.get(), binaryFilter); #endif if (extensionsMatch) { // Convert filename back to UTF-8 for internal handling (plugin expects UTF-8 strings) #ifdef AVS_POSIX std::string filename_utf8 = file.path().filename().generic_string(); #else auto fn_w = file.path().filename().wstring(); auto fn_utf8 = WideCharToUtf8(fn_w.c_str()); std::string filename_utf8 = fn_utf8.get(); #endif PluginFile p(concat(dir, filename_utf8)); // utf8 handled // Search for loaded plugins with the same base name. bool same_found = false; for (size_t i = 0; i < AutoLoadedPlugins.size(); ++i) { #ifdef AVS_POSIX if (AutoLoadedPlugins[i].BaseName == p.BaseName) // case insentitive #else if (streqi(AutoLoadedPlugins[i].BaseName.c_str(), p.BaseName.c_str())) #endif { // Prevent loading a plugin with a basename that is // already loaded (from another autoload folder). same_found = true; break; } } if (same_found) continue; // Try to load plugin AVSValue dummy; LoadPlugin(p, false, &dummy); } } const char* scriptFilter = ".avsi"; // Build platform-native path again (already available as dir_path) for (auto& file : fs::directory_iterator(dir_path, fs::directory_options::skip_permission_denied | fs::directory_options::follow_directory_symlink, ec)) // and not recursive_directory_iterator { const bool extensionsMatch = #ifdef AVS_POSIX file.path().extension() == scriptFilter; // case sensitive #else // Convert extension to UTF-8 for comparison ([](const fs::path &p, const char *filter)->bool { auto ext_w = p.extension().wstring(); auto ext_utf8 = WideCharToUtf8(ext_w.c_str()); return streqi(ext_utf8.get(), filter); })(file.path(), scriptFilter); #endif if (extensionsMatch) { // CWDChanger expects a char*; we keep passing the UTF-8 dir here (as before). CWDChanger cwdchange(dir.c_str()); #ifdef AVS_POSIX std::string filename_utf8 = file.path().filename().generic_string(); #else auto fn_w = file.path().filename().wstring(); auto fn_utf8 = WideCharToUtf8(fn_w.c_str()); std::string filename_utf8 = fn_utf8.get(); #endif PluginFile p(concat(dir, filename_utf8)); // Search for loaded avsi scripts with the same base name. bool same_found = false; for (size_t i = 0; i < AutoLoadedImports.size(); ++i) { #ifdef AVS_POSIX if (AutoLoadedImports[i].BaseName == p.BaseName) // case insensitive #else if (streqi(AutoLoadedImports[i].BaseName.c_str(), p.BaseName.c_str())) #endif { // Prevent loading an avsi script with a basename that is // already loaded (from another autoload folder). same_found = true; break; } } if (same_found) continue; // Try to load script Env->Invoke("Import", p.FilePath.c_str()); // FIXME: utf8? AutoLoadedImports.push_back(p); } } } Autoloading = false; } PluginManager::~PluginManager() { // Delete all AVSFunction objects that we created std::unordered_set function_set; for (const auto& lists : ExternalFunctions) { const FunctionList& funcList = lists.second; for (const auto& func : funcList) function_set.insert(func); } for (const auto& lists : AutoloadedFunctions) { const FunctionList& funcList = lists.second; for (const auto& func : funcList) function_set.insert(func); } for (const auto& func : function_set) { delete func; } // Unload plugin binaries for (size_t i = 0; i < LoadedPlugins.size(); ++i) { assert(LoadedPlugins[i].Library); FreeLibrary(LoadedPlugins[i].Library); LoadedPlugins[i].Library = NULL; } for (size_t i = 0; i < AutoLoadedPlugins.size(); ++i) { assert(AutoLoadedPlugins[i].Library); FreeLibrary(AutoLoadedPlugins[i].Library); AutoLoadedPlugins[i].Library = NULL; } Env = NULL; PluginInLoad = NULL; } void PluginManager::UpdateFunctionExports(const char* funcName, const char* funcParams, const char *exportVar) { if (exportVar == NULL) exportVar = "$PluginFunctions$"; // Update $PluginFunctions$ const char *oldFnList = Env->GetVarString(exportVar, ""); std::string FnList(oldFnList); if (FnList.size() > 0) // if the list is not empty... FnList.push_back(' '); // ...add a delimiting whitespace FnList.append(funcName); Env->SetGlobalVar(exportVar, AVSValue( Env->SaveString(FnList.c_str(), (int)FnList.size()) )); // Update $Plugin!...!Param$ std::string param_id; param_id.reserve(128); param_id.append("$Plugin!"); param_id.append(funcName); param_id.append("!Param$"); Env->SetGlobalVar(Env->SaveString(param_id.c_str(), (int)param_id.size()), AVSValue(Env->SaveString(funcParams))); } bool PluginManager::LoadPlugin(const char* path, bool throwOnError, AVSValue *result) { auto pf = PluginFile { path }; return LoadPlugin(pf, throwOnError, result); } #ifdef AVS_WINDOWS static bool Is64BitDLL(std::string sDLL, bool &bIs64BitDLL) { bIs64BitDLL = false; LOADED_IMAGE li; if (!MapAndLoad((LPSTR)sDLL.c_str(), NULL, &li, TRUE, TRUE)) { //error handling (check GetLastError()) return false; } if (li.FileHeader->FileHeader.Machine != IMAGE_FILE_MACHINE_I386) //64 bit image bIs64BitDLL = true; UnMapAndLoad(&li); return true; } #endif //AVS_WINDOWS bool PluginManager::LoadPlugin(PluginFile &plugin, bool throwOnError, AVSValue *result) { std::vector& PluginList = Autoloading ? AutoLoadedPlugins : LoadedPlugins; for (size_t i = 0; i < PluginList.size(); ++i) { if (streqi(PluginList[i].FilePath.c_str(), plugin.FilePath.c_str())) { // Imitate successful loading if the plugin is already loaded plugin = PluginList[i]; return true; } } plugin.isPluginAvs25 = false; plugin.isPluginPreV11C = false; plugin.isPluginC = false; #ifdef AVS_WINDOWS // Search for dependent DLLs in the plugin's directory too size_t slash_pos = plugin.FilePath.rfind('/'); std::string plugin_dir = plugin.FilePath.substr(0, slash_pos);; DllDirChanger dllchange(plugin_dir.c_str()); // Load the dll into memory plugin.Library = LoadLibraryEx(plugin.FilePath.c_str(), 0, LOAD_WITH_ALTERED_SEARCH_PATH); if (plugin.Library == NULL) { DWORD errCode = GetLastError(); // Bitness mixing always throws an error, regardless of throwOnError state // By this new behaviour even plugin auto-load will fail bool bIs64BitDLL; bool succ = Is64BitDLL(plugin.FilePath, bIs64BitDLL); if (succ) { const bool selfIs32 = sizeof(void *) == 4; if (selfIs32 && bIs64BitDLL) Env->ThrowError("Cannot load a 64 bit DLL in 32 bit Avisynth: '%s'.\n", plugin.FilePath.c_str()); if (!selfIs32 && !bIs64BitDLL) Env->ThrowError("Cannot load a 32 bit DLL in 64 bit Avisynth: '%s'.\n", plugin.FilePath.c_str()); } if (throwOnError) { Env->ThrowError("Cannot load file '%s'. Platform returned code %d:\n%s", plugin.FilePath.c_str(), errCode, GetLastErrorText(errCode).c_str()); } else return false; } #else // AVS_POSIX plugin.Library = dlopen(plugin.FilePath.c_str(), RTLD_LAZY); if (plugin.Library == NULL) Env->ThrowError("Cannot load file '%s'. Reason: %s", plugin.FilePath.c_str(), dlerror()); #endif // Try to load various plugin interfaces std::string avsexception26_message; const int avs26res = TryAsAvs26(plugin, result, avsexception26_message); if (avs26res != 0) // 0: OK, plugin had AvisynthPluginInit3Func { if (avs26res != 1) { // 1: AvisynthPluginInit3Func not found // plugin entry point exists but exception was thrown // Bad plugin, we must report the exception immediately regardless of throwOnError // Message could be from plugin author or, e.g., from env->AddFunction() Env->ThrowError("'%s' plugin loading error:\n%s", plugin.FilePath.c_str(), avsexception26_message.c_str()); } if (!TryAsAvsC(plugin, result)) // V11: try avisynth_c_plugin_init2, plugin is 64 bit capable { if (!TryAsAvsPreV11C(plugin, result)) // try avisynth_c_plugin_init, plugin is not 64 bit capable, 64 bit data will be casted down to int/float { if (!TryAsAvs25(plugin, result)) { FreeLibrary(plugin.Library); plugin.Library = NULL; if (throwOnError) Env->ThrowError("'%s' cannot be used as a plugin for AviSynth.", plugin.FilePath.c_str()); else return false; } } } } PluginList.push_back(plugin); return true; } std::string PluginManager::ListAutoloadDirs() { // lf separated list, no separator after the last one std::string result; if (!AutoloadDirs.empty()) { result = AutoloadDirs[0]; for (size_t i = 1; i < AutoloadDirs.size(); ++i) { result += "\n" + AutoloadDirs[i]; } } return result; } const AVSFunction* PluginManager::Lookup(const FunctionMap& map, const char* search_name, const AVSValue* args, size_t num_args, bool strict, size_t args_names_count, const char* const* arg_names) const { FunctionMap::const_iterator list_it = map.find(search_name); if (list_it == map.end()) return NULL; for ( FunctionList::const_reverse_iterator func_it = list_it->second.rbegin(); func_it != list_it->second.rend(); ++func_it) { const AVSFunction *func = *func_it; if (AVSFunction::TypeMatch(func->param_types, args, num_args, strict, Env) && AVSFunction::ArgNameMatch(func->param_types, args_names_count, arg_names) ) { return func; } } return NULL; } const AVSFunction* PluginManager::Lookup(const char* search_name, const AVSValue* args, size_t num_args, bool strict, size_t args_names_count, const char* const* arg_names) const { /* Lookup in non-autoloaded functions first, so that they take priority */ const AVSFunction* func = Lookup(ExternalFunctions, search_name, args, num_args, strict, args_names_count, arg_names); if (func != NULL) return func; /* If not found, look amongst the autoloaded */ return Lookup(AutoloadedFunctions, search_name, args, num_args, strict, args_names_count, arg_names); } bool PluginManager::FunctionExists(const char* name) const { bool autoloaded = (AutoloadedFunctions.find(name) != AutoloadedFunctions.end()); return autoloaded || (ExternalFunctions.find(name) != ExternalFunctions.end()); } // A minor helper function static bool FunctionListHasDll(const FunctionList &list, const char *dll_path) { for (const auto &f : list) { if ( (nullptr == f->dll_path) || (nullptr == dll_path) ) { if (f->dll_path == dll_path) { return true; } } else if (streqi(f->dll_path, dll_path)) { return true; } } return false; } void PluginManager::AddFunction(const char* name, const char* params, IScriptEnvironment::ApplyFunc apply, void* user_data, const char *exportVar, bool isCalledFromAvs25Interface, bool isCalledFromPreV11CInterface) { if (!IsValidParameterString(params)) Env->ThrowError("%s has an invalid parameter string (bug in filter)", name); FunctionMap& functions = Autoloading ? AutoloadedFunctions : ExternalFunctions; AVSFunction *newFunc = NULL; if (PluginInLoad != NULL) { // either called using IScriptEnvironment_Avs25 or we are inside of a CPPv2.5 plugin load const bool isAvs25like = isCalledFromAvs25Interface || PluginInLoad->isPluginAvs25; // During function instantiation the new V11 64 bit 'l'ong/'d'ouble // parameters must be converted to int/float instead. // If 64->32-bit conversion is not done, the pre-V11 C plugin does not detect // AVS_Value type properly, since the type check is not performed through interface calls. // The 'baked code' in avisynth_c.h does not know about 'l'ong or 'd'ouble type: // IsInt() / IsFloat() or avs_is_int() / avs_is_float() would return false on the new 64 bit types. // How Avisynth detects that a C plugin 'knows' about 64 bit types? // - the plugin is 64 bit aware plugin, works with regular IScriptEnvironment // - When avisynth_c_plugin_init2 is available (PluginInLoad->isPluginC is set) // - When C client called avs_create_script_environment(ver) with ver>=11. // - the plugin is pre-V11 C plugin and we pass IScriptEnvironment_AvsPreV11C // - when the plugin responded only to avisynth_c_plugin_init; // (PluginInLoad->isPluginPerV11C is true) // - C client called avs_create_script_environment(ver) with ver<11 // (isCalledFromPreV11CInterface is true) const bool isPrev11Clike = isCalledFromPreV11CInterface || PluginInLoad->isPluginPreV11C; newFunc = new AVSFunction(name, PluginInLoad->BaseName.c_str(), params, apply, user_data, PluginInLoad->FilePath.c_str(), isAvs25like, isPrev11Clike); } else { // Not plugin load case. // AddFunction or avs_add_function was called by a client // (a C client which directly loads avisynth) // or when called from a cpp v2.5 level script environtment. // isCalledFromAvs25Interface: IScriptEnvironment_Avs25->AddFunction newFunc = new AVSFunction(name, NULL, params, apply, user_data, NULL, isCalledFromAvs25Interface, isCalledFromPreV11CInterface ); } // Warn user if a function with the same name is already registered by another plugin { const auto &it = functions.find(newFunc->name); if ( (functions.end() != it) && !FunctionListHasDll(it->second, newFunc->dll_path) ) { OneTimeLogTicket ticket(LOGTICKET_W1008, newFunc->name); Env->LogMsgOnce(ticket, LOGLEVEL_WARNING, "%s() is defined by multiple plugins. Calls to this filter might be ambiguous and could result in the wrong function being called.", newFunc->name); } } functions[newFunc->name].push_back(newFunc); UpdateFunctionExports(newFunc->name, newFunc->param_types, exportVar); if (NULL != newFunc->canon_name) { // Warn user if a function with the same name is already registered by another plugin { const auto &it = functions.find(newFunc->canon_name); if ((functions.end() != it) && !FunctionListHasDll(it->second, newFunc->dll_path)) { OneTimeLogTicket ticket(LOGTICKET_W1008, newFunc->canon_name); Env->LogMsgOnce(ticket, LOGLEVEL_WARNING, "%s() is defined by multiple plugins. Calls to this filter might be ambiguous and could result in the wrong function being called.", newFunc->name); } } functions[newFunc->canon_name].push_back(newFunc); UpdateFunctionExports(newFunc->canon_name, newFunc->param_types, exportVar); } } std::string PluginManager::PluginLoading() const { if (NULL == PluginInLoad) return std::string(); else return PluginInLoad->BaseName; } // 0: success // 1: no AvisynthPluginInit3Func // 2: Avisynth exception // 3: other exception int PluginManager::TryAsAvs26(PluginFile &plugin, AVSValue *result, std::string &avsexception_message) { extern const AVS_Linkage* const AVS_linkage; // In interface.cpp #ifdef AVS_POSIX AvisynthPluginInit3Func AvisynthPluginInit3 = (AvisynthPluginInit3Func)dlsym(plugin.Library, "AvisynthPluginInit3"); #elif defined(GCC_WIN32) AvisynthPluginInit3Func AvisynthPluginInit3 = (AvisynthPluginInit3Func)GetProcAddress(plugin.Library, "_AvisynthPluginInit3"); if (!AvisynthPluginInit3) AvisynthPluginInit3 = (AvisynthPluginInit3Func)GetProcAddress(plugin.Library, "AvisynthPluginInit3@8"); #else AvisynthPluginInit3Func AvisynthPluginInit3 = (AvisynthPluginInit3Func)GetProcAddress(plugin.Library, "AvisynthPluginInit3"); if (!AvisynthPluginInit3) AvisynthPluginInit3 = (AvisynthPluginInit3Func)GetProcAddress(plugin.Library, "_AvisynthPluginInit3@8"); #endif int success = 0; // O.K. avsexception_message = ""; if (AvisynthPluginInit3 == NULL) return 1; // not found else { PluginInLoad = &plugin; // a bad plugin can kill everything if it uses e.g. an old IScriptEnvironment2 try { *result = AvisynthPluginInit3(Env, AVS_linkage); } catch (const AvisynthError& error) { avsexception_message = error.msg; success = 2; } catch (const std::exception& ex) { avsexception_message = ex.what(); success = 3; } catch (...) { avsexception_message = "Unknown exception"; success = 3; } PluginInLoad = NULL; } return success; } bool PluginManager::TryAsAvs25(PluginFile &plugin, AVSValue *result) { #ifdef AVS_POSIX AvisynthPluginInit2Func AvisynthPluginInit2 = (AvisynthPluginInit2Func)dlsym(plugin.Library, "AvisynthPluginInit2"); #elif defined(GCC_WIN32) AvisynthPluginInit2Func AvisynthPluginInit2 = (AvisynthPluginInit2Func)GetProcAddress(plugin.Library, "_AvisynthPluginInit2"); if (!AvisynthPluginInit2) AvisynthPluginInit2 = (AvisynthPluginInit2Func)GetProcAddress(plugin.Library, "AvisynthPluginInit2@4"); #else AvisynthPluginInit2Func AvisynthPluginInit2 = (AvisynthPluginInit2Func)GetProcAddress(plugin.Library, "AvisynthPluginInit2"); if (!AvisynthPluginInit2) AvisynthPluginInit2 = (AvisynthPluginInit2Func)GetProcAddress(plugin.Library, "_AvisynthPluginInit2@4"); #endif bool success = true; if (AvisynthPluginInit2 == NULL) return false; else { PluginInLoad = &plugin; // in case of a crash in init2 try { // Pass the 2.5 variant IScriptEnvironment, which has different Invoke // and AddFunction method to avoid array copy/free problems. // (NEW_AVSVALUE compatibility: "baked code" strikes back) // set before AddFunction callbacks happen from the AvisynthPluginInit2 called below plugin.isPluginAvs25 = true; *result = AvisynthPluginInit2(Env->GetEnv25()); } catch (...) { success = false; } PluginInLoad = NULL; } return success; } bool PluginManager::TryAsAvsPreV11C(PluginFile& plugin, AVSValue* result) { #ifdef AVS_POSIX AvisynthCPluginInitFunc AvisynthCPluginInit = (AvisynthCPluginInitFunc)dlsym(plugin.Library, "avisynth_c_plugin_init"); #else #ifdef _WIN64 AvisynthCPluginInitFunc AvisynthCPluginInit = (AvisynthCPluginInitFunc)GetProcAddress(plugin.Library, "avisynth_c_plugin_init"); if (!AvisynthCPluginInit) AvisynthCPluginInit = (AvisynthCPluginInitFunc)GetProcAddress(plugin.Library, "_avisynth_c_plugin_init@4"); #else // _WIN32 AvisynthCPluginInitFunc AvisynthCPluginInit = (AvisynthCPluginInitFunc)GetProcAddress(plugin.Library, "_avisynth_c_plugin_init@4"); if (!AvisynthCPluginInit) AvisynthCPluginInit = (AvisynthCPluginInitFunc)GetProcAddress(plugin.Library, "avisynth_c_plugin_init@4"); if (!AvisynthCPluginInit) AvisynthCPluginInit = (AvisynthCPluginInitFunc)GetProcAddress(plugin.Library, "avisynth_c_plugin_init"); #endif #endif // AVS_POSIX if (AvisynthCPluginInit == NULL) return false; else { PluginInLoad = &plugin; // set before AddFunction callbacks happen from the AvisynthCPluginInit called below plugin.isPluginPreV11C = true; // no array deep copy/free when NEW_AVSVALUE { AVS_ScriptEnvironment e; e.env = Env; AVS_ScriptEnvironment* pe; pe = &e; const char* s = NULL; #if defined(X86_32) && defined(MSVC) int callok = 1; // (stdcall) __asm // Tritical - Jan 2006 { push eax push edx push 0x12345678 // Stash a known value mov eax, pe // Env pointer push eax // Arg1 call AvisynthCPluginInit // avisynth_c_plugin_init lea edx, s // return value is in eax mov DWORD PTR[edx], eax pop eax // Get top of stack cmp eax, 0x12345678 // Was it our known value? je end // Yes! Stack was cleaned up, was a stdcall lea edx, callok mov BYTE PTR[edx], 0 // Set callok to 0 (_cdecl) pop eax // Get 2nd top of stack cmp eax, 0x12345678 // Was this our known value? je end // Yes! Stack is now correctly cleaned up, was a _cdecl mov BYTE PTR[edx], 2 // Set callok to 2 (bad stack) end: pop edx pop eax } switch (callok) { case 0: // cdecl #ifdef AVSC_USE_STDCALL Env->ThrowError("Avisynth 2 C Plugin '%s' has wrong calling convention! Must be _stdcall.", plugin.BaseName.c_str()); #endif break; case 1: // stdcall #ifndef AVSC_USE_STDCALL Env->ThrowError("Avisynth 2 C Plugin '%s' has wrong calling convention! Must be _cdecl.", plugin.BaseName.c_str()); #endif break; case 2: Env->ThrowError("Avisynth 2 C Plugin '%s' has corrupted the stack.", plugin.BaseName.c_str()); } #else s = AvisynthCPluginInit(pe); #endif // if (s == 0) // Env->ThrowError("Avisynth 2 C Plugin '%s' returned a NULL pointer.", plugin.BaseName.c_str()); *result = AVSValue(s); } PluginInLoad = NULL; } return true; } // v11 capable: C plugin implements avisynth_c_plugin_init2! bool PluginManager::TryAsAvsC(PluginFile& plugin, AVSValue* result) { #ifdef AVS_POSIX AvisynthCPluginInitFunc AvisynthCPluginInit = (AvisynthCPluginInitFunc)dlsym(plugin.Library, "avisynth_c_plugin_init2"); #else #ifdef _WIN64 AvisynthCPluginInitFunc AvisynthCPluginInit = (AvisynthCPluginInitFunc)GetProcAddress(plugin.Library, "avisynth_c_plugin_init2"); if (!AvisynthCPluginInit) AvisynthCPluginInit = (AvisynthCPluginInitFunc)GetProcAddress(plugin.Library, "_avisynth_c_plugin_init2@4"); #else // _WIN32 AvisynthCPluginInitFunc AvisynthCPluginInit = (AvisynthCPluginInitFunc)GetProcAddress(plugin.Library, "_avisynth_c_plugin_init2@4"); if (!AvisynthCPluginInit) AvisynthCPluginInit = (AvisynthCPluginInitFunc)GetProcAddress(plugin.Library, "avisynth_c_plugin_init2@4"); if (!AvisynthCPluginInit) AvisynthCPluginInit = (AvisynthCPluginInitFunc)GetProcAddress(plugin.Library, "avisynth_c_plugin_init2"); #endif #endif // AVS_POSIX if (AvisynthCPluginInit == NULL) return false; else { PluginInLoad = &plugin; // set before AddFunction callbacks happen from the AvisynthCPluginInit called below plugin.isPluginC = true; // no array deep copy/free when NEW_AVSVALUE, but 64 bit data capable { AVS_ScriptEnvironment e; e.env = Env; AVS_ScriptEnvironment* pe; pe = &e; const char* s = NULL; #if defined(X86_32) && defined(MSVC) int callok = 1; // (stdcall) __asm // Tritical - Jan 2006 { push eax push edx push 0x12345678 // Stash a known value mov eax, pe // Env pointer push eax // Arg1 call AvisynthCPluginInit // avisynth_c_plugin_init lea edx, s // return value is in eax mov DWORD PTR[edx], eax pop eax // Get top of stack cmp eax, 0x12345678 // Was it our known value? je end // Yes! Stack was cleaned up, was a stdcall lea edx, callok mov BYTE PTR[edx], 0 // Set callok to 0 (_cdecl) pop eax // Get 2nd top of stack cmp eax, 0x12345678 // Was this our known value? je end // Yes! Stack is now correctly cleaned up, was a _cdecl mov BYTE PTR[edx], 2 // Set callok to 2 (bad stack) end: pop edx pop eax } switch (callok) { case 0: // cdecl #ifdef AVSC_USE_STDCALL Env->ThrowError("Avisynth C Plugin '%s' has wrong calling convention! Must be _stdcall.", plugin.BaseName.c_str()); #endif break; case 1: // stdcall #ifndef AVSC_USE_STDCALL Env->ThrowError("Avisynth C Plugin '%s' has wrong calling convention! Must be _cdecl.", plugin.BaseName.c_str()); #endif break; case 2: Env->ThrowError("Avisynth C Plugin '%s' has corrupted the stack.", plugin.BaseName.c_str()); } #else s = AvisynthCPluginInit(pe); #endif * result = AVSValue(s); } PluginInLoad = NULL; } return true; } /* --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- LoadPlugin --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- */ AVSValue LoadPlugin(AVSValue args, void*, IScriptEnvironment* env) { IScriptEnvironment2 *env2 = static_cast(env); bool success = true; const bool utf8 = args[1].AsBool(false); // default: false (ANSI on Windows), n/a on other OS for (int i = 0; i < args[0].ArraySize(); ++i) { AVSValue dummy; auto path_utf8 = charToUtf8(args[0][i].AsString(), utf8); success &= env2->LoadPlugin(path_utf8.c_str(), true, &dummy); // accepts only utf8 paths on all OS } return AVSValue(success); } extern const AVSFunction Plugin_functions[] = { {"LoadPlugin", BUILTIN_FUNC_PREFIX, "s+[utf8]b", LoadPlugin}, {"LoadCPlugin", BUILTIN_FUNC_PREFIX, "s+[utf8]b", LoadPlugin }, // for compatibility with older scripts {"Load_Stdcall_Plugin", BUILTIN_FUNC_PREFIX, "s+[utf8]b", LoadPlugin }, // for compatibility with older scripts { 0 } }; ================================================ FILE: avs_core/core/PluginManager.h ================================================ #ifndef AVSCORE_PLUGINS_H #define AVSCORE_PLUGINS_H #include #include #include #include "internal.h" class InternalEnvironment; struct PluginFile; struct StdStriComparer { bool operator() (const std::string& lhs, const std::string& rhs) const { #if defined(MSVC) return (_strcmpi(lhs.c_str(), rhs.c_str()) < 0); #else return (strcasecmp(lhs.c_str(), rhs.c_str()) < 0); #endif } }; typedef std::vector FunctionList; typedef std::map FunctionMap; class PluginManager { private: InternalEnvironment *Env; PluginFile *PluginInLoad; std::vector AutoloadDirs; std::vector AutoLoadedImports; std::vector AutoLoadedPlugins; std::vector LoadedPlugins; FunctionMap ExternalFunctions; FunctionMap AutoloadedFunctions; bool AutoloadExecuted; bool Autoloading; int TryAsAvs26(PluginFile &plugin, AVSValue *result, std::string& avsexception_message); bool TryAsAvs25(PluginFile &plugin, AVSValue *result); bool TryAsAvsPreV11C(PluginFile& plugin, AVSValue* result); bool TryAsAvsC(PluginFile &plugin, AVSValue *result); const AVSFunction* Lookup(const FunctionMap& map, const char* search_name, const AVSValue* args, size_t num_args, bool strict, size_t args_names_count, const char* const* arg_names) const; public: PluginManager(InternalEnvironment* env); ~PluginManager(); void ClearAutoloadDirs(); void AddAutoloadDir(const std::string &dir_utf8, bool toFront); bool LoadPlugin(PluginFile &plugin, bool throwOnError, AVSValue *result); bool LoadPlugin(const char* path, bool throwOnError, AVSValue *result); bool HasAutoloadExecuted() const { return AutoloadExecuted; } void UpdateFunctionExports(const char* funcName, const char* funcParams, const char *exportVar); std::string ListAutoloadDirs(); bool FunctionExists(const char* name) const; std::string PluginLoading() const; // Returns the basename of the plugin DLL that is currently being loaded, or NULL if no plugin is being loaded void AutoloadPlugins(); void AddFunction(const char* name, const char* params, IScriptEnvironment::ApplyFunc apply, void* user_data, const char *exportVar, bool isCalledFromAvs25Interface, bool isCalledFromPreV11CInterface); const AVSFunction* Lookup(const char* search_name, const AVSValue* args, size_t num_args, bool strict, size_t args_names_count, const char* const* arg_names) const; }; #endif // AVSCORE_PLUGINS_H ================================================ FILE: avs_core/core/Prefetcher.cpp ================================================ #include "Prefetcher.h" #include #include #include #ifdef INTEL_INTRINSICS #include #endif #include #include "ThreadPool.h" #include "ObjectPool.h" #include "LruCache.h" #include "InternalEnvironment.h" #include "internal.h" struct PrefetcherJobParams { int frame; Prefetcher* prefetcher; LruCache::handle cache_handle; }; struct PrefetcherPimpl { PClip child; VideoInfo vi; // The number of threads to use for prefetching const int nThreads; // Maximum number of frames to prefetch const int nPrefetchFrames; ThreadPool* thread_pool; ObjectPool JobParamsPool; std::mutex params_pool_mutex; // Contains the pattern we are locked on to int LockedPattern; // The number of consecutive frames Pattern has repeated itself int PatternHits; // The number of consecutive frames LockedPattern was invalid int PatternMisses; // The current pattern that we are not locked on to int Pattern; // True if we have found a pattern to lock onto bool IsLocked; // The frame number that GetFrame() has been called with the last time int LastRequestedFrame; std::shared_ptr > VideoCache; std::atomic running_workers; std::mutex worker_exception_mutex; std::exception_ptr worker_exception; bool worker_exception_present; InternalEnvironment *EnvI; PrefetcherPimpl(const PClip& _child, int _nThreads, int _nPrefetchFrames, IScriptEnvironment2 *env2) : child(_child), vi(_child->GetVideoInfo()), nThreads(_nThreads), nPrefetchFrames(_nPrefetchFrames), thread_pool(NULL), LockedPattern(1), PatternHits(0), PatternMisses(0), Pattern(1), IsLocked(false), LastRequestedFrame(0), VideoCache(NULL), running_workers(0), worker_exception_present(0), EnvI(static_cast(env2)) { thread_pool = EnvI->NewThreadPool(nThreads); } ~PrefetcherPimpl() { for (void* data : thread_pool->Finish()) { PrefetcherJobParams *ptr = (PrefetcherJobParams*)data; VideoCache->rollback(&ptr->cache_handle); } } }; // The number of intervals a pattern has to repeat itself to become (un)locked #define PATTERN_LOCK_LENGTH 3 AVSValue Prefetcher::ThreadWorker(IScriptEnvironment2* env, void* data) { PrefetcherJobParams *ptr = (PrefetcherJobParams*)data; Prefetcher *prefetcher = ptr->prefetcher; int n = ptr->frame; LruCache::handle cache_handle = ptr->cache_handle; { std::lock_guard lock(prefetcher->_pimpl->params_pool_mutex); prefetcher->_pimpl->JobParamsPool.Destruct(ptr); } try { cache_handle.first->value = prefetcher->_pimpl->child->GetFrame(n, env); #ifdef INTEL_INTRINSICS #ifdef X86_32 _mm_empty(); #endif #endif prefetcher->_pimpl->VideoCache->commit_value(&cache_handle); --(prefetcher->_pimpl->running_workers); } catch(...) { prefetcher->_pimpl->VideoCache->rollback(&cache_handle); std::lock_guard lock(prefetcher->_pimpl->worker_exception_mutex); prefetcher->_pimpl->worker_exception = std::current_exception(); prefetcher->_pimpl->worker_exception_present = true; --(prefetcher->_pimpl->running_workers); } return AVSValue(); } Prefetcher::Prefetcher(const PClip& _child, int _nThreads, int _nPrefetchFrames, IScriptEnvironment *env) : _pimpl(NULL) { _pimpl = new PrefetcherPimpl(_child, _nThreads, _nPrefetchFrames, static_cast(env)); _pimpl->VideoCache = std::make_shared >(_pimpl->nPrefetchFrames*2, CACHE_NO_RESIZE); } void Prefetcher::Destroy() { if (_pimpl) { PrefetcherPimpl *pimpl = _pimpl; delete pimpl; _pimpl = nullptr; } } Prefetcher::~Prefetcher() { Destroy(); } size_t Prefetcher::NumPrefetchThreads() const { return _pimpl->nThreads; } int __stdcall Prefetcher::SchedulePrefetch(int current_n, int prefetch_start, InternalEnvironment* env) { int n = prefetch_start; while ((_pimpl->running_workers < _pimpl->nPrefetchFrames) && (std::abs(n - current_n) < _pimpl->nPrefetchFrames) ) { n += _pimpl->IsLocked ? _pimpl->LockedPattern : 1; if (n >= _pimpl->vi.num_frames) break; PVideoFrame result; LruCache::handle cache_handle; switch(_pimpl->VideoCache->lookup(n, &cache_handle, false, result)) { case LRU_LOOKUP_NOT_FOUND: { PrefetcherJobParams *p = NULL; { std::lock_guard lock(_pimpl->params_pool_mutex); p = _pimpl->JobParamsPool.Construct(); } p->frame = n; p->prefetcher = this; p->cache_handle = cache_handle; ++_pimpl->running_workers; _pimpl->thread_pool->QueueJob(ThreadWorker, p, env, NULL); break; } case LRU_LOOKUP_FOUND_AND_READY: // Fall-through intentional case LRU_LOOKUP_NO_CACHE: // Fall-through intentional case LRU_LOOKUP_FOUND_BUT_NOTAVAIL: { break; } default: { assert(0); break; } } } // switch return n; } PVideoFrame __stdcall Prefetcher::GetFrame(int n, IScriptEnvironment* env_) { InternalEnvironment* IEnv = GetAndRevealCamouflagedEnv(env_); IScriptEnvironment* env = static_cast(IEnv); if (IEnv->GetSuppressThreadCount() > 0) { // do not use thread when invoke running return _pimpl->child->GetFrame(n, env); } int pattern = n - _pimpl->LastRequestedFrame; _pimpl->LastRequestedFrame = n; if (pattern == 0) pattern = 1; if (_pimpl->IsLocked) { if (_pimpl->LockedPattern == pattern) { _pimpl->PatternHits = 0; // Tracks Pattern _pimpl->PatternMisses = 0; // Tracks LockedPattern } else if (_pimpl->Pattern == pattern) { _pimpl->PatternHits++; // Tracks Pattern _pimpl->PatternMisses++; // Tracks LockedPattern } else { _pimpl->PatternHits = 0; // Tracks Pattern _pimpl->PatternMisses++; // Tracks LockedPattern } _pimpl->Pattern = pattern; if ((_pimpl->PatternMisses >= PATTERN_LOCK_LENGTH) && (_pimpl->PatternHits >= PATTERN_LOCK_LENGTH)) { _pimpl->LockedPattern = _pimpl->Pattern; _pimpl->PatternHits = 0; // Tracks Pattern _pimpl->PatternMisses = 0; // Tracks LockedPattern } else if ((_pimpl->PatternMisses >= PATTERN_LOCK_LENGTH) && (_pimpl->PatternHits < PATTERN_LOCK_LENGTH)) { _pimpl->IsLocked = false; } } else { if (_pimpl->Pattern == pattern) { _pimpl->PatternHits++; // Tracks Pattern _pimpl->PatternMisses = 0; // Tracks Pattern } else { _pimpl->PatternHits = 0; // Tracks Pattern _pimpl->PatternMisses++; // Tracks Pattern } if (_pimpl->PatternHits >= PATTERN_LOCK_LENGTH) { _pimpl->LockedPattern = pattern; _pimpl->PatternMisses = 0; // Tracks Pattern _pimpl->IsLocked = true; } } { std::lock_guard lock(_pimpl->worker_exception_mutex); if (_pimpl->worker_exception_present) { std::rethrow_exception(_pimpl->worker_exception); } } // Prefetch 1 int prefetch_pos = SchedulePrefetch(n, n, IEnv); // Get requested frame PVideoFrame result; LruCache::handle cache_handle; // fill result if LRU_LOOKUP_FOUND_AND_READY switch(_pimpl->VideoCache->lookup(n, &cache_handle, true, result)) { case LRU_LOOKUP_NOT_FOUND: { try { result = _pimpl->child->GetFrame(n, env); // P.F. fill result before Commit! cache_handle.first->value = result; // cache_handle.first->value = _pimpl->child->GetFrame(n, env); // P.F. before Commit! #ifdef INTEL_INTRINSICS #ifdef X86_32 _mm_empty(); #endif #endif _pimpl->VideoCache->commit_value(&cache_handle); } catch(...) { _pimpl->VideoCache->rollback(&cache_handle); throw; } break; } case LRU_LOOKUP_FOUND_AND_READY: { //result = cache_handle.first->value; // old method, result is filled already break; } case LRU_LOOKUP_NO_CACHE: { result = _pimpl->child->GetFrame(n, env); break; } case LRU_LOOKUP_FOUND_BUT_NOTAVAIL: // Fall-through intentional default: { assert(0); break; } } // Prefetch 2 SchedulePrefetch(n, prefetch_pos, IEnv); return result; } bool __stdcall Prefetcher::GetParity(int n) { return _pimpl->child->GetParity(n); } void __stdcall Prefetcher::GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env_) { InternalEnvironment* IEnv = GetAndRevealCamouflagedEnv(env_); IScriptEnvironment* env = static_cast(IEnv); _pimpl->child->GetAudio(buf, start, count, env); } int __stdcall Prefetcher::SetCacheHints(int cachehints, int frame_range) { AVS_UNUSED(frame_range); if (CACHE_GET_MTMODE == cachehints) return MT_NICE_FILTER; if (CACHE_GET_DEV_TYPE == cachehints) return (_pimpl->child->GetVersion() >= 5) ? _pimpl->child->SetCacheHints(CACHE_GET_DEV_TYPE, 0) : 0; return 0; } const VideoInfo& __stdcall Prefetcher::GetVideoInfo() { return _pimpl->vi; } AVSValue Prefetcher::Create(AVSValue args, void*, IScriptEnvironment* env) { InternalEnvironment *envi = static_cast(env); PClip child = args[0].AsClip(); int PrefetchThreads = args[1].AsInt((int)envi->GetEnvProperty(AEP_PHYSICAL_CPUS)+1); int PrefetchFrames = args[2].AsInt(PrefetchThreads * 2); if (PrefetchThreads > 0 && PrefetchFrames > 0) { return new Prefetcher(child, PrefetchThreads, PrefetchFrames, env); } else return child; } ================================================ FILE: avs_core/core/Prefetcher.h ================================================ #ifndef _AVS_FILT_PREFETCHER_H #define _AVS_FILT_PREFETCHER_H #include struct PrefetcherPimpl; class InternalEnvironment; class Prefetcher : public IClip { private: PrefetcherPimpl * _pimpl; static AVSValue ThreadWorker(IScriptEnvironment2* env, void* data); int __stdcall SchedulePrefetch(int current_n, int prefetch_start, InternalEnvironment* env); Prefetcher(const PClip& _child, int _nThreads, int _nPrefetchFrames, IScriptEnvironment *env); public: ~Prefetcher(); size_t NumPrefetchThreads() const; virtual PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); virtual bool __stdcall GetParity(int n); virtual void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env); virtual int __stdcall SetCacheHints(int cachehints, int frame_range); virtual const VideoInfo& __stdcall GetVideoInfo(); void Destroy(); static AVSValue Create(AVSValue args, void*, IScriptEnvironment* env); }; #endif // _AVS_FILT_PREFETCHER_H ================================================ FILE: avs_core/core/ScriptEnvironmentTLS.h ================================================ #ifndef _ThreadScriptEnvironment_H #define _ThreadScriptEnvironment_H #include #ifdef AVS_WINDOWS #include #else #include #endif #include #include "vartable.h" #include "internal.h" #include "ThreadPool.h" #include "BufferPool.h" #include "DeviceManager.h" #include "InternalEnvironment.h" #endif // _ThreadScriptEnvironment_H ================================================ FILE: avs_core/core/SimpleLruCache.h ================================================ #ifndef AVS_SIMPLELRUCACHE_H #define AVS_SIMPLELRUCACHE_H #include #include #include #include template class SimpleLruCache { public: struct Entry { K key; V value; Entry(const K& k) : key(k) {} }; typedef V value_type; typedef K key_type; typedef typename std::list::iterator entry_type; typedef std::function EvictEventType; private: size_t MinCapacity; size_t MaxCapacity; size_t RequestedCapacity; size_t RealCapacity; std::list Cache; std::list Pool; void* EventUserData; const EvictEventType EvictEvent; public: SimpleLruCache(size_t capacity, const EvictEventType&& evict, void* evData) : MinCapacity(0), MaxCapacity(std::numeric_limits::max()), RequestedCapacity(capacity), RealCapacity(capacity), EventUserData(evData), EvictEvent(evict) { } size_t size() const { return Cache.size(); } size_t requested_capacity() const { return RequestedCapacity; } size_t capacity() const { return RealCapacity; } void limits(size_t* min, size_t* max) const { *min = MinCapacity; *max = MaxCapacity; } void set_limits(size_t min, size_t max) { MinCapacity = min; MaxCapacity = max; resize(RequestedCapacity); } V* lookup(const K& key, bool *found, bool lookuponly = false) { // Look for an existing cache entry, // and return it when found const entry_type it_end = Cache.end(); for ( entry_type it = Cache.begin(); it != it_end; ++it ) { if (it->key == key) { // Move found element to the front of the list if (it != Cache.begin()) Cache.splice(Cache.begin(), Cache, it); *found = true; return &(Cache.front().value); } } // Nothing found *found = false; if (lookuponly) { return NULL; } // Evict an old element if the cache is full trim(); if (RealCapacity != 0) { // See if we can take one from our pool if (!Pool.empty()) { Cache.splice(Cache.begin(), Pool, Pool.begin()); Cache.front().key = key; } else { Cache.emplace_front(key); } return &(Cache.front().value); } // Return NULL-storage if we cannot store anything return NULL; } void remove(const K& key) { const entry_type it_end = Cache.end(); for ( entry_type it = Cache.begin(); it != it_end; ++it ) { if (it->key == key) { Pool.splice(Pool.begin(), Cache, it); break; } } } void trim() { if (Cache.size() > RealCapacity) { size_t nItemsToDelete = Cache.size() - RealCapacity; auto it = --Cache.end(); for (size_t i = 0; i < nItemsToDelete; ++i) { auto prev_it = it; bool end = (it == Cache.begin()); if (!end) { prev_it = it; --prev_it; } if (EvictEvent != NULL) { if (EvictEvent(this, *it, EventUserData)) { Pool.splice(Pool.begin(), Cache, it); } } else { // TODO: Do we want the consumer to always define EvictItem? Pool.splice(Pool.begin(), Cache, it); } if (!end) it = prev_it; } } } void resize(size_t new_cap) { RequestedCapacity = new_cap; RealCapacity = clamp(RequestedCapacity, MinCapacity, MaxCapacity); trim(); } }; #endif // AVS_SIMPLELRUCACHE_H ================================================ FILE: avs_core/core/ThreadPool.cpp ================================================ #include "ThreadPool.h" #include "internal.h" #include #include struct ThreadPoolGenericItemData { ThreadWorkerFuncPtr Func; void* Params; AVSPromise* Promise; Device* device; }; #include "mpmc_bounded_queue.h" typedef mpmc_bounded_queue MessageQueue; class ThreadPoolPimpl { public: std::vector Threads; MessageQueue MsgQueue; std::mutex Mutex; std::condition_variable FinishCond; size_t NumRunning; ThreadPoolPimpl(size_t nThreads) : Threads(), MsgQueue(nThreads * 6) {} }; void ThreadPool::ThreadFunc(size_t thread_id, ThreadPoolPimpl * const _pimpl, InternalEnvironment* env) { auto EnvTLS = env->NewThreadScriptEnvironment((int)thread_id); PInternalEnvironment holder = PInternalEnvironment(EnvTLS); while (true) { ThreadPoolGenericItemData data; if (_pimpl->MsgQueue.pop_back(&data) == false) { // threadpool is canceled std::unique_lock lock(_pimpl->Mutex); if (--_pimpl->NumRunning == 0) { _pimpl->FinishCond.notify_all(); } return; } EnvTLS->SetCurrentDevice(data.device); EnvTLS->GetSupressCaching() = false; if (data.Promise != NULL) { try { data.Promise->set_value(data.Func(EnvTLS, data.Params)); } catch (const AvisynthError&) { data.Promise->set_exception(std::current_exception()); } catch (const std::exception&) { data.Promise->set_exception(std::current_exception()); } catch (...) { data.Promise->set_exception(std::current_exception()); //data.Promise->set_value(AVSValue("An unknown exception was thrown in the thread pool.")); } } else { try { data.Func(EnvTLS, data.Params); } catch (...) {} } } //while } ThreadPool::ThreadPool(size_t nThreads, size_t nStartId, InternalEnvironment* env) : _pimpl(new ThreadPoolPimpl(nThreads)) { _pimpl->Threads.reserve(nThreads); std::unique_lock lock(_pimpl->Mutex); // i is used as the thread id. Skip id zero because that is reserved for the main thread. // CUDA: thread id is controled by caller for (size_t i = 0; i < nThreads; ++i) _pimpl->Threads.emplace_back(ThreadFunc, i + nStartId, _pimpl, env); _pimpl->NumRunning = nThreads; } void ThreadPool::QueueJob(ThreadWorkerFuncPtr clb, void* params, InternalEnvironment* env, JobCompletion* tc) { ThreadPoolGenericItemData itemData; itemData.Func = clb; itemData.Params = params; itemData.device = env->GetCurrentDevice(); if (tc != NULL) itemData.Promise = tc->Add(); else itemData.Promise = NULL; if (_pimpl->MsgQueue.push_front(std::move(itemData)) == false) { throw AvisynthError("Threadpool is cancelled"); } } size_t ThreadPool::NumThreads() const { return _pimpl->Threads.size(); } std::vector ThreadPool::Finish() { std::unique_lock lock(_pimpl->Mutex); if (_pimpl->NumRunning > 0) { _pimpl->MsgQueue.finish(); while (_pimpl->NumRunning > 0) { _pimpl->FinishCond.wait(lock); } std::vector ret; ThreadPoolGenericItemData item; while (_pimpl->MsgQueue.pop_remain(&item)) { ret.push_back(item.Params); } return ret; } return std::vector(); } void ThreadPool::Join() { if (_pimpl->Threads.size() > 0) { Finish(); for (size_t i = 0; i < _pimpl->Threads.size(); ++i) { if (_pimpl->Threads[i].joinable()) _pimpl->Threads[i].join(); } _pimpl->Threads.clear(); } } ThreadPool::~ThreadPool() { Finish(); Join(); delete _pimpl; } ================================================ FILE: avs_core/core/ThreadPool.h ================================================ #ifndef _AVS_THREADPOOL_H #define _AVS_THREADPOOL_H #include #include #include typedef std::future AVSFuture; typedef std::promise AVSPromise; class InternalEnvironment; class JobCompletion : public IJobCompletion { private: const size_t max_jobs; size_t nJobs; public: typedef std::pair PromFutPair; PromFutPair *pairs; JobCompletion(size_t _max_jobs) : max_jobs(_max_jobs), nJobs(0), pairs(NULL) { pairs = new PromFutPair[max_jobs]; // Initialize for first use nJobs = max_jobs; Reset(); } AVSPromise* Add() { if (nJobs == max_jobs) throw AvisynthError("The completion object is already full."); AVSPromise* ret = &(pairs[nJobs].first); ++nJobs; return ret; } virtual ~JobCompletion() { Wait(); delete [] pairs; } void __stdcall Wait() { for (size_t i = 0; i < nJobs; ++i) pairs[i].second.wait(); } size_t __stdcall Size() const { return nJobs; } size_t __stdcall Capacity() const { return max_jobs; } AVSValue __stdcall Get(size_t i) { return pairs[i].second.get(); } #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wpessimizing-move" #elif defined(__GNUC__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wpessimizing-move" #elif defined(_MSC_VER) // Add MSVC-specific pragma if needed #endif void __stdcall Reset() { for (size_t i = 0; i < nJobs; ++i) { // To be on the safe side, keep std::move to ensure efficient move semantics, // even if copy elision is possible (despite compiler warnings). // AVSValue does not have a move constructor or move assignment operator. // It only has a copy constructor and copy assignment operator. This means that // AVSValue objects will be copied rather than moved, which can be less efficient. pairs[i].first = std::move(AVSPromise()); pairs[i].second = std::move(pairs[i].first.get_future()); } nJobs = 0; } #ifdef __clang__ #pragma clang diagnostic pop #elif defined(__GNUC__) #pragma GCC diagnostic pop #elif defined(_MSC_VER) // Add MSVC-specific pragma if needed #endif void __stdcall Destroy() { delete this; } }; class ThreadPoolPimpl; class ThreadPool { private: ThreadPoolPimpl* const _pimpl; static void ThreadFunc(size_t thread_id, ThreadPoolPimpl* const _pimpl, InternalEnvironment* env); public: ThreadPool(size_t nThreads, size_t nStartId, InternalEnvironment* env); ~ThreadPool(); void QueueJob(ThreadWorkerFuncPtr clb, void* params, InternalEnvironment* env, JobCompletion* tc); size_t NumThreads() const; std::vector Finish(); void Join(); }; #endif // _AVS_THREADPOOL_H ================================================ FILE: avs_core/core/alignplanar.cpp ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. // Alignplanar // Copyright (c) Klaus Post 2001 - 2005 /****************************** ******* AlignPlanar ****** *****************************/ #include "avisynth.h" #include "alignplanar.h" AlignPlanar::AlignPlanar(PClip _clip) : GenericVideoFilter(_clip) {} PVideoFrame __stdcall AlignPlanar::GetFrame(int n, IScriptEnvironment* env) { int plane = (env->PlanarChromaAlignment(IScriptEnvironment::PlanarChromaAlignmentTest)) ? PLANAR_U_ALIGNED : PLANAR_Y_ALIGNED; PVideoFrame src = child->GetFrame(n, env); if (!(src->GetRowSize(plane)&(FRAME_ALIGN-1))) return src; PVideoFrame dst = env->NewVideoFrameP(vi, &src); if ((dst->GetRowSize(PLANAR_Y_ALIGNED)&(FRAME_ALIGN-1))) env->ThrowError("AlignPlanar: [internal error] Returned frame was not aligned!"); env->BitBlt(dst->GetWritePtr(), dst->GetPitch(), src->GetReadPtr(), src->GetPitch(), src->GetRowSize(), src->GetHeight()); env->BitBlt(dst->GetWritePtr(PLANAR_V), dst->GetPitch(PLANAR_V), src->GetReadPtr(PLANAR_V), src->GetPitch(PLANAR_V), src->GetRowSize(PLANAR_V), src->GetHeight(PLANAR_V)); env->BitBlt(dst->GetWritePtr(PLANAR_U), dst->GetPitch(PLANAR_U), src->GetReadPtr(PLANAR_U), src->GetPitch(PLANAR_U), src->GetRowSize(PLANAR_U), src->GetHeight(PLANAR_U)); return dst; } PClip AlignPlanar::Create(PClip clip) { if (!clip->GetVideoInfo().IsPlanar()) { // If not planar, already ok. return clip; } else return new AlignPlanar(clip); } ================================================ FILE: avs_core/core/alignplanar.h ================================================ // Avisynth v2.5. Copyright 2009 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __Align_Planar_H__ #define __Align_Planar_H__ class AlignPlanar : public GenericVideoFilter { public: AlignPlanar(PClip _clip); static PClip Create(PClip clip); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); }; #endif //__Align_Planar_H__ ================================================ FILE: avs_core/core/arch.h.in ================================================ #ifndef _AVS_ARCH_H_ #define _AVS_ARCH_H_ #define AVS_ARCH @AVS_ARCH@ // e.g. i386 #endif // _AVS_ARCH_H_ ================================================ FILE: avs_core/core/audio.cpp ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include #ifdef AVS_WINDOWS #include #else #include #endif #include #include "internal.h" #include "audio.h" #include "../convert/convert_audio.h" #include #include #include #include #define BIGBUFFSIZE (2048*1024) // Use a 2Mb buffer for EnsureVBRMP3Sync seeking & Normalize scanning #ifndef INT16_MAX #define INT16_MAX 32767 #endif #ifndef INT16_MIN #define INT16_MIN (-32768) #endif #ifndef INT32_MAX #define INT32_MAX 2147483647 #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647 - 1) #endif #ifndef INT64_MAX #define INT64_MAX 9223372036854775807LL #endif #ifndef INT64_MIN #define INT64_MIN (-9223372036854775807LL - 1) #endif static int64_t signed_saturated_add64(int64_t x, int64_t y) { // determine the lower or upper bound of the result int64_t ret = (x < 0) ? INT64_MIN : INT64_MAX; // this is always well defined: // if x < 0 this adds a positive value to INT64_MIN // if x > 0 this subtracts a positive value from INT64_MAX int64_t comp = ret - x; // the condition is equivalent to this longer one. #ifdef MSVC_PURE // Due to a compiler bug (bad code gen) in VS2022 MSVC 17.12.3 and before, // the short version of the condition cannot be used safely. // Issue is reported: https://developercommunity.visualstudio.com/t/Bad-code-gen-with-inlined-functions-with/10813706 // Workaround is presented here, until the fix. // They seem to have it fixed in 17.13.1. Anyway, we keep this code path separated. if ((x < 0 && y > comp) || (x >= 0 && y <= comp)) #else if ((x < 0) == (y > comp)) // short, quicker one #endif ret = x + y; return ret; } // ----------- Channels // ffmpeg extras are not handled, only the first 18 bits // which is defined in WAVEFORMATEXTENSIBLE and Avisynth.h AvsChannelMask struct channel_name_t { const char* name; const char* description; }; static const struct channel_name_t channel_names[] = { { "FL", "front left" }, { "FR", "front right" }, { "FC", "front center" }, { "LFE", "low frequency" }, { "BL", "back left" }, { "BR", "back right" }, { "FLC", "front left-of-center" }, { "FRC", "front right-of-center" }, { "BC", "back center" }, { "SL", "side left" }, { "SR", "side right" }, { "TC", "top center" }, { "TFL", "top front left" }, { "TFC", "top front center" }, { "TFR", "top front right" }, { "TBL", "top back left" }, { "TBC", "top back center" }, { "TBR", "top back right" } }; constexpr auto channel_names_size = sizeof(channel_names) / sizeof(channel_name_t); struct channel_layout_name { const char* name; ChannelLayoutDescriptor_t layout; }; static const struct channel_layout_name channel_layout_map[] = { { "mono", AVS_CHANNEL_LAYOUT_MASK_MONO }, { "stereo", AVS_CHANNEL_LAYOUT_MASK_STEREO }, { "2.1", AVS_CHANNEL_LAYOUT_MASK_2POINT1 }, { "3.0", AVS_CHANNEL_LAYOUT_MASK_SURROUND }, { "3.0(back)", AVS_CHANNEL_LAYOUT_MASK_2_1 }, { "4.0", AVS_CHANNEL_LAYOUT_MASK_4POINT0 }, { "quad", AVS_CHANNEL_LAYOUT_MASK_QUAD }, { "quad(side)", AVS_CHANNEL_LAYOUT_MASK_2_2 }, { "3.1", AVS_CHANNEL_LAYOUT_MASK_3POINT1 }, { "5.0", AVS_CHANNEL_LAYOUT_MASK_5POINT0_BACK }, { "5.0(side)", AVS_CHANNEL_LAYOUT_MASK_5POINT0 }, { "4.1", AVS_CHANNEL_LAYOUT_MASK_4POINT1 }, { "5.1", AVS_CHANNEL_LAYOUT_MASK_5POINT1_BACK }, { "5.1(side)", AVS_CHANNEL_LAYOUT_MASK_5POINT1 }, { "6.0", AVS_CHANNEL_LAYOUT_MASK_6POINT0 }, { "6.0(front)", AVS_CHANNEL_LAYOUT_MASK_6POINT0_FRONT }, { "hexagonal", AVS_CHANNEL_LAYOUT_MASK_HEXAGONAL }, { "6.1", AVS_CHANNEL_LAYOUT_MASK_6POINT1 }, { "6.1(back)", AVS_CHANNEL_LAYOUT_MASK_6POINT1_BACK }, { "6.1(front)", AVS_CHANNEL_LAYOUT_MASK_6POINT1_FRONT }, { "7.0", AVS_CHANNEL_LAYOUT_MASK_7POINT0 }, { "7.0(front)", AVS_CHANNEL_LAYOUT_MASK_7POINT0_FRONT }, { "7.1", AVS_CHANNEL_LAYOUT_MASK_7POINT1 }, { "7.1(wide)", AVS_CHANNEL_LAYOUT_MASK_7POINT1_WIDE_BACK }, { "7.1(wide-side)", AVS_CHANNEL_LAYOUT_MASK_7POINT1_WIDE }, { "7.1(top)", AVS_CHANNEL_LAYOUT_MASK_7POINT1_TOP_BACK }, { "octagonal", AVS_CHANNEL_LAYOUT_MASK_OCTAGONAL }, { "cube", AVS_CHANNEL_LAYOUT_MASK_CUBE }, //{ "hexadecagonal", AV_CHANNEL_LAYOUT_HEXADECAGONAL } //{ "downmix", AV_CHANNEL_LAYOUT_STEREO_DOWNMIX, }, //{ "22.2", AV_CHANNEL_LAYOUT_22POINT2, }, }; constexpr auto channel_layout_map_size = sizeof(channel_layout_map) / sizeof(channel_layout_name); static unsigned int av_get_default_channel_layout(int nb_channels) { for (int i = 0; i < channel_layout_map_size; i++) if (nb_channels == channel_layout_map[i].layout.nb_channels) return channel_layout_map[i].layout.mask; return 0; } // similar to old ffmpeg method static unsigned int get_channel_layout_single(const char* name, size_t name_len) { // combined layout name for (int i = 0; i < channel_layout_map_size; i++) { if (strlen(channel_layout_map[i].name) == name_len && !memcmp(channel_layout_map[i].name, name, name_len)) return channel_layout_map[i].layout.mask; } // individual channel name for (int i = 0; i < channel_names_size; i++) if (channel_names[i].name && strlen(channel_names[i].name) == name_len && !memcmp(channel_names[i].name, name, name_len)) return (unsigned int)1 << i; //get default by number of channels, syntax: number ending with 'c' char* end; errno = 0; long i = std::strtol(name, &end, 10); if (!errno && (end + 1 - name == name_len && *end == 'c')) return av_get_default_channel_layout(i); // return the directly given mask errno = 0; long long layout = std::strtoll(name, &end, 0); if (!errno && end - name == name_len) { if (layout > std::numeric_limits::max()) return 0; return (unsigned int)std::max(layout, 0LL); } return 0; } // returns layout mask from the layout name or channel name // or from their combinations unsigned int av_get_channel_layout(const char* name) { const char* n, * e; const char* name_end = name + strlen(name); unsigned int layout = 0, layout_single; if(!_stricmp(name, "speaker_all")) return AvsChannelMask::MASK_SPEAKER_ALL; for (n = name; n < name_end; n = e + 1) { for (e = n; e < name_end && *e != '+' && *e != '|'; e++); layout_single = get_channel_layout_single(n, e - n); if (!layout_single) return 0; layout |= layout_single; } return layout; } unsigned int GetDefaultChannelLayout(int nChannels) { if (nChannels < 1 || nChannels > 8) return 0; return av_get_default_channel_layout(nChannels); /* old one: // Called from VfW export as well // 3.7.3 changes some defaults to match ffmpeg // 3 channels: Surround to 2.1 // 4 channels: Quad to 4.0 // 6 channels: 6.1(back) to 6.1 const int SpeakerMasks[9] = { 0, // chnls name layout ffmpeg 0x00004, // 1 mono -- -- FC AV_CH_LAYOUT_MONO (AV_CH_FRONT_CENTER) 0x00003, // 2 stereo FL FR AV_CH_LAYOUT_STEREO (AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT) 0x0000B, // 3 2.1 FL FR LFE AV_CH_LAYOUT_2POINT1 (AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY) // 0x00007, // 3 3.0 FL FR FC AV_CH_LAYOUT_SURROUND (AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER) 0x00107, // 4 4.0 FL FR FC -- -- -- -- -- BC AV_CH_LAYOUT_4POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_CENTER) // 0x00033, // 4 quad FL FR -- -- BL BR AV_CH_LAYOUT_QUAD (AV_CH_LAYOUT_STEREO|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) 0x00037, // 5 5.0 FL FR FC -- BL BR AV_CH_LAYOUT_5POINT0_BACK (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) 0x0003F, // 6 5.1 FL FR FC LFE BL BR AV_CH_LAYOUT_5POINT1_BACK (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_LOW_FREQUENCY) 0x0070F, // 7 6.1 FL FR FC LFE -- -- -- -- BC SL SR AV_CH_LAYOUT_6POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_CENTER) // 0x0013F, // 7 6.1(back) FL FR FC LFE BL BR -- -- BC AV_CH_LAYOUT_6POINT1_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_BACK_CENTER) 0x0063F, // 8 7.1 FL FR FC LFE BL BR -- -- -- SL SR AV_CH_LAYOUT_7POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) }; return SpeakerMasks[nChannels]; */ } // popcount static int channelcount_from_mask(unsigned int mask) { unsigned long long y; y = mask * 0x0002000400080010ULL; y = y & 0x1111111111111111ULL; y = y * 0x1111111111111111ULL; y = y >> 60; return (int)y; } // gets the 'idx'th bit=1 from layout_mask and returns its bit index // or -1 if not found // index can be used to channel_names enum AVSChannel av_channel_layout_channel_from_index(const unsigned int channel_layout_mask, unsigned int idx) { const int nb_channels = channelcount_from_mask(channel_layout_mask); if ((int)idx >= nb_channels) return AVSChannel::AVS_CHAN_IDX_NONE; for (int i = 0; i < 32; i++) { // unsigned int 32 bits if ((1ULL << i) & channel_layout_mask && !idx--) return (enum AVSChannel)i; } return AVSChannel::AVS_CHAN_IDX_NONE; } std::string channel_layout_to_str(const unsigned int channel_layout_mask) { // special if (channel_layout_mask == AvsChannelMask::MASK_SPEAKER_ALL) return "speaker_all"; // find direct match for (int i = 0; i < channel_layout_map_size; i++) { if (channel_layout_mask == channel_layout_map[i].layout.mask) { return channel_layout_map[i].name; } } // return channel combo: // e.g. "2 channels (FC+LFE)" const int nb_channels = channelcount_from_mask(channel_layout_mask); std::string bp; if (nb_channels) bp = std::to_string(nb_channels) + " channels ("; for (int i = 0; i < nb_channels; i++) { enum AVSChannel ch = av_channel_layout_channel_from_index(channel_layout_mask, i); if (i) bp += "+"; if (ch == AVSChannel::AVS_CHAN_IDX_NONE) bp += "NONE"; else if ((unsigned int)ch < channel_names_size) bp += channel_names[(unsigned int)ch].name; } if (nb_channels) { bp += ")"; return bp; } bp = "(Error. Mask=" + std::to_string(channel_layout_mask) + ")"; return bp; } /******************************************************************** ***** Declare index of new filters for Avisynth's filter engine ***** ********************************************************************/ extern const AVSFunction Audio_filters[] = { { "DelayAudio", BUILTIN_FUNC_PREFIX, "cf", DelayAudio::Create }, { "AmplifydB", BUILTIN_FUNC_PREFIX, "cf+", Amplify::Create_dB }, { "Amplify", BUILTIN_FUNC_PREFIX, "cf+", Amplify::Create }, { "AssumeSampleRate", BUILTIN_FUNC_PREFIX, "ci", AssumeRate::Create }, { "Normalize", BUILTIN_FUNC_PREFIX, "c[volume]f[show]b", Normalize::Create }, { "MixAudio", BUILTIN_FUNC_PREFIX, "cc[clip1_factor]f[clip2_factor]f", MixAudio::Create }, { "ResampleAudio", BUILTIN_FUNC_PREFIX, "ci[]i", ResampleAudio::Create }, { "ConvertToMono", BUILTIN_FUNC_PREFIX, "c", ConvertToMono::Create }, { "EnsureVBRMP3Sync", BUILTIN_FUNC_PREFIX, "c", EnsureVBRMP3Sync::Create }, { "MergeChannels", BUILTIN_FUNC_PREFIX, "c+", MergeChannels::Create }, { "MonoToStereo", BUILTIN_FUNC_PREFIX, "cc", MergeChannels::Create }, { "GetLeftChannel", BUILTIN_FUNC_PREFIX, "c", GetChannel::Create_left }, { "GetRightChannel", BUILTIN_FUNC_PREFIX, "c", GetChannel::Create_right }, { "GetChannel", BUILTIN_FUNC_PREFIX, "ci+", GetChannel::Create_n }, { "GetChannels", BUILTIN_FUNC_PREFIX, "ci+", GetChannel::Create_n }, // Alias to ease use! { "KillVideo", BUILTIN_FUNC_PREFIX, "c", KillVideo::Create }, { "KillAudio", BUILTIN_FUNC_PREFIX, "c", KillAudio::Create }, { "ConvertAudioTo16bit", BUILTIN_FUNC_PREFIX, "c", ConvertAudio::Create_16bit }, // in convertaudio.cpp { "ConvertAudioTo8bit", BUILTIN_FUNC_PREFIX, "c", ConvertAudio::Create_8bit }, { "ConvertAudioTo24bit", BUILTIN_FUNC_PREFIX, "c", ConvertAudio::Create_24bit }, { "ConvertAudioTo32bit", BUILTIN_FUNC_PREFIX, "c", ConvertAudio::Create_32bit }, { "ConvertAudioToFloat", BUILTIN_FUNC_PREFIX, "c", ConvertAudio::Create_float }, { "ConvertAudio", BUILTIN_FUNC_PREFIX, "cii", ConvertAudio::Create_Any }, // For plugins to Invoke() { "SetChannelMask", BUILTIN_FUNC_PREFIX, "cbi", SetChannelMask::Create }, { "SetChannelMask", BUILTIN_FUNC_PREFIX, "cs", SetChannelMask::Create }, { 0 } }; // Note - floats should not be clipped - they will be clipped, when they are converted back to ints. // Vdub can handle 8/16 bit, and reads 32bit, but cannot play/convert it. Floats doesn't make sense // in AVI. So for now convert back to 16 bit always. // Always! FIXME: Most int64's are often cropped to ints - count is ok to be int, but not start // For plugins to env->Invoke() AVSValue __cdecl ConvertAudio::Create_Any(AVSValue args, void*, IScriptEnvironment*) { return Create(args[0].AsClip(), args[1].AsInt(), args[2].AsInt()); } // For explicit conversions AVSValue __cdecl ConvertAudio::Create_16bit(AVSValue args, void*, IScriptEnvironment*) { return Create(args[0].AsClip(), SAMPLE_INT16, SAMPLE_INT16); } AVSValue __cdecl ConvertAudio::Create_8bit(AVSValue args, void*, IScriptEnvironment*) { return Create(args[0].AsClip(), SAMPLE_INT8, SAMPLE_INT8); } AVSValue __cdecl ConvertAudio::Create_32bit(AVSValue args, void*, IScriptEnvironment*) { return Create(args[0].AsClip(), SAMPLE_INT32, SAMPLE_INT32); } AVSValue __cdecl ConvertAudio::Create_float(AVSValue args, void*, IScriptEnvironment*) { return Create(args[0].AsClip(), SAMPLE_FLOAT, SAMPLE_FLOAT); } AVSValue __cdecl ConvertAudio::Create_24bit(AVSValue args, void*, IScriptEnvironment*) { return Create(args[0].AsClip(), SAMPLE_INT24, SAMPLE_INT24); } #if defined(X86_32) && defined(MSVC) && !defined(__clang__) void FilterUD_mmx(short *Xp, unsigned Ph, int _inc, int _dhb, short *p_Imp, unsigned End); #endif /************************************* ******* Assume SampleRate ******** *************************************/ AssumeRate::AssumeRate(PClip _clip, int _rate) : NonCachedGenericVideoFilter(_clip) { if (_rate < 0) _rate = 0; if (vi.SamplesPerSecond() == 0) // Don't add audio if none is present. _rate = 0; vi.audio_samples_per_second = _rate; } AVSValue __cdecl AssumeRate::Create(AVSValue args, void*, IScriptEnvironment*) { return new AssumeRate(args[0].AsClip(), args[1].AsInt()); } /****************************************** ******* Convert Audio -> Mono ****** ******* Supports int16 & float ****** *****************************************/ ConvertToMono::ConvertToMono(PClip _clip) : GenericVideoFilter(ConvertAudio::Create(_clip, SAMPLE_INT16 | SAMPLE_FLOAT, SAMPLE_FLOAT)), tempbuffer(NULL) { channels = vi.AudioChannels(); vi.nchannels = 1; vi.SetChannelMask(true, AvsChannelMask::MASK_SPEAKER_FRONT_CENTER); tempbuffer_size = 0; } void __stdcall ConvertToMono::GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) { if (tempbuffer_size) { if (tempbuffer_size < count) { delete[] tempbuffer; tempbuffer = new char[(unsigned)(count * channels * vi.BytesPerChannelSample())]; tempbuffer_size = (int)count; } } else { tempbuffer = new char[(unsigned)(count * channels * vi.BytesPerChannelSample())]; tempbuffer_size = (int)count; } child->GetAudio(tempbuffer, start, count, env); if (vi.IsSampleType(SAMPLE_INT16)) { signed short* samples = (signed short*)buf; signed short* tempsamples = (signed short*)tempbuffer; const int rchannels = 65536 / channels; for (int i = 0; i < (int)count; i++) { // Defeat slow default "(int64_t)i < count" int tsample = 0; for (int j = 0 ; j < channels; j++) tsample += *tempsamples++; // Accumulate samples samples[i] = (signed short)((tsample * rchannels + 32768) >> 16); // tsample * (1/channels) + 0.5 } } else if (vi.IsSampleType(SAMPLE_FLOAT)) { SFLOAT* samples = (SFLOAT*)buf; SFLOAT* tempsamples = (SFLOAT*)tempbuffer; const SFLOAT f_rchannels = SFLOAT(1.0 / channels); for (int i = 0; i < (int)count; i++) { // Defeat slow default "(int64_t)i < count" SFLOAT tsample = 0.0f; for (int j = 0 ; j < channels; j++) tsample += *tempsamples++; // Accumulate samples samples[i] = (tsample * f_rchannels); } } } int __stdcall ConvertToMono::SetCacheHints(int cachehints, int frame_range) { AVS_UNUSED(frame_range); switch (cachehints) { case CACHE_GET_MTMODE: return MT_SERIALIZED; default: break; } return 0; } PClip ConvertToMono::Create(PClip clip) { if (!clip->GetVideoInfo().HasAudio()) return clip; if (clip->GetVideoInfo().AudioChannels() == 1) return clip; else return new ConvertToMono(clip); } AVSValue __cdecl ConvertToMono::Create(AVSValue args, void*, IScriptEnvironment*) { return Create(args[0].AsClip()); } /****************************************** ******* Ensure VBR mp3 sync, ****** ******* by always reading audio ****** ******* sequencial. ****** *****************************************/ // EnsureVBRMP3Sync adds a 1MB audio cache and causes a high penalty for any out of order // accesses outside the audio cache: a seek to zero plus a linear read up to the new position. EnsureVBRMP3Sync::EnsureVBRMP3Sync(PClip _clip) : GenericVideoFilter(_clip) { last_end = 0; } void __stdcall EnsureVBRMP3Sync::GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) { if (start != last_end) { // Reread! int64_t bcount = count; int64_t offset = 0; char* samples = (char*)buf; bool bigbuff=false; if (start > last_end) offset = last_end; // Skip forward only if the skipped to position is in front of last position. if ((count < start-offset) && (vi.BytesFromAudioSamples(count) < BIGBUFFSIZE)) { samples = new(std::nothrow) char[BIGBUFFSIZE]; if (samples) { bigbuff=true; bcount = vi.AudioSamplesFromBytes(BIGBUFFSIZE); } else { samples = (char*)buf; // malloc failed just reuse clients buffer } } while (offset + bcount < start) { // Read whole blocks of 'bcount' samples child->GetAudio(samples, offset, bcount, env); offset += bcount; } // Read until 'start' child->GetAudio(samples, offset, start - offset, env); // Now we're at 'start' offset += start - offset; if (bigbuff) delete[] samples; if (offset != start) env->ThrowError("EnsureVBRMP3Sync [Internal error]: Offset should be %i, but is %i", start, offset); } child->GetAudio(buf, start, count, env); last_end = start + count; } int __stdcall EnsureVBRMP3Sync::SetCacheHints(int cachehints, int frame_range) { AVS_UNUSED(frame_range); // Enable CACHE_AUDIO on parent cache and juice it up to 1Mb switch (cachehints) { case CACHE_GET_MTMODE: return MT_SERIALIZED; case CACHE_GETCHILD_AUDIO_MODE: // Parent Cache asking Child for desired audio cache mode return CACHE_AUDIO; case CACHE_GETCHILD_AUDIO_SIZE: // Parent Cache asking Child for desired audio cache size return 1024*1024; default: break; } return 0; } AVSValue __cdecl EnsureVBRMP3Sync::Create(AVSValue args, void*, IScriptEnvironment*) { return new EnsureVBRMP3Sync(args[0].AsClip()); } /******************************************* ******* Mux 'N' sources, so the **** ******* total channels is the sum of **** ******* the channels in the 'N' clip **** *******************************************/ MergeChannels::MergeChannels(PClip _clip, int _num_children, PClip* _child_array, IScriptEnvironment* env) : GenericVideoFilter(_clip), tempbuffer(NULL), child_array(_child_array), num_children(_num_children) { clip_channels = new int[num_children]; clip_offset = new signed char * [num_children]; clip_channels[0] = vi.AudioChannels(); for (int i = 1;i < num_children;i++) { PClip tclip = child_array[i]; child_array[i] = ConvertAudio::Create(tclip, vi.SampleType(), vi.SampleType()); // Clip 2 should now be same type as clip 1. const VideoInfo& vi2 = child_array[i]->GetVideoInfo(); if (vi.audio_samples_per_second != vi2.audio_samples_per_second) { env->ThrowError("MergeChannels: Clips must have same sample rate! Use ResampleAudio()!"); // Could be removed for fun :) } if (vi.SampleType() != vi2.SampleType()) env->ThrowError("MergeChannels: Clips must have same sample type! Use ConvertAudio()!"); // Should never happend! clip_channels[i] = vi2.AudioChannels(); vi.nchannels += vi2.AudioChannels(); } if (vi.AudioChannels() <= 8) vi.SetChannelMask(true, GetDefaultChannelLayout(vi.AudioChannels())); else vi.SetChannelMask(false, 0); // over 8: no guess tempbuffer_size = 0; } MergeChannels::~MergeChannels() { if (tempbuffer_size) { delete[] tempbuffer; tempbuffer_size=0; } delete[] clip_channels; delete[] clip_offset; delete[] child_array; } void __stdcall MergeChannels::GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) { if (tempbuffer_size < count) { if (tempbuffer_size) delete[] tempbuffer; tempbuffer = new signed char[(unsigned)(count * vi.BytesPerAudioSample())]; tempbuffer_size = (int)count; } // Get audio: const int channel_offset = (int)count * vi.BytesPerChannelSample(); // Offset per channel int i, c_channel = 0; for (i = 0;i < num_children;i++) { child_array[i]->GetAudio(tempbuffer + (c_channel*channel_offset), start, count, env); clip_offset[i] = tempbuffer + (c_channel * channel_offset); c_channel += clip_channels[i]; } // Interleave channels char* samples = (char*) buf; const int bpcs = vi.BytesPerChannelSample(); const int bps = vi.BytesPerAudioSample(); int dst_offset = 0; for (i = 0;i < num_children;i++) { signed char* src_buf = clip_offset[i]; const int bpcc = bpcs*clip_channels[i]; switch (bpcc) { case 2: { // mono 16 bit for (int l = 0, k=dst_offset; l < count; l++, k+=bps) { *(short*)(samples+k) = ((short*)src_buf)[l]; } break; } case 4: { // mono float/32 bit, stereo 16 bit for (int l = 0, k=dst_offset; l < count; l++, k+=bps) { *(int*)(samples+k) = ((int*)src_buf)[l]; } break; } case 8: { // stereo float/32 bit #ifdef INTEL_INTRINSICS #if defined(X86_32) && defined(MSVC) if (env->GetCPUFlags() & CPUF_MMX) { __asm { mov eax,[src_buf] mov edi,[samples] mov ecx,dword ptr[count] add edi,[dst_offset] test ecx,ecx mov edx,[bps] ; bytes per strip jz done shr ecx,1 ; CF=count&1, count>>=1 jnc label ; count was even movq mm1,[eax] ; do 1 odd quad add eax,8 movq [edi],mm1 add edi,edx test ecx,ecx jz done align 16 label: movq mm0,[eax] ; do pairs of quads movq mm1,[eax+8] add eax,16 movq [edi],mm0 movq [edi+edx],mm1 lea edi,[edi+edx*2] loop label done: emms } } else #endif // X86_32 #endif { for (int l = 0, k=dst_offset; l < count; l++, k+=bps) { *(int64_t*)(samples+k) = ((int64_t*)src_buf)[l]; } } break; } default: { // everything else, 1 byte at a time for (int l = 0; l < count; l++) { for (int k = 0; k < bpcc; k++) { samples[dst_offset + (l*bps) + k] = src_buf[(l*bpcc) + k]; } } } } dst_offset += bpcc; } } int __stdcall MergeChannels::SetCacheHints(int cachehints, int frame_range) { AVS_UNUSED(frame_range); switch (cachehints) { case CACHE_GET_MTMODE: return MT_SERIALIZED; default: break; } return 0; } AVSValue __cdecl MergeChannels::Create(AVSValue args, void*, IScriptEnvironment* env) { int num_args; PClip* child_array; if (args[0].IsArray()) { num_args = args[0].ArraySize(); if (num_args == 1) return args[0][0]; child_array = new PClip[num_args]; for (int i = 0; i < num_args; ++i) child_array[i] = args[0][i].AsClip(); return new MergeChannels(args[0][0].AsClip(), num_args, child_array, env); } // MonoToStereo Case num_args = 2; child_array = new PClip[num_args]; child_array[0] = GetChannel::Create_left(args[0].AsClip()); child_array[1] = GetChannel::Create_right(args[1].AsClip()); return new MergeChannels(child_array[0], num_args, child_array, env); } /*************************************************** ******* Get left or right ******* ******* channel from a stereo source ******* ***************************************************/ GetChannel::GetChannel(PClip _clip, int* _channel, int _numchannels) : GenericVideoFilter(_clip), tempbuffer(NULL), channel(_channel), numchannels(_numchannels) { cbps = vi.BytesPerChannelSample(); src_bps = vi.BytesPerAudioSample(); vi.nchannels = numchannels; tempbuffer_size = 0; dst_bps = vi.BytesPerAudioSample(); if (vi.AudioChannels() <= 8) vi.SetChannelMask(true, GetDefaultChannelLayout(vi.AudioChannels())); else vi.SetChannelMask(false, 0); // over 8: no guess } void __stdcall GetChannel::GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) { if (tempbuffer_size < count) { if (tempbuffer_size) delete[] tempbuffer; tempbuffer = new char[(unsigned)(count * src_bps)]; tempbuffer_size = (int)count; } child->GetAudio(tempbuffer, start, count, env); switch (cbps) { case 1: { // 8 bit char* samples = (char*)buf; char* tbuff = tempbuffer; for (int i = 0; i < count; i++) { for (int k = 0; k < numchannels; k++) { *(samples++) = tbuff[channel[k]]; } tbuff += src_bps; } break; } case 2: { // 16 bit short* samples = (short*)buf; short* tbuff = (short*)tempbuffer; for (int i = 0; i < count; i++) { for (int k = 0; k < numchannels; k++) { *(samples++) = tbuff[channel[k]]; } tbuff += src_bps>>1; } break; } case 4: { // float/32 bit int* samples = (int*)buf; int* tbuff = (int*)tempbuffer; for (int i = 0; i < count; i++) { for (int k = 0; k < numchannels; k++) { *(samples++) = tbuff[channel[k]]; } tbuff += src_bps>>2; } break; } default: { // 24 bit, etc char* samples = (char*)buf; char* tbuff = tempbuffer; for (int i = 0; i < count; i++) { for (int k = 0; k < numchannels; k++) { int src_o = channel[k] * cbps; for (int j = src_o; j < src_o+cbps; j++) *(samples++) = tbuff[j]; } tbuff += src_bps; } break; } } } int __stdcall GetChannel::SetCacheHints(int cachehints, int frame_range) { AVS_UNUSED(frame_range); switch (cachehints) { case CACHE_GET_MTMODE: return MT_SERIALIZED; default: break; } return 0; } PClip GetChannel::Create_left(PClip clip) { if (clip->GetVideoInfo().AudioChannels() != 1) { int* ch = new int[1]; ch[0] = 0; clip = new GetChannel(clip, ch, 1); } // do not preserve 'left'ness return new SetChannelMask(clip, true, AvsChannelMask::MASK_SPEAKER_FRONT_CENTER); } PClip GetChannel::Create_right(PClip clip) { if (clip->GetVideoInfo().AudioChannels() != 1) { int* ch = new int[1]; ch[0] = 1; clip = new GetChannel(clip, ch, 1); } // do not preserve 'right'ness return new SetChannelMask(clip, true, AvsChannelMask::MASK_SPEAKER_FRONT_CENTER); } PClip GetChannel::Create_n(PClip clip, int* n, int numchannels) { return new GetChannel(clip, n, numchannels); } AVSValue __cdecl GetChannel::Create_left(AVSValue args, void*, IScriptEnvironment*) { return Create_left(args[0].AsClip()); } AVSValue __cdecl GetChannel::Create_right(AVSValue args, void*, IScriptEnvironment*) { return Create_right(args[0].AsClip()); } AVSValue __cdecl GetChannel::Create_n(AVSValue args, void*, IScriptEnvironment* env) { AVSValue args_c = args[1]; const int num_args = args_c.ArraySize(); int* child_array = new int[num_args]; for (int i = 0; i < num_args; ++i) { child_array[i] = args_c[i].AsInt() - 1; // Beware: Channel is 0-based in code and 1 based in scripts if (child_array[i] >= args[0].AsClip()->GetVideoInfo().AudioChannels()) env->ThrowError("GetChannel: Attempted to request a channel that didn't exist!"); if (child_array[i] < 0) env->ThrowError("GetChannel: There are no channels below 1! (first channel is 1)"); } return Create_n(args[0].AsClip(), child_array, num_args); } /****************************** ******* Kill Video ******** ******************************/ KillVideo::KillVideo(PClip _clip) : GenericVideoFilter(_clip) { vi.width = 0; vi.height= 0; vi.fps_numerator = 0; vi.fps_denominator= 0; vi.num_frames = 0; vi.pixel_type = 0; vi.image_type = 0; } AVSValue __cdecl KillVideo::Create(AVSValue args, void*, IScriptEnvironment*) { return new KillVideo(args[0].AsClip()); } /****************************** ******* Kill Audio ******** ******************************/ KillAudio::KillAudio(PClip _clip) : NonCachedGenericVideoFilter(_clip) { vi.audio_samples_per_second = 0; vi.sample_type = 0; vi.num_audio_samples = 0; vi.nchannels = 0; vi.SetChannelMask(false, 0); } AVSValue __cdecl KillAudio::Create(AVSValue args, void*, IScriptEnvironment*) { return new KillAudio(args[0].AsClip()); } /****************************** ****** Set Channel Mask ****** ******************************/ SetChannelMask::SetChannelMask(PClip _clip, bool IsChannelMaskKnown, unsigned int dwChannelMask) : NonCachedGenericVideoFilter(_clip) { vi.SetChannelMask(IsChannelMaskKnown, dwChannelMask); } AVSValue __cdecl SetChannelMask::Create(AVSValue args, void*, IScriptEnvironment* env) { if (args[1].IsString()) { const char* channelName = args[1].AsString(""); if (*channelName) { unsigned int channelMask = av_get_channel_layout(channelName); if (channelMask == 0) env->ThrowError("SetChannelMask: could not find channel descriptor/combo '%s'\n", channelName); return new SetChannelMask(args[0].AsClip(), true, channelMask); } // fallthrough, "" given -> unknown } else { const bool known = args[1].AsBool(false); if (known) return new SetChannelMask(args[0].AsClip(), true, args[2].AsInt(0)); } return new SetChannelMask(args[0].AsClip(), false, 0); } /****************************** ******* Delay Audio ****** *****************************/ DelayAudio::DelayAudio(double delay, PClip _child) : GenericVideoFilter(_child), delay_samples(int64_t(delay * vi.audio_samples_per_second + 0.5)) { vi.num_audio_samples += delay_samples; } void DelayAudio::GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) { child->GetAudio(buf, start - delay_samples, count, env); } AVSValue __cdecl DelayAudio::Create(AVSValue args, void*, IScriptEnvironment*) { return new DelayAudio(args[1].AsFloat(), args[0].AsClip()); } /******************************** ******* Amplify Audio ****** *******************************/ Amplify::Amplify(PClip _child, float* _volumes, int* _i_v) : GenericVideoFilter(ConvertAudio::Create(_child, SAMPLE_INT16 | SAMPLE_FLOAT | SAMPLE_INT32, SAMPLE_FLOAT)), volumes(_volumes), i_v(_i_v) { } Amplify::~Amplify() { if (volumes) { delete[] (float*)volumes; volumes=0; } if (i_v) { delete[] (int*)i_v; i_v=0; } } void __stdcall Amplify::GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) { child->GetAudio(buf, start, count, env); int channels = vi.AudioChannels(); int countXchannels = (int)count*channels; if (vi.SampleType() == SAMPLE_INT16) { #if defined(X86_32) && defined(MSVC) const short* endsample = (short*)buf + countXchannels; const int* iv = i_v; __asm { mov ecx, [iv] mov edi, [buf] align 16 iloop0: xor esi, esi ; j jloop0: mov eax, DWORD PTR [ecx+esi*4] ; i_v[j] movsx edx, WORD PTR [edi] ; *samples inc esi ; j++ imul edx add edi, 2 ; samples++ add eax, 65536 adc edx, 0 cmp edx, -1 ; if (nh < -1) return MIN_SHORT; jge notnegsat0 mov eax, -32768 jmp saturate0 notnegsat0: test edx, edx ; if (nh > 0) return MAX_SHORT; jle notpossat0 mov eax, 32767 jmp saturate0 notpossat0: shrd eax, edx, 17 ; n>>17 saturate0: mov WORD PTR [edi-2], ax ; *samples cmp esi, [channels] ; j < channels jl jloop0 cmp edi, [endsample] jl iloop0 } #else short* samples = (short*)buf; for (int i = 0; i < countXchannels; i+=channels) { for (int j = 0; j < channels; j++) { samples[i + j] = (short)clamp( signed_saturated_add64(Int32x32To64(samples[i + j], i_v[j]), 65536) >> 17, (int64_t)INT16_MIN, (int64_t)INT16_MAX); } } #endif // X86_32 return ; } if (vi.SampleType() == SAMPLE_INT32) { #if defined(X86_32) && defined(MSVC) const int* endsample = (int*)buf + countXchannels; const int* iv = i_v; __asm { mov ecx, [iv] mov edi, [buf] align 16 iloop1: xor esi, esi ; j jloop1: mov eax, DWORD PTR [ecx+esi*4] ; i_v[j] mov edx, DWORD PTR [edi] ; *samples inc esi ; j++ imul edx add edi, 4 ; samples++ add eax, 65536 adc edx, 0 cmp edx,0xffff0000 ; if (nh < -65536) return MIN_INT; jge notnegsat1 mov eax, 0x80000000 jmp saturate1 notnegsat1: cmp edx,0x0000ffff ; if (nh > 65535) return MAX_INT; jle notpossat1 mov eax, 0x7fffffff jmp saturate1 notpossat1: shrd eax, edx, 17 ; n>>17 saturate1: mov DWORD PTR [edi-4], eax ; *samples cmp esi, [channels] ; j < channels jl jloop1 cmp edi, [endsample] jl iloop1 } #else int* samples = (int*)buf; for (int i = 0; i < countXchannels; i+=channels) { for (int j = 0;j < channels;j++) { samples[i + j] = (int)clamp( signed_saturated_add64(Int32x32To64(samples[i + j], i_v[j]), 65536) >> 17, (int64_t)INT32_MIN, (int64_t)INT32_MAX); } } #endif // X86_32 return ; } if (vi.SampleType() == SAMPLE_FLOAT) { SFLOAT* samples = (SFLOAT*)buf; for (int i = 0; i < countXchannels; i+=channels) { for (int j = 0;j < channels;j++) { // Does not saturate, as other filters do. samples[i + j] = samples[i + j] * volumes[j]; // We should saturate only on conversion. } } return ; } } AVSValue __cdecl Amplify::Create(AVSValue args, void*, IScriptEnvironment*) { if (!args[0].AsClip()->GetVideoInfo().AudioChannels()) return args[0]; AVSValue args_c = args[1]; const int num_args = args_c.ArraySize(); const int ch = args[0].AsClip()->GetVideoInfo().AudioChannels(); float* child_array = new float[ch]; int* i_child_array = new int[ch]; for (int i = 0; i < ch; ++i) { child_array[i] = args_c[min(i, num_args - 1)].AsFloatf(); i_child_array[i] = int(child_array[i] * 131072.0f + 0.5f); } return new Amplify(args[0].AsClip(), child_array, i_child_array); } AVSValue __cdecl Amplify::Create_dB(AVSValue args, void*, IScriptEnvironment*) { if (!args[0].AsClip()->GetVideoInfo().AudioChannels()) return args[0]; AVSValue args_c = args[1]; const int num_args = args_c.ArraySize(); const int ch = args[0].AsClip()->GetVideoInfo().AudioChannels(); float* child_array = new float[ch]; int* i_child_array = new int[ch]; for (int i = 0; i < ch; ++i) { child_array[i] = dBtoScaleFactorf(args_c[min(i, num_args - 1)].AsFloatf()); i_child_array[i] = int(child_array[i] * 131072.0f + 0.5f); } return new Amplify(args[0].AsClip(), child_array, i_child_array); } /***************************** ***** Normalize audio ****** ***** Supports int16,float****** ******************************/ Normalize::Normalize(PClip _child, float _max_factor, bool _showvalues) : GenericVideoFilter(ConvertAudio::Create(_child, SAMPLE_INT16 | SAMPLE_FLOAT, SAMPLE_FLOAT)), max_factor(_max_factor), max_volume(-1.0f), frameno(0), showvalues(_showvalues) { } void __stdcall Normalize::GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) { if (max_volume < 0.0f) { // Read samples into buffer and test them if (vi.SampleType() == SAMPLE_INT16) { int64_t bcount = count; short* samples = (short*)buf; bool bigbuff=false; if (vi.BytesFromAudioSamples(count) < BIGBUFFSIZE) { samples = new(std::nothrow) short[BIGBUFFSIZE/sizeof(short)]; if (samples) { bigbuff=true; bcount = vi.AudioSamplesFromBytes(BIGBUFFSIZE); } else { samples = (short*)buf; // malloc failed just reuse clients buffer } } const int64_t passes = vi.num_audio_samples / bcount; int64_t negpeaksampleno=-1, pospeaksampleno=-1; int i_pos_volume = 0; int i_neg_volume = 0; const int chanXbcount = (int)bcount * vi.AudioChannels(); for (int64_t i = 0; i < passes; i++) { child->GetAudio(samples, bcount*i, bcount, env); for (int j = 0; j < chanXbcount; j++) { const int sample=samples[j]; if (sample < i_neg_volume) { // Cope with MIN_SHORT i_neg_volume = sample; negpeaksampleno = chanXbcount*i+j; if (sample <= -32767) { i = passes; break; } } else if (sample > i_pos_volume) { i_pos_volume = sample; pospeaksampleno = chanXbcount*i+j; if (sample == 32767) { i = passes; break; } } } } // Remaining samples if ((i_pos_volume != 32767) && (i_neg_volume > -32767)) { const int64_t rem_samples = vi.num_audio_samples % bcount; const int chanXremcount = (int)rem_samples * vi.AudioChannels(); child->GetAudio(samples, bcount*passes, rem_samples, env); for (int j = 0; j < chanXremcount; j++) { const int sample=samples[j]; if (sample < i_neg_volume) { // Cope with MIN_SHORT i_neg_volume = sample; negpeaksampleno = chanXbcount*passes+j; } else if (sample > i_pos_volume) { i_pos_volume = sample; pospeaksampleno = chanXbcount*passes+j; } } } if (bigbuff) delete[] samples; i_pos_volume = -i_pos_volume; // Remember -ve has 1 more range than +ve, i.e. -32768 if (i_neg_volume < i_pos_volume) { i_pos_volume = i_neg_volume; frameno = vi.FramesFromAudioSamples(negpeaksampleno / vi.AudioChannels()); } else { frameno = vi.FramesFromAudioSamples(pospeaksampleno / vi.AudioChannels()); } max_volume = float(i_pos_volume * (-1.0/32768.0)); max_factor = max_factor / max_volume; } else if (vi.SampleType() == SAMPLE_FLOAT) { // Float int64_t bcount = count; SFLOAT* samples = (SFLOAT*)buf; bool bigbuff=false; if (vi.BytesFromAudioSamples(count) < BIGBUFFSIZE) { samples = new(std::nothrow) SFLOAT[BIGBUFFSIZE/sizeof(SFLOAT)]; if (samples) { bigbuff=true; bcount = vi.AudioSamplesFromBytes(BIGBUFFSIZE); } else { samples = (SFLOAT*)buf; // malloc failed just reuse clients buffer } } const int chanXbcount = (int)bcount * vi.AudioChannels(); const int64_t passes = vi.num_audio_samples / bcount; int64_t peaksampleno=-1; for (int64_t i = 0;i < passes;i++) { child->GetAudio(samples, bcount*i, bcount, env); for (int j = 0;j < chanXbcount;j++) { const SFLOAT sample = fabsf(samples[j]); if (sample > max_volume) { max_volume = sample; peaksampleno = chanXbcount*i+j; } } } // Remaining samples const int64_t rem_samples = vi.num_audio_samples % bcount; const int chanXremcount = (int)rem_samples * vi.AudioChannels(); child->GetAudio(samples, bcount*passes, rem_samples, env); for (int j = 0;j < chanXremcount;j++) { const SFLOAT sample = fabsf(samples[j]); if (sample > max_volume) { max_volume = sample; peaksampleno = chanXbcount*passes+j; } } if (bigbuff) delete[] samples; frameno = vi.FramesFromAudioSamples(peaksampleno / vi.AudioChannels()); max_factor = max_factor / max_volume; } } const int chanXcount = (int)count * vi.AudioChannels(); if (vi.SampleType() == SAMPLE_INT16) { const int factor = (int)(max_factor * 131072.0f + 0.5f); child->GetAudio(buf, start, count, env); #if defined(X86_32) && defined(MSVC) const short* endsample = (short*)buf + chanXcount; __asm { mov ecx, [factor] mov edi, [buf] align 16 iloop2: movsx eax, WORD PTR [edi] ; *samples imul ecx add edi, 2 ; samples++ add eax, 65536 adc edx, 0 cmp edx, -1 ; if (nh < -1) return MIN_SHORT; jge notnegsat2 mov eax, -32768 jmp saturate2 notnegsat2: test edx, edx ; if (nh > 0) return MAX_SHORT; jle notpossat2 mov eax, 32767 jmp saturate2 notpossat2: shrd eax, edx, 17 ; n>>17 saturate2: mov WORD PTR [edi-2], ax ; *samples cmp edi, [endsample] jl iloop2 } #else short* samples = (short*)buf; for (int i = 0; i < chanXcount; ++i) { // TODO: This is very slow. Right now, it should just work, we'll optimize later. samples[i] = (short)clamp( signed_saturated_add64(Int32x32To64(samples[i], factor), 65536) >> 17, (int64_t)INT16_MIN, (int64_t)INT16_MAX); } #endif // X86_32 } else if (vi.SampleType() == SAMPLE_FLOAT) { SFLOAT* samples = (SFLOAT*)buf; child->GetAudio(buf, start, count, env); for (int i = 0; i < chanXcount; ++i) { samples[i] = samples[i] * max_factor; } } } int __stdcall Normalize::SetCacheHints(int cachehints, int frame_range) { AVS_UNUSED(frame_range); switch (cachehints) { case CACHE_GET_MTMODE: return MT_SERIALIZED; default: break; } return 0; } PVideoFrame __stdcall Normalize::GetFrame(int n, IScriptEnvironment* env) { if (showvalues) { PVideoFrame src = child->GetFrame(n, env); env->MakeWritable(&src); char text[400]; if (max_volume < 0) { sprintf(text, "Normalize: Result not yet calculated!"); } else { double maxdb = 8.685889638 * log(max_factor); // maxdb = (20 * log(factor)) / log(10); sprintf(text, "Amplify Factor: %8.4f\nAmplify DB: %8.4f\nAt Frame: %d", max_factor, maxdb, frameno); } env->ApplyMessage(&src, vi, text, vi.width / 4, 0xf0f080, 0, 0); return src; } return child->GetFrame(n, env); } AVSValue __cdecl Normalize::Create(AVSValue args, void*, IScriptEnvironment*) { return new Normalize(args[0].AsClip(), args[1].AsFloatf(1.0f), args[2].AsBool(false));} /***************************** ***** Mix audio tracks ****** ******************************/ MixAudio::MixAudio(PClip _child, PClip _clip, double _track1_factor, double _track2_factor, IScriptEnvironment* env) : GenericVideoFilter(ConvertAudio::Create(_child, SAMPLE_INT16 | SAMPLE_FLOAT, SAMPLE_FLOAT)), tempbuffer(NULL), track1_factor(int(_track1_factor*131072.0 + 0.5)), track2_factor(int(_track2_factor*131072.0 + 0.5)), t1factor(float(_track1_factor)), t2factor(float(_track2_factor)) { clip = ConvertAudio::Create(_clip, vi.SampleType(), vi.SampleType()); // Clip 2 should now be same type as clip 1. const VideoInfo vi2 = clip->GetVideoInfo(); if (vi.audio_samples_per_second != vi2.audio_samples_per_second) env->ThrowError("MixAudio: Clips must have same sample rate! Use ResampleAudio()!"); // Could be removed for fun :) if (vi.AudioChannels() != vi2.AudioChannels()) env->ThrowError("MixAudio: Clips must have same number of channels! Use ConvertToMono() or MergeChannels()!"); tempbuffer_size = 0; } void __stdcall MixAudio::GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) { if (tempbuffer_size < count) { if (tempbuffer_size) delete[] tempbuffer; tempbuffer = new signed char[(size_t)(count * vi.BytesPerAudioSample())]; tempbuffer_size = (int)count; } child->GetAudio(buf, start, count, env); clip->GetAudio(tempbuffer, start, count, env); unsigned channels = vi.AudioChannels(); if (vi.SampleType()&SAMPLE_INT16) { #if defined(X86_32) && defined(MSVC) const short* tbuffer = (short*)tempbuffer; const short* endsample = (short*)buf + unsigned(count)*channels; const int t1_factor = track1_factor; const int t2_factor = track2_factor; __asm { push ebx mov edi, [buf] mov esi, [tbuffer] align 16 iloop3: movsx eax, WORD PTR [edi] ; *samples add edi, 2 ; samples++ imul [t1_factor] mov ebx, 65536 xor ecx, ecx add ebx, eax movsx eax, WORD PTR [esi] ; *clip_samples adc ecx, edx imul [t2_factor] add esi, 2 ; clip_samples++ add eax, ebx adc edx, ecx cmp edx, -1 ; if (nh < -1) return MIN_SHORT; jge notnegsat3 mov eax, -32768 jmp saturate3 notnegsat3: test edx, edx ; if (nh > 0) return MAX_SHORT; jle notpossat3 mov eax, 32767 jmp saturate3 notpossat3: shrd eax, edx, 17 ; n>>17 saturate3: mov WORD PTR [edi-2], ax ; *samples cmp edi, [endsample] jl iloop3 pop ebx } #else short* samples = (short*)buf; short* clip_samples = (short*)tempbuffer; for (unsigned i = 0; i < unsigned(count)*channels; ++i) { samples[i] = (short)clamp( signed_saturated_add64(signed_saturated_add64(Int32x32To64(samples[i], track1_factor), Int32x32To64(clip_samples[i], track2_factor)), 65536) >> 17, (int64_t)INT16_MIN, (int64_t)INT16_MAX); } #endif } else if (vi.SampleType()&SAMPLE_FLOAT) { SFLOAT* samples = (SFLOAT*)buf; const SFLOAT* clip_samples = (SFLOAT*)tempbuffer; for (unsigned i = 0; i < unsigned(count)*channels; ++i) { samples[i] = (samples[i] * t1factor) + (clip_samples[i] * t2factor); } } } int __stdcall MixAudio::SetCacheHints(int cachehints, int frame_range) { AVS_UNUSED(frame_range); switch (cachehints) { case CACHE_GET_MTMODE: return MT_SERIALIZED; default: break; } return 0; } AVSValue __cdecl MixAudio::Create(AVSValue args, void*, IScriptEnvironment* env) { double track1_factor = args[2].AsDblDef(0.5); double track2_factor = args[3].AsDblDef(1.0 - track1_factor); return new MixAudio(args[0].AsClip(), args[1].AsClip(), track1_factor, track2_factor, env); } /******************************** ******* Resample Audio ****** *******************************/ static int Amasktab[Amask+1]; static SFLOAT fAmasktab[Amask+1]; ResampleAudio::ResampleAudio(PClip _child, int _target_rate_n, int _target_rate_d, IScriptEnvironment*) : GenericVideoFilter(ConvertAudio::Create(_child, SAMPLE_INT16 | SAMPLE_FLOAT, SAMPLE_FLOAT)), factor(_target_rate_n / (double(_target_rate_d) * vi.audio_samples_per_second)) { srcbuffer = 0; fsrcbuffer = 0; if (vi.audio_samples_per_second == 0) { skip_conversion = true; return ; } // To avoid overflow, implement as (A*B+C/2)/C = (A/C)*B + ((A%C)*B+C>>1)/C const int64_t den = Int32x32To64(_target_rate_d, vi.audio_samples_per_second); const int64_t num_audio_samples = (vi.num_audio_samples/den) * _target_rate_n + ((vi.num_audio_samples%den)*_target_rate_n + (den>>1))/den; if (vi.num_audio_samples == num_audio_samples) { skip_conversion = true; return ; } skip_conversion = false; vi.num_audio_samples = num_audio_samples; vi.audio_samples_per_second = (_target_rate_n + (_target_rate_d>>1))/_target_rate_d; if (vi.IsSampleType(SAMPLE_INT16)) { double dLpScl = 0.0; // Load interpolate ratio table for (int i=0; i<=Amask; i++) Amasktab[i] = (i<<16) | (Amask+1-i); /* a is between 0 and 1 */ // generate filter coefficients makeFilter(Imp, dLpScl, Nwing, 0.90, 9); Imp[Nwing] = 0; // for "interpolation" beyond last coefficient /* Account for increased filter gain when using factors less than 1 */ if (factor < 1) dLpScl = dLpScl * factor; // Attenuate resampler scale factor by 0.95 to reduce probability of clipping LpScl = int(dLpScl * 0.95 + 0.5); // Scale guard bits so intermediate result fits in short mNhg = Nhg; while (dLpScl < 16384.0) { dLpScl *= 2.0; mNhg += 1; } mLpScl = int(dLpScl + 0.5); // Must be 16384 <= mLpScl <= 32767 } else { // SAMPLE_FLOAT // Load interpolate ratio table for (int i=0; i<=Amask; i++) fAmasktab[i] = float(i) / (Amask+1); /* a is between 0 and 1 */ /* Account for increased filter gain when using factors less than 1 */ if (factor < 1) makeFilter(fImp, factor, Nwing, 0.90, 9); // generate filter coefficients else makeFilter(fImp, 1.0, Nwing, 0.90, 9); // generate filter coefficients fImp[Nwing] = 0.0; // for "interpolation" beyond last coefficient } /* Calc reach of LP filter wing & give some creeping room */ Xoff = int(((Nmult + 1) / 2.0) * max(1.0, 1.0 / factor)) + 10; /* The previous algorithm was causing quite a noticable click or pop at the * end of each mouthful due to accumulated creep between pos+N*dtb at the * end of one call to (start/factor*(1<GetAudio(buf, start, count, env); return ; } auto src_start = int64_t(((long double)start / factor) * (1 << Np) + 0.5); auto src_end = int64_t(((long double)(start + count) / factor) * (1 << Np) + 0.5); const int64_t source_samples = ((src_end - src_start) >> Np) + 2 * Xoff + 1; const int source_bytes = (int)vi.BytesFromAudioSamples(source_samples); int64_t pos = (int(src_start & Pmask)) + (Xoff << Np); short ch = (short)vi.AudioChannels(); unsigned dtberror = 0; if (vi.IsSampleType(SAMPLE_INT16)) { if (!srcbuffer || source_bytes > srcbuffer_size) { delete[] srcbuffer; srcbuffer = new short[source_bytes >> 1]; srcbuffer_size = source_bytes; last_samples= 0; last_start = 0; } const int offset = int((src_start >> Np) - Xoff - last_start); // Difference from last time last_start = (src_start >> Np) - Xoff; // Start for next time int overlap = int(last_samples - offset); // How many samples already fetched if ((offset < 0) || (overlap <= 0)) // Is there any overlap? overlap = 0; else if (offset*ch >= 2) // Assume 32bit separation is okay // Yes, copy to start of buffer memcpy(srcbuffer, srcbuffer+offset*ch, overlap*ch<<1); // fast else if (offset > 0) memmove(srcbuffer, srcbuffer+offset*ch, overlap*ch<<1); // slow last_samples= max(overlap, source_samples); // Samples for next time if (source_samples-overlap > 0) // Get the rest of the source samples child->GetAudio(&srcbuffer[overlap*ch], last_start+overlap, source_samples-overlap, env); short* dst = (short*)buf; short* dst_end = &dst[count * ch]; #ifdef INTEL_INTRINSICS #if defined(X86_32) && defined(MSVC_PURE) if (env->GetCPUFlags() & CPUF_MMX) { static const int r_Na = 1 << (Na-1); static const int r_Nhxn = 1 << (Nhxn-1); static const int r_NLpScl = 1 << (NLpScl-1); const int inc = ch * sizeof(short); int posNp = int(pos >> Np); // MM7 - Accumulate the left/right wing inner product of the current sample pair // MM6 - Rounding constant 1 << (Na-1), (64) // MM5 - Rounding constant 1 << (Nhxn-1), (8192) // MM4 - Scaled scaling factor, mLpScl // MM3 - Rounding constant 1 << (NLpScl-1), (4096) // MM2 - Scaled number of guard bits, mNhg __asm { movd mm6, [r_Na] ; 1 << (Na - 1) movd mm5, [r_Nhxn] ; 1 << (Nhxn - 1) punpckldq mm6, mm6 ; 00000040 00000040 mov eax, this punpckldq mm5, mm5 ; 00002000 00002000 movd mm4, [eax].mLpScl ; 00000000 LpScl movd mm3, [r_NLpScl] ; 1 << (NLpScl-1) punpckldq mm4, mm4 ; LpScl | LpScl movd mm2, [eax].mNhg ; Number of guard bits punpckldq mm3, mm3 ; 00001000 00001000 } while (dst < dst_end) { for (int q = 0; q < ch; q+=2) { // do 2 channels at once bool single = (q+1 >= ch); short* Xp = &srcbuffer[posNp * ch]; __asm pxor mm7, mm7; // 2 channel samples are accumulated in MM7 FilterUD_mmx(Xp + ch + q, (unsigned)(-pos) & Pmask, inc, dhb, Imp, Nwing); /* Perform right-wing inner product */ FilterUD_mmx(Xp + q, (unsigned)( pos) & Pmask, -inc, dhb, Imp, Nwing); /* Perform left-wing inner product */ __asm { psrad mm7, mm2 ; scaled Nhg guard bits mov eax, [dst] pmaddwd mm7, mm4 ; Normalize for unity filter gain test byte ptr[single], 1 ; doing 1 sample or 2 samples? paddd mm7, mm3 ; round jnz dosingle psrad mm7, NLpScl ; strip guard bits add eax, 4 ; dst+=2 packssdw mm7, mm7 ; pack with signed saturation ready for output mov [dst], eax movd [eax-4], mm7 ; deposit 2 output samples jmp done1 align 16 dosingle: psrad mm7, NLpScl ; strip guard bits add eax, 2 ; dst+= packssdw mm7, mm7 ; pack with signed saturation ready for output mov [dst], eax movd edx, mm7 mov [eax-2], dx ; deposit 1 output sample align 16 done1: } } // for (int q = 0 __asm { // Don't be a creep ;-) mov edx, this mov eax, dtberror ; time increment error accumulator mov ecx, [edx].dtb ; time increment add eax, [edx].dtbe ; add error per cycle mov edx, dword ptr pos+4 cmp eax, 0x80000000 ; accumulated 1 full error yet? jb nofix inc ecx ; += 1 sub eax, 0x80000000 ; -= 1 full error nofix: add ecx, dword ptr pos ; Move to next sample mov dtberror, eax adc edx, 0 mov dword ptr pos, ecx shrd ecx, edx, Np ; posNp = pos >> Np mov dword ptr pos+4, edx mov posNp, ecx } } // while (dst __asm emms; } else #endif // X86_32 #endif { while (dst < dst_end) { for (int q = 0; q < ch; q++) { short* Xp = &srcbuffer[(pos >> Np) * ch]; #if 1 int64_t v64 = FilterUD(Xp + q, (short)(pos & Pmask), - ch); /* Perform left-wing inner product */ v64 += FilterUD(Xp + ch + q, (short)(( -pos) & Pmask), ch); /* Perform right-wing inner product */ v64 += 1 << (Nh - 1); /* Round only once! */ int v32 = int(v64 >> Nh); /* Make guard bits once! */ v32 *= LpScl; /* Normalize for unity filter gain */ *dst++ = IntToShort(v32, NLpScl); /* strip guard bits, deposit output */ #else int v = FilterUD(Xp + q, (short)(pos & Pmask), - ch); /* Perform left-wing inner product */ v += FilterUD(Xp + ch + q, (short)(( -pos) & Pmask), ch); /* Perform right-wing inner product */ v >>= Nhg; /* Make guard bits */ v *= LpScl; /* Normalize for unity filter gain */ *dst++ = IntToShort(v, NLpScl); /* strip guard bits, deposit output */ #endif } if ((dtberror += dtbe) >= (1u << 31)) { // Don't be a creep ;-) dtberror -= (1u << 31); pos += dtb + 1; /* Move to next sample by time increment + error adjustment */ } else { pos += dtb; /* Move to next sample by time increment */ } } } } else { // SAMPLE_FLOAT if (!fsrcbuffer || source_bytes > srcbuffer_size) { delete[] fsrcbuffer; fsrcbuffer = new SFLOAT[source_bytes >> 2]; srcbuffer_size = source_bytes; last_samples= 0; last_start = 0; } const int offset = int((src_start >> Np) - Xoff - last_start); last_start = (src_start >> Np) - Xoff; int overlap = int(last_samples - offset); if ((offset < 0) || (overlap <= 0)) overlap = 0; else if (offset > 0) memcpy(fsrcbuffer, fsrcbuffer+offset*ch, overlap*ch<<2); last_samples= max(overlap, source_samples); if (source_samples-overlap > 0) child->GetAudio(&fsrcbuffer[overlap*ch], last_start+overlap, source_samples-overlap, env); SFLOAT* dst = (SFLOAT*)buf; SFLOAT* dst_end = &dst[count * ch]; while (dst < dst_end) { for (int q = 0; q < ch; q++) { SFLOAT* Xp = &fsrcbuffer[(pos >> Np) * ch]; SFLOAT v = FilterUD(Xp + q, (short)( pos & Pmask), - ch); /* Perform left-wing inner product */ v += FilterUD(Xp + ch + q, (short)(( -pos) & Pmask), ch); /* Perform right-wing inner product */ *dst++ = v; /* deposit output */ } if ((dtberror += dtbe) >= (1 << 31)) { // Don't be a creep ;-) dtberror -= (1u << 31); pos += dtb + 1; /* Move to next sample by time increment + error adjustment */ } else { pos += dtb; /* Move to next sample by time increment */ } } } } int __stdcall ResampleAudio::SetCacheHints(int cachehints, int frame_range) { AVS_UNUSED(frame_range); switch (cachehints) { case CACHE_GET_MTMODE: return MT_SERIALIZED; default: break; } return 0; } AVSValue __cdecl ResampleAudio::Create(AVSValue args, void*, IScriptEnvironment* env) { return new ResampleAudio(args[0].AsClip(), args[1].AsInt(), args[2].AsInt(1), env); } #ifdef INTEL_INTRINSICS #if defined(X86_32) && defined(MSVC_PURE) // FilterUD MMX SAMPLE_INT16 Version -- approx 3.25 times faster than original (2.4x than new) /* * MMx registers transfered across calls * MM7 - Accumulate the left/right wing inner product of the current sample pair * MM6 - Rounding constant 1 << (Na-1), (64) * MM5 - Rounding constant 1 << (Nhxn-1), (8192) * * Uses MM0, MM1 */ #pragma warning( push ) #pragma warning (disable: 4799) //function '...' has no EMMS instruction void FilterUD_mmx(short *Xp, unsigned Ph, int _inc, int _dhb, short *p_Imp, unsigned End) { unsigned Ho = (Ph * (unsigned)_dhb) >> Np; if (_inc > 0) { // If doing right wing drop extra coeff, so when Ph is End--; // 0.5, we don't do one too many mult's if (Ph == 0) // If the phase is zero then we've already skipped the Ho += _dhb; // first sample, so we must also skip ahead in Imp[] } __asm { mov edi,[Xp] mov esi,[Ho] mov ecx,[p_Imp] mov edx,esi ; Fold into end for improved pairing mov eax,Amask shr edx,Na ; Ho >> Na and eax,esi ; Ho & Amask cmp edx,[End] movd mm1,Amasktab[eax*4] ; 0000 0000 eax 128-eax jae donone align 16 loop1: movd mm0,[ecx+edx*2] ; 0000 0000 Imp[Ho>>Na7+1] Imp[Ho>>Na7] add esi,[_dhb] ; Ho += dhb pmaddwd mm0,mm1 ; 00000000 Imp[h+1]*a + Imp[h]*(128-a) movd mm1,[edi] ; 0000 0000 *(Xp+1) *Xp paddd mm0,mm6 ; += round add edi,[_inc] ; Xp += Inc pslld mm0,16-Na ; <<= 16-Na mov eax,Amask psrld mm0,16 ; 0000 0000 0000 coeff punpcklwd mm1,mm1 ; *(Xp+1) *(Xp+1) *Xp *Xp mov edx,esi punpckldq mm0,mm0 ; 0000 coeff 0000 coeff and eax,esi ; Ho & Amask pmaddwd mm0,mm1 ; *(Xp+1)*coeff | *Xp*coeff shr edx,Na ; Ho >> Na paddd mm0,mm5 ; += round movd mm1,Amasktab[eax*4] ; 0000 0000 eax 128-eax psrad mm0,Nhxn ; >>=Nhxn cmp edx,[End] paddd mm7,mm0 ; v += t jb loop1 donone: } } #pragma warning( pop ) #endif // X86_32 #endif // FilterUD SAMPLE_INT16 Version int64_t ResampleAudio::FilterUD(short *Xp, short Ph, short Inc) { int64_t v = 0; unsigned Ho = (Ph * (unsigned)dhb) >> Np; unsigned End = Nwing; if (Inc > 0) /* If doing right wing... */ { /* ...drop extra coeff, so when Ph is */ End--; /* 0.5, we don't do too many mult's */ if (Ph == 0) /* If the phase is zero... */ Ho += dhb; /* ...then we've already skipped the */ } /* first sample, so we must also */ /* skip ahead in Imp[] and ImpD[] */ while ((Ho >> Na) < End) { int t = Imp[Ho >> Na]; /* Get IR sample */ #if 1 // It's 37% faster and more accurate to accumulate 64 bits // than stuffing around testing, rounding and shifting const int a = Ho & Amask; /* a is logically between 0 and 1 */ const int r = 1 << (Na-1); /* Round */ t += ((int(Imp[(Ho>>Na)+1]) - t) * a + r) >> Na; /* t is now interp'd filter coeff */ t *= *Xp; /* Mult coeff by input sample */ #else int a = Ho & Amask; /* a is logically between 0 and 1 */ t += ((int(Imp[(Ho >> Na) + 1]) - t) * a) >> Na; /* t is now interp'd filter coeff */ t *= *Xp; /* Mult coeff by input sample */ if (t & 1 << (Nhxn - 1)) /* Round, if needed */ t += 1 << (Nhxn - 1); t >>= Nhxn; /* Leave some guard bits, but come back some */ #endif v += t; /* The filter output */ Ho += dhb; /* IR step */ Xp += Inc; /* Input signal step. NO CHECK ON BOUNDS */ } return (v); } // FilterUD SAMPLE_FLOAT Version -- Approx same speed as new int16 and SSRC on P4 (40% on P2) SFLOAT ResampleAudio::FilterUD(SFLOAT *Xp, short Ph, short Inc) { SFLOAT v = 0; unsigned Ho = (Ph * (unsigned)dhb) >> Np; unsigned End = Nwing; if (Inc > 0) /* If doing right wing... */ { /* ...drop extra coeff, so when Ph is */ End--; /* 0.5, we don't do too many mult's */ if (Ph == 0) /* If the phase is zero... */ Ho += dhb; /* ...then we've already skipped the */ } /* first sample, so we must also */ /* skip ahead in fImp[] */ while ((Ho >> Na) < End) { SFLOAT t = fImp[Ho >> Na]; /* Get IR sample */ t += (fImp[(Ho >> Na) + 1] - t) * fAmasktab[Ho & Amask]; /* t is now interpolated filter coeff */ t *= *Xp; /* Mult coeff by input sample */ v += t; /* The filter output */ Ho += dhb; /* IR step */ Xp += Inc; /* Input signal step. NO CHECK ON BOUNDS */ } return (v); } /******************************** ******* Helper methods ******* ********************************/ double Izero(double x) { double sum, u, halfx, temp; int n; sum = u = n = 1; halfx = x / 2.0; do { temp = halfx / (double)n; n += 1; temp *= temp; u *= temp; sum += u; } while (u >= IzeroEPSILON*sum); return (sum); } void LpFilter(double c[], int N, double frq, double Beta, int Num) { int i; /* Calculate ideal lowpass filter impulse response coefficients: */ c[0] = 2.0 * frq; const double PIdivNum = PI / Num; for (i = 1; i < N; i++) { const double temp = PIdivNum * i; c[i] = sin(2.0 * temp * frq) / temp; /* Analog sinc function, cutoff = frq */ } /* * Calculate and Apply Kaiser window to ideal lowpass filter. * Note: last window value is IBeta which is NOT zero. * You're supposed to really truncate the window here, not ramp * it to zero. This helps reduce the first sidelobe. */ const double IBeta = 1.0 / Izero(Beta); const double inm1 = 1.0 / (N - 1); for (i = 1; i < N; i++) { const double temp = i * inm1; c[i] *= Izero(Beta * sqrt(1.0 - temp * temp)) * IBeta; } } /* ERROR return codes: * 0 - no error * 1 - Nwing too large (Nwing is > MAXNWING) * 2 - Froll is not in interval [0:1) * 3 - Beta is < 1.0 * */ // makeFilter SAMPLE_INT16 Version int makeFilter( short Imp[], double &dLpScl, unsigned short Nwing, double Froll, double Beta) { static const int MAXNWING = 8192; static double ImpR[MAXNWING]; double DCgain, Scl, Maxh; short Dh; int i; if (Nwing > MAXNWING) /* Check for valid parameters */ return (1); if ((Froll <= 0) || (Froll > 1)) return (2); if (Beta < 1) return (3); /* * Design Kaiser-windowed sinc-function low-pass filter */ LpFilter(ImpR, (int)Nwing, 0.5*Froll, Beta, Npc); /* Compute the DC gain of the lowpass filter, and its maximum coefficient * magnitude. Scale the coefficients so that the maximum coeffiecient just * fits in Nh-bit fixed-point, and compute LpScl as the NLpScl-bit (signed) * scale factor which when multiplied by the output of the lowpass filter * gives unity gain. */ DCgain = 0; Dh = Npc; /* Filter sampling period for factors>=1 */ for (i = Dh; i < Nwing; i += Dh) DCgain += ImpR[i]; DCgain = 2 * DCgain + ImpR[0]; /* DC gain of real coefficients */ for (Maxh = i = 0; i < Nwing; i++) Maxh = max(Maxh, fabs(ImpR[i])); Scl = ((1 << (Nh - 1)) - 1) / Maxh; /* Map largest coeff to 16-bit maximum */ dLpScl = fabs((1 << (NLpScl + Nh)) / (DCgain * Scl)); /* Scale filter coefficients for Nh bits and convert to integer */ if (ImpR[0] < 0) /* Need pos 1st value for LpScl storage */ Scl = -Scl; for (i = 0; i < Nwing; i++) /* Scale & round them */ Imp[i] = short(ImpR[i] * Scl + 0.5); return (0); } // makeFilter SAMPLE_FLOAT Version int makeFilter( SFLOAT fImp[], double dLpScl, unsigned short Nwing, double Froll, double Beta) { static const int MAXNWING = 8192; static double ImpR[MAXNWING]; double DCgain, Scl; int i; if (Nwing > MAXNWING) /* Check for valid parameters */ return (1); if ((Froll <= 0) || (Froll > 1)) return (2); if (Beta < 1) return (3); /* * Design Kaiser-windowed sinc-function low-pass filter */ LpFilter(ImpR, (int)Nwing, 0.5*Froll, Beta, Npc); /* Compute the DC gain of the lowpass filter, and its maximum coefficient * magnitude. Scale the coefficients so that the maximum coeffiecient just * fits in Nh-bit fixed-point, and compute LpScl as the NLpScl-bit (signed) * scale factor which when multiplied by the output of the lowpass filter * gives unity gain. */ DCgain = 0; /* Npc is filter sampling period for factors>=1 */ for (i = Npc; i < Nwing; i += Npc) DCgain += ImpR[i]; DCgain = 2 * DCgain + ImpR[0]; /* DC gain of real coefficients */ Scl = dLpScl / DCgain; /* Scale filter coefficients for unity gain and convert to float */ if (ImpR[0] < 0) /* Need pos 1st value for LpScl storage */ Scl = -Scl; for (i = 0; i < Nwing; i++) /* Scale them */ fImp[i] = (SFLOAT)(ImpR[i] * Scl); return (0); } ================================================ FILE: avs_core/core/audio.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __Audio_H__ #define __Audio_H__ #include #include // ------- Channels, only 0..17, SPEAKER_ALL not handled here enum AVSChannel { AVS_CHAN_IDX_NONE = -1, // Invalid channel index AVS_CHAN_IDX_FRONT_LEFT, AVS_CHAN_IDX_FRONT_RIGHT, AVS_CHAN_IDX_FRONT_CENTER, AVS_CHAN_IDX_LOW_FREQUENCY, AVS_CHAN_IDX_BACK_LEFT, AVS_CHAN_IDX_BACK_RIGHT, AVS_CHAN_IDX_FRONT_LEFT_OF_CENTER, AVS_CHAN_IDX_FRONT_RIGHT_OF_CENTER, AVS_CHAN_IDX_BACK_CENTER, AVS_CHAN_IDX_SIDE_LEFT, AVS_CHAN_IDX_SIDE_RIGHT, AVS_CHAN_IDX_TOP_CENTER, AVS_CHAN_IDX_TOP_FRONT_LEFT, AVS_CHAN_IDX_TOP_FRONT_CENTER, AVS_CHAN_IDX_TOP_FRONT_RIGHT, AVS_CHAN_IDX_TOP_BACK_LEFT, AVS_CHAN_IDX_TOP_BACK_CENTER, AVS_CHAN_IDX_TOP_BACK_RIGHT }; // similarly to ffmpeg #define AVS_CHANNEL_LAYOUT_MONO (AvsChannelMask::MASK_SPEAKER_FRONT_CENTER) #define AVS_CHANNEL_LAYOUT_STEREO (AvsChannelMask::MASK_SPEAKER_FRONT_LEFT|AvsChannelMask::MASK_SPEAKER_FRONT_RIGHT) #define AVS_CHANNEL_LAYOUT_2POINT1 (AVS_CHANNEL_LAYOUT_STEREO|AvsChannelMask::MASK_SPEAKER_LOW_FREQUENCY) #define AVS_CHANNEL_LAYOUT_2_1 (AVS_CHANNEL_LAYOUT_STEREO|AvsChannelMask::MASK_SPEAKER_BACK_CENTER) #define AVS_CHANNEL_LAYOUT_SURROUND (AVS_CHANNEL_LAYOUT_STEREO|AvsChannelMask::MASK_SPEAKER_FRONT_CENTER) #define AVS_CHANNEL_LAYOUT_3POINT1 (AVS_CHANNEL_LAYOUT_SURROUND|AvsChannelMask::MASK_SPEAKER_LOW_FREQUENCY) #define AVS_CHANNEL_LAYOUT_4POINT0 (AVS_CHANNEL_LAYOUT_SURROUND|AvsChannelMask::MASK_SPEAKER_BACK_CENTER) #define AVS_CHANNEL_LAYOUT_4POINT1 (AVS_CHANNEL_LAYOUT_4POINT0|AvsChannelMask::MASK_SPEAKER_LOW_FREQUENCY) #define AVS_CHANNEL_LAYOUT_2_2 (AVS_CHANNEL_LAYOUT_STEREO|AvsChannelMask::MASK_SPEAKER_SIDE_LEFT|AvsChannelMask::MASK_SPEAKER_SIDE_RIGHT) #define AVS_CHANNEL_LAYOUT_QUAD (AVS_CHANNEL_LAYOUT_STEREO|AvsChannelMask::MASK_SPEAKER_BACK_LEFT|AvsChannelMask::MASK_SPEAKER_BACK_RIGHT) #define AVS_CHANNEL_LAYOUT_5POINT0 (AVS_CHANNEL_LAYOUT_SURROUND|AvsChannelMask::MASK_SPEAKER_SIDE_LEFT|AvsChannelMask::MASK_SPEAKER_SIDE_RIGHT) #define AVS_CHANNEL_LAYOUT_5POINT1 (AVS_CHANNEL_LAYOUT_5POINT0|AvsChannelMask::MASK_SPEAKER_LOW_FREQUENCY) #define AVS_CHANNEL_LAYOUT_5POINT0_BACK (AVS_CHANNEL_LAYOUT_SURROUND|AvsChannelMask::MASK_SPEAKER_BACK_LEFT|AvsChannelMask::MASK_SPEAKER_BACK_RIGHT) #define AVS_CHANNEL_LAYOUT_5POINT1_BACK (AVS_CHANNEL_LAYOUT_5POINT0_BACK|AvsChannelMask::MASK_SPEAKER_LOW_FREQUENCY) #define AVS_CHANNEL_LAYOUT_6POINT0 (AVS_CHANNEL_LAYOUT_5POINT0|AvsChannelMask::MASK_SPEAKER_BACK_CENTER) #define AVS_CHANNEL_LAYOUT_6POINT0_FRONT (AVS_CHANNEL_LAYOUT_2_2|AvsChannelMask::MASK_SPEAKER_FRONT_LEFT_OF_CENTER|AvsChannelMask::MASK_SPEAKER_FRONT_RIGHT_OF_CENTER) #define AVS_CHANNEL_LAYOUT_HEXAGONAL (AVS_CHANNEL_LAYOUT_5POINT0_BACK|AvsChannelMask::MASK_SPEAKER_BACK_CENTER) #define AVS_CHANNEL_LAYOUT_6POINT1 (AVS_CHANNEL_LAYOUT_5POINT1|AvsChannelMask::MASK_SPEAKER_BACK_CENTER) #define AVS_CHANNEL_LAYOUT_6POINT1_BACK (AVS_CHANNEL_LAYOUT_5POINT1_BACK|AvsChannelMask::MASK_SPEAKER_BACK_CENTER) #define AVS_CHANNEL_LAYOUT_6POINT1_FRONT (AVS_CHANNEL_LAYOUT_6POINT0_FRONT|AvsChannelMask::MASK_SPEAKER_LOW_FREQUENCY) #define AVS_CHANNEL_LAYOUT_7POINT0 (AVS_CHANNEL_LAYOUT_5POINT0|AvsChannelMask::MASK_SPEAKER_BACK_LEFT|AvsChannelMask::MASK_SPEAKER_BACK_RIGHT) #define AVS_CHANNEL_LAYOUT_7POINT0_FRONT (AVS_CHANNEL_LAYOUT_5POINT0|AvsChannelMask::MASK_SPEAKER_FRONT_LEFT_OF_CENTER|AvsChannelMask::MASK_SPEAKER_FRONT_RIGHT_OF_CENTER) #define AVS_CHANNEL_LAYOUT_7POINT1 (AVS_CHANNEL_LAYOUT_5POINT1|AvsChannelMask::MASK_SPEAKER_BACK_LEFT|AvsChannelMask::MASK_SPEAKER_BACK_RIGHT) #define AVS_CHANNEL_LAYOUT_7POINT1_WIDE (AVS_CHANNEL_LAYOUT_5POINT1|AvsChannelMask::MASK_SPEAKER_FRONT_LEFT_OF_CENTER|AvsChannelMask::MASK_SPEAKER_FRONT_RIGHT_OF_CENTER) #define AVS_CHANNEL_LAYOUT_7POINT1_WIDE_BACK (AVS_CHANNEL_LAYOUT_5POINT1_BACK|AvsChannelMask::MASK_SPEAKER_FRONT_LEFT_OF_CENTER|AvsChannelMask::MASK_SPEAKER_FRONT_RIGHT_OF_CENTER) #define AVS_CHANNEL_LAYOUT_7POINT1_TOP_BACK (AVS_CHANNEL_LAYOUT_5POINT1_BACK|AvsChannelMask::MASK_SPEAKER_TOP_FRONT_LEFT|AvsChannelMask::MASK_SPEAKER_TOP_FRONT_RIGHT) #define AVS_CHANNEL_LAYOUT_OCTAGONAL (AVS_CHANNEL_LAYOUT_5POINT0|AvsChannelMask::MASK_SPEAKER_BACK_LEFT|AvsChannelMask::MASK_SPEAKER_BACK_CENTER|AvsChannelMask::MASK_SPEAKER_BACK_RIGHT) #define AVS_CHANNEL_LAYOUT_CUBE (AVS_CHANNEL_LAYOUT_QUAD|AvsChannelMask::MASK_SPEAKER_TOP_FRONT_LEFT|AvsChannelMask::MASK_SPEAKER_TOP_FRONT_RIGHT|AvsChannelMask::MASK_SPEAKER_TOP_BACK_LEFT|AvsChannelMask::MASK_SPEAKER_TOP_BACK_RIGHT) //#define AVS_CHANNEL_LAYOUT_HEXADECAGONAL (AVS_CHANNEL_LAYOUT_OCTAGONAL|AvsChannelMask::MASK_SPEAKER_WIDE_LEFT|AvsChannelMask::MASK_SPEAKER_WIDE_RIGHT|AvsChannelMask::MASK_SPEAKER_TOP_BACK_LEFT|AvsChannelMask::MASK_SPEAKER_TOP_BACK_RIGHT|AvsChannelMask::MASK_SPEAKER_TOP_BACK_CENTER|AvsChannelMask::MASK_SPEAKER_TOP_FRONT_CENTER|AvsChannelMask::MASK_SPEAKER_TOP_FRONT_LEFT|AvsChannelMask::MASK_SPEAKER_TOP_FRONT_RIGHT) //#define AVS_CHANNEL_LAYOUT_STEREO_DOWNMIX (AvsChannelMask::MASK_SPEAKER_STEREO_LEFT|AvsChannelMask::MASK_SPEAKER_STEREO_RIGHT) typedef struct ChannelLayoutDescriptor_t { int nb_channels; unsigned int mask; } ChannelLayoutDescriptor_t; #define AVS_CHANNEL_LAYOUT_MASK(nb, m) \ { (nb), (m) } // Common pre-defined channel layouts #define AVS_CHANNEL_LAYOUT_MASK_MONO AVS_CHANNEL_LAYOUT_MASK(1, AVS_CHANNEL_LAYOUT_MONO) #define AVS_CHANNEL_LAYOUT_MASK_STEREO AVS_CHANNEL_LAYOUT_MASK(2, AVS_CHANNEL_LAYOUT_STEREO) #define AVS_CHANNEL_LAYOUT_MASK_2POINT1 AVS_CHANNEL_LAYOUT_MASK(3, AVS_CHANNEL_LAYOUT_2POINT1) #define AVS_CHANNEL_LAYOUT_MASK_2_1 AVS_CHANNEL_LAYOUT_MASK(3, AVS_CHANNEL_LAYOUT_2_1) #define AVS_CHANNEL_LAYOUT_MASK_SURROUND AVS_CHANNEL_LAYOUT_MASK(3, AVS_CHANNEL_LAYOUT_SURROUND) #define AVS_CHANNEL_LAYOUT_MASK_3POINT1 AVS_CHANNEL_LAYOUT_MASK(4, AVS_CHANNEL_LAYOUT_3POINT1) #define AVS_CHANNEL_LAYOUT_MASK_4POINT0 AVS_CHANNEL_LAYOUT_MASK(4, AVS_CHANNEL_LAYOUT_4POINT0) #define AVS_CHANNEL_LAYOUT_MASK_4POINT1 AVS_CHANNEL_LAYOUT_MASK(5, AVS_CHANNEL_LAYOUT_4POINT1) #define AVS_CHANNEL_LAYOUT_MASK_2_2 AVS_CHANNEL_LAYOUT_MASK(4, AVS_CHANNEL_LAYOUT_2_2) #define AVS_CHANNEL_LAYOUT_MASK_QUAD AVS_CHANNEL_LAYOUT_MASK(4, AVS_CHANNEL_LAYOUT_QUAD) #define AVS_CHANNEL_LAYOUT_MASK_5POINT0 AVS_CHANNEL_LAYOUT_MASK(5, AVS_CHANNEL_LAYOUT_5POINT0) #define AVS_CHANNEL_LAYOUT_MASK_5POINT1 AVS_CHANNEL_LAYOUT_MASK(6, AVS_CHANNEL_LAYOUT_5POINT1) #define AVS_CHANNEL_LAYOUT_MASK_5POINT0_BACK AVS_CHANNEL_LAYOUT_MASK(5, AVS_CHANNEL_LAYOUT_5POINT0_BACK) #define AVS_CHANNEL_LAYOUT_MASK_5POINT1_BACK AVS_CHANNEL_LAYOUT_MASK(6, AVS_CHANNEL_LAYOUT_5POINT1_BACK) #define AVS_CHANNEL_LAYOUT_MASK_6POINT0 AVS_CHANNEL_LAYOUT_MASK(6, AVS_CHANNEL_LAYOUT_6POINT0) #define AVS_CHANNEL_LAYOUT_MASK_6POINT0_FRONT AVS_CHANNEL_LAYOUT_MASK(6, AVS_CHANNEL_LAYOUT_6POINT0_FRONT) #define AVS_CHANNEL_LAYOUT_MASK_HEXAGONAL AVS_CHANNEL_LAYOUT_MASK(6, AVS_CHANNEL_LAYOUT_HEXAGONAL) #define AVS_CHANNEL_LAYOUT_MASK_6POINT1 AVS_CHANNEL_LAYOUT_MASK(7, AVS_CHANNEL_LAYOUT_6POINT1) #define AVS_CHANNEL_LAYOUT_MASK_6POINT1_BACK AVS_CHANNEL_LAYOUT_MASK(7, AVS_CHANNEL_LAYOUT_6POINT1_BACK) #define AVS_CHANNEL_LAYOUT_MASK_6POINT1_FRONT AVS_CHANNEL_LAYOUT_MASK(7, AVS_CHANNEL_LAYOUT_6POINT1_FRONT) #define AVS_CHANNEL_LAYOUT_MASK_7POINT0 AVS_CHANNEL_LAYOUT_MASK(7, AVS_CHANNEL_LAYOUT_7POINT0) #define AVS_CHANNEL_LAYOUT_MASK_7POINT0_FRONT AVS_CHANNEL_LAYOUT_MASK(7, AVS_CHANNEL_LAYOUT_7POINT0_FRONT) #define AVS_CHANNEL_LAYOUT_MASK_7POINT1 AVS_CHANNEL_LAYOUT_MASK(8, AVS_CHANNEL_LAYOUT_7POINT1) #define AVS_CHANNEL_LAYOUT_MASK_7POINT1_WIDE AVS_CHANNEL_LAYOUT_MASK(8, AVS_CHANNEL_LAYOUT_7POINT1_WIDE) #define AVS_CHANNEL_LAYOUT_MASK_7POINT1_WIDE_BACK AVS_CHANNEL_LAYOUT_MASK(8, AVS_CHANNEL_LAYOUT_7POINT1_WIDE_BACK) #define AVS_CHANNEL_LAYOUT_MASK_7POINT1_TOP_BACK AVS_CHANNEL_LAYOUT_MASK(8, AVS_CHANNEL_LAYOUT_7POINT1_TOP_BACK) #define AVS_CHANNEL_LAYOUT_MASK_OCTAGONAL AVS_CHANNEL_LAYOUT_MASK(8, AVS_CHANNEL_LAYOUT_OCTAGONAL) #define AVS_CHANNEL_LAYOUT_MASK_CUBE AVS_CHANNEL_LAYOUT_MASK(8, AVS_CHANNEL_LAYOUT_CUBE) //#define AVS_CHANNEL_LAYOUT_MASK_HEXADECAGONAL AVS_CHANNEL_LAYOUT_MASK(16, AVS_CHANNEL_LAYOUT_HEXADECAGONAL) unsigned int av_get_channel_layout(const char* name); unsigned int GetDefaultChannelLayout(int nChannels); std::string channel_layout_to_str(const unsigned int channel_layout_mask); /******* Helper stuff *******/ #define MAX_SHORT (32767) #define MIN_SHORT (-32768) /* Conversion constants */ // We are using fixed point binary arithmetic here #define Nhc 8 // Number of bits for filter points #define Na 7 // Number of bits for interpolating between filter points #define Np (Nhc+Na) // Total number of bits to represent fractional phase #define Npc (1<>= scl; if (v>MAX_SHORT) return MAX_SHORT; else if (v < MIN_SHORT) return MIN_SHORT; else return (short)v; } static double Izero(double x); static void LpFilter(double c[], int N, double frq, double Beta, int Num); static int makeFilter(short Imp[], double &dLpScl, unsigned short Nwing, double Froll, double Beta); static int makeFilter(SFLOAT fImp[], double dLpScl, unsigned short Nwing, double Froll, double Beta); /******************************************************************** ********************************************************************/ class AssumeRate : public NonCachedGenericVideoFilter /** * Changes the sample rate of a clip **/ { public: AssumeRate(PClip _clip, int _rate); static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment*); }; class ConvertToMono : public GenericVideoFilter /** * Class to convert audio to mono **/ { public: ConvertToMono(PClip _clip); virtual ~ConvertToMono() {if (tempbuffer_size) {delete[] tempbuffer;tempbuffer_size=0;}} void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env); int __stdcall SetCacheHints(int cachehints, int frame_range); static PClip Create(PClip clip); static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment*); private: char *tempbuffer; int tempbuffer_size; int channels; }; class EnsureVBRMP3Sync : public GenericVideoFilter /** * Ensure VBR mp3 sync, by always reading audio sequencially. **/ { public: EnsureVBRMP3Sync(PClip _clip); void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env); int __stdcall SetCacheHints(int cachehints, int frame_range); static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env); private: int64_t last_end; }; class MergeChannels : public GenericVideoFilter /** * Class to convert two mono sources to stereo **/ { public: MergeChannels(PClip _clip, int _num_children, PClip* _child_array, IScriptEnvironment* env); ~MergeChannels(); void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env); int __stdcall SetCacheHints(int cachehints, int frame_range); static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment*); private: int* clip_channels; signed char** clip_offset; signed char *tempbuffer; PClip* child_array; const int num_children; int tempbuffer_size; }; class GetChannel : public GenericVideoFilter /** * Class to get left or right channel from stereo source **/ { public: GetChannel(PClip _clip, int* _channel, int numchannels); virtual ~GetChannel() { if (tempbuffer_size) {delete[] tempbuffer;tempbuffer_size=0;} if (channel) {delete[] channel; channel=0; } } void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env); int __stdcall SetCacheHints(int cachehints, int frame_range); static PClip Create_left(PClip clip); static PClip Create_right(PClip clip); static PClip Create_n(PClip clip, int* n, int numchannels); static AVSValue __cdecl Create_left(AVSValue args, void*, IScriptEnvironment*); static AVSValue __cdecl Create_right(AVSValue args, void*, IScriptEnvironment*); static AVSValue __cdecl Create_n(AVSValue args, void*, IScriptEnvironment* env); private: char *tempbuffer; int* channel; int tempbuffer_size; int numchannels; int cbps; int src_bps; int dst_bps; }; class KillVideo : public GenericVideoFilter /** * Removes audio from clip **/ { public: KillVideo(PClip _clip); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment*) { AVS_UNUSED(n); return NULL; }; static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment*); }; class KillAudio : public NonCachedGenericVideoFilter /** * Removes audio from clip **/ { public: KillAudio(PClip _clip); void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) { AVS_UNUSED(buf); AVS_UNUSED(start); AVS_UNUSED(count); AVS_UNUSED(env); }; static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment*); }; class SetChannelMask : public NonCachedGenericVideoFilter /** * Sets/remove Audio Channel Mask from VideoInfo **/ { public: SetChannelMask(PClip _clip, bool IsChannelMaskKnown, unsigned int dwChannelMask); static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment*); }; class DelayAudio : public GenericVideoFilter /** * Class to delay audio stream **/ { public: DelayAudio(double delay, PClip _child); void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env); static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env); private: const int64_t delay_samples; }; class Amplify : public GenericVideoFilter /** * Amplify a clip's audio track **/ { public: Amplify(PClip _child, float* _volumes, int* _i_v); ~Amplify(); void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env); static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env); static AVSValue __cdecl Create_dB(AVSValue args, void*, IScriptEnvironment* env); private: const float* volumes; const int* i_v; static __inline float dBtoScaleFactorf(float dB) { return powf(10.0f, dB/20.0f);}; }; class Normalize : public GenericVideoFilter /** * Normalize a clip's audio track **/ { public: Normalize(PClip _child, float _max_factor, bool _showvalues); void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env); int __stdcall SetCacheHints(int cachehints, int frame_range); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env); private: float max_factor; float max_volume; int frameno; bool showvalues; }; class MixAudio : public GenericVideoFilter /** * Mix audio from one clip into another. **/ { public: MixAudio(PClip _child, PClip _clip, double _track1_factor, double _track2_factor, IScriptEnvironment* env); void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env); int __stdcall SetCacheHints(int cachehints, int frame_range); static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env); virtual ~MixAudio() {if (tempbuffer_size) delete[] tempbuffer;tempbuffer_size=0;} private: PClip clip; signed char *tempbuffer; const int track1_factor, track2_factor; const float t1factor, t2factor; int tempbuffer_size; }; class ResampleAudio : public GenericVideoFilter /** * Class to resample the audio stream **/ { public: ResampleAudio(PClip _child, int _target_rate_n, int _target_rate_d, IScriptEnvironment* env); virtual ~ResampleAudio() { delete[] srcbuffer; delete[] fsrcbuffer; } void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env); int __stdcall SetCacheHints(int cachehints, int frame_range); static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env); enum { Nwing = 8192, Nmult = 65 }; // Number of filter points, (Nwing>>Nhc)*2+1 private: int64_t FilterUD(short *Xp, short Ph, short Inc); SFLOAT FilterUD(SFLOAT *Xp, short Ph, short Inc); const double factor; int Xoff, dtb, dhb; unsigned dtbe; int LpScl, mLpScl, mNhg; short* srcbuffer; SFLOAT* fsrcbuffer; int srcbuffer_size; bool skip_conversion; int64_t last_start, last_samples; union { // Share storage SFLOAT fImp[Nwing+1]; short Imp[Nwing+1]; }; }; #endif // __Audio_H__ ================================================ FILE: avs_core/core/avisynth.cpp ================================================ // Avisynth v2.6. Copyright 2002-2009 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include #include "../core/internal.h" #include "InternalEnvironment.h" #include "./parser/script.h" #include #include #include "strings.h" #include #include #include "bitblt.h" #include "FilterConstructor.h" #include "PluginManager.h" #include "../filters/conditional/conditional_reader.h" #include "MappedList.h" #include #include #include #include #include #include #define __STDC_FORMAT_MACROS #include #ifdef AVS_WINDOWS #include #include #else #include "avisynth_conf.h" #if defined(AVS_MACOS) #include #include #include #include #elif defined(AVS_BSD) #include #else #include #include #if defined(AVS_HAIKU) #include #else #include #endif #endif #include #endif #include #include #include #include #include "MTGuard.h" #include "cache.h" #include #include #include #include #include "FilterGraph.h" #include "DeviceManager.h" #include "AVSMap.h" #ifndef YieldProcessor // low power spin idle #define YieldProcessor() __nop(void) #endif class ScriptEnvironment; // forward /* Global Lock Manager */ class GlobalLockManager { public: // Get a named mutex. If it doesn't exist, it's created. static std::mutex& get_mutex(const std::string& name); // Track which environments hold which locks for cleanup. static void acquire_lock_for_env(const std::string& name, ScriptEnvironment* env); static void release_lock_for_env(const std::string& name, ScriptEnvironment* env); // Called when an IScriptEnvironment is destroyed. static void on_environment_exit(ScriptEnvironment* env); private: GlobalLockManager() = delete; ~GlobalLockManager() = delete; static std::map> s_namedMutexes; static std::mutex s_mutexMapLock; // Protects s_namedMutexes static std::map> s_envToHeldLocks; static std::mutex s_envLocksMapLock; // Protects s_envToHeldLocks }; std::map> GlobalLockManager::s_namedMutexes; std::mutex GlobalLockManager::s_mutexMapLock; std::map> GlobalLockManager::s_envToHeldLocks; std::mutex GlobalLockManager::s_envLocksMapLock; std::mutex& GlobalLockManager::get_mutex(const std::string& name) { std::lock_guard lock(s_mutexMapLock); if (s_namedMutexes.find(name) == s_namedMutexes.end()) { s_namedMutexes[name] = std::make_unique(); } return *s_namedMutexes[name]; } void GlobalLockManager::acquire_lock_for_env(const std::string& name, ScriptEnvironment* env) { std::lock_guard envLock(s_envLocksMapLock); s_envToHeldLocks[env].insert(name); } void GlobalLockManager::release_lock_for_env(const std::string& name, ScriptEnvironment* env) { std::lock_guard envLock(s_envLocksMapLock); if (s_envToHeldLocks.count(env)) { s_envToHeldLocks[env].erase(name); if (s_envToHeldLocks[env].empty()) { s_envToHeldLocks.erase(env); } } } void GlobalLockManager::on_environment_exit(ScriptEnvironment* env) { std::lock_guard envLock(s_envLocksMapLock); auto it = s_envToHeldLocks.find(env); if (it != s_envToHeldLocks.end()) { // Note: The actual mutexes are not unlocked here, only the tracking is cleared. // A truly stuck mutex requires more complex solutions (e.g., timed_mutex with recovery, // or ensuring threads exit gracefully). For Avisynth's use case, clearing the tracking // is important to prevent memory leaks in the map. // If it tried to call unlock() on a mutex held by another (potentially crashed) thread, // that would lead to undefined behavior.By simply removing the tracking entry, // we avoid this dangerous operation. s_envToHeldLocks.erase(it); } } extern const AVSFunction Audio_filters[], Combine_filters[], Convert_filters[], Convolution_filters[], Edit_filters[], Field_filters[], Focus_filters[], Fps_filters[], Histogram_filters[], Layer_filters[], Levels_filters[], Misc_filters[], Plugin_functions[], Resample_filters[], Resize_filters[], Script_functions[], Source_filters[], Text_filters[], Transform_filters[], Merge_filters[], Color_filters[], Debug_filters[], Turn_filters[], Conditional_filters[], Conditional_funtions_filters[], Cache_filters[], Greyscale_filters[], Swap_filters[], Overlay_filters[], Exprfilter_filters[], FilterGraph_filters[], Device_filters[] ; const AVSFunction* const builtin_functions[] = { Audio_filters, Combine_filters, Convert_filters, Convolution_filters, Edit_filters, Field_filters, Focus_filters, Fps_filters, Histogram_filters, Layer_filters, Levels_filters, Misc_filters, Resample_filters, Resize_filters, Script_functions, Source_filters, Text_filters, Transform_filters, Merge_filters, Color_filters, Debug_filters, Turn_filters, Conditional_filters, Conditional_funtions_filters, Plugin_functions, Cache_filters, Overlay_filters, Greyscale_filters, Swap_filters, FilterGraph_filters, Device_filters, Exprfilter_filters }; #if 0 // Global statistics counters struct { unsigned int CleanUps; unsigned int Losses; unsigned int PlanA1; unsigned int PlanA2; unsigned int PlanB; unsigned int PlanC; unsigned int PlanD; char tag[36]; } g_Mem_stats = { 0, 0, 0, 0, 0, 0, 0, "CleanUps, Losses, Plan[A1,A2,B,C,D]" }; #endif const _PixelClip PixelClip; #ifdef MSVC // Helper function to count set bits in the processor mask. template static uint32_t CountSetBits(T bitMask) { uint32_t LSHIFT = sizeof(T) * 8 - 1; uint32_t bitSetCount = 0; T bitTest = (T)1 << LSHIFT; uint32_t i; for (i = 0; i <= LSHIFT; ++i) { bitSetCount += ((bitMask & bitTest) ? 1 : 0); bitTest /= 2; } return bitSetCount; } #endif static size_t GetNumPhysicalCPUs() { #if defined(AVS_WINDOWS) #ifdef MSVC typedef BOOL(WINAPI* LPFN_GLPI)(PSYSTEM_LOGICAL_PROCESSOR_INFORMATION, PDWORD); LPFN_GLPI glpi; BOOL done = FALSE; PSYSTEM_LOGICAL_PROCESSOR_INFORMATION buffer = NULL; PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ptr = NULL; DWORD returnLength = 0; [[maybe_unused]] DWORD logicalProcessorCount = 0; [[maybe_unused]] DWORD numaNodeCount = 0; [[maybe_unused]] DWORD processorCoreCount = 0; [[maybe_unused]] DWORD processorL1CacheCount = 0; [[maybe_unused]] DWORD processorL2CacheCount = 0; [[maybe_unused]] DWORD processorL3CacheCount = 0; [[maybe_unused]] DWORD processorPackageCount = 0; DWORD byteOffset = 0; PCACHE_DESCRIPTOR Cache; glpi = (LPFN_GLPI)GetProcAddress( GetModuleHandle(TEXT("kernel32")), "GetLogicalProcessorInformation"); if (NULL == glpi) { // _tprintf(TEXT("\nGetLogicalProcessorInformation is not supported.\n")); return (0); } while (!done) { BOOL rc = glpi(buffer, &returnLength); if (FALSE == rc) { if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { if (buffer) free(buffer); buffer = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)malloc( returnLength); if (NULL == buffer) { // _tprintf(TEXT("\nError: Allocation failure\n")); return (0); } } else { // _tprintf(TEXT("\nError %d\n"), GetLastError()); return (0); } } else { done = TRUE; } } ptr = buffer; while (byteOffset + sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) <= returnLength) { switch (ptr->Relationship) { case RelationNumaNode: // Non-NUMA systems report a single record of this type. numaNodeCount++; break; case RelationProcessorCore: processorCoreCount++; // A hyperthreaded core supplies more than one logical processor. logicalProcessorCount += CountSetBits(ptr->ProcessorMask); break; case RelationCache: // Cache data is in ptr->Cache, one CACHE_DESCRIPTOR structure for each cache. Cache = &ptr->Cache; if (Cache->Level == 1) { processorL1CacheCount++; } else if (Cache->Level == 2) { processorL2CacheCount++; } else if (Cache->Level == 3) { processorL3CacheCount++; } break; case RelationProcessorPackage: // Logical processors share a physical package. processorPackageCount++; break; default: // _tprintf(TEXT("\nError: Unsupported LOGICAL_PROCESSOR_RELATIONSHIP value.\n")); return (0); } byteOffset += sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION); ptr++; } /* _tprintf(TEXT("\nGetLogicalProcessorInformation results:\n")); _tprintf(TEXT("Number of NUMA nodes: %d\n"), numaNodeCount); _tprintf(TEXT("Number of physical processor packages: %d\n"), processorPackageCount); _tprintf(TEXT("Number of processor cores: %d\n"), processorCoreCount); _tprintf(TEXT("Number of logical processors: %d\n"), logicalProcessorCount); _tprintf(TEXT("Number of processor L1/L2/L3 caches: %d/%d/%d\n"), processorL1CacheCount, processorL2CacheCount, processorL3CacheCount); */ free(buffer); return processorCoreCount; #else return 4; // TODO: GCC on Windows? #endif #elif defined(AVS_LINUX) std::set core_ids; for (auto& p : fs::directory_iterator("/sys/devices/system/cpu")) { if (!p.path().filename().string().rfind("cpu", 0)) { std::ifstream ifs(p.path() / "topology/core_id"); int core_id; if (ifs) { ifs >> core_id; if (ifs) core_ids.insert(core_id); } } } return core_ids.size(); #elif defined(AVS_MACOS) int cpu_cnt = 0; size_t cpu_cnt_size = sizeof(cpu_cnt); return sysctlbyname("hw.physicalcpu", &cpu_cnt, &cpu_cnt_size, NULL, 0) ? 0 : cpu_cnt; #else return 4; // AVS_BSD TODO #endif } #ifdef MSVC static std::string FormatString(const char* fmt, va_list args) { va_list args2; va_copy(args2, args); _locale_t locale = _create_locale(LC_NUMERIC, "C"); // decimal point: dot int count = _vscprintf_l(fmt, locale, args2); // don't use _vsnprintf_l(NULL, 0, fmt, locale, args) here, // it returns -1 instead of the buffer size under Wine (February, 2017) std::vector buf(count + 1); _vsnprintf_l(buf.data(), buf.size(), fmt, locale, args2); _free_locale(locale); va_end(args2); return std::string(buf.data()); } #else static std::string FormatString(const char* fmt, va_list args) { va_list args2; va_copy(args2, args); // There is no locale specific version of vsnprintf under Linux/gcc. // During program startup, the equivalent of setlocale(LC_ALL, "C") // is executed before any user code is run. But Avisynth is just a dll/shared object. // If the host program calls std::setlocale(LC_ALL, "") - typically in its 'main()' // then it sets current locale by the environment variables. // Unfortunately setlocale is not thread safe and modifies global state which // affects execution of locale-dependent functions, it is undefined behavior to call // it from one thread, while another thread is executing any of such functions (e.g. sprintf) // It can happen that a plugin sets setlocale(LC_ALL, ""). The effect is global, // other formatting functions in the same program will start using the new // (environment) setting. // One must set LC_NUMERIC part of the locale to "C" before the host executable, // to be sure that after such unsafe setlocale(LC_ALL, "") then formatting to dot // remains O.K. #if 0 // Finally we don't do that. Not 100% safe. std::string prev_loc = std::setlocale(LC_NUMERIC, nullptr); setlocale(LC_NUMERIC, "C"); // Set C locale for '.' and no thousand sep #endif int count = vsnprintf(NULL, 0, fmt, args); std::vector buf(count + 1); vsnprintf(buf.data(), buf.size(), fmt, args2); va_end(args2); #if 0 std::setlocale(LC_NUMERIC, prev_loc.c_str()); // Restore the previous locale. #endif return std::string(buf.data()); } #endif void* VideoFrame::operator new(size_t size) { return ::operator new(size); } VideoFrame::VideoFrame(VideoFrameBuffer* _vfb, AVSMap* avsmap, int _offset, int _pitch, int _row_size, int _height, int _pixel_type) : refcount(0), vfb(_vfb), offset(_offset), pitch(_pitch), row_size(_row_size), height(_height), offsetU(_offset), offsetV(_offset), pitchUV(0), row_sizeUV(0), heightUV(0), // PitchUV=0 so this doesn't take up additional space offsetA(0), pitchA(0), row_sizeA(0), properties(avsmap), pixel_type(_pixel_type) { InterlockedIncrement(&vfb->refcount); } VideoFrame::VideoFrame(VideoFrameBuffer* _vfb, AVSMap* avsmap, int _offset, int _pitch, int _row_size, int _height, int _offsetU, int _offsetV, int _pitchUV, int _row_sizeUV, int _heightUV, int _pixel_type) : refcount(0), vfb(_vfb), offset(_offset), pitch(_pitch), row_size(_row_size), height(_height), offsetU(_offsetU), offsetV(_offsetV), pitchUV(_pitchUV), row_sizeUV(_row_sizeUV), heightUV(_heightUV), offsetA(0), pitchA(0), row_sizeA(0), properties(avsmap), pixel_type(_pixel_type) { InterlockedIncrement(&vfb->refcount); } VideoFrame::VideoFrame(VideoFrameBuffer* _vfb, AVSMap* avsmap, int _offset, int _pitch, int _row_size, int _height, int _offsetU, int _offsetV, int _pitchUV, int _row_sizeUV, int _heightUV, int _offsetA, int _pixel_type) : refcount(0), vfb(_vfb), offset(_offset), pitch(_pitch), row_size(_row_size), height(_height), offsetU(_offsetU), offsetV(_offsetV), pitchUV(_pitchUV), row_sizeUV(_row_sizeUV), heightUV(_heightUV), offsetA(_offsetA), pitchA(_pitch), row_sizeA(_row_size), properties(avsmap), pixel_type(_pixel_type) { InterlockedIncrement(&vfb->refcount); } // Hack note: Use of Subframe will require an "InterlockedDecrement(&retval->refcount);" after // assignment to a PVideoFrame, the same as for a "New VideoFrame" to keep the refcount consistant. // P.F. ?? so far it works automatically VideoFrame* VideoFrame::Subframe(int rel_offset, int new_pitch, int new_row_size, int new_height) const { // Change planar color formats to Y-only, which is quasi-interleaved int new_pixel_type; if (pixel_type & VideoInfo::CS_PLANAR) new_pixel_type = VideoInfo::CS_GENERIC_Y | (pixel_type & VideoInfo::CS_Sample_Bits_Mask); else new_pixel_type = pixel_type; return new VideoFrame(vfb, new AVSMap(), offset + rel_offset, new_pitch, new_row_size, new_height, new_pixel_type); } VideoFrame* VideoFrame::Subframe(int rel_offset, int new_pitch, int new_row_size, int new_height, int rel_offsetU, int rel_offsetV, int new_pitchUV) const { // Maintain plane size relationship const int new_row_sizeUV = !row_size ? 0 : MulDiv(new_row_size, row_sizeUV, row_size); const int new_heightUV = !height ? 0 : MulDiv(new_height, heightUV, height); // Remove alpha from color format int new_pixel_type; if (pixel_type & VideoInfo::CS_YUVA) new_pixel_type = (pixel_type & ~VideoInfo::CS_YUVA) | VideoInfo::CS_YUV; else if (pixel_type & VideoInfo::CS_RGBA_TYPE) new_pixel_type = (pixel_type & ~VideoInfo::CS_RGBA_TYPE) | VideoInfo::CS_RGB_TYPE; else new_pixel_type = pixel_type; return new VideoFrame(vfb, new AVSMap(), offset + rel_offset, new_pitch, new_row_size, new_height, rel_offsetU + offsetU, rel_offsetV + offsetV, new_pitchUV, new_row_sizeUV, new_heightUV, new_pixel_type); } // alpha support VideoFrame* VideoFrame::Subframe(int rel_offset, int new_pitch, int new_row_size, int new_height, int rel_offsetU, int rel_offsetV, int new_pitchUV, int rel_offsetA) const { // Maintain plane size relationship const int new_row_sizeUV = !row_size ? 0 : MulDiv(new_row_size, row_sizeUV, row_size); const int new_heightUV = !height ? 0 : MulDiv(new_height, heightUV, height); return new VideoFrame(vfb, new AVSMap(), offset + rel_offset, new_pitch, new_row_size, new_height, offsetU + rel_offsetU, offsetV + rel_offsetV, new_pitchUV, new_row_sizeUV, new_heightUV, offsetA + rel_offsetA, pixel_type); } VideoFrameBuffer::VideoFrameBuffer() : data(nullptr), data_size(0), sequence_number(0), refcount(1), device(nullptr) { } VideoFrameBuffer::VideoFrameBuffer(int size, int margin, Device* device) : data(device->Allocate(size, margin)), data_size(size), sequence_number(0), refcount(0), device(device) { } VideoFrameBuffer::~VideoFrameBuffer() { DESTRUCTOR(); } void VideoFrameBuffer::DESTRUCTOR() { // _ASSERTE(refcount == 0); InterlockedIncrement(&sequence_number); // HACK: Notify any children with a pointer, this buffer has changed!!! if (data) device->Free(data); data = nullptr; // and mark it invalid!! data_size = 0; // and don't forget to set the size to 0 as well! device = nullptr; // no longer related to a device } class AtExiter { struct AtExitRec { const IScriptEnvironment::ShutdownFunc func; void* const user_data; AtExitRec* const next; AtExitRec(IScriptEnvironment::ShutdownFunc _func, void* _user_data, AtExitRec* _next) : func(_func), user_data(_user_data), next(_next) {} }; AtExitRec* atexit_list; public: AtExiter() { atexit_list = 0; } void Add(IScriptEnvironment::ShutdownFunc f, void* d) { atexit_list = new AtExitRec(f, d, atexit_list); } void Execute(IScriptEnvironment* env) { while (atexit_list) { AtExitRec* next = atexit_list->next; atexit_list->func(atexit_list->user_data, env); delete atexit_list; atexit_list = next; } } }; static std::string NormalizeString(const std::string& str) { // lowercase std::string ret = str; for (size_t i = 0; i < ret.size(); ++i) ret[i] = tolower(ret[i]); // trim trailing spaces size_t endpos = ret.find_last_not_of(" \t"); if (std::string::npos != endpos) ret = ret.substr(0, endpos + 1); // trim leading spaces size_t startpos = ret.find_first_not_of(" \t"); if (std::string::npos != startpos) ret = ret.substr(startpos); return ret; } typedef enum class _MtWeight { MT_WEIGHT_0_DEFAULT, MT_WEIGHT_1_USERSPEC, MT_WEIGHT_2_USERFORCE, MT_WEIGHT_MAX } MtWeight; class ClipDataStore { public: // The clip instance that we hold data for. IClip* Clip = nullptr; // Clip was created directly by an Invoke() call bool CreatedByInvoke = false; ClipDataStore(IClip* clip) : Clip(clip) {}; }; class MtModeEvaluator { public: int NumChainedNice = 0; int NumChainedMulti = 0; int NumChainedSerial = 0; MtMode GetFinalMode(MtMode topInvokeMode) { if (NumChainedSerial > 0) { return MT_SERIALIZED; } else if (NumChainedMulti > 0) { if (MT_SERIALIZED == topInvokeMode) { return MT_SERIALIZED; } else { return MT_MULTI_INSTANCE; } } else { return topInvokeMode; } } void Accumulate(const MtModeEvaluator& other) { NumChainedNice += other.NumChainedNice; NumChainedMulti += other.NumChainedMulti; NumChainedSerial += other.NumChainedSerial; } void Accumulate(MtMode mode) { switch (mode) { case MT_NICE_FILTER: ++NumChainedNice; break; case MT_MULTI_INSTANCE: ++NumChainedMulti; break; case MT_SERIALIZED: ++NumChainedSerial; break; default: assert(0); break; } } static bool ClipSpecifiesMtMode(const PClip& clip) { int val = clip->SetCacheHints(CACHE_GET_MTMODE, 0); return (clip->GetVersion() >= 5) && (val > MT_INVALID) && (val < MT_MODE_COUNT); } static MtMode GetInstanceMode(const PClip& clip, MtMode defaultMode) { return ClipSpecifiesMtMode(clip) ? (MtMode)clip->SetCacheHints(CACHE_GET_MTMODE, 0) : defaultMode; } static MtMode GetInstanceMode(const PClip& clip) { return (MtMode)clip->SetCacheHints(CACHE_GET_MTMODE, 0); } static MtMode GetMtMode(const PClip& clip, const Function* invokeCall, const InternalEnvironment* env) { bool invokeModeForced; MtMode invokeMode = env->GetFilterMTMode(invokeCall, &invokeModeForced); if (invokeModeForced) { return invokeMode; } bool hasInstanceMode = ClipSpecifiesMtMode(clip); if (hasInstanceMode) { return GetInstanceMode(clip); } else { return invokeMode; } } static bool UsesDefaultMtMode(const PClip& clip, const Function* invokeCall, const InternalEnvironment* env) { return !ClipSpecifiesMtMode(clip) && !env->FilterHasMtMode(invokeCall); } void AddChainedFilter(const PClip& clip, MtMode defaultMode) { MtMode mode = GetInstanceMode(clip, defaultMode); Accumulate(mode); } }; OneTimeLogTicket::OneTimeLogTicket(ELogTicketType type) : _type(type) {} OneTimeLogTicket::OneTimeLogTicket(ELogTicketType type, const Function* func) : _type(type), _function(func) {} OneTimeLogTicket::OneTimeLogTicket(ELogTicketType type, const std::string& str) : _type(type), _string(str) {} bool OneTimeLogTicket::operator==(const OneTimeLogTicket& other) const { return (_type == other._type) && (_function == other._function) && (_string.compare(other._string) == 0); } namespace std { template <> struct hash { std::size_t operator()(const OneTimeLogTicket& k) const { // TODO: This is a pretty poor combination function for hashes. // Find something better than a simple XOR. return hash()(k._type) ^ hash()((void*)k._function) ^ hash()((std::string)k._string); } }; } #include "vartable.h" #include "ThreadPool.h" #include #include #include #include #include "Prefetcher.h" #include "BufferPool.h" #include "ScriptEnvironmentTLS.h" class ThreadScriptEnvironment; // order is not important, unlike in IScriptEnvironment variants. class ScriptEnvironment { public: ScriptEnvironment(); void CheckVersion(int version); int GetCPUFlags(); int64_t GetCPUFlagsEx(); void AddFunction(const char* name, const char* params, INeoEnv::ApplyFunc apply, void* user_data = 0); void AddFunction25(const char* name, const char* params, INeoEnv::ApplyFunc apply, void* user_data = 0); void AddFunctionPreV11C(const char* name, const char* params, INeoEnv::ApplyFunc apply, void* user_data = 0); bool FunctionExists(const char* name); PVideoFrame NewVideoFrameOnDevice(const VideoInfo& vi, int align, Device* device); PVideoFrame NewVideoFrameOnDevice(int row_size, int height, int align, int pixel_type, Device* device); PVideoFrame NewVideoFrame(const VideoInfo& vi, const PDevice& device); // variant #3, with frame property source PVideoFrame NewVideoFrameOnDevice(const VideoInfo& vi, int align, Device* device, const PVideoFrame *prop_src); // variant #1, with frame property source PVideoFrame NewVideoFrameOnDevice(int row_size, int height, int align, int pixel_type, Device* device, const PVideoFrame* prop_src); // variant #2, with frame property source PVideoFrame NewVideoFrame(const VideoInfo& vi, const PDevice& device, const PVideoFrame* prop_src); PVideoFrame NewPlanarVideoFrame(int row_size, int height, int row_sizeUV, int heightUV, int align, bool U_first, int pixel_type, Device* device); bool MakeWritable(PVideoFrame* pvf); void BitBlt(BYTE* dstp, int dst_pitch, const BYTE* srcp, int src_pitch, int row_size, int height); void AtExit(IScriptEnvironment::ShutdownFunc function, void* user_data); PVideoFrame Subframe(PVideoFrame src, int rel_offset, int new_pitch, int new_row_size, int new_height); int SetMemoryMax(int mem); int SetWorkingDir(const char* newdir); bool AcquireGlobalLock(const char* name); void ReleaseGlobalLock(const char* name); AVSC_CC ~ScriptEnvironment(); void* ManageCache(int key, void* data); bool PlanarChromaAlignment(IScriptEnvironment::PlanarChromaAlignmentMode key); PVideoFrame SubframePlanar(PVideoFrame src, int rel_offset, int new_pitch, int new_row_size, int new_height, int rel_offsetU, int rel_offsetV, int new_pitchUV); void DeleteScriptEnvironment(); void ApplyMessage(PVideoFrame* frame, const VideoInfo& vi, const char* message, int size, int textcolor, int halocolor, int bgcolor); void ApplyMessageEx(PVideoFrame* frame, const VideoInfo& vi, const char* message, int size, int textcolor, int halocolor, int bgcolor, bool utf8); const AVS_Linkage* GetAVSLinkage(); // alpha support PVideoFrame NewPlanarVideoFrame(int row_size, int height, int row_sizeUV, int heightUV, int align, bool U_first, bool alpha, int pixel_type, Device* device); PVideoFrame SubframePlanar(PVideoFrame src, int rel_offset, int new_pitch, int new_row_size, int new_height, int rel_offsetU, int rel_offsetV, int new_pitchUV, int rel_offsetA); PVideoFrame SubframePlanarA(PVideoFrame src, int rel_offset, int new_pitch, int new_row_size, int new_height, int rel_offsetU, int rel_offsetV, int new_pitchUV, int rel_offsetA); void copyFrameProps(const PVideoFrame& src, PVideoFrame& dst); const AVSMap* getFramePropsRO(const PVideoFrame& frame) AVS_NOEXCEPT; AVSMap* getFramePropsRW(PVideoFrame& frame) AVS_NOEXCEPT; int propNumKeys(const AVSMap* map) AVS_NOEXCEPT; const char* propGetKey(const AVSMap* map, int index) AVS_NOEXCEPT; int propNumElements(const AVSMap* map, const char* key) AVS_NOEXCEPT; char propGetType(const AVSMap* map, const char* key) AVS_NOEXCEPT; int propDeleteKey(AVSMap* map, const char* key) AVS_NOEXCEPT; int64_t propGetInt(const AVSMap* map, const char* key, int index, int* error) AVS_NOEXCEPT; int propGetIntSaturated(const AVSMap* map, const char* key, int index, int* error) AVS_NOEXCEPT; double propGetFloat(const AVSMap* map, const char* key, int index, int* error) AVS_NOEXCEPT; float propGetFloatSaturated(const AVSMap* map, const char* key, int index, int* error) AVS_NOEXCEPT; const char* propGetData(const AVSMap* map, const char* key, int index, int* error) AVS_NOEXCEPT; int propGetDataSize(const AVSMap* map, const char* key, int index, int* error) AVS_NOEXCEPT; int propGetDataTypeHint(const AVSMap* map, const char* key, int index, int* error) AVS_NOEXCEPT; PClip propGetClip(const AVSMap* map, const char* key, int index, int* error) AVS_NOEXCEPT; const PVideoFrame propGetFrame(const AVSMap* map, const char* key, int index, int* error) AVS_NOEXCEPT; int propSetInt(AVSMap* map, const char* key, int64_t i, int append) AVS_NOEXCEPT; int propSetFloat(AVSMap* map, const char* key, double d, int append) AVS_NOEXCEPT; int propSetData(AVSMap* map, const char* key, const char* d, int length, int append) AVS_NOEXCEPT; int propSetDataH(AVSMap* map, const char* key, const char* d, int length, int type, int append) AVS_NOEXCEPT; int propSetClip(AVSMap* map, const char* key, PClip& clip, int append) AVS_NOEXCEPT; int propSetFrame(AVSMap* map, const char* key, const PVideoFrame& frame, int append) AVS_NOEXCEPT; const int64_t* propGetIntArray(const AVSMap* map, const char* key, int* error) AVS_NOEXCEPT; const double* propGetFloatArray(const AVSMap* map, const char* key, int* error) AVS_NOEXCEPT; int propSetIntArray(AVSMap* map, const char* key, const int64_t* i, int size) AVS_NOEXCEPT; int propSetFloatArray(AVSMap* map, const char* key, const double* d, int size) AVS_NOEXCEPT; AVSMap* createMap() AVS_NOEXCEPT; void freeMap(AVSMap* map) AVS_NOEXCEPT; void clearMap(AVSMap* map) AVS_NOEXCEPT; PVideoFrame NewVideoFrame(const VideoInfo& vi, const PVideoFrame* prop_src, int align = FRAME_ALIGN); bool MakePropertyWritable(PVideoFrame* pvf); // V9 /* IScriptEnvironment2 */ bool LoadPlugin(const char* filePath, bool throwOnError, AVSValue *result); void AddAutoloadDir(const char* dirPath, bool toFront); void ClearAutoloadDirs(); void AutoloadPlugins(); void AddFunction(const char* name, const char* params, INeoEnv::ApplyFunc apply, void* user_data, const char *exportVar); bool InternalFunctionExists(const char* name); void AdjustMemoryConsumption(size_t amount, bool minus); void SetFilterMTMode(const char* filter, MtMode mode, bool force); void SetFilterMTMode(const char* filter, MtMode mode, MtWeight weight); void SetFilterProp(const char* filter, const char* key, const AVSValue& value, int mode); void SetFilterPropConditional(const char* filter, const char* param_name, const AVSValue& param_match, const char* key, const AVSValue& value, int mode); const char* GetFilterProps(); void SetFilterPropPassthrough(const char* filter); MtMode GetFilterMTMode(const Function* filter, bool* is_forced) const; void ParallelJob(ThreadWorkerFuncPtr jobFunc, void* jobData, IJobCompletion* completion); IJobCompletion* NewCompletion(size_t capacity); size_t GetEnvProperty(AvsEnvProperty prop); ClipDataStore* ClipData(IClip* clip); MtMode GetDefaultMtMode() const; bool FilterHasMtMode(const Function* filter) const; void SetLogParams(const char* target, int level); void LogMsg(int level, const char* fmt, ...); void LogMsg_valist(int level, const char* fmt, va_list va); void LogMsgOnce(const OneTimeLogTicket& ticket, int level, const char* fmt, ...); void LogMsgOnce_valist(const OneTimeLogTicket& ticket, int level, const char* fmt, va_list va); void SetMaxCPU(const char *features); // fixme: why is here InternalEnvironment? /* INeoEnv */ bool Invoke_(AVSValue *result, const AVSValue& implicit_last, const char* name, const Function *f, const AVSValue& args, const char* const* arg_names, InternalEnvironment* env_thread, bool is_runtime); PDevice GetDevice(AvsDeviceType device_type, int device_index) const; int SetMemoryMax(AvsDeviceType type, int index, int mem); PVideoFrame GetOnDeviceFrame(const PVideoFrame& src, Device* device); void ParallelJob(ThreadWorkerFuncPtr jobFunc, void* jobData, IJobCompletion* completion, InternalEnvironment *env); ThreadPool* NewThreadPool(size_t nThreads); void SetGraphAnalysis(bool enable) { graphAnalysisEnable = enable; } char* ListAutoloadDirs(); void IncEnvCount() { InterlockedIncrement(&EnvCount); } void DecEnvCount() { InterlockedDecrement(&EnvCount); } ConcurrentVarStringFrame* GetTopFrame() { return &top_frame; } void SetCacheMode(CacheMode mode) { cacheMode = mode; } CacheMode GetCacheMode() { return cacheMode; } void SetDeviceOpt(DeviceOpt opt, int val); size_t GetInvokeStackSize() { return invoke_stack.size(); } void UpdateFunctionExports(const char* funcName, const char* funcParams, const char* exportVar); // public, AVSMap error should access void ThrowError(const char* fmt, ...); ThreadScriptEnvironment* GetMainThreadEnv() { return threadEnv.get(); } class VFBStorage : public VideoFrameBuffer { public: std::atomic last_freed_timestamp; int free_count; int margin; PGraphMemoryNode memory_node; // Helper to update VFB timestamp from external code static void UpdateVFBFreeTimestamp(VideoFrameBuffer* vfb) { static std::atomic global_free_counter{ 0 }; static_cast(vfb)->last_freed_timestamp = ++global_free_counter; } VFBStorage() : VideoFrameBuffer(), free_count(0), margin(0) { } VFBStorage(int size, int margin, Device* device) : VideoFrameBuffer(size, margin, device), free_count(0), margin(margin) { } void Attach(FilterGraphNode* node) { if (memory_node) { memory_node->OnFree(data_size, device); memory_node = nullptr; } if (node != nullptr) { memory_node = node->GetMemoryNode(); memory_node->OnAllocate(data_size, device); } } ~VFBStorage() { if (memory_node) { memory_node->OnFree(data_size, device); memory_node = nullptr; } #ifdef _DEBUG if (data && (device->device_type == DEV_TYPE_CPU)) { // check buffer overrun int* pInt = (int*)(data + margin + data_size); if (pInt[0] != 0xDEADBEEF || pInt[1] != 0xDEADBEEF || pInt[2] != 0xDEADBEEF || pInt[3] != 0xDEADBEEF) { printf("Buffer overrun!!!\n"); } } #endif } }; private: typedef IScriptEnvironment::NotFound NotFound; typedef IScriptEnvironment::ApplyFunc ApplyFunc; // Tritical May 2005 // Note order here!! // AtExiter has functions which // rely on StringDump elements. ConcurrentVarStringFrame top_frame; std::unique_ptr threadEnv; std::mutex string_mutex; AtExiter at_exit; ThreadPool* thread_pool; PluginManager* plugin_manager; std::recursive_mutex plugin_mutex; long EnvCount; // for ThreadScriptEnvironment leak detection void VThrowError(const char* fmt, va_list va); const Function* Lookup(const char* search_name, const AVSValue* args, size_t num_args, bool &pstrict, size_t args_names_count, const char* const* arg_names, IScriptEnvironment2* env_thread); bool CheckArguments(const Function* f, const AVSValue* args, size_t num_args, bool &pstrict, size_t args_names_count, const char* const* arg_names); std::unordered_map clip_data; void ExportBuiltinFilters(); bool PlanarChromaAlignmentState; long hrfromcoinit; uint32_t coinitThreadId; struct DebugTimestampedFrame { VideoFrame* frame; #ifdef _DEBUG std::chrono::time_point timestamp; #endif DebugTimestampedFrame(VideoFrame* _frame) : frame(_frame) #ifdef _DEBUG , timestamp(std::chrono::high_resolution_clock::now()) #endif {} }; typedef std::vector VideoFrameArrayType; typedef std::map FrameBufferRegistryType; typedef std::map FrameRegistryType2; // post r1825 P.F. typedef mapped_list CacheRegistryType; FrameRegistryType2 FrameRegistry2; // P.F. #ifdef _DEBUG void ListFrameRegistry(size_t min_size, size_t max_size, bool someframes); #endif std::unique_ptr Devices; CacheRegistryType CacheRegistry; AvsCache* FrontCache; VideoFrame* GetNewFrame(size_t vfb_size, size_t margin, Device* device); VideoFrame* GetFrameFromRegistry(size_t vfb_size, Device* device); void RegisterSubFrameInRegistry(size_t vfb_size, VideoFrameBuffer* vfb, VideoFrame* new_frame); void ShrinkCache(Device* device); VideoFrame* AllocateFrame(size_t vfb_size, size_t margin, Device* device); std::recursive_mutex memory_mutex; std::recursive_mutex invoke_mutex; // 3.7.2 // 3.7.2: // Distinct invoke mutex from memory_mutex because a background GetFrame and Invoke would deadlock // when called specially by AvsPMod: Eval, then the resulting clip variable is ConvertToRGB32'd // by using Invoke. // // GetFrame can require accessing FrameRegistry (NewVideoFrame). // When an Clip is obtained from Eval which script has e.g. Prefetch(2) at the end then it runs // worker threads in the background, doing GetFrame calls. // When this AVS Clip is further ConvertToYUV444'd (using Invoke) it calles GetFrame(0) in its // constructor for getting frame properties and prepare the filter upon them. (this is not a real // frame property but rather a clip property which is the same for all frames, we are using frame#0 for // frame property source. // // Two things are running parallel: // - a GetFrame from Invoke which holds a memory_mutex, then locks a MT_SERIALIZED mutex. // - a GetFrame from the prefetcher of the already Eval'd Clip which first holds a // MT_SERIALIZED mutex then may lock a memory_mutex. // Finally they deadlock on the source filter's ChildFilter MT guard (MtGuard::GetFrame, MT_SERIALIZED). // Serialized access from prefetch // - gets a ChildFilter mutex, calls GetFrame which would require memory_mutex (NewVideoFrame). // Serialized access from Invoke // - _Invoke locks the memory_mutex, then would obtain ChildFilter mutex. // // Under specific timing conditions which surely happens in tenth of seconds we get deadlock. // // Solution: a new invoke_mutex is introduced besides memory_mutex. // Other sub-tasks are already guarded with other mutexes: e.g. plugin_mutex, string_mutex. // Note: An earlier attempt to avoid this problem was introducing // int ScriptEnvironment::suppressThreadCount; (GetSuppressThreadCount) // "Concurrent GetFrame with Invoke causes deadlock. // Increment this variable when Invoke running // to prevent submitting job to threadpool" // But this cannot handle the above mentioned case, because by that time threadpool is already working. int frame_align; int plane_align; //BufferPool BufferPool; typedef std::vector MTGuardRegistryType; MTGuardRegistryType MTGuardRegistry; std::vector > ThreadPoolRegistry; size_t nTotalThreads; size_t nMaxFilterInstances; // Members used to reconstruct Association between Invoke() calls and filter instances std::stack invoke_stack; // MT mode specifications std::unordered_map> MtMap; MtMode DefaultMtMode = MtMode::MT_MULTI_INSTANCE; static const std::string DEFAULT_MODE_SPECIFIER; // Auto filter-property injection struct PropEntry { std::string key; // frame property key to inject AVSValue value; // int, float, string, function, or undefined (capture from named arg) int mode; // AVSPropAppendMode std::string param_name; // if non-empty: only inject when named call arg 'param_name' == param_match AVSValue param_match; // the value to compare against (only used when param_name is non-empty) }; std::unordered_map> FilterPropMap; std::unordered_set FilterPropPassthroughSet; // filters that need input-prop forwarding // Logging-related members int LogLevel; std::string LogTarget; std::ofstream LogFileStream; std::unordered_set LogTickets; // filter graph bool graphAnalysisEnable; typedef std::vector GraphNodeRegistryType; GraphNodeRegistryType GraphNodeRegistry; CacheMode cacheMode; int64_t cpuFlagsEx; // extended 64 bits CPU flags size_t cache_size_L2; void InitMT(); }; #ifdef ALTERNATIVE_VFB_TIMESTAMP // wrapper for VideoFrameBuffer destroy namespace VFBHelper { void UpdateVFBFreeTimestamp(VideoFrameBuffer* vfb) { ScriptEnvironment::VFBStorage::UpdateVFBFreeTimestamp(vfb); } } #endif const std::string ScriptEnvironment::DEFAULT_MODE_SPECIFIER = "DEFAULT_MT_MODE"; // Only ThrowError and Sprintf is implemented(Used by destructor) class MinimumScriptEnvironment : public IScriptEnvironment { VarTable var_table; public: MinimumScriptEnvironment(ConcurrentVarStringFrame* top_frame) : var_table(top_frame) { } virtual ~MinimumScriptEnvironment() {} virtual int __stdcall GetCPUFlags() { throw AvisynthError("Not Implemented"); } virtual char* __stdcall SaveString(const char* s, int length = -1) { return var_table.SaveString(s, length); } virtual char* Sprintf(const char* fmt, ...) { va_list val; va_start(val, fmt); char* result = VSprintf(fmt, val); va_end(val); return result; } virtual char* __stdcall VSprintf(const char* fmt, va_list val) { try { std::string str = FormatString(fmt, val); return var_table.SaveString(str.c_str(), int(str.size())); // SaveString will add the NULL in len mode. } catch (...) { return NULL; } } __declspec(noreturn) virtual void ThrowError(const char* fmt, ...) { va_list val; va_start(val, fmt); VThrowError(fmt, val); va_end(val); // Compiler doesn't recognize that the function would not return. // With this line we are satisfying the noreturn attribute. // Anyway, this is unreachable code. std::terminate(); } void __stdcall VThrowError(const char* fmt, va_list va) { std::string msg; try { msg = FormatString(fmt, va); } catch (...) { msg = "Exception while processing ScriptEnvironment::ThrowError()."; } // Throw... throw AvisynthError(var_table.SaveString(msg.c_str())); } virtual void __stdcall AddFunction(const char* name, const char* params, ApplyFunc apply, void* user_data) { throw AvisynthError("Not Implemented"); } virtual bool __stdcall FunctionExists(const char* name) { throw AvisynthError("Not Implemented"); } virtual AVSValue __stdcall Invoke(const char* name, const AVSValue args, const char* const* arg_names = 0) { throw AvisynthError("Not Implemented"); } virtual AVSValue __stdcall GetVar(const char* name) { throw AvisynthError("Not Implemented"); } virtual bool __stdcall SetVar(const char* name, const AVSValue& val) { throw AvisynthError("Not Implemented"); } virtual bool __stdcall SetGlobalVar(const char* name, const AVSValue& val) { throw AvisynthError("Not Implemented"); } virtual void __stdcall PushContext(int level = 0) { throw AvisynthError("Not Implemented"); } virtual void __stdcall PopContext() { throw AvisynthError("Not Implemented"); } virtual PVideoFrame __stdcall NewVideoFrame(const VideoInfo& vi, int align = FRAME_ALIGN) { throw AvisynthError("Not Implemented"); } virtual bool __stdcall MakeWritable(PVideoFrame* pvf) { throw AvisynthError("Not Implemented"); } virtual void __stdcall BitBlt(BYTE* dstp, int dst_pitch, const BYTE* srcp, int src_pitch, int row_size, int height) { throw AvisynthError("Not Implemented"); } virtual void __stdcall AtExit(ShutdownFunc function, void* user_data) { throw AvisynthError("Not Implemented"); } virtual void __stdcall CheckVersion(int version = AVISYNTH_INTERFACE_VERSION) { throw AvisynthError("Not Implemented"); } virtual PVideoFrame __stdcall Subframe(PVideoFrame src, int rel_offset, int new_pitch, int new_row_size, int new_height) { throw AvisynthError("Not Implemented"); } virtual int __stdcall SetMemoryMax(int mem) { throw AvisynthError("Not Implemented"); } virtual int __stdcall SetWorkingDir(const char * newdir) { throw AvisynthError("Not Implemented"); } virtual void* __stdcall ManageCache(int key, void* data) { throw AvisynthError("Not Implemented"); } virtual bool __stdcall PlanarChromaAlignment(PlanarChromaAlignmentMode key) { throw AvisynthError("Not Implemented"); } virtual PVideoFrame __stdcall SubframePlanar(PVideoFrame src, int rel_offset, int new_pitch, int new_row_size, int new_height, int rel_offsetU, int rel_offsetV, int new_pitchUV) { throw AvisynthError("Not Implemented"); } virtual void __stdcall DeleteScriptEnvironment() { throw AvisynthError("Not Implemented"); } virtual void __stdcall ApplyMessage(PVideoFrame* frame, const VideoInfo& vi, const char* message, int size, int textcolor, int halocolor, int bgcolor) { throw AvisynthError("Not Implemented"); } virtual const AVS_Linkage* __stdcall GetAVSLinkage() { throw AvisynthError("Not Implemented"); } virtual AVSValue __stdcall GetVarDef(const char* name, const AVSValue& def = AVSValue()) { throw AvisynthError("Not Implemented"); } }; /* --------------------------------------------------------------------------------- * Interface transformation hack * --------------------------------------------------------------------------------- */ InternalEnvironment* GetAndRevealCamouflagedEnv(IScriptEnvironment* env) { InternalEnvironment* IEnv; // This function is called from CacheGuard::GetFrame/GetAudio, Prefetcher::GetFrame/GetAudio, // ScriptClip::GetFrame, ConditionalFilter::GetFrame, and other runtime filters. // When GetFrame is called from an AviSynth C++ 2.5 or PreV11C plugin constructor (xx_Create), // or such a plugin is inside a runtime function, then // 'env' is a disguised IScriptEnvironment_Avs25/AvsPreV11C, which we cannot // static_cast to InternalEnvironment directly. // We need to determine whether the environment is v2.5/PreV11C and act accordingly. if (env->ManageCache((int)MC_QueryAvs25, nullptr) == (intptr_t*)1) { IEnv = static_cast(reinterpret_cast(env)); } else if (env->ManageCache((int)MC_QueryAvsPreV11C, nullptr) == (intptr_t*)1) { IEnv = static_cast(reinterpret_cast(env)); } else { IEnv = static_cast(env); } return IEnv; } /* --------------------------------------------------------------------------------- * Per thread data * --------------------------------------------------------------------------------- */ struct ScriptEnvironmentTLS { const int thread_id; // PF 161223 why do we need thread-local global variables? // comment remains here until it gets cleared, anyway, I make it of no use VarTable var_table; BufferPool buffer_pool; Device* currentDevice; bool closing; // Used to avoid deadlock, if vartable is being accessed while shutting down (Popcontext) bool supressCaching; int ImportDepth; int getFrameRecursiveCount; // Concurrent GetFrame with Invoke causes deadlock. // Increment this variable when Invoke running // to prevent submitting job to threadpool int suppressThreadCount; FilterGraphNode* currentGraphNode; volatile long refcount; ScriptEnvironmentTLS(int thread_id, InternalEnvironment* core) : thread_id(thread_id) , var_table(core->GetTopFrame()) , buffer_pool(core) , currentDevice(NULL) , closing(false) , supressCaching(false) , ImportDepth(0) , getFrameRecursiveCount(0) , suppressThreadCount(0) , currentGraphNode(nullptr) , refcount(1) { } }; // per thread data is bound to a thread (not ThreadScriptEnvironment) // since some filter (e.g. svpflow1) ignores env given for GetFrame, and always use main thread's env. // this is a work-around for that. #if defined(AVS_WINDOWS) && !defined(__GNUC__) # ifdef XP_TLS extern DWORD dwTlsIndex; # else // does not work on XP when DLL is dynamic loaded. see dwTlsIndex instead __declspec(thread) ScriptEnvironmentTLS* g_TLS = nullptr; # endif #else __thread ScriptEnvironmentTLS* g_TLS = nullptr; #endif class ThreadScriptEnvironment : public InternalEnvironment { ScriptEnvironment* core; ScriptEnvironmentTLS* coreTLS; ScriptEnvironmentTLS myTLS; public: ThreadScriptEnvironment(int thread_id, ScriptEnvironment* core, ScriptEnvironmentTLS* coreTLS) : core(core) , coreTLS(coreTLS) , myTLS(thread_id, this) { if (coreTLS == nullptr) { // when this is main thread TLS this->coreTLS = &myTLS; } if (thread_id != 0) { // thread pool thread #ifdef XP_TLS ScriptEnvironmentTLS* g_TLS = (ScriptEnvironmentTLS*)(TlsGetValue(dwTlsIndex)); #endif if (g_TLS != nullptr) { ThrowError("Detected multiple ScriptEnvironmentTLSs for a single thread"); } g_TLS = &myTLS; #ifdef XP_TLS if (!TlsSetValue(dwTlsIndex, g_TLS)) { ThrowError("Could not store thread local value for ScriptEnvironmentTLS"); } #endif } core->IncEnvCount(); // for leak detection } ~ThreadScriptEnvironment() { core->DecEnvCount(); // for leak detection } ScriptEnvironmentTLS* GetTLS() { return &myTLS; } #ifdef XP_TLS // a ? : b, evaluate 'a' only once #define IFNULL(a, b) ([&](){ auto val = (a); return ((val) == nullptr ? (b) : (val)); }()) #define DISPATCH(name) IFNULL((ScriptEnvironmentTLS*)(TlsGetValue(dwTlsIndex)), coreTLS)->name #else #define DISPATCH(name) (g_TLS ? g_TLS : coreTLS)->name #endif AVSValue __stdcall GetVar(const char* name) { if (DISPATCH(closing)) return AVSValue(); // We easily risk being inside the critical section below, while deleting variables. AVSValue val; if (DISPATCH(var_table).Get(name, &val)) return val; else throw IScriptEnvironment::NotFound(); } bool __stdcall SetVar(const char* name, const AVSValue& val) { if (DISPATCH(closing)) return true; // We easily risk being inside the critical section below, while deleting variables. return DISPATCH(var_table).Set(name, val); } bool __stdcall SetGlobalVar(const char* name, const AVSValue& val) { if (DISPATCH(closing)) return true; // We easily risk being inside the critical section below, while deleting variables. return DISPATCH(var_table).SetGlobal(name, val); } void __stdcall PushContext(int level = 0) { DISPATCH(var_table).Push(); } void __stdcall PopContext() { DISPATCH(var_table).Pop(); } void __stdcall PushContextGlobal() { DISPATCH(var_table).PushGlobal(); } void __stdcall PopContextGlobal() { DISPATCH(var_table).PopGlobal(); } bool __stdcall GetVarTry(const char* name, AVSValue* val) const { if (DISPATCH(closing)) return false; // We easily risk being inside the critical section below, while deleting variables. return DISPATCH(var_table).Get(name, val); } AVSValue __stdcall GetVarDef(const char* name, const AVSValue& def) { if (DISPATCH(closing)) return def; // We easily risk being inside the critical section below, while deleting variables. AVSValue val; if (this->GetVarTry(name, &val)) return val; else return def; } bool __stdcall GetVarBool(const char* name, bool def) const { if (DISPATCH(closing)) return false; // We easily risk being inside the critical section below, while deleting variables. AVSValue val; if (this->GetVarTry(name, &val)) return val.AsBool(def); else return def; } int __stdcall GetVarInt(const char* name, int def) const { if (DISPATCH(closing)) return def; // We easily risk being inside the critical section below, while deleting variables. AVSValue val; if (this->GetVarTry(name, &val)) return val.AsInt(def); else return def; } double __stdcall GetVarDouble(const char* name, double def) const { if (DISPATCH(closing)) return def; // We easily risk being inside the critical section below, while deleting variables. AVSValue val; if (this->GetVarTry(name, &val)) return val.AsDblDef(def); else return def; } const char* __stdcall GetVarString(const char* name, const char* def) const { if (DISPATCH(closing)) return def; // We easily risk being inside the critical section below, while deleting variables. AVSValue val; if (this->GetVarTry(name, &val)) return val.AsString(def); else return def; } #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable: 4244) // conversion from __int64, possible loss of data #endif int64_t __stdcall GetVarLong(const char* name, int64_t def) const { if (DISPATCH(closing)) return def; // We easily risk being inside the critical section below, while deleting variables. AVSValue val; if (this->GetVarTry(name, &val)) return val.AsLong(def); // v11: real int64 support else return def; } #ifdef _MSC_VER #pragma warning(pop) #endif void* __stdcall Allocate(size_t nBytes, size_t alignment, AvsAllocType type) { if ((type != AVS_NORMAL_ALLOC) && (type != AVS_POOLED_ALLOC)) return NULL; return DISPATCH(buffer_pool).Allocate(nBytes, alignment, type == AVS_POOLED_ALLOC); } void __stdcall Free(void* ptr) { DISPATCH(buffer_pool).Free(ptr); } Device* __stdcall GetCurrentDevice() const { return DISPATCH(currentDevice); } Device* __stdcall SetCurrentDevice(Device* device) { Device* old = DISPATCH(currentDevice); DISPATCH(currentDevice) = device; return old; } PVideoFrame __stdcall NewVideoFrame(const VideoInfo& vi, int align) { return core->NewVideoFrameOnDevice(vi, align, DISPATCH(currentDevice)); } PVideoFrame __stdcall NewVideoFrameP(const VideoInfo& vi, const PVideoFrame *prop_src, int align) { return core->NewVideoFrameOnDevice(vi, align, DISPATCH(currentDevice), prop_src); } void* __stdcall GetDeviceStream() { return DISPATCH(currentDevice)->GetComputeStream(); } void __stdcall DeviceAddCallback(void(*cb)(void*), void* user_data) { DeviceCompleteCallbackData cbdata = { cb, user_data }; DISPATCH(currentDevice)->AddCompleteCallback(cbdata); } PVideoFrame __stdcall GetFrame(PClip c, int n, const PDevice& device) { DeviceSetter setter(this, (Device*)(void*)device); return c->GetFrame(n, this); } /* --------------------------------------------------------------------------------- * S T U B S * --------------------------------------------------------------------------------- */ bool __stdcall InternalFunctionExists(const char* name) { return core->InternalFunctionExists(name); } void __stdcall AdjustMemoryConsumption(size_t amount, bool minus) { core->AdjustMemoryConsumption(amount, minus); } void __stdcall CheckVersion(int version) { core->CheckVersion(version); } int __stdcall GetCPUFlags() { return core->GetCPUFlags(); } int64_t __stdcall GetCPUFlagsEx() { return core->GetCPUFlagsEx(); } char* __stdcall SaveString(const char* s, int length = -1) { return DISPATCH(var_table).SaveString(s, length); } char* __stdcall SaveString(const char* s, int length, bool escape) { return DISPATCH(var_table).SaveString(s, length, escape); } char* Sprintf(const char* fmt, ...) { va_list val; va_start(val, fmt); // do not call core->Sprintf, because cannot pass ... further char* result = VSprintf(fmt, val); va_end(val); return result; } char* __stdcall VSprintf(const char* fmt, va_list val) { try { std::string str = FormatString(fmt, val); return DISPATCH(var_table).SaveString(str.c_str(), int(str.size())); // SaveString will add the NULL in len mode. } catch (...) { return NULL; } } void ThrowError(const char* fmt, ...) { va_list val; va_start(val, fmt); VThrowError(fmt, val); va_end(val); } void __stdcall VThrowError(const char* fmt, va_list va) { std::string msg; try { msg = FormatString(fmt, va); } catch (...) { msg = "Exception while processing ScriptEnvironment::ThrowError()."; } // Also log the error before throwing this->LogMsg(LOGLEVEL_ERROR, msg.c_str()); // Throw... throw AvisynthError(DISPATCH(var_table).SaveString(msg.c_str())); } PVideoFrame __stdcall SubframePlanarA(PVideoFrame src, int rel_offset, int new_pitch, int new_row_size, int new_height, int rel_offsetU, int rel_offsetV, int new_pitchUV, int rel_offsetA) { return core->SubframePlanarA(src, rel_offset, new_pitch, new_row_size, new_height, rel_offsetU, rel_offsetV, new_pitchUV, rel_offsetA); } bool __stdcall MakePropertyWritable(PVideoFrame* pvf) { return core->MakePropertyWritable(pvf); } void __stdcall copyFrameProps(const PVideoFrame& src, PVideoFrame& dst) { core->copyFrameProps(src, dst); } const AVSMap* __stdcall getFramePropsRO(const PVideoFrame& frame) { return core->getFramePropsRO(frame); } AVSMap* __stdcall getFramePropsRW(PVideoFrame& frame) { return core->getFramePropsRW(frame); } int __stdcall propNumKeys(const AVSMap* map) { return core->propNumKeys(map); } const char* __stdcall propGetKey(const AVSMap* map, int index) { return core->propGetKey(map, index); } int __stdcall propNumElements(const AVSMap* map, const char* key) { return core->propNumElements(map, key); } char __stdcall propGetType(const AVSMap* map, const char* key) { return core->propGetType(map, key); } int __stdcall propDeleteKey(AVSMap* map, const char* key) { return core->propDeleteKey(map, key); } int64_t __stdcall propGetInt(const AVSMap* map, const char* key, int index, int* error) { return core->propGetInt(map, key, index, error); } int __stdcall propGetIntSaturated(const AVSMap* map, const char* key, int index, int* error) { return core->propGetIntSaturated(map, key, index, error); } double __stdcall propGetFloat(const AVSMap* map, const char* key, int index, int* error) { return core->propGetFloat(map, key, index, error); } float __stdcall propGetFloatSaturated(const AVSMap* map, const char* key, int index, int* error) { return core->propGetFloatSaturated(map, key, index, error); } const char* __stdcall propGetData(const AVSMap* map, const char* key, int index, int* error) { return core->propGetData(map, key, index, error); } int __stdcall propGetDataSize(const AVSMap* map, const char* key, int index, int* error) { return core->propGetDataSize(map, key, index, error); } int __stdcall propGetDataTypeHint(const AVSMap* map, const char* key, int index, int* error) { return core->propGetDataTypeHint(map, key, index, error); } PClip __stdcall propGetClip(const AVSMap* map, const char* key, int index, int* error) { return core->propGetClip(map, key, index, error); } const PVideoFrame __stdcall propGetFrame(const AVSMap* map, const char* key, int index, int* error) { return core->propGetFrame(map, key, index, error); } int __stdcall propSetInt(AVSMap* map, const char* key, int64_t i, int append) { return core->propSetInt(map, key, i, append); } int __stdcall propSetFloat(AVSMap* map, const char* key, double d, int append) { return core->propSetFloat(map, key, d, append); } int __stdcall propSetData(AVSMap* map, const char* key, const char* d, int length, int append) { return core->propSetData(map, key, d, length, append); } int __stdcall propSetDataH(AVSMap* map, const char* key, const char* d, int length, int type, int append) { return core->propSetDataH(map, key, d, length, type, append); } int __stdcall propSetClip(AVSMap* map, const char* key, PClip& clip, int append) { return core->propSetClip(map, key, clip, append); } int __stdcall propSetFrame(AVSMap* map, const char* key, const PVideoFrame& frame, int append) { return core->propSetFrame(map, key, frame, append); } const int64_t* __stdcall propGetIntArray(const AVSMap* map, const char* key, int* error) { return core->propGetIntArray(map, key, error); } const double* __stdcall propGetFloatArray(const AVSMap* map, const char* key, int* error) { return core->propGetFloatArray(map, key, error); } int __stdcall propSetIntArray(AVSMap* map, const char* key, const int64_t* i, int size) { return core->propSetIntArray(map, key, i, size); } int __stdcall propSetFloatArray(AVSMap* map, const char* key, const double* d, int size) { return core->propSetFloatArray(map, key, d, size); } AVSMap* __stdcall createMap() { return core->createMap(); } void __stdcall freeMap(AVSMap* map) { core->freeMap(map); } void __stdcall clearMap(AVSMap* map) { core->clearMap(map); } void __stdcall AddFunction(const char* name, const char* params, ApplyFunc apply, void* user_data = 0) { core->AddFunction(name, params, apply, user_data); } void __stdcall AddFunction25(const char* name, const char* params, ApplyFunc apply, void* user_data = 0) { core->AddFunction25(name, params, apply, user_data); } void __stdcall AddFunctionPreV11C(const char* name, const char* params, ApplyFunc apply, void* user_data = 0) { core->AddFunctionPreV11C(name, params, apply, user_data); } bool __stdcall FunctionExists(const char* name) { return core->FunctionExists(name); } bool IsRuntime() { // When invoked from GetFrame/GetAudio, skip all cache and mt mecanism bool is_runtime = true; #ifdef XP_TLS ScriptEnvironmentTLS* g_TLS = (ScriptEnvironmentTLS*)(TlsGetValue(dwTlsIndex)); #endif if (g_TLS == nullptr) { // not called by thread if (GetFrameRecursiveCount() == 0) { // not called by GetFrame is_runtime = false; } } return is_runtime; } // thrower Invoke, IScriptEnvironment AVSValue __stdcall Invoke(const char* name, const AVSValue args, const char* const* arg_names) { AVSValue result; if (!core->Invoke_(&result, AVSValue(), name, nullptr, args, arg_names, this, IsRuntime())) { throw NotFound(); } return result; } // thrower Invoke, IScriptEnvironment_Avs25 AVSValue __stdcall Invoke25(const char* name, const AVSValue args, const char* const* arg_names) { AVSValue result; const bool success = core->Invoke_(&result, AVSValue(), name, nullptr, args, arg_names, this, IsRuntime()); ((AVSValue*)&args)->MarkArrayAsNonDeepCopy(); // In Avisynth+, arrays are deep-copied and freed. The 'args' array elements are freed upon Invoke25's exit. // But this call comes from a filter using Avisynth 2.5 header, where the caller would free the elements again, causing a crash. // We assume memory freeing is handled by the cpp 2.5 plugin. // If 'args' is an array, we convert its type to 'void' to prevent AVSValue destructor from freeing the array elements. // Unlike Avisynth+, the passed AVSValue is not a smart deep-copied array; it was allocated by the client and filled manually. if (!success) throw NotFound(); // 2.5 plugins don't know about long and double types. if (result.GetType() == AvsValueType::VALUE_TYPE_LONG) // real 64 bit integer result = result.AsInt(); else if (result.GetType() == AvsValueType::VALUE_TYPE_DOUBLE) // real 64 bit double result = result.AsFloatf(); return result; } // thrower Invoke, IScriptEnvironment_AvsPreV11C AVSValue __stdcall InvokePreV11C(const char* name, const AVSValue args, const char* const* arg_names) { AVSValue result; const bool success = core->Invoke_(&result, AVSValue(), name, nullptr, args, arg_names, this, IsRuntime()); if (!success) throw NotFound(); // PreV11C plugins don't know about 'l'ong and 'd'ouble basic types. // Convert them to 'i'nt and 'f'loat respectively. // A preV11C interface plugin (no avisynth_c_plugin_init2) can call avs_invoke // which would (if unchanged) result in a 64 bit type, like Pi() returns double. // Example call: // AVS_Value ver = avs_invoke(Env, "Pi", avs_new_value_array(NULL, 0), NULL); // We convert only basic types, and not handling array type return values here, // to look into whether it contains 64 bit elements accidentally. // Neither is an old C plugin expected to handle array return values. // Anyway, proper dyn array support comes only from v11 on C API. if (result.GetType() == AvsValueType::VALUE_TYPE_LONG) // real 64 bit integer result = result.AsInt(); // to 32 bit integer else if (result.GetType() == AvsValueType::VALUE_TYPE_DOUBLE) // real 64 bit double result = result.AsFloatf(); // to 32 bit float return result; } // no-throw Invoke, IScriptEnvironment, Ex-IS2 bool __stdcall InvokeTry(AVSValue* result, const char* name, const AVSValue& args, const char* const* arg_names) { return core->Invoke_(result, AVSValue(), name, nullptr, args, arg_names, this, IsRuntime()); } // thrower Invoke + implicit last, since IS V8 // created to have throw and non-throw (xxxxTry) versions from all Invokes AVSValue __stdcall Invoke2(const AVSValue& implicit_last, const char* name, const AVSValue args, const char* const* arg_names) { AVSValue result; if (!core->Invoke_(&result, implicit_last, name, nullptr, args, arg_names, this, IsRuntime())) { throw NotFound(); } return result; } // no-throw Invoke + implicit last, Ex-INeo bool __stdcall Invoke2Try(AVSValue* result, const AVSValue& implicit_last, const char* name, const AVSValue args, const char* const* arg_names) { return core->Invoke_(result, implicit_last, name, nullptr, args, arg_names, this, IsRuntime()); } // thrower Invoke + implicit last + PFunction AVSValue __stdcall Invoke3(const AVSValue& implicit_last, const PFunction& func, const AVSValue args, const char* const* arg_names) { AVSValue result; if (!core->Invoke_(&result, implicit_last, func->GetLegacyName(), func->GetDefinition(), args, arg_names, this, IsRuntime())) { throw NotFound(); } return result; } // no-throw Invoke + implicit last + PFunction bool __stdcall Invoke3Try(AVSValue *result, const AVSValue& implicit_last, const PFunction& func, const AVSValue args, const char* const* arg_names) { return core->Invoke_(result, implicit_last, func->GetLegacyName(), func->GetDefinition(), args, arg_names, this, IsRuntime()); } // King of all Invoke versions: no-throw Invoke + implicit last + funtion name + function definition bool __stdcall Invoke_(AVSValue *result, const AVSValue& implicit_last, const char* name, const Function *f, const AVSValue& args, const char* const* arg_names) { return core->Invoke_(result, implicit_last, name, f, args, arg_names, this, IsRuntime()); } bool __stdcall MakeWritable(PVideoFrame* pvf) { return core->MakeWritable(pvf); } void __stdcall BitBlt(BYTE* dstp, int dst_pitch, const BYTE* srcp, int src_pitch, int row_size, int height) { core->BitBlt(dstp, dst_pitch, srcp, src_pitch, row_size, height); } void __stdcall AtExit(IScriptEnvironment::ShutdownFunc function, void* user_data) { core->AtExit(function, user_data); } PVideoFrame __stdcall Subframe(PVideoFrame src, int rel_offset, int new_pitch, int new_row_size, int new_height) { return core->Subframe(src, rel_offset, new_pitch, new_row_size, new_height); } int __stdcall SetMemoryMax(int mem) { return core->SetMemoryMax(mem); } int __stdcall SetWorkingDir(const char* newdir) { return core->SetWorkingDir(newdir); } bool __stdcall AcquireGlobalLock(const char* name) { return core->AcquireGlobalLock(name); } void __stdcall ReleaseGlobalLock(const char* name) { core->ReleaseGlobalLock(name); } void* __stdcall ManageCache(int key, void* data) { if ( (MANAGE_CACHE_KEYS)key == MC_QueryAvs25 || (MANAGE_CACHE_KEYS)key == MC_QueryAvsPreV11C ) return (intptr_t*)0; return core->ManageCache(key, data); } void* __stdcall ManageCache25(int key, void* data) { // We use a v2.5-special ManageCache call with special key to query if // env ptr is v2.5 even if casted to IScriptEnvironment if ((MANAGE_CACHE_KEYS)key == MC_QueryAvs25) return (intptr_t *)1; return ManageCache(key, data); } void* __stdcall ManageCachePreV11C(int key, void* data) { // We use a preV11C-special ManageCache call with special key to query if // env ptr is preV11C even if casted to IScriptEnvironment if ((MANAGE_CACHE_KEYS)key == MC_QueryAvsPreV11C) return (intptr_t*)1; return ManageCache(key, data); } bool __stdcall PlanarChromaAlignment(IScriptEnvironment::PlanarChromaAlignmentMode key) { return core->PlanarChromaAlignment(key); } PVideoFrame __stdcall SubframePlanar(PVideoFrame src, int rel_offset, int new_pitch, int new_row_size, int new_height, int rel_offsetU, int rel_offsetV, int new_pitchUV) { return core->SubframePlanar(src, rel_offset, new_pitch, new_row_size, new_height, rel_offsetU, rel_offsetV, new_pitchUV); } void __stdcall DeleteScriptEnvironment() { #ifdef XP_TLS ScriptEnvironmentTLS* g_TLS = (ScriptEnvironmentTLS*)(TlsGetValue(dwTlsIndex)); #endif if (g_TLS != nullptr) { ThrowError("Cannot delete environment from a TLS proxy."); } core->DeleteScriptEnvironment(); } void __stdcall ApplyMessage(PVideoFrame* frame, const VideoInfo& vi, const char* message, int size, int textcolor, int halocolor, int bgcolor) { core->ApplyMessage(frame, vi, message, size, textcolor, halocolor, bgcolor); } void __stdcall ApplyMessageEx(PVideoFrame* frame, const VideoInfo& vi, const char* message, int size, int textcolor, int halocolor, int bgcolor, bool utf8) { core->ApplyMessageEx(frame, vi, message, size, textcolor, halocolor, bgcolor, utf8); } const AVS_Linkage* __stdcall GetAVSLinkage() { return core->GetAVSLinkage(); } /* IScriptEnvironment2 */ bool __stdcall LoadPlugin(const char* filePath, bool throwOnError, AVSValue* result) { return core->LoadPlugin(filePath, throwOnError, result); } void __stdcall AddAutoloadDir(const char* dirPath, bool toFront) { core->AddAutoloadDir(dirPath, toFront); } void __stdcall ClearAutoloadDirs() { core->ClearAutoloadDirs(); } void __stdcall AutoloadPlugins() { core->AutoloadPlugins(); } void __stdcall AddFunction(const char* name, const char* params, ApplyFunc apply, void* user_data, const char* exportVar) { core->AddFunction(name, params, apply, user_data, exportVar); } char* __stdcall ListAutoloadDirs() { return core->ListAutoloadDirs(); } void __stdcall SetFilterProp(const char* filter, const char* key, const AVSValue& value, int mode) { core->SetFilterProp(filter, key, value, mode); } void __stdcall SetFilterPropConditional(const char* filter, const char* param_name, const AVSValue& param_match, const char* key, const AVSValue& value, int mode) { core->SetFilterPropConditional(filter, param_name, param_match, key, value, mode); } const char* __stdcall GetFilterProps() { return core->GetFilterProps(); } void __stdcall SetFilterPropPassthrough(const char* filter) { core->SetFilterPropPassthrough(filter); } int __stdcall IncrImportDepth() { return ++DISPATCH(ImportDepth); } int __stdcall DecrImportDepth() { return --DISPATCH(ImportDepth); } size_t __stdcall GetEnvProperty(AvsEnvProperty prop) { switch (prop) { case AEP_THREAD_ID: return DISPATCH(thread_id); case AEP_SUPPRESS_THREAD: return DISPATCH(suppressThreadCount); case AEP_GETFRAME_RECURSIVE: return DISPATCH(getFrameRecursiveCount); default: return core->GetEnvProperty(prop); } } void __stdcall SetFilterMTMode(const char* filter, MtMode mode, bool force) { core->SetFilterMTMode(filter, mode, force); } MtMode __stdcall GetFilterMTMode(const Function* filter, bool* is_forced) const { return core->GetFilterMTMode(filter, is_forced); } bool __stdcall FilterHasMtMode(const Function* filter) const { return core->FilterHasMtMode(filter); } IJobCompletion* __stdcall NewCompletion(size_t capacity) { return core->NewCompletion(capacity); } void __stdcall ParallelJob(ThreadWorkerFuncPtr jobFunc, void* jobData, IJobCompletion* completion) { core->ParallelJob(jobFunc, jobData, completion, this); } void __stdcall ParallelJob(ThreadWorkerFuncPtr jobFunc, void* jobData, IJobCompletion* completion, InternalEnvironment* env) { core->ParallelJob(jobFunc, jobData, completion, env); } ClipDataStore* __stdcall ClipData(IClip* clip) { return core->ClipData(clip); } MtMode __stdcall GetDefaultMtMode() const { return core->GetDefaultMtMode(); } void __stdcall SetLogParams(const char* target, int level) { core->SetLogParams(target, level); } // stdcall calling convention is not supported on variadic function void LogMsg(int level, const char* fmt, ...) { va_list val; va_start(val, fmt); core->LogMsg_valist(level, fmt, val); va_end(val); } void __stdcall LogMsg_valist(int level, const char* fmt, va_list va) { core->LogMsg_valist(level, fmt, va); } // stdcall calling convention is not supported on variadic function void LogMsgOnce(const OneTimeLogTicket& ticket, int level, const char* fmt, ...) { va_list val; va_start(val, fmt); core->LogMsgOnce_valist(ticket, level, fmt, val); va_end(val); } void __stdcall LogMsgOnce_valist(const OneTimeLogTicket& ticket, int level, const char* fmt, va_list va) { core->LogMsgOnce_valist(ticket, level, fmt, va); } void __stdcall SetMaxCPU(const char *features) { core->SetMaxCPU(features); } void __stdcall SetGraphAnalysis(bool enable) { core->SetGraphAnalysis(enable); } int __stdcall SetMemoryMax(AvsDeviceType type, int index, int mem) { return core->SetMemoryMax(type, index, mem); } PDevice __stdcall GetDevice(AvsDeviceType device_type, int device_index) const { return core->GetDevice(device_type, device_index); } PDevice __stdcall GetDevice() const { return DISPATCH(currentDevice); } AvsDeviceType __stdcall GetDeviceType() const { return DISPATCH(currentDevice)->device_type; } int __stdcall GetDeviceId() const { return DISPATCH(currentDevice)->device_id; } int __stdcall GetDeviceIndex() const { return DISPATCH(currentDevice)->device_index; } void* __stdcall GetDeviceStream() const { return DISPATCH(currentDevice)->GetComputeStream();; } PVideoFrame __stdcall NewVideoFrameOnDevice(const VideoInfo& vi, int align, Device* device) { return core->NewVideoFrameOnDevice(vi, align, device); } // shortcut to the above PVideoFrame __stdcall NewVideoFrame(const VideoInfo& vi) { return NewVideoFrameOnDevice(vi, FRAME_ALIGN, DISPATCH(currentDevice)); } // shortcut to the above PVideoFrame __stdcall NewVideoFrame(const VideoInfo& vi, const PDevice& device) { return NewVideoFrameOnDevice(vi, FRAME_ALIGN, (Device*)(void*)device); } // variants with frame property source PVideoFrame __stdcall NewVideoFrameOnDevice(const VideoInfo& vi, int align, Device* device, const PVideoFrame *prop_src) { return core->NewVideoFrameOnDevice(vi, align, device, prop_src); } // shortcut to the above PVideoFrame __stdcall NewVideoFrame(const VideoInfo& vi, const PVideoFrame* prop_src) { return NewVideoFrameOnDevice(vi, FRAME_ALIGN, DISPATCH(currentDevice), prop_src); } // shortcut to the above PVideoFrame __stdcall NewVideoFrame(const VideoInfo& vi, const PDevice& device, const PVideoFrame* prop_src) { return NewVideoFrameOnDevice(vi, FRAME_ALIGN, (Device*)(void*)device, prop_src); } PVideoFrame __stdcall GetOnDeviceFrame(const PVideoFrame& src, Device* device) { return core->GetOnDeviceFrame(src, device); } ThreadPool* __stdcall NewThreadPool(size_t nThreads) { return core->NewThreadPool(nThreads); } void __stdcall AddRef() { InterlockedIncrement(&DISPATCH(refcount)); } void __stdcall Release() { if (InterlockedDecrement(&DISPATCH(refcount)) == 0) { delete this; } } void __stdcall IncEnvCount() { core->IncEnvCount(); } void __stdcall DecEnvCount() { core->DecEnvCount(); } ConcurrentVarStringFrame* __stdcall GetTopFrame() { return core->GetTopFrame(); } void __stdcall SetCacheMode(CacheMode mode) { core->SetCacheMode(mode); } CacheMode __stdcall GetCacheMode() { return core->GetCacheMode(); } bool& __stdcall GetSupressCaching() { return DISPATCH(supressCaching); } size_t __stdcall GetInvokeStackSize() { return core->GetInvokeStackSize(); } void __stdcall SetDeviceOpt(DeviceOpt opt, int val) { core->SetDeviceOpt(opt, val); } void __stdcall UpdateFunctionExports(const char* funcName, const char* funcParams, const char *exportVar) { if (GetThreadId() != 0 || GetFrameRecursiveCount() != 0) { // no need to export function at runtime return; } core->UpdateFunctionExports(funcName, funcParams, exportVar); } InternalEnvironment* __stdcall NewThreadScriptEnvironment(int thread_id) { return new ThreadScriptEnvironment(thread_id, core, coreTLS); } int __stdcall GetThreadId() { return DISPATCH(thread_id); } int& __stdcall GetFrameRecursiveCount() { return DISPATCH(getFrameRecursiveCount); } int& __stdcall GetSuppressThreadCount() { return DISPATCH(suppressThreadCount); } FilterGraphNode*& GetCurrentGraphNode() { return DISPATCH(currentGraphNode); } #undef DISPATCH #undef IFNULL }; #ifdef AVS_POSIX static uint64_t posix_get_physical_memory() { uint64_t ullTotalPhys; #if defined(AVS_MACOS) size_t len; sysctlbyname("hw.memsize", nullptr, &len, nullptr, 0); int64_t memsize; sysctlbyname("hw.memsize", (void*)&memsize, &len, nullptr, 0); ullTotalPhys = memsize; #elif defined(AVS_BSD) size_t len; int64_t memsize; #if !defined(__OpenBSD__) // OpenBSD doesn't have sysctlbyname at all, so this needs to be // ported to plain sysctl. sysctlbyname("hw.physmem", nullptr, &len, nullptr, 0); sysctlbyname("hw.physmem", (void*)&memsize, &len, nullptr, 0); #else sysctl((const int *)HW_PHYSMEM, 4, nullptr, &len, nullptr, 0); sysctl((const int *)HW_PHYSMEM, 4, (void*)&memsize, &len, nullptr, 0); #endif ullTotalPhys = memsize; #elif defined(AVS_HAIKU) system_info sysinf; get_system_info(&sysinf); ullTotalPhys = PAGESIZE * sysinf.max_pages; #else // linux struct sysinfo info; if (sysinfo(&info) != 0) { throw AvisynthError("sysinfo: error reading system statistics"); } ullTotalPhys = (uint64_t)info.totalram * info.mem_unit; #endif return ullTotalPhys; } static int64_t posix_get_available_memory() { int64_t memory; long nPageSize = sysconf(_SC_PAGE_SIZE); int64_t nAvailablePhysicalPages; #if defined(AVS_MACOS) vm_statistics64_data_t vmstats; mach_msg_type_number_t vmstatsz = HOST_VM_INFO64_COUNT; host_statistics64(mach_host_self(), HOST_VM_INFO64, (host_info_t)&vmstats, &vmstatsz); nAvailablePhysicalPages = vmstats.free_count; #elif defined(AVS_BSD) #if !defined(__OpenBSD__) // OpenBSD does not have sysctlbyname size_t nAvailablePhysicalPagesLen = sizeof(nAvailablePhysicalPages); sysctlbyname("vm.stats.vm.v_free_count", &nAvailablePhysicalPages, &nAvailablePhysicalPagesLen, NULL, 0); #endif #elif defined(AVS_HAIKU) system_info sysinf; get_system_info(&sysinf); nAvailablePhysicalPages = sysinf.free_memory; #else // Linux nAvailablePhysicalPages = sysconf(_SC_AVPHYS_PAGES); #endif memory = nPageSize * nAvailablePhysicalPages; return memory; } #endif static uint64_t ConstrainMemoryRequest(uint64_t requested) { // Get system memory information #ifdef AVS_WINDOWS // needs linux alternative MEMORYSTATUSEX memstatus; memstatus.dwLength = sizeof(memstatus); GlobalMemoryStatusEx(&memstatus); // mem_limit is the largest amount of memory that makes sense to use. // We don't want to use more than the virtual address space, // and we also don't want to start paging to disk. uint64_t mem_limit = min(memstatus.ullTotalVirtual, memstatus.ullTotalPhys); uint64_t mem_sysreserve = 0; if (memstatus.ullTotalPhys > memstatus.ullTotalVirtual) { // We are probably running on a 32bit OS system where the virtual space is capped to // much less than what the system can use, so it is enough to reserve only a small amount. mem_sysreserve = 128 * 1024 * 1024ull; } else { // We could probably use up all the RAM in our single application, // so reserve more to leave some RAM for other apps and the OS too. mem_sysreserve = 1024 * 1024 * 1024ull; } // Cap memory_max to at most mem_sysreserve less than total, but at least to 64MB. return clamp(requested, (uint64_t)64 * 1024 * 1024, mem_limit - mem_sysreserve); #else // copied over from AvxSynth, check against current code!!! // Check#1 // AvxSynth returned simply the actual total_available memory // this part is trying to fine tune it, considering that // - total_available may contain swap area which we do not want to use FIXME: check it! // - leave some memory for other processes (1 GB for x64, 128MB for 32 bit) uint64_t physical_memory = posix_get_physical_memory(); uint64_t total_available = posix_get_available_memory(); // We don't want to use more than the virtual address space, // and we also don't want to start paging to disk. uint64_t mem_limit = min(total_available, physical_memory); // We could probably use up all the RAM in our single application, // so reserve more to leave some RAM for other apps and the OS too. const bool isX64 = sizeof(void*) == 8; uint64_t mem_sysreserve = isX64 ? (uint64_t)1024 * 1024 * 1024 : (uint64_t)128 * 1024 * 1024; // Cap memory_max to at most mem_sysreserve less than total, but at least to 64MB. uint64_t allowed_memory = clamp(requested, (uint64_t)64 * 1024 * 1024, mem_limit - mem_sysreserve); #if 0 const int DIV = 1024 * 1024; fprintf(stdout, "requested= %" PRIu64 " MB\r\n", requested / DIV); fprintf(stdout, "physical_memory= %" PRIu64 " MB\r\n", physical_memory / DIV); fprintf(stdout, "total_available= %" PRIu64 " MB\r\n", total_available / DIV); fprintf(stdout, "mem_limit= %" PRIu64 " MB\r\n", mem_limit / DIV); fprintf(stdout, "mem_sysreserve= %" PRIu64 " MB\r\n", mem_sysreserve / DIV); fprintf(stdout, "allowed_memory= %" PRIu64 " MB\r\n", allowed_memory / DIV); /*For a computer with 16GB RAM, 64 bit OS No SetMemoryMax, where default max request is 4GB on x64 requested= 4072 MB physical_memory= 16291 MB total_available= 7640 MB mem_limit= 7640 MB mem_sysreserve= 1024 MB allowed_memory= 4072 MB Using SetmemoryMax(10000) requested= 10000 MB physical_memory= 16291 MB total_available= 7667 MB mem_limit= 7667 MB mem_sysreserve= 1024 MB allowed_memory= 6643 MB */ #endif return allowed_memory; #endif } IJobCompletion* ScriptEnvironment::NewCompletion(size_t capacity) { return new JobCompletion(capacity); } ScriptEnvironment::ScriptEnvironment() : threadEnv(), at_exit(), thread_pool(NULL), plugin_manager(NULL), EnvCount(0), PlanarChromaAlignmentState(true), // Change to "true" for 2.5.7 hrfromcoinit(E_FAIL), coinitThreadId(0), Devices(), FrontCache(NULL), nTotalThreads(1), nMaxFilterInstances(1), LogLevel(LOGLEVEL_NONE), graphAnalysisEnable(false), cacheMode(CACHE_DEFAULT) { #ifdef XP_TLS if(dwTlsIndex == 0) throw("ScriptEnvironment: TlsAlloc failed on DLL load"); #endif cpuFlagsEx = ::GetCPUFlagsEx(); cache_size_L2 = ::GetL2CacheSize(); try { #ifdef AVS_WINDOWS // Make sure COM is initialised hrfromcoinit = CoInitialize(NULL); // If it was already init'd then decrement // the use count and leave it alone! if (hrfromcoinit == S_FALSE) { hrfromcoinit = E_FAIL; CoUninitialize(); } // Remember our threadId. coinitThreadId = GetCurrentThreadId(); #endif threadEnv = std::unique_ptr(new ThreadScriptEnvironment(0, this, nullptr)); Devices = std::unique_ptr(new DeviceManager(threadEnv.get())); // calc frame align frame_align = plane_align = FRAME_ALIGN; #ifdef ENABLE_CUDA for (int i = 0, end = Devices->GetNumDevices(DEV_TYPE_CUDA); i < end; ++i) { int align, pitchAlign; Devices->GetDevice(DEV_TYPE_CUDA, i)->GetAlignmentRequirement(&align, &pitchAlign); frame_align = max(frame_align, pitchAlign); plane_align = max(plane_align, align); } #endif auto cpuDevice = Devices->GetCPUDevice(); threadEnv->GetTLS()->currentDevice = cpuDevice; #ifdef AVS_WINDOWS MEMORYSTATUSEX memstatus; memstatus.dwLength = sizeof(memstatus); GlobalMemoryStatusEx(&memstatus); cpuDevice->memory_max = ConstrainMemoryRequest(memstatus.ullTotalPhys / 4); #endif #ifdef AVS_POSIX uint64_t ullTotalPhys = posix_get_physical_memory(); cpuDevice->memory_max = ConstrainMemoryRequest(ullTotalPhys / 4); // fprintf(stdout, "Total physical memory= %" PRIu64 ", after constraint=%" PRIu64 "\r\n", ullTotalPhys, memory_max); // Total physical memory = 17083355136, after constraint = 7274700800 #endif const bool isX64 = sizeof(void*) == 8; cpuDevice->memory_max = min(cpuDevice->memory_max, (uint64_t)((isX64 ? 4096 : 1024) * (1024 * 1024ull))); // at start, cap memory usage to 1GB(x86)/4GB (x64) cpuDevice->memory_used = 0ull; top_frame.Set("true", true); top_frame.Set("false", false); top_frame.Set("yes", true); top_frame.Set("no", false); top_frame.Set("last", AVSValue()); top_frame.Set("$ScriptName$", AVSValue()); top_frame.Set("$ScriptFile$", AVSValue()); top_frame.Set("$ScriptDir$", AVSValue()); top_frame.Set("$ScriptNameUtf8$", AVSValue()); top_frame.Set("$ScriptFileUtf8$", AVSValue()); top_frame.Set("$ScriptDirUtf8$", AVSValue()); plugin_manager = new PluginManager(threadEnv.get()); #ifdef AVS_WINDOWS plugin_manager->AddAutoloadDir("USER_PLUS_PLUGINS", false); plugin_manager->AddAutoloadDir("MACHINE_PLUS_PLUGINS", false); plugin_manager->AddAutoloadDir("USER_CLASSIC_PLUGINS", false); plugin_manager->AddAutoloadDir("MACHINE_CLASSIC_PLUGINS", false); #else // system_avs_plugindir relies on install path, it and user_avs_plugindir_configurable get // defined in avisynth_conf.h.in when configuring. if(std::getenv("HOME")) { std::string user_avs_plugindir = std::getenv("HOME"); std::string user_avs_plugindir_local = std::getenv("HOME"); std::string user_avs_dirname = "/.avisynth"; user_avs_plugindir.append(user_avs_dirname); user_avs_plugindir_local.append("/").append(user_avs_plugindir_configurable); plugin_manager->AddAutoloadDir(user_avs_plugindir, false); plugin_manager->AddAutoloadDir(user_avs_plugindir_local, false); } if (std::getenv("LD_LIBRARY_PATH")) { std::string ldrel_avs_plugindir, ldrel_stor; ldrel_avs_plugindir.append(std::getenv("LD_LIBRARY_PATH")); std::istringstream ldrelin(ldrel_avs_plugindir); while(getline(ldrelin, ldrel_stor, ':')) { ldrel_stor.append("/avisynth"); plugin_manager->AddAutoloadDir(ldrel_stor, false); } } plugin_manager->AddAutoloadDir(system_avs_plugindir, false); #endif top_frame.Set("LOG_ERROR", (int)LOGLEVEL_ERROR); top_frame.Set("LOG_WARNING", (int)LOGLEVEL_WARNING); top_frame.Set("LOG_INFO", (int)LOGLEVEL_INFO); top_frame.Set("LOG_DEBUG", (int)LOGLEVEL_DEBUG); top_frame.Set("DEV_TYPE_CPU", (int)DEV_TYPE_CPU); top_frame.Set("DEV_TYPE_CUDA", (int)DEV_TYPE_CUDA); top_frame.Set("CACHE_FAST_START", (int)CACHE_FAST_START); top_frame.Set("CACHE_OPTIMAL_SIZE", (int)CACHE_OPTIMAL_SIZE); top_frame.Set("DEV_CUDA_PINNED_HOST", (int)DEV_CUDA_PINNED_HOST); top_frame.Set("DEV_FREE_THRESHOLD", (int)DEV_FREE_THRESHOLD); InitMT(); thread_pool = new ThreadPool(std::thread::hardware_concurrency(), 1, threadEnv.get()); ExportBuiltinFilters(); clip_data.max_load_factor(0.8f); LogTickets.max_load_factor(0.8f); } catch (const AvisynthError& err) { #ifdef AVS_WINDOWS if (SUCCEEDED(hrfromcoinit)) { hrfromcoinit = E_FAIL; CoUninitialize(); } #endif // Needs must, to not loose the text we // must leak a little memory. throw AvisynthError(_strdup(err.msg)); } } MtMode ScriptEnvironment::GetDefaultMtMode() const { return DefaultMtMode; } void ScriptEnvironment::InitMT() { top_frame.Set("MT_NICE_FILTER", (int)MT_NICE_FILTER); top_frame.Set("MT_MULTI_INSTANCE", (int)MT_MULTI_INSTANCE); top_frame.Set("MT_SERIALIZED", (int)MT_SERIALIZED); top_frame.Set("MT_SPECIAL_MT", (int)MT_SPECIAL_MT); } ScriptEnvironment::~ScriptEnvironment() { _RPT0(0, "~ScriptEnvironment() called.\n"); auto tls = threadEnv->GetTLS(); tls->closing = true; // Before we start to pull the world apart // give every one their last wish. at_exit.Execute(threadEnv.get()); GlobalLockManager::on_environment_exit(this); // V12 delete thread_pool; tls->var_table.Clear(); top_frame.Clear(); // There can be a circular reference between the Prefetcher and the // TLS PopContext() variables of the threads started by it. Normally // this doesn't happen, but it can for example when somebody // sets 'last' in a TLS (see ScriptClip for a specific example). // This circular reference causes leaks, so we call // Destroy() on the prefetcher, which will in turn terminate all // its TLS stuff and break the chain. for (auto& pool : ThreadPoolRegistry) { pool->Join(); } ThreadPoolRegistry.clear(); // delete ThreadScriptEnvironment threadEnv = nullptr; // check ThreadScriptEnvironment leaks if (EnvCount > 0) { LogMsg(LOGLEVEL_WARNING, "ThreadScriptEnvironment leaks."); } #if 0 // check clip leaks DoDumpGraph if (std::find_if(GraphNodeRegistry.begin(), GraphNodeRegistry.end(), [](FilterGraphNode* node) { return node != nullptr; }) != GraphNodeRegistry.end()) { // This is dangerous operation because thread's string is destroyed // and may be there are dangling string pointer which results in access violation. MinimumScriptEnvironment env(&top_frame); DoDumpGraph(GraphNodeRegistry, "clip_leaks.txt", &env); } #endif #ifdef _DEBUG // LogMsg(LOGLEVEL_DEBUG, "We are before FrameRegistryCleanup"); // ListFrameRegistry(0,10000000000000ull, true, device); // list all #endif // and deleting the frame buffer from FrameRegistry2 as well bool somethingLeaks = false; for (auto &it: FrameRegistry2) { for (auto &it2: it.second) { VFBStorage *vfb = static_cast(it2.first); delete vfb; // iterate through frames belonging to this vfb for (auto &it3: it2.second) { VideoFrame *frame = it3.frame; frame->vfb = 0; //assert(0 == frame->refcount); if (0 == frame->refcount) { delete frame; } else { somethingLeaks = true; } } // it3 } // it2 } // it if (somethingLeaks) { LogMsg(LOGLEVEL_WARNING, "A plugin or the host application might be causing memory leaks."); } delete plugin_manager; #ifdef AVS_WINDOWS // COM is Win32-specific // If we init'd COM and this is the right thread then release it // If it's the wrong threadId then tuff, nothing we can do. if (SUCCEEDED(hrfromcoinit) && (coinitThreadId == GetCurrentThreadId())) { hrfromcoinit = E_FAIL; CoUninitialize(); } #endif } void ScriptEnvironment::SetLogParams(const char* target, int level) { if (nullptr == target) { target = "stderr"; } if (-1 == level) { level = LOGLEVEL_INFO; } if (LogFileStream.is_open()) { LogFileStream.close(); } LogLevel = LOGLEVEL_NONE; if (!streqi(target, "stderr") && !streqi(target, "stdout")) { LogFileStream.open(target, std::ofstream::out | std::ofstream::app); if (LogFileStream.fail()) { this->ThrowError("SetLogParams: Could not open file \"%s\" for writing.", target); return; } } LogLevel = level; LogTarget = target; } void ScriptEnvironment::LogMsg(int level, const char* fmt, ...) { va_list val; va_start(val, fmt); LogMsg_valist(level, fmt, val); va_end(val); } void ScriptEnvironment::LogMsg_valist(int level, const char* fmt, va_list va) { // Don't output message if our logging level is not high enough if (level > LogLevel) { return; } // Setup string prefixes for output messages const char* levelStr = nullptr; uint16_t levelAttr; switch (level) { case LOGLEVEL_ERROR: levelStr = "ERROR: "; #ifdef AVS_WINDOWS // FOREGROUND_* is Windows-specific levelAttr = FOREGROUND_INTENSITY | FOREGROUND_RED; #endif break; case LOGLEVEL_WARNING: levelStr = "WARNING: "; #ifdef AVS_WINDOWS // FOREGROUND_* is Windows-specific levelAttr = FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED; #endif break; case LOGLEVEL_INFO: levelStr = "INFO: "; #ifdef AVS_WINDOWS // FOREGROUND_* is Windows-specific levelAttr = FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE; #endif break; case LOGLEVEL_DEBUG: levelStr = "DEBUG: "; #ifdef AVS_WINDOWS // FOREGROUND_* is Windows-specific levelAttr = FOREGROUND_INTENSITY | FOREGROUND_BLUE | FOREGROUND_RED; #endif break; default: this->ThrowError("LogMsg: level argument must be between 1 and 4."); break; } // Prepare message output target std::ostream* targetStream = nullptr; #ifdef AVS_WINDOWS void* hConsole = GetStdHandle(STD_ERROR_HANDLE); #else void* hConsole = stderr; #endif if (streqi("stderr", LogTarget.c_str())) { #ifdef AVS_WINDOWS hConsole = GetStdHandle(STD_ERROR_HANDLE); #else hConsole = stderr; #endif targetStream = &std::cerr; } else if (streqi("stdout", LogTarget.c_str())) { #ifdef AVS_WINDOWS // linux alternative? hConsole = GetStdHandle(STD_OUTPUT_HANDLE); #else hConsole = stdout; #endif targetStream = &std::cout; } else if (LogFileStream.is_open()) { targetStream = &LogFileStream; } else { // Logging not yet set up (SetLogParams() not yet called). // Do nothing. return; } // Format our message string std::string msg = FormatString(fmt, va); #ifdef AVS_WINDOWS // Save current console attributes so that we can restore them later CONSOLE_SCREEN_BUFFER_INFO Info; GetConsoleScreenBufferInfo(hConsole, &Info); #endif // Do the output std::lock_guard lock(string_mutex); *targetStream << "---------------------------------------------------------------------" << std::endl; #ifdef AVS_WINDOWS SetConsoleTextAttribute(hConsole, levelAttr); #endif *targetStream << levelStr; #ifdef AVS_WINDOWS SetConsoleTextAttribute(hConsole, Info.wAttributes); #endif *targetStream << msg << std::endl; targetStream->flush(); } void ScriptEnvironment::LogMsgOnce(const OneTimeLogTicket& ticket, int level, const char* fmt, ...) { va_list val; va_start(val, fmt); LogMsgOnce_valist(ticket, level, fmt, val); va_end(val); } void ScriptEnvironment::LogMsgOnce_valist(const OneTimeLogTicket& ticket, int level, const char* fmt, va_list va) { if (LogTickets.end() == LogTickets.find(ticket)) { LogMsg_valist(level, fmt, va); LogTickets.insert(ticket); } } void ScriptEnvironment::SetMaxCPU(const char* features) { #if defined(ARM64) enum CPUlevel { CL_NONE, CL_NEON, CL_DOTPROD, CL_SVE2, CL_I8MM, CL_SVE2_1 }; #elif defined(X86_32) || defined(X86_64) enum CPUlevel { CL_NONE, CL_MMX, CL_SSE, CL_SSE2, CL_SSE3, CL_SSSE3, CL_SSE4_1, CL_SSE4_2, CL_AVX, CL_AVX2, CL_AVX512_BASE, CL_AVX512_FAST }; #else enum CPUlevel { CL_NONE }; #endif std::string s; const int len = (int)strlen(features); s.resize(len); for (int i = 0; i < len; i++) s[i] = tolower(features[i]); int64_t cpu_flags = GetCPUFlagsEx(); std::vector tokens; std::size_t start = 0, end = 0; while ((end = s.find(',', start)) != std::string::npos) { if (end != start) { tokens.push_back(s.substr(start, end - start)); } start = end + 1; } if (end != start) { tokens.push_back(s.substr(start)); } for (auto token : tokens) { token = trim(token); if (token.empty()) continue; int mode = 0; // limit char ch = token[token.size() - 1]; if (ch == '-') mode = -1; // remove else if (ch == '+') mode = 1; // add if (mode != 0) token.resize(token.size() - 1); CPUlevel cpulevel = CL_NONE; const char* t = token.c_str(); if (streqi(t, "") || streqi(t, "none")) cpulevel = CL_NONE; #if defined(ARM64) else if (streqi(t, "neon")) cpulevel = CL_NEON; else if (streqi(t, "dotprod")) cpulevel = CL_DOTPROD; else if (streqi(t, "sve2")) cpulevel = CL_SVE2; else if (streqi(t, "i8mm")) cpulevel = CL_I8MM; else if (streqi(t, "sve2.1")) cpulevel = CL_SVE2_1; // i8mm is just an optional level may not dependent on sve2 and vice versa else ThrowError("SetMaxCPU error: cpu level must be empty or none, neon, dotprod or sve2 (%s)", t); #elif defined(X86_32) || defined(X86_64) else if (streqi(t, "mmx")) cpulevel = CL_MMX; else if (streqi(t, "sse")) cpulevel = CL_SSE; else if (streqi(t, "sse2")) cpulevel = CL_SSE2; else if (streqi(t, "sse3")) cpulevel = CL_SSE3; else if (streqi(t, "ssse3")) cpulevel = CL_SSSE3; else if (streqi(t, "sse4") || streqi(t, "sse4.1")) cpulevel = CL_SSE4_1; else if (streqi(t, "sse4.2")) cpulevel = CL_SSE4_2; else if (streqi(t, "avx")) cpulevel = CL_AVX; else if (streqi(t, "avx2")) cpulevel = CL_AVX2; else if (streqi(t, "avx512base")) cpulevel = CL_AVX512_BASE; else if (streqi(t, "avx512fast")) cpulevel = CL_AVX512_FAST; else ThrowError("SetMaxCPU error: cpu level must be empty or none, mmx, sse, sse2, sse3, ssse3, sse4 or sse4.1, sse4.2, avx, avx2, avx512base or avx512fast (%s)", t); #else else ThrowError("SetMaxCPU error: cpu level must be empty or none (%s)", t); #endif if (0 == mode) { // limit // always switch off the more advanced features compared to previous check if limiting #if defined(ARM64) if (cpulevel <= CL_SVE2_1) { // already max level, nothing to do } if (cpulevel <= CL_SVE2) { cpu_flags &= ~CPUF_ARM_SVE2_1; } if (cpulevel <= CL_DOTPROD) { cpu_flags &= ~CPUF_ARM_SVE2; } if (cpulevel <= CL_NEON) { cpu_flags &= ~CPUF_ARM_DOTPROD; } if (cpulevel <= CL_NONE) { cpu_flags &= ~CPUF_ARM_NEON; // switch off the most minimal feature } #elif defined(X86_32) || defined(X86_64) // group feature if (cpulevel <= CL_AVX512_FAST) { // disable all avx512, re-enable the whole mask up to "fast" cpu_flags &= ~CPUF_AVX512_MASK; cpu_flags |= CPUF_AVX512_FAST_ALL; } // group feature if (cpulevel <= CL_AVX512_BASE) { // disable all avx512, re-enable the whole mask up to "base" cpu_flags &= ~CPUF_AVX512_MASK; cpu_flags |= CPUF_AVX512_BASE_ALL; } // individual features if (cpulevel <= CL_AVX2) // just disable all avx512 cpu_flags &= ~CPUF_AVX512_MASK; if (cpulevel <= CL_AVX) cpu_flags &= ~(CPUF_AVX2 | CPUF_FMA3 | CPUF_FMA4 | CPUF_F16C); if (cpulevel <= CL_SSE4_2) cpu_flags &= ~(CPUF_AVX); // switch off AVX, when max is sse4.2, other features already off if (cpulevel <= CL_SSE4_1) cpu_flags &= ~(CPUF_SSE4_2); if (cpulevel <= CL_SSSE3) cpu_flags &= ~(CPUF_SSE4_1); if (cpulevel <= CL_SSE3) cpu_flags &= ~(CPUF_SSSE3); if (cpulevel <= CL_SSE2) cpu_flags &= ~(CPUF_SSE3); if (cpulevel <= CL_SSE) cpu_flags &= ~(CPUF_SSE2); if (cpulevel <= CL_MMX) cpu_flags &= ~(CPUF_SSE | CPUF_INTEGER_SSE); // ? if (cpulevel <= CL_NONE) cpu_flags &= ~(CPUF_MMX); #else // nothing to do, only "none" exists #endif } else { int64_t current_flag; switch (cpulevel) { #if defined(ARM64) case CL_SVE2_1: current_flag = CPUF_ARM_SVE2_1; break; case CL_I8MM: current_flag = CPUF_ARM_I8MM; break; case CL_SVE2: current_flag = CPUF_ARM_SVE2; break; case CL_DOTPROD: current_flag = CPUF_ARM_DOTPROD; break; case CL_NEON: current_flag = CPUF_ARM_NEON; break; #elif defined(X86_32) || defined(X86_64) case CL_AVX512_FAST: current_flag = CPUF_AVX512_FAST_ALL; break; case CL_AVX512_BASE: current_flag = CPUF_AVX512_BASE_ALL; break; case CL_AVX2: current_flag = CPUF_AVX2 | CPUF_FMA3; break; case CL_AVX: current_flag = CPUF_AVX; break; case CL_SSE4_2: current_flag = CPUF_SSE4_2; break; case CL_SSE4_1: current_flag = CPUF_SSE4_1; break; case CL_SSSE3: current_flag = CPUF_SSSE3; break; case CL_SSE3: current_flag = CPUF_SSE3; break; case CL_SSE2: current_flag = CPUF_SSE2; break; case CL_SSE: current_flag = CPUF_SSE; break; case CL_MMX: current_flag = CPUF_MMX; break; #else // nothing to do, only "none" exists #endif default: current_flag = 0; } if (mode < 0) { if (0 != current_flag) cpu_flags &= ~current_flag; // sse2-: removes sse2 } else cpu_flags |= current_flag; // avx2+: adds avx2 and fma3 // limit to sse2 and avx2: "sse2,avx2+" } } cpuFlagsEx = cpu_flags; } ClipDataStore* ScriptEnvironment::ClipData(IClip *clip) { #if ( !defined(_MSC_VER) || (_MSC_VER < 1900) ) return &(clip_data.emplace(clip, clip).first->second); #else return &(clip_data.try_emplace(clip, clip).first->second); #endif } void ScriptEnvironment::AdjustMemoryConsumption(size_t amount, bool minus) { if (minus) Devices->GetCPUDevice()->memory_used -= amount; else Devices->GetCPUDevice()->memory_used += amount; } void ScriptEnvironment::ParallelJob(ThreadWorkerFuncPtr jobFunc, void* jobData, IJobCompletion* completion) { thread_pool->QueueJob(jobFunc, jobData, threadEnv.get(), static_cast(completion)); } void ScriptEnvironment::ParallelJob(ThreadWorkerFuncPtr jobFunc, void* jobData, IJobCompletion* completion, InternalEnvironment* env) { thread_pool->QueueJob(jobFunc, jobData, env, static_cast(completion)); } void ScriptEnvironment::SetFilterMTMode(const char* filter, MtMode mode, bool force) { this->SetFilterMTMode(filter, mode, force ? MtWeight::MT_WEIGHT_2_USERFORCE : MtWeight::MT_WEIGHT_1_USERSPEC); } void ScriptEnvironment::SetFilterMTMode(const char* filter, MtMode mode, MtWeight weight) { assert(NULL != filter); assert(strcmp("", filter) != 0); if (((int)mode <= (int)MT_INVALID) || ((int)mode >= (int)MT_MODE_COUNT)) { throw AvisynthError("Invalid MT mode specified."); } if (streqi(filter, DEFAULT_MODE_SPECIFIER.c_str())) { DefaultMtMode = mode; return; } std::string name_to_register; std::string loading; { std::unique_lock env_lock(plugin_mutex); loading = plugin_manager->PluginLoading(); } if (loading.empty()) name_to_register = filter; else name_to_register = loading.append("_").append(filter); name_to_register = NormalizeString(name_to_register); auto it = MtMap.find(name_to_register); if (it != MtMap.end()) { if ((int)weight >= (int)(it->second.second)) { it->second.first = mode; it->second.second = weight; } } else { MtMap.emplace(name_to_register, std::make_pair(mode, weight)); } } bool ScriptEnvironment::FilterHasMtMode(const Function* filter) const { if (filter->name == nullptr) { // no named function return false; } const auto& end = MtMap.end(); return (end != MtMap.find(NormalizeString(filter->canon_name))) || (end != MtMap.find(NormalizeString(filter->name))); } static bool isValidVSMapKey(const std::string& s); // forward void ScriptEnvironment::SetFilterProp(const char* filter, const char* key, const AVSValue& value, int mode) { assert(filter != nullptr && *filter != '\0'); assert(key != nullptr); if (!isValidVSMapKey(std::string(key))) ThrowError("SetFilterProp: invalid property key '%s'. Must start with a letter or underscore, " "followed only by letters, digits and underscores.", key); if (mode != AVSPropAppendMode::PROPAPPENDMODE_REPLACE && mode != AVSPropAppendMode::PROPAPPENDMODE_APPEND && mode != AVSPropAppendMode::PROPAPPENDMODE_TOUCH) ThrowError("SetFilterProp: invalid mode %d for filter '%s', key '%s'.", mode, filter, key); std::string name_to_register; std::string loading; { std::unique_lock env_lock(plugin_mutex); loading = plugin_manager->PluginLoading(); } if (loading.empty()) name_to_register = filter; else name_to_register = loading + "_" + filter; name_to_register = NormalizeString(name_to_register); FilterPropMap[name_to_register].push_back(PropEntry{ std::string(key), value, mode, {}, AVSValue() }); } void ScriptEnvironment::SetFilterPropConditional(const char* filter, const char* param_name, const AVSValue& param_match, const char* key, const AVSValue& value, int mode) { assert(filter != nullptr && *filter != '\0'); assert(param_name != nullptr && *param_name != '\0'); assert(key != nullptr); if (!isValidVSMapKey(std::string(key))) ThrowError("SetFilterProp: invalid property key '%s'. Must start with a letter or underscore, " "followed only by letters, digits and underscores.", key); if (mode != AVSPropAppendMode::PROPAPPENDMODE_REPLACE && mode != AVSPropAppendMode::PROPAPPENDMODE_APPEND && mode != AVSPropAppendMode::PROPAPPENDMODE_TOUCH) ThrowError("SetFilterProp: invalid mode %d for filter '%s', key '%s'.", mode, filter, key); std::string name_to_register; std::string loading; { std::unique_lock env_lock(plugin_mutex); loading = plugin_manager->PluginLoading(); } if (loading.empty()) name_to_register = filter; else name_to_register = loading + "_" + filter; name_to_register = NormalizeString(name_to_register); FilterPropMap[name_to_register].push_back(PropEntry{ std::string(key), value, mode, std::string(param_name), param_match }); } void ScriptEnvironment::SetFilterPropPassthrough(const char* filter) { assert(filter != nullptr && *filter != '\0'); std::string name_to_register; std::string loading; { std::unique_lock env_lock(plugin_mutex); loading = plugin_manager->PluginLoading(); } if (loading.empty()) name_to_register = filter; else name_to_register = loading + "_" + filter; FilterPropPassthroughSet.insert(NormalizeString(name_to_register)); } const char* ScriptEnvironment::GetFilterProps() { std::string json = "[\n"; bool first = true; for (const auto& kv : FilterPropMap) { for (const auto& entry : kv.second) { if (!first) json += ",\n"; first = false; json += " {\"filter\":\"" + kv.first + "\",\"key\":\"" + entry.key + "\""; if (!entry.param_name.empty()) { json += ",\"when_param\":\"" + entry.param_name + "\",\"when_value\":"; // param_match can be a scalar or an alias array auto serializeScalar = [&](const AVSValue& v) -> std::string { if (v.IsString()) return "\"" + std::string(v.AsString()) + "\""; if (v.IsInt()) return std::to_string(v.AsLong()); if (v.IsFloat()) return double_to_string(v.AsFloat()); if (v.IsBool()) return v.AsBool() ? "true" : "false"; return "null"; }; if (entry.param_match.IsArray()) { json += "["; for (int j = 0; j < entry.param_match.ArraySize(); ++j) { if (j > 0) json += ","; json += serializeScalar(entry.param_match[j]); } json += "]"; } else { json += serializeScalar(entry.param_match); } } json += ","; if (entry.value.IsFunction()) { json += "\"type\":\"function\",\"value\":null"; } else if (entry.value.IsInt()) { json += "\"type\":\"int\",\"value\":" + std::to_string(entry.value.AsLong()); } else if (entry.value.IsBool()) { // bool values are converted to int at registration; this branch is a safety net json += "\"type\":\"int\",\"value\":" + std::to_string(entry.value.AsBool() ? 1 : 0); } else if (entry.value.IsFloat()) { json += "\"type\":\"float\",\"value\":" + double_to_string(entry.value.AsFloat()); } else if (entry.value.IsString()) { std::string escaped; for (unsigned char c : std::string(entry.value.AsString())) { if (c == '"') escaped += "\\\""; else if (c == '\\') escaped += "\\\\"; else if (c == '\n') escaped += "\\n"; else if (c == '\r') escaped += "\\r"; else escaped += c; } json += "\"type\":\"string\",\"value\":\"" + escaped + "\""; } else if (!entry.value.Defined()) { json += "\"type\":\"capture\",\"value\":null"; // undefined(): capture from named call arg } else { json += "\"type\":\"unknown\",\"value\":null"; } json += ",\"mode\":" + std::to_string(entry.mode) + "}"; } } json += "\n]"; return threadEnv->SaveString(json.c_str(), (int)json.size()); } MtMode ScriptEnvironment::GetFilterMTMode(const Function* filter, bool* is_forced) const { assert(NULL != filter); if (filter->name == nullptr) { // no named function *is_forced = false; return DefaultMtMode; } assert(NULL != filter->name); assert(NULL != filter->canon_name); auto it = MtMap.find(NormalizeString(filter->canon_name)); if (it != MtMap.end()) { *is_forced = it->second.second == MtWeight::MT_WEIGHT_2_USERFORCE; return it->second.first; } it = MtMap.find(NormalizeString(filter->name)); if (it != MtMap.end()) { *is_forced = it->second.second == MtWeight::MT_WEIGHT_2_USERFORCE; return it->second.first; } *is_forced = false; return DefaultMtMode; } /* This function adds information about builtin functions into global variables. * External utilities (like AvsPmod) can parse these variables and use them * to learn about supported functions and their syntax. */ void ScriptEnvironment::ExportBuiltinFilters() { std::string FunctionList; FunctionList.reserve(512); const size_t NumFunctionArrays = sizeof(builtin_functions) / sizeof(builtin_functions[0]); for (size_t i = 0; i < NumFunctionArrays; ++i) { for (const AVSFunction* f = builtin_functions[i]; !f->empty(); ++f) { // This builds the $InternalFunctions$ variable, which is a list of space-delimited // function names. Utilities can learn the names of the builtin function from this. FunctionList.append(f->name); FunctionList.push_back(' '); // For each supported function, a global variable is added with as the name, // and the list of parameters to that function as the value. std::string param_var_name; param_var_name.reserve(128); param_var_name.append("$Plugin!"); param_var_name.append(f->name); param_var_name.append("!Param$"); threadEnv->SetGlobalVar(threadEnv->SaveString(param_var_name.c_str(), (int)param_var_name.size()), AVSValue(f->param_types)); } } // Save $InternalFunctions$ threadEnv->SetGlobalVar("$InternalFunctions$", AVSValue(threadEnv->SaveString(FunctionList.c_str(), (int)FunctionList.size()))); } size_t ScriptEnvironment::GetEnvProperty(AvsEnvProperty prop) { switch (prop) { case AEP_NUM_DEVICES: return Devices->GetNumDevices(); case AEP_FRAME_ALIGN: return frame_align; case AEP_PLANE_ALIGN: return plane_align; case AEP_FILTERCHAIN_THREADS: return nMaxFilterInstances; case AEP_PHYSICAL_CPUS: return GetNumPhysicalCPUs(); case AEP_CACHESIZE_L2: return cache_size_L2; case AEP_LOGICAL_CPUS: return std::thread::hardware_concurrency(); case AEP_THREAD_ID: return 0; case AEP_THREADPOOL_THREADS: return thread_pool->NumThreads(); case AEP_VERSION: #ifdef RELEASE_TARBALL return 0; #else return AVS_SEQREV; #endif case AEP_HOST_SYSTEM_ENDIANNESS: return (uintptr_t)AVS_ENDIANNESS; case AEP_INTERFACE_VERSION: return AVISYNTH_INTERFACE_VERSION; case AEP_INTERFACE_BUGFIX: return AVISYNTHPLUS_INTERFACE_BUGFIX_VERSION; default: this->ThrowError("Invalid property request."); return std::numeric_limits::max(); } assert(0); } bool ScriptEnvironment::LoadPlugin(const char* filePath, bool throwOnError, AVSValue *result) { // Autoload needed to ensure that manual LoadPlugin() calls always override autoloaded plugins. // For that, autoloading must happen before any LoadPlugin(), so we force an // autoload operation before any LoadPlugin(). std::unique_lock env_lock(plugin_mutex); this->AutoloadPlugins(); return plugin_manager->LoadPlugin(filePath, throwOnError, result); } void ScriptEnvironment::AddAutoloadDir(const char* dirPath, bool toFront) { std::unique_lock env_lock(plugin_mutex); plugin_manager->AddAutoloadDir(dirPath, toFront); } void ScriptEnvironment::ClearAutoloadDirs() { std::unique_lock env_lock(plugin_mutex); plugin_manager->ClearAutoloadDirs(); } char* ScriptEnvironment::ListAutoloadDirs() { std::unique_lock env_lock(plugin_mutex); std::string str = plugin_manager->ListAutoloadDirs(); return threadEnv->SaveString(str.c_str(), (int)str.size()); } void ScriptEnvironment::AutoloadPlugins() { std::unique_lock env_lock(plugin_mutex); plugin_manager->AutoloadPlugins(); } int ScriptEnvironment::SetMemoryMax(int mem) { Device* cpuDevice = Devices->GetCPUDevice(); if (mem > 0) /* If mem is zero, we should just return current setting */ cpuDevice->memory_max = ConstrainMemoryRequest(mem * 1048576ull); return (int)(cpuDevice->memory_max / 1048576ull); } int ScriptEnvironment::SetWorkingDir(const char* newdir) { return SetCurrentDirectory(newdir) ? 0 : 1; } void ScriptEnvironment::CheckVersion(int version) { if (version > AVISYNTH_INTERFACE_VERSION) ThrowError("Plugin was designed for a later version of Avisynth (%d)", version); } int ScriptEnvironment::GetCPUFlags() { return cpuFlagsEx & 0xFFFFFFFF; } int64_t ScriptEnvironment::GetCPUFlagsEx() { return cpuFlagsEx; } void ScriptEnvironment::AddFunction(const char* name, const char* params, ApplyFunc apply, void* user_data) { this->AddFunction(name, params, apply, user_data, NULL); } // called from IScriptEnvironment_Avs25 void ScriptEnvironment::AddFunction25(const char* name, const char* params, ApplyFunc apply, void* user_data) { std::unique_lock env_lock(plugin_mutex); plugin_manager->AddFunction(name, params, apply, user_data, NULL, true, false); } // called from IScriptEnvironment_AvsPreV11C void ScriptEnvironment::AddFunctionPreV11C(const char* name, const char* params, ApplyFunc apply, void* user_data) { std::unique_lock env_lock(plugin_mutex); plugin_manager->AddFunction(name, params, apply, user_data, NULL, false, true); } void ScriptEnvironment::AddFunction(const char* name, const char* params, ApplyFunc apply, void* user_data, const char *exportVar) { std::unique_lock env_lock(plugin_mutex); plugin_manager->AddFunction(name, params, apply, user_data, exportVar, false, false); } VideoFrame* ScriptEnvironment::AllocateFrame(size_t vfb_size, size_t margin, Device* device) { if (vfb_size > (size_t)std::numeric_limits::max()) { throw AvisynthError(threadEnv->Sprintf("Requested buffer size of %zu is too large", vfb_size)); } VFBStorage* vfb = NULL; try { vfb = new VFBStorage((int)vfb_size, (int)margin, device); } catch(const std::bad_alloc&) { return NULL; } VideoFrame *new_frame = NULL; try { new_frame = new VideoFrame(vfb, new AVSMap(), 0, 0, 0, 0, VideoInfo::CS_UNKNOWN); } catch(const std::bad_alloc&) { delete vfb; return NULL; } device->memory_used += vfb_size; vfb->Attach(threadEnv->GetCurrentGraphNode()); // automatically inserts keys if they not exist! // no locking here, calling method have done it already FrameRegistry2[vfb_size][vfb].push_back(DebugTimestampedFrame(new_frame)); //_RPT1(0, "ScriptEnvironment::AllocateFrame %zu frame=%p vfb=%p %" PRIu64 "\n", vfb_size, newFrame, newFrame->vfb, memory_used); return new_frame; } #ifdef _DEBUG static void DebugOut(char* s) { #ifdef AVS_POSIX LogMsg(LOGLEVEL_DEBUG, s); #else _RPT0(0, s); #endif } void ScriptEnvironment::ListFrameRegistry(size_t min_size, size_t max_size, bool someframes) { char buf[1024]; //#define FULL_LIST_OF_VFBs //#define LIST_ALSO_SOME_FRAMES int size1 = 0; int size2 = 0; int size3 = 0; snprintf(buf, 1023, "******** %p <= FrameRegistry2 Address. Buffer list for size between %7zu and %7zu\n", &FrameRegistry2, min_size, max_size); DebugOut(buf); snprintf(buf, 1023, ">> IterateLevel #1: Different vfb sizes: FrameRegistry2.size=%zu \n", FrameRegistry2.size()); DebugOut(buf); size_t total_vfb_size = 0; auto t_end = std::chrono::high_resolution_clock::now(); // list to debugview: all frames up-to vfb_size size for (FrameRegistryType2::iterator it = FrameRegistry2.lower_bound(min_size), end_it = FrameRegistry2.upper_bound(max_size); it != end_it; ++it) { size1++; _RPT3(0, ">>>> IterateLevel #2 [%3d]: Vfb count for size %7zu is %7zu\n", size1, it->first, it->second.size()); for (auto &it2: it->second) { size2++; VFBStorage* vfb = static_cast(it2.first); total_vfb_size += vfb->GetDataSize(); size_t inner_frame_count_size = it2.second.size(); #ifdef ALTERNATIVE_VFB_TIMESTAMP snprintf(buf, 1023, ">>>> IterateLevel #3 %5zu frames in [%3d,%5d] --> vfb=%p vfb_refcount=%3ld vfb_timestamp=%" PRId64 " seqNum=%d\n", inner_frame_count_size, size1, size2, vfb, vfb->refcount, vfb->last_freed_timestamp.load(), vfb->GetSequenceNumber()); #else snprintf(buf, 1023, ">>>> IterateLevel #3 %5zu frames in [%3d,%5d] --> vfb=%p vfb_refcount=%3ld seqNum=%d\n", inner_frame_count_size, size1, size2, vfb, vfb->refcount, vfb->GetSequenceNumber()); #endif DebugOut(buf); // iterate the frame list of this vfb int inner_frame_count = 0; int inner_frame_count_for_frame_refcount_nonzero = 0; for (auto &it3: it2.second) { size3++; inner_frame_count++; #ifdef _DEBUG VideoFrame* frame = it3.frame; std::chrono::time_point frame_entry_timestamp = it3.timestamp; #else VideoFrame* frame = it3; #endif if (0 != frame->refcount) inner_frame_count_for_frame_refcount_nonzero++; if (someframes) { std::chrono::duration elapsed_seconds = t_end - frame_entry_timestamp; if (inner_frame_count <= 4) // list only the first 2. There can be even many thousand of frames! { // log only if frame creation timestamp is too old! // e.g. 100 secs, it must be a stuck frame (but can also be a valid static frame from ColorBars) // if (elapsed_seconds.count() > 100.0f && frame->refcount > 0) //if (frame->refcount > 0) { snprintf(buf, 1023, " >> Frame#%6d: vfb=%p frame=%p frame_refcount=%3ld T=%f ago\n", inner_frame_count, vfb, frame, frame->refcount, elapsed_seconds.count()); DebugOut(buf); } } else if (inner_frame_count == inner_frame_count_size - 1) { // log the last one if (frame->refcount > 0) { snprintf(buf, 1023, " ...Frame#%6d: vfb=%p frame=%p frame_refcount=%3ld \n", inner_frame_count, vfb, frame, frame->refcount); DebugOut(buf); } _RPT2(0, " == TOTAL of %d frames. Number of nonzero refcount=%d \n", inner_frame_count, inner_frame_count_for_frame_refcount_nonzero); } if (0 == vfb->refcount && 0 != frame->refcount) { snprintf(buf, 1023, " ########## VFB=0 FRAME!=0 ####### VFB: %p Frame:%p frame_refcount=%3ld \n", vfb, frame, frame->refcount); DebugOut(buf); } } } // After the inner loop, always print summary: snprintf(buf, 1023, " == TOTAL of %d frames. nonzero refcount=%d \n", inner_frame_count, inner_frame_count_for_frame_refcount_nonzero); DebugOut(buf); } } snprintf(buf, 1023, ">> >> >> array sizes %d %d %d Total VFB size=%zu\n", size1, size2, size3, total_vfb_size); DebugOut(buf); snprintf(buf, 1023, " ----------------------------\n"); DebugOut(buf); } #endif #ifndef ALTERNATIVE_VFB_TIMESTAMP VideoFrame* ScriptEnvironment::GetFrameFromRegistry(size_t vfb_size, Device* device) { #ifdef _DEBUG std::chrono::time_point t_start, t_end; // std::chrono::time_point t_start, t_end; t_start = std::chrono::high_resolution_clock::now(); #endif // FrameRegistry2 is like: map> > // typedef std::vector VideoFrameArrayType; // typedef std::map FrameBufferRegistryType; // typedef std::map FrameRegistryType2; // [vfb_size = 10000][vfb = 0x111111111] [frame = 0x129837192(,timestamp=xxx)] // [frame = 0x012312122(,timestamp=xxx)] // [frame = 0x232323232(,timestamp=xxx)] // [vfb = 0x222222222] [frame = 0x333333333(,timestamp=xxx)] // [frame = 0x444444444(,timestamp=xxx)] // Which is better? // - found exact vfb_size or // - allow reusing existing vfb's with size up to size_to_find*1.5 THIS ONE! // - allow to occupy any buffer that is bigger than the requested size //for (FrameRegistryType2::iterator it = FrameRegistry2.lower_bound(vfb_size), end_it = FrameRegistry2.upper_bound(vfb_size); // exact! no-go. special service clips can fragment it //for (FrameRegistryType2::iterator it = FrameRegistry2.lower_bound(vfb_size), end_it = FrameRegistry2.end(); // vfb_size or bigger, so a 100K size would claim a 1.5M space. for (FrameRegistryType2::iterator it = FrameRegistry2.lower_bound(vfb_size), end_it = FrameRegistry2.upper_bound(vfb_size * 3 / 2); // vfb_size or at most 1.5* bigger it != end_it; ++it) { for (auto &it2: it->second) { VFBStorage *vfb = static_cast(it2.first); // same for all map content, the key is vfb pointer if (device == vfb->device && 0 == vfb->refcount) // vfb device and refcount check { size_t videoFrameListSize = it2.second.size(); // size is more than one if SubFrame was used to create a new frame VideoFrame *frame_found; bool found = false; for (VideoFrameArrayType::iterator it3 = it2.second.begin(), end_it3 = it2.second.end(); it3 != end_it3; /* ++it3 not here, because of the delete */) { VideoFrame *frame = it3->frame; // sanity check if its refcount is zero // because when a vfb is free (refcount==0) then all its parent frames should also be free assert(0 == frame->refcount); // Note: Release() does not free 'properties'; FrameRegistry is the sole owner. // An Avisynth 2.5 filter ("baked code" in ancient avisynth.h) can set refcount // to zero without freeing extra frame data, so nullptr is not guaranteed here. // Clear content now to promptly free any large strings/arrays. if (frame->properties != nullptr) frame->properties->clear(); if (!found) { InterlockedIncrement(&(frame->vfb->refcount)); // same as &(vfb->refcount) vfb->free_count = 0; // reset free count vfb->Attach(threadEnv->GetCurrentGraphNode()); #ifdef _DEBUG char buf[256]; t_end = std::chrono::high_resolution_clock::now(); std::chrono::duration elapsed_seconds = t_end - t_start; snprintf(buf, 255, "ScriptEnvironment::GetNewFrame NEW METHOD EXACT hit! VideoFrameListSize=%7zu GotSize=%7zu FrReg.Size=%6zu vfb=%p frame=%p SeekTime:%f\n", videoFrameListSize, vfb_size, FrameRegistry2.size(), vfb, frame, elapsed_seconds.count()); _RPT0(0, buf); _RPT5(0, " frame %p RowSize=%d Height=%d Pitch=%d Offset=%d\n", frame, frame->GetRowSize(), frame->GetHeight(), frame->GetPitch(), frame->GetOffset()); #endif // properties was cleared above; create the AVSMap shell only if somehow null if (frame->properties == nullptr) frame->properties = new AVSMap(); // only 1 frame in list -> no delete if (videoFrameListSize <= 1) { _RPT1(0, "ScriptEnvironment::GetNewFrame returning frame. VideoFrameListSize was 1\n", videoFrameListSize); #ifdef _DEBUG it3->timestamp = std::chrono::high_resolution_clock::now(); // refresh timestamp! #endif return frame; // return immediately } // more than X: just registered the frame found, and erase all other frames from list plus delete frame objects also frame_found = frame; found = true; ++it3; } else { // if the first frame to this vfb was already found, then we free all others and delete it from the list // Benefit: no 4-5k frame list count per a single vfb. //_RPT4(0, "ScriptEnvironment::GetNewFrame Delete one frame %p RowSize=%d Height=%d Pitch=%d Offset=%d\n", frame, frame->GetRowSize(), frame->GetHeight(), frame->GetPitch(), frame->GetOffset()); delete frame; ++it3; } } // for it3 if (found) { _RPT1(0, "ScriptEnvironment::GetNewFrame returning frame_found. clearing frames. List count: it2->second.size(): %7zu \n", it2.second.size()); it2.second.clear(); it2.second.reserve(16); // initial capacity set to 16, avoid reallocation when 1st, 2nd, etc.. elements pushed later (possible speedup) it2.second.push_back(DebugTimestampedFrame(frame_found)); // keep only the first #ifdef _DEBUG //ListFrameRegistry(vfb_size, vfb_size, true); // for chasing stuck frames //ListFrameRegistry(0, vfb_size, true); // for chasing stuck frames #endif return frame_found; } } } // for it2 } // for it _RPT3(0, "ScriptEnvironment::GetNewFrame, no free entry in FrameRegistry. Requested vfb size=%zu memused=%" PRIu64 " memmax=%" PRIu64 "\n", vfb_size, device->memory_used.load(), device->memory_max); #ifdef _DEBUG //ListFrameRegistry(vfb_size, vfb_size, true); // for chasing stuck frames //ListFrameRegistry(0, vfb_size, true); // for chasing stuck frames #endif return NULL; } #else // A newer method which returns the most recently freed vfb VideoFrame* ScriptEnvironment::GetFrameFromRegistry(size_t vfb_size, Device* device) { #ifdef _DEBUG std::chrono::time_point t_start, t_end; t_start = std::chrono::high_resolution_clock::now(); #endif for (FrameRegistryType2::iterator it = FrameRegistry2.lower_bound(vfb_size), end_it = FrameRegistry2.upper_bound(vfb_size * 3 / 2); it != end_it; ++it) { // Find VFB with _highest_ last_freed_timestamp (most recently freed) VFBStorage* best_vfb = nullptr; int64_t best_timestamp = -1; FrameBufferRegistryType::iterator best_it2 = it->second.end(); // FIXME: size of frame registry? - Here we do always full scan. // Unlike the old method which returns first free. for (auto it2 = it->second.begin(); it2 != it->second.end(); ++it2) { VFBStorage* vfb = static_cast(it2->first); if (device == vfb->device && 0 == vfb->refcount) { int64_t timestamp = vfb->last_freed_timestamp.load(); if (timestamp > best_timestamp) { best_timestamp = timestamp; best_vfb = vfb; best_it2 = it2; } } } if (best_vfb != nullptr) { auto& it2 = best_it2; VFBStorage* vfb = best_vfb; // Process the most recently freed VFB (LRU strategy for better cache locality) // This new version is likely better because it prefers recently-used memory // (better cache performance), while the old version just grabs the first available match. size_t videoFrameListSize = it2->second.size(); VideoFrame* frame_found = nullptr; bool found = false; for (VideoFrameArrayType::iterator it3 = it2->second.begin(), end_it3 = it2->second.end(); it3 != end_it3; /* ++it3 not here, because of the delete */) { VideoFrame* frame = it3->frame; assert(0 == frame->refcount); // Clear content now to promptly free any large strings/arrays. if (frame->properties != nullptr) frame->properties->clear(); if (!found) { InterlockedIncrement(&(frame->vfb->refcount)); vfb->free_count = 0; vfb->Attach(threadEnv->GetCurrentGraphNode()); #ifdef _DEBUG char buf[256]; t_end = std::chrono::high_resolution_clock::now(); std::chrono::duration elapsed_seconds = t_end - t_start; snprintf(buf, 255, "ScriptEnvironment::GetNewFrame NEW METHOD EXACT hit! VideoFrameListSize=%7zu GotSize=%7zu FrReg.Size=%6zu vfb=%p frame=%p timestamp=%" PRId64 " SeqNum=%d SeekTime:%f\n", videoFrameListSize, vfb_size, FrameRegistry2.size(), vfb, frame, vfb->last_freed_timestamp.load(), vfb->GetSequenceNumber(), elapsed_seconds.count()); _RPT0(0, buf); #endif // properties was cleared above; create the AVSMap shell only if somehow null if (frame->properties == nullptr) frame->properties = new AVSMap(); frame_found = frame; found = true; #ifdef _DEBUG it3->timestamp = std::chrono::high_resolution_clock::now(); #endif ++it3; } else { delete frame; // ~VideoFrame()/DESTRUCTOR() deletes frame->properties ++it3; } } // for it3 if (found) { _RPT2(0, "ScriptEnvironment::GetNewFrame returning frame_found. clearing frames. List count: %7zu timestamp=%" PRId64 " SeqNum=%d\n", it2->second.size(), vfb->last_freed_timestamp.load(), vfb->GetSequenceNumber()); it2->second.clear(); it2->second.reserve(16); it2->second.push_back(DebugTimestampedFrame(frame_found)); #ifdef _DEBUG ListFrameRegistry(vfb_size, vfb_size, true); ListFrameRegistry(0, vfb_size, true); #endif return frame_found; } } } // for it _RPT3(0, "ScriptEnvironment::GetNewFrame, no free entry in FrameRegistry. Requested vfb size=%zu memused=%" PRIu64 " memmax=%" PRIu64 "\n", vfb_size, device->memory_used.load(), device->memory_max); #ifdef _DEBUG ListFrameRegistry(vfb_size, vfb_size, true); ListFrameRegistry(0, vfb_size, true); #endif return NULL; } #endif VideoFrame* ScriptEnvironment::GetNewFrame(size_t vfb_size, size_t margin, Device* device) { std::unique_lock env_lock(memory_mutex); // prevent fragmentation of vfb buffer list many different small-sized vfb's if (vfb_size < 64) vfb_size = 64; else if (vfb_size < 256) vfb_size = 256; else if (vfb_size < 512) vfb_size = 512; else if (vfb_size < 1024) vfb_size = 1024; else if (vfb_size < 2048) vfb_size = 2048; else if (vfb_size < 4096) vfb_size = 4096; /* ----------------------------------------------------------- * Try to return an unused but already allocated instance * ----------------------------------------------------------- */ VideoFrame* frame = GetFrameFromRegistry(vfb_size, device); if (frame != NULL) return frame; /* ----------------------------------------------------------- * No unused instance was found, try to allocate a new one * ----------------------------------------------------------- */ // We reserve 15% for unaccounted stuff if (device->memory_used + vfb_size < device->memory_max * 0.85f) { frame = AllocateFrame(vfb_size, margin, device); } if (frame != NULL) return frame; #ifdef _DEBUG // #define LIST_CACHES // list all cache_entries #ifdef LIST_CACHES int cache_counter = 0; for (auto &cit: CacheRegistry) { cache_counter++; AvsCache* cache = cit; int cache_size = cache->SetCacheHints(CACHE_GET_SIZE, 0); _RPT4(0, " cache#%d cache_ptr=%p cache_size=%d \n", cache_counter, (void*)cache, cache_size); // let's see what's in the cache } #endif #endif /* ----------------------------------------------------------- * Couldn't allocate, shrink cache and get more unused frames * ----------------------------------------------------------- */ ShrinkCache(device); /* ----------------------------------------------------------- * Try to return an unused frame again * ----------------------------------------------------------- */ frame = GetFrameFromRegistry(vfb_size, device); if (frame != NULL) return frame; /* ----------------------------------------------------------- * Try to allocate again * ----------------------------------------------------------- */ frame = AllocateFrame(vfb_size, margin, device); if (frame != NULL) return frame; OneTimeLogTicket ticket(LOGTICKET_W1100); LogMsgOnce(ticket, LOGLEVEL_WARNING, "Memory reallocation occurs. This will probably degrade performance. You can try increasing the limit using SetMemoryMax()."); /* ----------------------------------------------------------- * No frame found, free all the unused frames!!! * ----------------------------------------------------------- */ _RPT1(0, "Allocate failed. GC start memory_used=%" PRIu64 "\n", device->memory_used.load()); // unfortunately if we reach here, only 0 or 1 vfbs or frames can be freed, from lower vfb sizes // usually it's not enough // yet it is true that it's meaningful only to free up smaller vfb sizes here for (FrameRegistryType2::iterator it = FrameRegistry2.begin(), end_it = FrameRegistry2.upper_bound(vfb_size); it != end_it; ++it) { for (FrameBufferRegistryType::iterator it2 = (it->second).begin(), end_it2 = (it->second).end(); it2 != end_it2; /*++it2: not here: may delete iterator position */) { VFBStorage *vfb = static_cast(it2->first); if (device == vfb->device && 0 == vfb->refcount) // vfb refcount check { vfb->device->memory_used -= vfb->GetDataSize(); // frame->vfb->GetDataSize(); delete vfb; for (auto &it3: it2->second) { VideoFrame *currentframe = it3.frame; assert(0 == currentframe->refcount); delete currentframe; } // delete array belonging to this vfb in one step it2->second.clear(); // clear frame list it2 = (it->second).erase(it2); // clear current vfb } else ++it2; } } _RPT1(0, "End of garbage collection A memused=%" PRIu64 "\n", device->memory_used.load()); #if 0 static int counter = 0; char buf[200]; sprintf(buf, "Re allocation %d\r\n", counter++); OutputDebugStringA(buf); #endif /* ----------------------------------------------------------- * Try to allocate again * ----------------------------------------------------------- */ frame = AllocateFrame(vfb_size, margin, device); if ( frame != NULL) return frame; /* ----------------------------------------------------------- * Oh boy... * ----------------------------------------------------------- */ // See if we could benefit from 64-bit Avisynth if (sizeof(void*) == 4 && device == Devices->GetCPUDevice()) { #ifdef AVS_WINDOWS // Get system memory information MEMORYSTATUSEX memstatus; memstatus.dwLength = sizeof(memstatus); GlobalMemoryStatusEx(&memstatus); BOOL using_wow64; if (IsWow64Process(GetCurrentProcess(), &using_wow64) // if running 32-bits on a 64-bit OS && (memstatus.ullAvailPhys > 1024ull * 1024 * 1024)) // if at least 1GB of system memory is still free { OneTimeLogTicket ticket(LOGTICKET_W1007); LogMsgOnce(ticket, LOGLEVEL_INFO, "We have run out of memory, but your system still has some free RAM left. You might benefit from a 64-bit build of Avisynth+."); } #endif } ThrowError("Could not allocate video frame. Out of memory. memory_max = %" PRIu64 ", memory_used = %" PRIu64 " Request=%zu", device->memory_max, device->memory_used.load(), vfb_size); return NULL; } void ScriptEnvironment::ShrinkCache(Device *device) { /* ----------------------------------------------------------- * Shrink cache to keep memory limit * ----------------------------------------------------------- */ int shrinkcount = 0; for (auto &cit: CacheRegistry) { // Oh darn. We'd need more memory than we are allowed to use. // Let's reduce the amount of caching. // We try to shrink least recently used caches first. AvsCache* cache = cit; if (cache->GetDevice() != device) { continue; } int cache_size = cache->SetCacheHints(CACHE_GET_SIZE, 0); if (cache_size != 0) { _RPT2(0, "ScriptEnvironment::EnsureMemoryLimit shrink cache. cache=%p new size=%d\n", (void*)cache, cache_size - 1); cache->SetCacheHints(CACHE_SET_MAX_CAPACITY, cache_size - 1); shrinkcount++; } // if } // for cit if (shrinkcount != 0) { OneTimeLogTicket ticket(LOGTICKET_W1003); LogMsgOnce(ticket, LOGLEVEL_WARNING, "Caches have been shrunk due to low memory limit. This will probably degrade performance. You can try increasing the limit using SetMemoryMax()."); } /* ----------------------------------------------------------- * Count up free_count and free if it exceeds the threshold * ----------------------------------------------------------- */ // Free up in one pass in FrameRegistry2 if (shrinkcount) { _RPT1(0, "EnsureMemoryLimit GC start: memused=%" PRIu64 "\n", device->memory_used.load()); [[maybe_unused]] int freed_vfb_count = 0; [[maybe_unused]] int freed_frame_count = 0; [[maybe_unused]] int unfreed_frame_count = 0; for (auto &it: FrameRegistry2) { for (FrameBufferRegistryType::iterator it2 = (it.second).begin(), end_it2 = (it.second).end(); it2 != end_it2; /*++it2: not here: may delete iterator position */) { VFBStorage *vfb = static_cast(it2->first); // vfb device and refcount check and free count exceeds the threshold if (device == vfb->device && 0 == vfb->refcount && vfb->free_count++ >= device->free_thresh) { #if 0 static int counter = 0; char buf[200]; sprintf(buf, "Free frame !!! %d\r\n", counter++); OutputDebugStringA(buf); #endif device->memory_used -= vfb->GetDataSize(); #ifdef _DEBUG VFBStorage *_vfb = vfb; #endif delete vfb; ++freed_vfb_count; for (auto &it3: it2->second) { VideoFrame *frame = it3.frame; assert(0 == frame->refcount); if (0 == frame->refcount) { delete frame; ++freed_frame_count; } else { // there should not be such case: vfb.refcount=0 and frame.refcount!=0 ++unfreed_frame_count; #ifdef _DEBUG _RPT3(0, " ?????? frame refcount error!!! _vfb=%p frame=%p framerefcount=%d \n", _vfb, frame, frame->refcount); #endif } } // delete array belonging to this vfb in one step it2->second.clear(); // clear frame list it2 = (it.second).erase(it2); // clear vfb entry } else ++it2; } } _RPT4(0, "End of garbage collection B: freed_vfb=%d frame=%d unfreed=%d memused=%" PRIu64 "\n", freed_vfb_count, freed_frame_count, unfreed_frame_count, device->memory_used.load()); } } // no alpha PVideoFrame ScriptEnvironment::NewPlanarVideoFrame(int row_size, int height, int row_sizeUV, int heightUV, int align, bool U_first, int pixel_type, Device* device) { return NewPlanarVideoFrame(row_size, height, row_sizeUV, heightUV, align, U_first, false /* no alpha */, pixel_type, device); } // with alpha support PVideoFrame ScriptEnvironment::NewPlanarVideoFrame(int row_size, int height, int row_sizeUV, int heightUV, int align, bool U_first, bool alpha, int pixel_type, Device* device) { if (align < 0) { align = -align; OneTimeLogTicket ticket(LOGTICKET_W1009); LogMsgOnce(ticket, LOGLEVEL_WARNING, "A filter is using forced frame alignment, a feature that is deprecated and disabled. The filter will likely behave erroneously."); } align = max(align, frame_align); int pitchUV; const int pitchY = AlignNumber(row_size, align); if (!PlanarChromaAlignmentState && (row_size == row_sizeUV*2) && (height == heightUV*2)) { // Meet old 2.5 series API expectations for YV12 // Legacy alignment - pack Y as specified, pack UV half that pitchUV = (pitchY+1)>>1; // UV plane, width = 1/2 byte per pixel - don't align UV planes seperately. } else { // Align planes separately pitchUV = AlignNumber(row_sizeUV, align); } size_t sizeY = AlignNumber(pitchY * height, plane_align); size_t sizeUV = AlignNumber(pitchUV * heightUV, plane_align); size_t size = sizeY + 2 * sizeUV + (alpha ? sizeY : 0); VideoFrame *res = GetNewFrame(size, align - 1, device); int offsetU, offsetV, offsetA; const int offsetY = (int)(AlignPointer(res->vfb->GetWritePtr(), align) - res->vfb->GetWritePtr()); // first line offset for proper alignment if (U_first) { offsetU = offsetY + (int)sizeY; offsetV = offsetY + (int)sizeY + (int)sizeUV; offsetA = alpha ? offsetV + (int)sizeUV : 0; } else { offsetV = offsetY + (int)sizeY; offsetU = offsetY + (int)sizeY + (int)sizeUV; offsetA = alpha ? offsetU + (int)sizeUV : 0; } res->offset = offsetY; res->pitch = pitchY; res->row_size = row_size; res->height = height; res->offsetU = offsetU; res->offsetV = offsetV; res->pitchUV = pitchUV; res->row_sizeUV = row_sizeUV; res->heightUV = heightUV; // alpha support res->offsetA = offsetA; res->row_sizeA = alpha ? row_size : 0; res->pitchA = alpha ? pitchY : 0; res->pixel_type = pixel_type; return PVideoFrame(res); } // Variant #1.no frame property source PVideoFrame ScriptEnvironment::NewVideoFrameOnDevice(int row_size, int height, int align, int pixel_type, Device* device) { if (align < 0) { align = -align; OneTimeLogTicket ticket(LOGTICKET_W1009); this->LogMsgOnce(ticket, LOGLEVEL_WARNING, "A filter is using forced frame alignment, a feature that is deprecated and disabled. The filter will likely behave erroneously."); } align = max(align, frame_align); const int pitch = AlignNumber(row_size, align); size_t size = pitch * height; VideoFrame *res = GetNewFrame(size, align - 1, device); const int offset = (int)(AlignPointer(res->vfb->GetWritePtr(), align) - res->vfb->GetWritePtr()); // first line offset for proper alignment res->offset = offset; res->pitch = pitch; res->row_size = row_size; res->height = height; res->offsetU = offset; res->offsetV = offset; res->pitchUV = 0; res->row_sizeUV = 0; res->heightUV = 0; // alpha support res->offsetA = 0; res->row_sizeA = 0; res->pitchA = 0; res->pixel_type = pixel_type; return PVideoFrame(res); } // Variant #1. with frame property source PVideoFrame ScriptEnvironment::NewVideoFrameOnDevice(int row_size, int height, int align, int pixel_type, Device* device, const PVideoFrame* prop_src) { PVideoFrame result = NewVideoFrameOnDevice(row_size, height, align, pixel_type, device); if (prop_src) copyFrameProps(*prop_src, result); return result; } // Variant #2. without frame property source PVideoFrame ScriptEnvironment::NewVideoFrame(const VideoInfo& vi, const PDevice& device) { return NewVideoFrameOnDevice(vi, frame_align, (Device*)(void*)device); } // Variant #2. with frame property source PVideoFrame ScriptEnvironment::NewVideoFrame(const VideoInfo& vi, const PDevice& device, const PVideoFrame* prop_src) { PVideoFrame result = NewVideoFrame(vi, device); if (prop_src) copyFrameProps(*prop_src, result); return result; } // Variant #3. without frame property source PVideoFrame ScriptEnvironment::NewVideoFrameOnDevice(const VideoInfo& vi, int align, Device* device) { // todo: high bit-depth: we have too many types now. Do we need really check? // Check requested pixel_type: switch (vi.pixel_type) { case VideoInfo::CS_BGR24: case VideoInfo::CS_BGR32: case VideoInfo::CS_YUY2: case VideoInfo::CS_Y8: case VideoInfo::CS_YV12: case VideoInfo::CS_YV16: case VideoInfo::CS_YV24: case VideoInfo::CS_YV411: case VideoInfo::CS_I420: // AVS16 do not reject when a filter requests it // planar YUV 10-32 bit case VideoInfo::CS_YUV420P10: case VideoInfo::CS_YUV422P10: case VideoInfo::CS_YUV444P10: case VideoInfo::CS_Y10: case VideoInfo::CS_YUV420P12: case VideoInfo::CS_YUV422P12: case VideoInfo::CS_YUV444P12: case VideoInfo::CS_Y12: case VideoInfo::CS_YUV420P14: case VideoInfo::CS_YUV422P14: case VideoInfo::CS_YUV444P14: case VideoInfo::CS_Y14: case VideoInfo::CS_YUV420P16: case VideoInfo::CS_YUV422P16: case VideoInfo::CS_YUV444P16: case VideoInfo::CS_Y16: case VideoInfo::CS_YUV420PS: case VideoInfo::CS_YUV422PS: case VideoInfo::CS_YUV444PS: case VideoInfo::CS_Y32: // 16 bit/sample packed RGB case VideoInfo::CS_BGR48: case VideoInfo::CS_BGR64: // planar RGB case VideoInfo::CS_RGBP: case VideoInfo::CS_RGBP10: case VideoInfo::CS_RGBP12: case VideoInfo::CS_RGBP14: case VideoInfo::CS_RGBP16: case VideoInfo::CS_RGBPS: // planar RGBA case VideoInfo::CS_RGBAP: case VideoInfo::CS_RGBAP10: case VideoInfo::CS_RGBAP12: case VideoInfo::CS_RGBAP14: case VideoInfo::CS_RGBAP16: case VideoInfo::CS_RGBAPS: // planar YUVA 8-32 bit case VideoInfo::CS_YUVA420: case VideoInfo::CS_YUVA422: case VideoInfo::CS_YUVA444: case VideoInfo::CS_YUVA420P10: case VideoInfo::CS_YUVA422P10: case VideoInfo::CS_YUVA444P10: case VideoInfo::CS_YUVA420P12: case VideoInfo::CS_YUVA422P12: case VideoInfo::CS_YUVA444P12: case VideoInfo::CS_YUVA420P14: case VideoInfo::CS_YUVA422P14: case VideoInfo::CS_YUVA444P14: case VideoInfo::CS_YUVA420P16: case VideoInfo::CS_YUVA422P16: case VideoInfo::CS_YUVA444P16: case VideoInfo::CS_YUVA420PS: case VideoInfo::CS_YUVA422PS: case VideoInfo::CS_YUVA444PS: break; default: ThrowError("Filter Error: Filter attempted to create VideoFrame with invalid pixel_type."); } PVideoFrame retval; if (vi.IsPlanar() && (vi.NumComponents() > 1)) { if (vi.IsYUV() || vi.IsYUVA()) { // Planar requires different math ;) const int xmod = 1 << vi.GetPlaneWidthSubsampling(PLANAR_U); const int xmask = xmod - 1; if (vi.width & xmask) ThrowError("Filter Error: Attempted to request a planar frame that wasn't mod%d in width!", xmod); const int ymod = 1 << vi.GetPlaneHeightSubsampling(PLANAR_U); const int ymask = ymod - 1; if (vi.height & ymask) ThrowError("Filter Error: Attempted to request a planar frame that wasn't mod%d in height!", ymod); const int heightUV = vi.height >> vi.GetPlaneHeightSubsampling(PLANAR_U); retval = NewPlanarVideoFrame(vi.RowSize(PLANAR_Y), vi.height, vi.RowSize(PLANAR_U), heightUV, align, !vi.IsVPlaneFirst(), vi.IsYUVA(), vi.pixel_type, device); } else { // plane order: G,B,R retval = NewPlanarVideoFrame(vi.RowSize(PLANAR_G), vi.height, vi.RowSize(PLANAR_G), vi.height, align, !vi.IsVPlaneFirst(), vi.IsPlanarRGBA(), vi.pixel_type, device); } } else { if ((vi.width&1)&&(vi.IsYUY2())) ThrowError("Filter Error: Attempted to request an YUY2 frame that wasn't mod2 in width."); retval= NewVideoFrameOnDevice(vi.RowSize(), vi.height, align, vi.pixel_type, device); } return retval; } // Variant #3. with frame property source PVideoFrame ScriptEnvironment::NewVideoFrameOnDevice(const VideoInfo& vi, int align, Device* device, const PVideoFrame* prop_src) { PVideoFrame result = NewVideoFrameOnDevice(vi, align, device); if (prop_src) copyFrameProps(*prop_src, result); return result; } bool ScriptEnvironment::MakeWritable(PVideoFrame* pvf) { const PVideoFrame& vf = *pvf; // If the frame is already writable, do nothing. if (vf->IsWritable()) return false; // Otherwise, allocate a new frame (using NewVideoFrame) and // copy the data into it. Then modify the passed PVideoFrame // to point to the new buffer. Device* device = vf->GetFrameBuffer()->device; PVideoFrame dst; #ifdef ENABLE_CUDA if (device->device_type == DEV_TYPE_CUDA) { // copy whole frame dst = GetOnDeviceFrame(vf, device); CopyCUDAFrame(dst, vf, threadEnv.get()); } else #endif { const int row_size = vf->GetRowSize(); const int height = vf->GetHeight(); bool alpha = 0 != vf->GetPitch(PLANAR_A); if (vf->GetPitch(PLANAR_U)) { // we have no videoinfo, so we assume that it is Planar if it has a U plane. const int row_sizeUV = vf->GetRowSize(PLANAR_U); // for Planar RGB this returns row_sizeUV which is the same for all planes const int heightUV = vf->GetHeight(PLANAR_U); dst = NewPlanarVideoFrame(row_size, height, row_sizeUV, heightUV, frame_align, false /* always V first on internal images */, alpha, vf->pixel_type, device); } else { dst = NewVideoFrameOnDevice(row_size, height, frame_align, vf->pixel_type, device); } BitBlt(dst->GetWritePtr(), dst->GetPitch(), vf->GetReadPtr(), vf->GetPitch(), row_size, height); // Blit More planes (pitch, rowsize and height should be 0, if none is present) BitBlt(dst->GetWritePtr(PLANAR_V), dst->GetPitch(PLANAR_V), vf->GetReadPtr(PLANAR_V), vf->GetPitch(PLANAR_V), vf->GetRowSize(PLANAR_V), vf->GetHeight(PLANAR_V)); BitBlt(dst->GetWritePtr(PLANAR_U), dst->GetPitch(PLANAR_U), vf->GetReadPtr(PLANAR_U), vf->GetPitch(PLANAR_U), vf->GetRowSize(PLANAR_U), vf->GetHeight(PLANAR_U)); if (alpha) BitBlt(dst->GetWritePtr(PLANAR_A), dst->GetPitch(PLANAR_A), vf->GetReadPtr(PLANAR_A), vf->GetPitch(PLANAR_A), vf->GetRowSize(PLANAR_A), vf->GetHeight(PLANAR_A)); } copyFrameProps(vf, dst); *pvf = dst; return true; } void ScriptEnvironment::AtExit(IScriptEnvironment::ShutdownFunc function, void* user_data) { at_exit.Add(function, user_data); } // Registers a new VideoFrame (which shares an existing VFB via Subframe) into // FrameRegistry2, with eager pruning of dead entries. // // Why subframe registration is needed: // Even though the new subframe shares the source VFB, it must be registered so // that GetFrameFromRegistry cannot wrongly reassign the VFB while any subframe // still references it. The VFB refcount guards against reuse, but the registry // is the mechanism by which VideoFrame objects are tracked and eventually recycled. // // Why pruning is needed: // The naive approach (bare push_back) causes a memory leak when the source VFB // belongs to a static-frame clip such as ColorBars() or BlankClip(). Those clips // serve the same VFB for every GetFrame() call; its refcount never reaches 0. // GetFrameFromRegistry only cleans up dead VideoFrame objects when it finds // vfb->refcount == 0, so it never visits the static VFB's bucket. Each call to // Subframe/SubframePlanar/MakePropertyWritable pushes a new entry; the subframe // is used briefly, released (refcount drops to 0), but the dead VideoFrame object // is never deleted. Over a long sequence (e.g. 107000 frames) this accumulates // ~10 MB of dead VideoFrame objects. // // The fix: // Before pushing, scan the bucket and delete all entries with refcount == 0, // mirroring what GetFrameFromRegistry does during normal VFB recycling, but // eagerly, for buckets it will never visit. // For static-clip VFBs the vector stabilizes at exactly 2 entries: // [0] the original live frame (refcount >= 2, untouched) // [1] the single current subframe (refcount == 0 by next call, pruned then) // For normal (non-static) clips the VFB is recycled normally by // GetFrameFromRegistry; the prune loop finds nothing and is a no-op. // // NOTE 1: AllocateFrame is intentionally excluded. It always creates a brand-new // VFB with a fresh, empty bucket, so there are never stale entries to prune there. // // NOTE 2: Caller must hold memory_mutex before calling this function. // All four call sites (AllocateFrame excluded) acquire memory_mutex // via std::unique_lock env_lock(memory_mutex) // before reaching this point. void ScriptEnvironment::RegisterSubFrameInRegistry(size_t vfb_size, VideoFrameBuffer* vfb, VideoFrame* new_frame) { // caller must already hold memory_mutex auto& vec = FrameRegistry2[vfb_size][vfb]; for (auto it = vec.begin(); it != vec.end(); ) { VideoFrame* f = it->frame; if (f->refcount == 0) { delete f; // ~VideoFrame()/DESTRUCTOR() deletes f->properties it = vec.erase(it); } else { ++it; } } vec.push_back(DebugTimestampedFrame(new_frame)); #ifdef _DEBUG // ListFrameRegistry(vfb_size, vfb_size, true); #endif } PVideoFrame ScriptEnvironment::Subframe(PVideoFrame src, int rel_offset, int new_pitch, int new_row_size, int new_height) { if (src->GetFrameBuffer()->device->device_type == DEV_TYPE_CPU) if ((new_pitch | rel_offset) & (frame_align - 1)) ThrowError("Filter Error: Filter attempted to break alignment of VideoFrame."); VideoFrame* subframe = src->Subframe(rel_offset, new_pitch, new_row_size, new_height); const AVSMap &avsmap = src->getConstProperties(); if (propNumKeys(&avsmap) > 0) subframe->setProperties(avsmap); size_t vfb_size = src->GetFrameBuffer()->GetDataSize(); // vector and maps needs locking std::unique_lock env_lock(memory_mutex); assert(NULL != subframe); RegisterSubFrameInRegistry(vfb_size, src->GetFrameBuffer(), subframe); return subframe; } PVideoFrame ScriptEnvironment::SubframePlanar(PVideoFrame src, int rel_offset, int new_pitch, int new_row_size, int new_height, int rel_offsetU, int rel_offsetV, int new_pitchUV) { if(src->GetFrameBuffer()->device->device_type == DEV_TYPE_CPU) if ((rel_offset | new_pitch | rel_offsetU | rel_offsetV | new_pitchUV) & (frame_align - 1)) ThrowError("Filter Error: Filter attempted to break alignment of VideoFrame."); VideoFrame *subframe = src->Subframe(rel_offset, new_pitch, new_row_size, new_height, rel_offsetU, rel_offsetV, new_pitchUV); const AVSMap& avsmap = src->getConstProperties(); if (propNumKeys(&avsmap) > 0) subframe->setProperties(avsmap); size_t vfb_size = src->GetFrameBuffer()->GetDataSize(); // vector and maps needs locking std::unique_lock env_lock(memory_mutex); // vector needs locking! assert(subframe != NULL); RegisterSubFrameInRegistry(vfb_size, src->GetFrameBuffer(), subframe); return subframe; } // alpha aware version PVideoFrame ScriptEnvironment::SubframePlanar(PVideoFrame src, int rel_offset, int new_pitch, int new_row_size, int new_height, int rel_offsetU, int rel_offsetV, int new_pitchUV, int rel_offsetA) { if (src->GetFrameBuffer()->device->device_type == DEV_TYPE_CPU) if ((rel_offset | new_pitch | rel_offsetU | rel_offsetV | new_pitchUV | rel_offsetA) & (frame_align - 1)) ThrowError("Filter Error: Filter attempted to break alignment of VideoFrame."); VideoFrame* subframe; subframe = src->Subframe(rel_offset, new_pitch, new_row_size, new_height, rel_offsetU, rel_offsetV, new_pitchUV, rel_offsetA); const AVSMap& avsmap = src->getConstProperties(); if (propNumKeys(&avsmap) > 0) subframe->setProperties(avsmap); size_t vfb_size = src->GetFrameBuffer()->GetDataSize(); // vector and maps needs locking std::unique_lock env_lock(memory_mutex); assert(subframe != NULL); RegisterSubFrameInRegistry(vfb_size, src->GetFrameBuffer(), subframe); return subframe; } void* ScriptEnvironment::ManageCache(int key, void* data) { // An extensible interface for providing system or user access to the // ScriptEnvironment class without extending the IScriptEnvironment // definition. std::lock_guard env_lock(memory_mutex); switch ((MANAGE_CACHE_KEYS)key) { // Called by Cache instances upon creation case MC_RegisterCache: { AvsCache* cache = reinterpret_cast(data); if (FrontCache != NULL) CacheRegistry.push_back(FrontCache); FrontCache = cache; break; } // Called by Cache instances upon destruction case MC_UnRegisterCache: { AvsCache* cache = reinterpret_cast(data); if (FrontCache == cache) FrontCache = NULL; else CacheRegistry.remove(cache); break; } // Called by Cache instances when they want to expand their limit case MC_NodAndExpandCache: { AvsCache* cache = reinterpret_cast(data); // Nod if (cache != FrontCache) { CacheRegistry.move_to_back(cache); } // Given that we are within our memory limits, // try to expand the limit of those caches that // need it. // We try to expand most recently used caches first. int cache_cap = cache->SetCacheHints(CACHE_GET_CAPACITY, 0); int cache_reqcap = cache->SetCacheHints(CACHE_GET_REQUESTED_CAP, 0); if (cache_reqcap <= cache_cap) return 0; Device* device = cache->GetDevice(); if ((device->memory_used > device->memory_max) || (device->memory_max - device->memory_used < device->memory_max*0.1f)) { // If we don't have enough free reserves, take away a cache slot from // a cache instance that hasn't been used since long. for (AvsCache* old_cache : CacheRegistry) { if (old_cache->GetDevice() != device) { continue; } int osize = cache->SetCacheHints(CACHE_GET_SIZE, 0); if (osize != 0) { old_cache->SetCacheHints(CACHE_SET_MAX_CAPACITY, osize - 1); break; } } // for cit } #ifdef _DEBUG _RPT2(0, "ScriptEnvironment::ManageCache increase capacity to %d cache_id=%s\n", cache_cap + 1, cache->FuncName.c_str()); #endif cache->SetCacheHints(CACHE_SET_MAX_CAPACITY, cache_cap + 1); break; } // Called by Cache instances when they are accessed case MC_NodCache: { AvsCache* cache = reinterpret_cast(data); if (cache == FrontCache) { return 0; } CacheRegistry.move_to_back(cache); break; } // case case MC_RegisterMTGuard: { MTGuard* guard = reinterpret_cast(data); MTGuardRegistry.push_back(guard); break; } case MC_UnRegisterMTGuard: { MTGuard* guard = reinterpret_cast(data); for (auto& item : MTGuardRegistry) { if (item == guard) { item = NULL; break; } } break; } case MC_RegisterGraphNode: { FilterGraphNode* node = reinterpret_cast(data); GraphNodeRegistry.push_back(node); break; } case MC_UnRegisterGraphNode: { FilterGraphNode* node = reinterpret_cast(data); for (auto& item : GraphNodeRegistry) { if (item == node) { item = NULL; break; } } break; } case MC_QueryAvs25: case MC_QueryAvsPreV11C: { break; // not cache related } } // switch return 0; } bool ScriptEnvironment::PlanarChromaAlignment(IScriptEnvironment::PlanarChromaAlignmentMode key){ bool oldPlanarChromaAlignmentState = PlanarChromaAlignmentState; switch (key) { case IScriptEnvironment::PlanarChromaAlignmentOff: { PlanarChromaAlignmentState = false; break; } case IScriptEnvironment::PlanarChromaAlignmentOn: { PlanarChromaAlignmentState = true; break; } default: break; } return oldPlanarChromaAlignmentState; } /* A helper for Invoke. Copy a nested array of 'src' into a flat array 'dst'. Returns the number of elements that have been written to 'dst'. If 'dst' is NULL, will still return the number of elements that would have been written to 'dst', but will not actually write to 'dst'. */ static size_t Flatten(const AVSValue& src, AVSValue* dst, size_t index, int level, const char* const* arg_names = NULL) { // level is starting from zero if (src.IsArray() && level == 0 ) { // flatten for the first arg level const int array_size = src.ArraySize(); for (int i=0; iGetVarTry(search_name, &avsv) && avsv.IsFunction()) { //auto& funcv = avsv.AsFunction(); // c++ strict conformance: cannot Convert PFunction to PFunction& const PFunction& funcv = avsv.AsFunction(); const char* name = funcv->GetLegacyName(); const Function* func = funcv->GetDefinition(); if (name != nullptr) { // wrapped function search_name = name; } else if (AVSFunction::TypeMatch(func->param_types, args, num_args, false, threadEnv.get()) && AVSFunction::ArgNameMatch(func->param_types, args_names_count, arg_names)) { pstrict = AVSFunction::TypeMatch(func->param_types, args, num_args, true, threadEnv.get()); return func; } } std::unique_lock env_lock(plugin_mutex); const Function *result = NULL; auto orig_args_names_count = args_names_count; size_t oanc; do { // if args_names_count>0 then a 2x2 loop, strict yes/no, with or without args name matching // if =0, 2x loop strict yes/no,without args name matching for (int strict = 1; strict >= 0; --strict) { pstrict = strict & 1; // first, look in loaded plugins or user defined functions result = plugin_manager->Lookup(search_name, args, num_args, pstrict, args_names_count, arg_names); if (result) return result; // then, look for a built-in function for (int i = 0; i < sizeof(builtin_functions)/sizeof(builtin_functions[0]); ++i) for (const AVSFunction* j = builtin_functions[i]; !j->empty(); ++j) { if (streqi(j->name, search_name)) { if (AVSFunction::TypeMatch(j->param_types, args, num_args, pstrict, ctx) && AVSFunction::ArgNameMatch(j->param_types, args_names_count, arg_names)) return j; } } } // Try again without arg name matching oanc = args_names_count; args_names_count = 0; } while (oanc); // If we got here it means the function has not been found. // If we haven't done so yet, load the plugins in the autoload folders // and try again. if (!plugin_manager->HasAutoloadExecuted()) { plugin_manager->AutoloadPlugins(); args_names_count = orig_args_names_count; return Lookup(search_name, args, num_args, pstrict, args_names_count, arg_names, ctx); } return NULL; } bool ScriptEnvironment::CheckArguments(const Function* func, const AVSValue* args, size_t num_args, bool &pstrict, size_t args_names_count, const char* const* arg_names) { if (AVSFunction::TypeMatch(func->param_types, args, num_args, false, threadEnv.get()) && AVSFunction::ArgNameMatch(func->param_types, args_names_count, arg_names)) { pstrict = AVSFunction::TypeMatch(func->param_types, args, num_args, true, threadEnv.get()); return true; } return false; } #ifdef LISTARGUMENTS // debug static void ListArguments(const char *name, const AVSValue& args, int &level, bool flattened) { if (!strcmp(name, "Import")) return; if (!strcmp(name, "Eval")) return; if (level == 0) fprintf(stdout, "------- %s (%s)\r\n", name, flattened ? "flattened" : "orig"); level++; if (args.IsArray()) { const int as = args.ArraySize(); fprintf(stdout, "Array, size=%d {\r\n", as); for (int i = 0; i < as; i++) { fprintf(stdout, "Element#%d\r\n", i); ListArguments(name, args[i], level, flattened); } fprintf(stdout, "}\r\n"); } else { if (!args.Defined()) fprintf(stdout, "Undefined\r\n"); else if (args.IsBool()) fprintf(stdout, "Bool %s\r\n", args.AsBool() ? "true" : "false"); else if (args.GetType() == AvsValueType::VALUE_TYPE_LONG) // before IsInt() ! fprintf(stdout, "Long %" PRId64 "\r\n", args.AsLong()); else if (args.IsInt()) fprintf(stdout, "Int %d\r\n", args.AsInt()); else if (args.IsString()) fprintf(stdout, "String %s\r\n", args.AsString()); else if (args.GetType() == AvsValueType::VALUE_TYPE_FLOAT) // before IsFloat() ! fprintf(stdout, "Float %f\r\n", args.AsFloatf()); else if (args.IsFloat()) fprintf(stdout, "Float/Double %lf\r\n", args.AsFloat()); else if (args.IsFunction()) fprintf(stdout, "Function\r\n"); else if (args.IsClip()) fprintf(stdout, "Clip\r\n"); else fprintf(stdout, "Unknown type\r\n"); } level--; } static void ListArguments2(const char* name, const AVSValue* args, int& level, bool flattened, int len) { if (!strcmp(name, "Import")) return; if (!strcmp(name, "Eval")) return; fprintf(stdout, "------- %s (%s)\r\n", name, flattened ? "flattened" : "orig"); level++; for (int i = 0; i < len; i++) { ListArguments(name, *(args +i), level, flattened); } } #endif bool ScriptEnvironment::Invoke_(AVSValue *result, const AVSValue& implicit_last, const char* name, const Function *f, const AVSValue& args, const char* const* arg_names, InternalEnvironment* env_thread, bool is_runtime) { const int args_names_count = (arg_names && args.IsArray()) ? args.ArraySize() : 0; if (name == nullptr) { // for debug printing name = ""; } // Step #1: Flattening // arrays received in the place of unnamed parameters are flattened back // to have them as a list again, in order to be compatible with Avisynth's "array elements as comma // delimited parameters" definition style. // get how many args we will need to store size_t args2_count = Flatten(args, NULL, 0, 0, arg_names); if (args2_count > ScriptParser::max_args) ThrowError("Too many arguments passed to function (max. is %d)", ScriptParser::max_args); // flatten unnamed args std::vector args2(args2_count + 1, AVSValue()); args2[0] = implicit_last; Flatten(args, args2.data() + 1, 0, 0, arg_names); #ifdef LISTARGUMENTS // debug list of Invoke arguments before-after flattening int level = 0; ListArguments(name, args, level, false); // unflattened remark ListArguments2(name, args2.data()+1, level, true, args2_count); // flattened remark #endif // Step #2: Arguments check and function detection by matching signature. bool strict = false; int argbase = 1; if (f != nullptr) { // check arguments if (!this->CheckArguments(f, args2.data() + 1, args2_count, strict, args_names_count, arg_names)) { if (!implicit_last.Defined() || !this->CheckArguments(f, args2.data(), args2_count + 1, strict, args_names_count, arg_names)) return false; argbase = 0; args2_count += 1; } } else { // Because only one level is flattened, for 2+ Dimension arrays result are // at least two parameters which are still arrays) // [3,4,5] is flattened as 3,4,5 // clip, [[2,3], [3,4,5]] is flattened as clip, [2,3], [3,4,5] // find matching function f = this->Lookup(name, args2.data() + 1, args2_count, strict, args_names_count, arg_names, env_thread); if (!f) { if (!implicit_last.Defined()) return false; // search function definitions with implicite "last" given f = this->Lookup(name, args2.data(), args2_count + 1, strict, args_names_count, arg_names, env_thread); if (!f) return false; argbase = 0; args2_count += 1; } } // Problem: Animate has parameter signature both "iis.*" and "ciis.*" // ColorBars() // Animate(0, 100, "blur", 0.1, 1.5) // Here we find "iis.*" but it turns out that its given function parameter "Blur" requires a clip // Thus we got an exception later during the filter instantiation (really it is "Blur" who throws the exception) // (see comment Issue20200818 later). // Expression evaluator would catch NotFound and reissue _Invoke with a forced implicit_last in args. // Step #3: Unnamed arguments // combine unnamed args into arrays size_t src_index = 0; const char* p = f->param_types; std::vector args3; std::vector args3_really_filled; bool last_was_named = false; while (*p) { if (*p == '[') { // named parameter check: between brackets (no name validity check, empty is valid as well) const char* pstart = p + 1; p = strchr(pstart, ']'); if (!p) break; last_was_named = true; p++; // skip closing bracket } else if (((p[1] == '*') || (p[1] == '+'))) { // Case of unnamed arrays or named arrays // Special named array: [] with no real name // Pre 3.6: filling up named arrays with names from script level was not possible. // Memo: array function signature types: * means "zero or more". + means "one or more" // Example fake-named array: the first clip array parameter of BlankClip "[]c*[length]i etc. // Some functions with array signatures: // Select i.+ // SelectEvery: cii* // Format: s.* // MPP_SharedMemoryServer: csi[aux_clips]c*[max_cache_frames]i // BlankClip []c*[length]i (fake named array) // ArrayGet .i+ // ArraySize . // Array/ArrayCreate .*: [[2,3,4], [1,2]] -> [2,3,4], [1,2] // user_script_function(clip, int_array) c[]i* // Pre v3.6 script-level array definition: autodetect comma separated list elements // The parser detects the end of array: the next argument type is different. // Since the end of free-typed (".+" or ".*") arrays cannot be recognized, they are allowed to appear // only at the very end of the parameter signature // Option since 3.6: bracket-style array definition syntax size_t start = src_index; const char arg_type = *p; if (src_index < args2_count && args2[argbase + src_index].IsArray() // After flattening this only happens when an explicite array was passed. // typed array recognition is easy and unambigous && arg_type != '.' // to avoid .+ case when one can pass array of arrays like [[1,2,3],[4,5]] flattened to [1,2,3],[4,5] ) { if (arg_type != '.') { if (!AVSFunction::SingleTypeMatchArray(arg_type, args2[argbase + src_index], strict)) ThrowError("Array elements do not match with the specified type in function %s", name); } if(p[1] == '+' && args2[argbase + src_index].ArraySize() == 0) // one or more ThrowError("An array with zero element size was given to function %s which expects a 'one-or-more' style array argument", name); args3.push_back(args2[argbase + src_index]); // can't delete args2 early because of this args3_really_filled.push_back(true); // valid array content src_index++; } else { // Collect consecutive similary-typed parameters into an array by automatic detection of its end: // The end of a simple-typed array: // - when the comma separated parameter list is changing type // - no more parameters (list ends) // E.g. collect values into an integer array (i*) until values in the list are still integers. // The array collection in parameter sequence 1, 2, 3, "hello1", "hello2" will stop before "hello1" // because type is changed from i to s. // This is why the end of an 'any-type' array (.*) cannot be detected from a comma delimited list: // no stopping condition (no type), only the end of list can stop collecting. while ((src_index < args2_count)) { const bool match = AVSFunction::SingleTypeMatch(arg_type, args2[argbase + src_index], strict); if (!match) break; src_index++; } size_t size = src_index - start; // so we have size number of items detected. Put them back into an array. assert(args2_count >= size); // Even if the AVSValue below is an array of zero size, we can't skip adding it to args3, // because filters like BlankClip []c* or MPP_SharedMemoryServer might still be expecting it. // 3.7.1.: This statement is no longer true. BlankClip was modified to handle Undefined AVSValue instead of array[] properly /* Considerations on resolving parameter handling for "array of anything" parameter when array(s) would be passed directly. Memo: - Avisynth signature: .* or .+ - Script function specifier val_array or val_array_nz When parameter signature is array of anything (.* or .+) and the parameter is passed unnamed (even if it is a named parameter) then there is an ambiguos situation which Giving a parameter list of 1,2,3 will be detected as [1,2,3] (compatibility: list is grouped together into an array internally). E.g. 1 will be detected as [1] Passing nothing from an Avisynth script in the place of the parameter will be detected as [] (array size is zero, value is defined) initially, then later in the named parameter processing procedure it can be overridden directly by a named value. This rule means that a directly given script array e.g. [1,2,3] will be detected as [[1,2,3]], because unnamed and untyped parameters are put together into an array, which has the size of the list. This is a list of 1 element which happens to be an array. Avisynth cannot 'guess' whether we want to define a single array directly or this array is the only one part of the list. So an unnamedly passed [1,2,3] will appear as [ [1,2,3] ] in the unnamed "array of anything" parameter value. Syntax hint: When someone would like to pass a directly specified array (e.g. [1,2,3] instead of 1,2,3) to a .+ or .* parameter the parameter must be passed by name to avoid ambiguity! Example script function definition: function foo(val_array "n") Value seen inside the function body: Call Value of n foo() Undefined foo(1) [1] (*) foo(1,2,3) [1,2,3] (*) foo([1,2,3]) ! [[1,2,3]] (*) foo([1,2,3],[4,5]) ! [[1,2,3],[4,5]] (*) foo(n=[1,2,3]) [1,2,3] foo(n=[[1,2,3],[4,5]]) [[1,2,3],[4,5]] foo(n=[]) [] foo(n=1) [1] (**) foo(n="hello") ["hello"] (**) * compatible Avisynth way: comma delimited consecutive values form an array ** simple-type value passed to a named array parameter will be created as a 1-element real array // unnamed signature function foo(val_array n) Call n foo() [] (defined and array size is zero) Avisynth compatible behaviour */ if (size == 0 && p[1] == '+') // '+': one or more { if(!last_was_named) ThrowError("A zero-sized array (or empty parameter list) appeared in the place of an unnamed parameter to function %s which expects a 'one-or-more' style array argument", name); args3.push_back(AVSValue()); // push undefined args3_really_filled.push_back(false); // zero sized (not found) array can be specified later with argname } else { if (size == 0) { if (last_was_named) args3.push_back(AVSValue()); // Named array is left Undefined here. In a later section it can be overridden with named argument // This ensures that passing empty [] is different than not passing anything (Defined() vs. Undefined()) // because of this (undefined instead of zero-sized array) BlankClip was changed to handle to allow the parameter as undefined. else { args3.push_back(AVSValue(NULL, 0)); // Unnamed parameter: array of zero size. // Fixme cosmetics: Maybe this one even cannot be reached, because an unnamed compulsory parameter cannot be 'zero or more' array } } else // create a proper array from the list of elements args3.push_back(AVSValue(args2.data() + argbase + start, (int)size)); // can't delete args2 early because of this if (last_was_named && size > 0) args3_really_filled.push_back(true); // valid array content else args3_really_filled.push_back(false); // zero sized (not found) array can be specified later with argname } } p += 2; // skip type-char and '*' or '+' last_was_named = false; } else { if (src_index < args2_count) { // At this point we could still have an array in AVSValue because a directly given (e.g. [1,2,3]) array is accepted at the place of a "." (any) type // The signature checker recognizes and reports a signature match in AVSFunction::TypeMatch // Example call: fn([1,2,3]) where fn has a signature of "c[n]." // Allowing it does not do any harm // FIXME, When removed, we'd better remove the limitation in (look for: QWERTZUIOP) #ifdef DISABLE_ARRAYS_WHEN_DOT_ALONE if (args2[argbase + src_index].IsArray() && p[0] != 'a') { ThrowError((std::string("An array is passed to a non-array parameter type in function ") + std::string(name)).c_str()); } else #endif { args3.push_back(args2[argbase + src_index]); } args3_really_filled.push_back(true); } else { args3.push_back(AVSValue()); args3_really_filled.push_back(false); } src_index++; p++; // Skip possible array marker for named arrays like [colors]f+ // Note: this declaration style is recognized only for versions >= 3.5.3 // so plugins using this syntax won't load/work with older AviSynth versions // Older versions without this check will report various errors like "named parameter was given more than once" // but only when given with names. Providing a named parameter as unnamed was possible from // direct plugin use formerly as well. if ((p[0] == '*') || (p[0] == '+')) p++; last_was_named = false; } } if (src_index < args2_count) ThrowError("Too many arguments to function %s", name); // Step #4: Named arguments // copy named args for (int i = 0; iparam_types; *p; ++p) { if (*p == '*' || *p == '+') { continue; // without incrementing named_arg_index } else if (*p == '[') { p += 1; const char* q = strchr(p, ']'); if (!q) break; if (strlen(arg_names[i]) == size_t(q - p) && !_strnicmp(arg_names[i], p, q - p)) { // we have a match if (args3[named_arg_index].Defined() && args3_really_filled[named_arg_index]) { // when a parameter like named array was filled as an empty array // from the unnamed section we don't throw error for the first time ThrowError("Script error: the named argument \"%s\" was passed more than once (twice as named or first unnamed then named) to %s", arg_names[i], name); } else if (args[i].Defined() && args[i].IsArray() && ((q[2] == '*' || q[2] == '+')) && !AVSFunction::SingleTypeMatchArray(q[1], args[i], false)) { // e.g. passing colors=[235, 128, "Hello"] to [colors]f+ ThrowError("Script error: the named array argument \"%s\" to %s had a wrong element type", arg_names[i], name); } else if (args[i].Defined() && !args[i].IsArray() && !AVSFunction::SingleTypeMatch(q[1], args[i], false)) { ThrowError("Script error: the named argument \"%s\" to %s had the wrong type (passed '%c')", arg_names[i], name, args[i].GetType(), q[1]); } else { if (args[i].Defined() && args[i].IsArray()) { // e.g. foo(sigma=[1.0, 1.1]) to [sigma]f is invalid if (!(q[2] == '*' || q[2] == '+') && q[1] != '.' && q[1] != 'a') ThrowError("Script error: the named argument \"%s\" to %s had the wrong type (passed an array to a non-array and not-any parameter)", arg_names[i], name); if (q[2] == '+' && args[i].ArraySize() == 0) ThrowError("Script error: the named argument \"%s\" to %s is a 'one-or-more' element style array but had zero element count.", arg_names[i], name); } // Note (after having array type parameters in script functions) // When passing a simple value to an array parameter, we should really make an array of it // or else script function parameters of array types won't see this parameter as an array inside the function body. // Note: Unlike AVS scripts a real plugin - through Avisynth interface - is // - allowed to index an AVSValue which is not even an array. Index 0 returns the simple-type value itself. // - calling AVSValue ArraySize() returns 1 // But an AVS script syntax indexing and ArraySize() requires a real array, simple base type is not allowed there. if(args[i].Defined() && !args[i].IsArray() && (q[2] == '*' || q[2] == '+' || q[1] == 'a')) args3[named_arg_index] = AVSValue(&args[i],1); // really create an array with one element else args3[named_arg_index] = args[i]; args3_really_filled[named_arg_index] = true; goto success; } } else { p = q + 1; } } named_arg_index++; } // failure ThrowError("Script error: %s does not have a named argument \"%s\"", name, arg_names[i]); success:; } } std::vector(args3).shrink_to_fit(); // end of parameter matching and parsing if(is_runtime) { // Invoked by a thread or GetFrame AVSValue funcArgs(args3.data(), (int)args3.size()); if (f->isPluginAvs25) // like GRunT's AverageLuma wrapper *result = f->apply(funcArgs, f->user_data, (IScriptEnvironment*)((IScriptEnvironment_Avs25*)env_thread)); else if (f->isPluginPreV11C) *result = f->apply(funcArgs, f->user_data, (IScriptEnvironment*)((IScriptEnvironment_AvsPreV11C*)env_thread)); else *result = f->apply(funcArgs, f->user_data, env_thread); return true; } // 3.7.2: changed memory_mutex to invoke_mutex // Concurrent GetFrame with Invoke causes deadlock. // Healing mode #2 std::lock_guard env_lock(invoke_mutex); // Concurrent GetFrame with Invoke causes deadlock. // Increment this variable when Invoke running // to prevent submitting job to threadpool // Healing mode #1 from Neo ScopedCounter suppressThreadCount_(threadEnv->GetSuppressThreadCount()); // chainedCtor is true if we are being constructed inside/by the // constructor of another filter. In that case we want MT protections // applied not here, but by the Invoke() call of that filter. const bool chainedCtor = invoke_stack.size() > 0; MtModeEvaluator mthelper; // Save clips whether one of them is returned unaltered after Invoke std::vector clip_parameters_raw; bool foundClipArgument = false; for (int i = argbase; i < (int)args2.size(); ++i) { auto& argx = args2[i]; // todo PF 161112 new arrays: recursive look into arrays whether they contain clips if (argx.IsClip()) { foundClipArgument = true; const PClip &clip = argx.AsClip(); IClip *clip_raw = (IClip*)((void*)clip); ClipDataStore *data = this->ClipData(clip_raw); // Save clips whether one of them is returned unaltered after Invoke clip_parameters_raw.push_back(clip_raw); if (!data->CreatedByInvoke) { #ifdef _DEBUG _RPT3(0, "ScriptEnvironment::Invoke.AddChainedFilter %s thread %d this->DefaultMtMode=%d\n", name, GetCurrentThreadId(), (int)this->DefaultMtMode); #endif mthelper.AddChainedFilter(clip, this->DefaultMtMode); } } } bool isSourceFilter = !foundClipArgument; // Capture call-time parameter values for filter-prop injection. // Must run before funcCtor (which moves args3) so we can read args3 here. // Using args3 (by now it is fully resolved) lets us match both positional and named call args. // For 99.9% of filters (not in FilterPropMap) this is just one fast O(1) map lookup. // Memo: f->param_types is the full function parameter signature. const std::vector* prop_entries_to_inject = nullptr; std::vector captured_entries; if (f->name != nullptr) { const std::string fname_for_prop = NormalizeString(f->canon_name ? f->canon_name : f->name); auto prop_it = FilterPropMap.find(fname_for_prop); if (prop_it == FilterPropMap.end() && f->canon_name != nullptr) prop_it = FilterPropMap.find(NormalizeString(f->name)); if (prop_it != FilterPropMap.end()) { bool needs_capture = false; for (const auto& e : prop_it->second) if (!e.value.Defined() || !e.param_name.empty()) { needs_capture = true; break; } if (needs_capture) { // Scan f->param_types for a [name]type parameter, return its args3 index or -1. // Works for both positional and named call args because args3 is fully resolved. auto findParamIdx = [&](const char* pname) -> int { int idx = 0; for (const char* p = f->param_types; *p; ++p) { if (*p == '*' || *p == '+') continue; // modifier, doesn't add a new slot if (*p == '[') { ++p; const char* q = strchr(p, ']'); if (!q) break; if (!_strnicmp(pname, p, q - p) && strlen(pname) == size_t(q - p)) return idx; // found: args3[idx] holds this param's value p = q + 1; // advance to type char, outer ++p moves past it } idx++; } return -1; }; auto scalarMatch = [](const AVSValue& actual, const AVSValue& candidate) -> bool { if (actual.IsString() && candidate.IsString()) return _stricmp(actual.AsString(), candidate.AsString()) == 0; // bool and int are interchangeable: true==1, false==0 if ((actual.IsInt() || actual.IsBool()) && (candidate.IsInt() || candidate.IsBool())) { int64_t a = actual.IsInt() ? actual.AsLong() : (actual.AsBool() ? 1LL : 0LL); int64_t c = candidate.IsInt() ? candidate.AsLong() : (candidate.AsBool() ? 1LL : 0LL); return a == c; } return (actual.IsFloat() && candidate.IsFloat() && actual.AsFloat() == candidate.AsFloat()); }; captured_entries = prop_it->second; // copy to resolve for (auto& entry : captured_entries) { if (!entry.param_name.empty()) { // Conditional: find formal param 'param_name' in args3 and compare to param_match. // param_match may be a scalar or an alias array (any element satisfies). // Works for positional and named call sites alike. int idx = findParamIdx(entry.param_name.c_str()); if (idx < 0 || idx >= (int)args3.size() || !args3[idx].Defined()) { entry.key.clear(); // param not in signature or not provided: skip } else { const AVSValue& actual = args3[idx]; bool matched = false; if (entry.param_match.IsArray()) { for (int j = 0; j < entry.param_match.ArraySize() && !matched; ++j) matched = scalarMatch(actual, entry.param_match[j]); } else { matched = scalarMatch(actual, entry.param_match); } if (!matched) entry.key.clear(); // condition not met: skip } } else if (!entry.value.Defined()) { // Unconditional capture: find formal param named entry.key in args3. int idx = findParamIdx(entry.key.c_str()); if (idx >= 0 && idx < (int)args3.size() && args3[idx].Defined()) entry.value = args3[idx]; // Still undefined: param not found or not passed; skipped at injection } } prop_entries_to_inject = &captured_entries; } else { prop_entries_to_inject = &(prop_it->second); // all entries have static values } } } // Capture passthrough source clip before funcCtor moves args3. // Only set when the filter is registered in FilterPropPassthroughSet AND args3[0] is a clip. PClip prop_passthrough_src; if (f->name != nullptr) { const std::string fname_pt = NormalizeString(f->canon_name ? f->canon_name : f->name); bool in_set = FilterPropPassthroughSet.count(fname_pt) > 0; if (!in_set && f->canon_name != nullptr) in_set = FilterPropPassthroughSet.count(NormalizeString(f->name)) > 0; if (in_set && !args3.empty() && args3[0].IsClip()) prop_passthrough_src = args3[0].AsClip(); } auto call_env = f->isPluginAvs25 || f->isPluginPreV11C ? nullptr : threadEnv.get(); auto call_env25 = f->isPluginAvs25 ? threadEnv.get()->GetEnv25() : nullptr; auto call_envPreV11C = f->isPluginPreV11C ? threadEnv.get()->GetEnvPreV11C() : nullptr; // ... and we're finally ready to make the call std::unique_ptr funcCtor = std::make_unique(call_env, call_env25, call_envPreV11C, f, &args2, &args3); _RPT1(0, "ScriptEnvironment::Invoke after funcCtor make unique %s\r\n", name); // args2 and args3 are not valid after this point anymore bool is_mtmode_forced; bool filterHasSpecialMT = this->GetFilterMTMode(f, &is_mtmode_forced) == MT_SPECIAL_MT; bool instantiated_clip_unaltered = false; #ifdef _DEBUG bool cache_guard_called = false; #endif if (filterHasSpecialMT) // pre-avs 3.6 workaround for MP_Pipeline { *result = funcCtor->InstantiateFilter(); #ifdef _DEBUG _RPT1(0, "ScriptEnvironment::Invoke done funcCtor->InstantiateFilter %s\r\n", name); #endif if ((*result).IsClip()) { // PropPassthrough: forward input frame properties for old filters that drop them. // Inserted before SetFilterProp entries so specific injections override inherited props. if (prop_passthrough_src) *result = new PropPassthrough((*result).AsClip(), prop_passthrough_src, threadEnv.get()); // property injection if (prop_entries_to_inject != nullptr) { for (const auto& entry : *prop_entries_to_inject) { if (entry.key.empty()) continue; if (!entry.value.Defined()) continue; const char* saved_key = threadEnv->SaveString(entry.key.c_str()); AVSValue prop_args[4] = { *result, AVSValue(saved_key), entry.value, AVSValue(entry.mode) }; *result = SetProperty::Create(AVSValue(prop_args, 4), (void*)0, threadEnv.get()); } } } } else if (funcCtor->IsScriptFunction()) { // Eval, EvalOop, Import and user defined script functions // Warn user if he set an MT-mode for a script function if (this->FilterHasMtMode(f)) { OneTimeLogTicket ticket(LOGTICKET_W1010, f); LogMsgOnce(ticket, LOGLEVEL_WARNING, "An MT-mode is set for %s() but it is a script function. You can only set the MT-mode for binary filters, for scripted functions it will be ignored.", f->name); } *result = funcCtor->InstantiateFilter(); #ifdef _DEBUG _RPT1(0, "ScriptEnvironment::Invoke done funcCtor->InstantiateFilter %s\r\n", name); #endif if ((*result).IsClip()) { if (prop_passthrough_src) *result = new PropPassthrough((*result).AsClip(), prop_passthrough_src, threadEnv.get()); if (prop_entries_to_inject != nullptr) { for (const auto& entry : *prop_entries_to_inject) { if (entry.key.empty()) continue; if (!entry.value.Defined()) continue; const char* saved_key = threadEnv->SaveString(entry.key.c_str()); AVSValue prop_args[4] = { *result, AVSValue(saved_key), entry.value, AVSValue(entry.mode) }; *result = SetProperty::Create(AVSValue(prop_args, 4), (void*)0, threadEnv.get()); } } } } else { #ifdef _DEBUG AvsCache *PrevFrontCache = FrontCache; #endif AVSValue fret; invoke_stack.push(&mthelper); try { fret = funcCtor->InstantiateFilter(); // Detect whether one of the parameter clip was returned unaltered. // Introduce bool instantiated_clip_unaltered. if (fret.IsClip()) { const PClip& clip = fret.AsClip(); IClip* clip_raw = (IClip*)((void*)clip); for (auto comparewith : clip_parameters_raw) { if (comparewith == clip_raw) { _RPT1(0, "ScriptEnvironment::Invoke funcCtor->InstantiateFilter %s returned the very same clip unaltered that was in a parameter\r\n", name); instantiated_clip_unaltered = true; break; } } } invoke_stack.pop(); } catch (...) { // comment: Issue20200818 invoke_stack.pop(); throw; } // Determine MT-mode, as if this instance had not called Invoke() // in its constructor. Note that this is not necessary the final // MT-mode. // PF 161012 hack(?) don't call if prefetch. If effective mt mode is MT_MULTI, then // Prefetch create gets called again // Prefetch is activated above in: fret = funcCtor->InstantiateFilter(); if (fret.IsClip() && (f->name == nullptr || strcmp(f->name, "Prefetch"))) { const PClip &clip = fret.AsClip(); bool is_mtmode_forced; this->GetFilterMTMode(f, &is_mtmode_forced); MtMode mtmode = MtModeEvaluator::GetMtMode(clip, f, threadEnv.get()); if (chainedCtor) { // Propagate information about our children's MT-safety // to our parent. invoke_stack.top()->Accumulate(mthelper); // Add our own MT-mode's information to the parent. invoke_stack.top()->Accumulate(mtmode); *result = fret; } else { if (!is_mtmode_forced) { mtmode = mthelper.GetFinalMode(mtmode); } // Special handling for source filters if (isSourceFilter && MtModeEvaluator::UsesDefaultMtMode(clip, f, threadEnv.get()) && (MT_SERIALIZED != mtmode)) { mtmode = MT_SERIALIZED; OneTimeLogTicket ticket(LOGTICKET_W1001, f); LogMsgOnce(ticket, LOGLEVEL_INFO, "%s() does not have any MT-mode specification. Because it is a source filter, it will use MT_SERIALIZED instead of the default MT mode.", f->canon_name); } // pass current directory as well, in order to remember it when a MT_MULTI_INSTANCE filter is populated to threads during Prefetch auto current_directory = CWDChanger::GetCurrentWorkingDirectory(); // wstring on Windows, string on POSIX // Do dot create MTGuard on an already existing clip if (!instantiated_clip_unaltered) { *result = MTGuard::Create(mtmode, clip, std::move(funcCtor), current_directory.c_str(), threadEnv.get()); IClip *clip_raw = (IClip*)((void*)clip); ClipDataStore *data = this->ClipData(clip_raw); data->CreatedByInvoke = true; } else { *result = clip; } } // if (chainedCtor) // Nekopanda: moved here from above. // some filters invoke complex filters in its constructor, and they need cache. // pf: Do not introduce (another) cache on an existing PClip if (!instantiated_clip_unaltered) { AVSValue args_cacheguard[2]{ *result, f->name }; *result = CacheGuard::Create(AVSValue(args_cacheguard, 2), NULL, threadEnv.get()); #ifdef _DEBUG cache_guard_called = true; #endif // Check that the filter returns zero for unknown queries in SetCacheHints(). // This is actually something we rely upon. if ((clip->GetVersion() >= 5) && (0 != clip->SetCacheHints(CACHE_USER_CONSTANTS, 0))) { OneTimeLogTicket ticket(LOGTICKET_W1002, f); LogMsgOnce(ticket, LOGLEVEL_WARNING, "%s() violates semantic contracts and may cause undefined behavior. Please inform the author of the plugin.", f->canon_name); } // Warn user if the MT-mode of this filter is unknown if (MtModeEvaluator::UsesDefaultMtMode(clip, f, threadEnv.get()) && !isSourceFilter) { OneTimeLogTicket ticket(LOGTICKET_W1004, f); LogMsgOnce(ticket, LOGLEVEL_WARNING, "%s() has no MT-mode set and will use the default MT-mode. This might be dangerous.", f->canon_name); } // Warn user if he forced an MT-mode that differs from the one specified by the filter itself if (is_mtmode_forced && MtModeEvaluator::ClipSpecifiesMtMode(clip) && MtModeEvaluator::GetInstanceMode(clip) != mtmode) { OneTimeLogTicket ticket(LOGTICKET_W1005, f); LogMsgOnce(ticket, LOGLEVEL_WARNING, "%s() specifies an MT-mode for itself, but a script forced a different one. Either the plugin or the script is erronous.", f->canon_name); } // Inform user if a script unnecessarily specifies an MT-mode for this filter if (!is_mtmode_forced && this->FilterHasMtMode(f) && MtModeEvaluator::ClipSpecifiesMtMode(clip)) { OneTimeLogTicket ticket(LOGTICKET_W1006, f); LogMsgOnce(ticket, LOGLEVEL_INFO, "Ignoring unnecessary MT-mode specification for %s() by script.", f->canon_name); } } // Auto-inject registered frame properties for this filter, outside !instantiated_clip_unaltered: // rules apply even when the filter returned a parameter clip unaltered. // PropPassthrough wraps first so specific SetFilterProp entries override inherited props. if ((*result).IsClip()) { if (prop_passthrough_src) *result = new PropPassthrough((*result).AsClip(), prop_passthrough_src, threadEnv.get()); // prop_entries_to_inject was resolved before InstantiateFilter(); undefined entries are // ones where capture-from-param failed (no matching named arg) and are skipped here. if (prop_entries_to_inject != nullptr) { for (const auto& entry : *prop_entries_to_inject) { if (entry.key.empty()) continue; // conditional entry: param did not match if (!entry.value.Defined()) continue; // capture-from-param: no named arg matched const char* saved_key = threadEnv->SaveString(entry.key.c_str()); AVSValue prop_args[4] = { *result, AVSValue(saved_key), entry.value, AVSValue(entry.mode) }; *result = SetProperty::Create(AVSValue(prop_args, 4), (void*)0, threadEnv.get()); } } } } // if (fret.IsClip()) else { *result = fret; } // static device check // this is not enough to check all dependencies but much helpful to users if ((*result).IsClip()) { auto last = (argbase == 0) ? implicit_last : AVSValue(); CheckChildDeviceTypes((*result).AsClip(), name, last, args, arg_names, threadEnv.get()); } // filter graph if (graphAnalysisEnable && (*result).IsClip()) { auto last = (argbase == 0) ? implicit_last : AVSValue(); *result = new FilterGraphNode((*result).AsClip(), f->name, last, args, arg_names, threadEnv.get()); } #ifdef _DEBUG if (PrevFrontCache != FrontCache && FrontCache != NULL) // cache registering swaps frontcache to the current { std::string real_function_name = name; if (!cache_guard_called) { real_function_name = "Unknow_Function_Invoked_By_No-Op_" + real_function_name + "_Create"; _RPT2(0, "ScriptEnvironment::Invoke nearEnd: FrontCache altered, (but no direct AvsCache call) FuncName=%s cache_id=%p\r\n", real_function_name.c_str(), (void*)FrontCache); } else { _RPT2(0, "ScriptEnvironment::Invoke nearEnd: FrontCache altered. FuncName=%s cache_id=%p\r\n", real_function_name.c_str(), (void*)FrontCache); } FrontCache->FuncName = real_function_name; // helps debugging. See also in cache.cpp } _RPT1(0, "ScriptEnvironment::Invoke done %s\r\n", name); #endif } return true; } bool ScriptEnvironment::FunctionExists(const char* name) { std::unique_lock env_lock(plugin_mutex); // Look among variable table AVSValue result; if (threadEnv->GetVarTry(name, &result)) { if (result.IsFunction()) { return true; } } // Look among internal functions if (InternalFunctionExists(name)) return true; // Look among plugin functions if (plugin_manager->FunctionExists(name)) return true; // Uhh... maybe if we load the plugins we'll have the function if (!plugin_manager->HasAutoloadExecuted()) { plugin_manager->AutoloadPlugins(); return this->FunctionExists(name); } return false; } bool ScriptEnvironment::InternalFunctionExists(const char* name) { for (int i = 0; i < sizeof(builtin_functions)/sizeof(builtin_functions[0]); ++i) for (const AVSFunction* j = builtin_functions[i]; !j->empty(); ++j) if (streqi(j->name, name)) return true; return false; } void ScriptEnvironment::BitBlt(BYTE* dstp, int dst_pitch, const BYTE* srcp, int src_pitch, int row_size, int height) { if (height<0) ThrowError("Filter Error: Attempting to blit an image with negative height."); if (row_size<0) ThrowError("Filter Error: Attempting to blit an image with negative row size."); ::BitBlt(dstp, dst_pitch, srcp, src_pitch, row_size, height); } void ScriptEnvironment::ThrowError(const char* fmt, ...) { va_list val; va_start(val, fmt); threadEnv->VThrowError(fmt, val); va_end(val); } void ScriptEnvironment::VThrowError(const char* fmt, va_list va) { threadEnv->VThrowError(fmt, va); } // since IF V8 it moved from IScriptEnvironment2 to IScriptEnvironment PVideoFrame ScriptEnvironment::SubframePlanarA(PVideoFrame src, int rel_offset, int new_pitch, int new_row_size, int new_height, int rel_offsetU, int rel_offsetV, int new_pitchUV, int rel_offsetA) { return SubframePlanar(src, rel_offset, new_pitch, new_row_size, new_height, rel_offsetU, rel_offsetV, new_pitchUV, rel_offsetA); } bool ScriptEnvironment::MakePropertyWritable(PVideoFrame* pvf) { const PVideoFrame& vf = *pvf; // If the frame is already writable, do nothing. if (vf->IsPropertyWritable()) return false; // Otherwise, allocate a new frame (using Subframe) // Thus we avoid the frame-content copy overhead and still get a new frame with its unique frameprop VideoFrame *dst; if (vf->GetPitch(PLANAR_A)) { // planar + alpha dst = vf->Subframe(0, vf->GetPitch(), vf->GetRowSize(), vf->GetHeight(), 0, 0, vf->GetPitch(PLANAR_U), 0); } else if (vf->GetPitch(PLANAR_U)) { // planar dst = vf->Subframe(0, vf->GetPitch(), vf->GetRowSize(), vf->GetHeight(), 0, 0, vf->GetPitch(PLANAR_U)); } else { // single plane dst = vf->Subframe(0, vf->GetPitch(), vf->GetRowSize(), vf->GetHeight()); } const AVSMap& avsmap = vf->getConstProperties(); if (propNumKeys(&avsmap) > 0) dst->setProperties(avsmap); size_t vfb_size = vf->GetFrameBuffer()->GetDataSize(); // vector and maps needs locking! std::unique_lock env_lock(memory_mutex); assert(dst != NULL); RegisterSubFrameInRegistry(vfb_size, vf->GetFrameBuffer(), dst); *pvf = dst; return true; } // since IF V8 frame property helpers are part of IScriptEnvironment void ScriptEnvironment::copyFrameProps(const PVideoFrame& src, PVideoFrame& dst) { dst->setProperties(src->getProperties()); } // frame properties support // core imported from VapourSynth // from vsapi.cpp const AVSMap* ScriptEnvironment::getFramePropsRO(const PVideoFrame& frame) AVS_NOEXCEPT { assert(frame); return &(frame->getConstProperties()); } AVSMap* ScriptEnvironment::getFramePropsRW(PVideoFrame &frame) AVS_NOEXCEPT { assert(frame); return &(frame->getProperties()); } int ScriptEnvironment::propNumKeys(const AVSMap* map) AVS_NOEXCEPT { assert(map); return static_cast(map->size()); } const char* ScriptEnvironment::propGetKey(const AVSMap* map, int index) AVS_NOEXCEPT { assert(map); if (index < 0 || static_cast(index) >= map->size()) ThrowError(("propGetKey: Out of bounds index " + std::to_string(index) + " passed. Valid range: [0," + std::to_string(map->size() - 1) + "]").c_str()); return map->key(index); } int ScriptEnvironment::propNumElements(const AVSMap* map, const char* key) AVS_NOEXCEPT { assert(map && key); VSArrayBase* val = map->find(key); return val ? static_cast(val->size()) : -1; } char ScriptEnvironment::propGetType(const AVSMap* map, const char* key) AVS_NOEXCEPT { assert(map && key); const char a[] = { 'u', 'i', 'f', 's', 'm', 'c', '?', 'v', '?' }; /* u PROPERTYTYPE_UNSET = 0, // ptUnset = 0, i PROPERTYTYPE_INT = 1, // ptInt = 1, f PROPERTYTYPE_FLOAT = 2, // ptFloat = 2, s PROPERTYTYPE_DATA = 3, // ptData = 3, m // ptFunction = 4, c PROPERTYTYPE_CLIP = 5, // ptVideoNode = 5, ? // ptAudioNode = 6, v PROPERTYTYPE_FRAME = 7, // ptVideoFrame = 7, ? // ptAudioFrame = 8 */ VSArrayBase* val = map->find(key); return val ? a[val->type()] : 'u'; } int ScriptEnvironment::propDeleteKey(AVSMap* map, const char* key) AVS_NOEXCEPT { assert(map && key); return map->erase(key); } static VSArrayBase* propGetShared(const AVSMap* map, const char* key, int index, int* error, AVSPropertyType propType, ScriptEnvironment *env) noexcept { assert(map && key && index >= 0); if (error) *error = AVSGetPropErrors::GETPROPERROR_SUCCESS; // peSuccess; if (map->hasError()) { if (error) *error = AVSGetPropErrors::GETPROPERROR_ERROR; // peError; else env->ThrowError(("Property read unsuccessful on map with error set but no error output: " + std::string(key)).c_str()); return nullptr; } VSArrayBase* arr = map->find(key); if (!arr) { if (error) *error = AVSGetPropErrors::GETPROPERROR_UNSET; // peUnset; else env->ThrowError(("Property read unsuccessful due to missing key but no error output: " + std::string(key)).c_str()); return nullptr; } if (index < 0 || index >= static_cast(arr->size())) { if (error) *error = AVSGetPropErrors::GETPROPERROR_INDEX; // peIndex; else env->ThrowError(("Property read unsuccessful due to out of bounds index but no error output: " + std::string(key)).c_str()); return nullptr; } if (arr->type() != propType) { if (error) *error = AVSGetPropErrors::GETPROPERROR_TYPE; // peType; else env->ThrowError(("Property read unsuccessful due to wrong type but no error output: " + std::string(key)).c_str()); return nullptr; } return arr; } int64_t ScriptEnvironment::propGetInt(const AVSMap* map, const char* key, int index, int* error) AVS_NOEXCEPT { VSArrayBase* arr = propGetShared(map, key, index, error, AVSPropertyType::PROPERTYTYPE_INT, this); // ptInt if (arr) return reinterpret_cast(arr)->at(index); else return 0; } int ScriptEnvironment::propGetIntSaturated(const AVSMap* map, const char* key, int index, int* error) AVS_NOEXCEPT { int internalError = 0; int64_t value = propGetInt(map, key, index, &internalError); if (error) { *error = internalError; } if (internalError == 0) { if (value > std::numeric_limits::max()) { return std::numeric_limits::max(); } if (value < std::numeric_limits::min()) { return std::numeric_limits::min(); } } return static_cast(value); } double ScriptEnvironment::propGetFloat(const AVSMap* map, const char* key, int index, int* error) AVS_NOEXCEPT { VSArrayBase* arr = propGetShared(map, key, index, error, AVSPropertyType::PROPERTYTYPE_FLOAT, this); // ptFloat if (arr) return reinterpret_cast(arr)->at(index); else return 0; } float ScriptEnvironment::propGetFloatSaturated(const AVSMap* map, const char* key, int index, int* error) AVS_NOEXCEPT { int internalError = 0; double value = propGetFloat(map, key, index, &internalError); if (error) { *error = internalError; } if (internalError == 0) { if (std::isnan(value)) { return std::numeric_limits::quiet_NaN(); } if (value > std::numeric_limits::max()) { return std::numeric_limits::max(); } if (value < -std::numeric_limits::max()) { return -std::numeric_limits::max(); } } return static_cast(value); } const char* ScriptEnvironment::propGetData(const AVSMap* map, const char* key, int index, int* error) AVS_NOEXCEPT { VSArrayBase* arr = propGetShared(map, key, index, error, AVSPropertyType::PROPERTYTYPE_DATA, this); // ptData if (arr) return reinterpret_cast(arr)->at(index).data.c_str(); else return nullptr; } int ScriptEnvironment::propGetDataSize(const AVSMap* map, const char* key, int index, int* error) AVS_NOEXCEPT { VSArrayBase* arr = propGetShared(map, key, index, error, AVSPropertyType::PROPERTYTYPE_DATA, this); // ptData if (arr) return static_cast(reinterpret_cast(arr)->at(index).data.size()); else return -1; } int ScriptEnvironment::propGetDataTypeHint(const AVSMap* map, const char* key, int index, int* error) AVS_NOEXCEPT { VSArrayBase* arr = propGetShared(map, key, index, error, AVSPropertyType::PROPERTYTYPE_DATA, this); // ptData if (arr) return reinterpret_cast(arr)->at(index).typeHint; else return AVSPropDataTypeHint::PROPDATATYPEHINT_UNKNOWN; // dtUnknown; } PClip ScriptEnvironment::propGetClip(const AVSMap* map, const char* key, int index, int* error) AVS_NOEXCEPT { int dummyError; VSArrayBase* arr = propGetShared(map, key, index, &dummyError, AVSPropertyType::PROPERTYTYPE_CLIP, this); // ptVideoNode if (arr) { // PClip itself is reference counted PClip ref = reinterpret_cast(arr)->at(index); return ref; } else { // no separate audio node in AVS return nullptr; } } const PVideoFrame ScriptEnvironment::propGetFrame(const AVSMap* map, const char* key, int index, int* error) AVS_NOEXCEPT { // PVideoFrame itself is reference counted int dummyError; VSArrayBase* arr = propGetShared(map, key, index, &dummyError, AVSPropertyType::PROPERTYTYPE_FRAME, this); // ptVideoFrame if (arr) { PVideoFrame ref = reinterpret_cast(arr)->at(index); return ref; } else { // no separate audio frame in AVS return nullptr; } } static inline bool isAlphaUnderscore(char c) { return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_'; } static inline bool isAlphaNumUnderscore(char c) { return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_'; } static bool isValidVSMapKey(const std::string& s) { size_t len = s.length(); if (!len) return false; if (!isAlphaUnderscore(s[0])) return false; for (size_t i = 1; i < len; i++) if (!isAlphaNumUnderscore(s[i])) return false; return true; } static int mapSetEmpty(AVSMap* map, const char* key, int type) AVS_NOEXCEPT { assert(map && key); if (!isValidVSMapKey(key)) return 1; std::string skey = key; if (map->find(skey)) return 1; switch (type) { case AVSPropertyType::PROPERTYTYPE_INT: // ptInt: map->insert(key, new VSIntArray); break; case AVSPropertyType::PROPERTYTYPE_FLOAT: // ptFloat: map->insert(key, new VSFloatArray); break; case AVSPropertyType::PROPERTYTYPE_DATA: // ptData: map->insert(key, new VSDataArray); break; case AVSPropertyType::PROPERTYTYPE_CLIP: // ptVideoNode: map->insert(key, new VSVideoNodeArray); break; /* case ptAudioNode: map->insert(key, new VSAudioNodeArray); break; */ case AVSPropertyType::PROPERTYTYPE_FRAME: // ptVideoFrame: map->insert(key, new VSVideoFrameArray); break; /* case ptAudioFrame: map->insert(key, new VSAudioFrameArray); break; */ /* case AVSPropertyType::PROPERTYTYPE_FUNCTION: // ptFunction: map->insert(key, new VSFunctionArray); break; */ default: return 1; } return 0; } template bool propSetShared(AVSMap* map, const char* key, const T& val, int append, ScriptEnvironment *env) { assert(map && key); if (append != AVSPropAppendMode::PROPAPPENDMODE_REPLACE && append != AVSPropAppendMode::PROPAPPENDMODE_APPEND && append != AVSPropAppendMode::PROPAPPENDMODE_TOUCH) // in VS4 this mode was dropped env->ThrowError("Invalid prop append mode given when setting key '%s'", key); if (!isValidVSMapKey(key)) return false; std::string skey = key; if (append == AVSPropAppendMode::PROPAPPENDMODE_REPLACE) { VSArray* v = new VSArray(); v->push_back(val); map->insert(key, v); return true; } else if (append == AVSPropAppendMode::PROPAPPENDMODE_APPEND) { VSArrayBase* arr = map->find(skey); if (arr && arr->type() == propType) { arr = map->detach(skey); reinterpret_cast*>(arr)->push_back(val); return true; } else if (arr) { return false; } else { VSArray* v = new VSArray(); v->push_back(val); map->insert(key, v); return true; } } else /* if (append == vs3::paTouch) */ { return !mapSetEmpty(map, key, propType); } } int ScriptEnvironment::propSetInt(AVSMap* map, const char* key, int64_t i, int append) AVS_NOEXCEPT { return !propSetShared(map, key, i, append, this); // ptInt } int ScriptEnvironment::propSetFloat(AVSMap* map, const char* key, double d, int append) AVS_NOEXCEPT { return !propSetShared(map, key, d, append, this); // ptFloat } // Unlike VS API4, Avisynth must maintain old function name, and introduce propSetDataH int ScriptEnvironment::propSetData(AVSMap* map, const char* key, const char* d, int length, int append) AVS_NOEXCEPT { return propSetDataH(map, key, d, length, AVSPropDataTypeHint::PROPDATATYPEHINT_UNKNOWN, append); // dtUnknown } // v11 int ScriptEnvironment::propSetDataH(AVSMap* map, const char* key, const char* d, int length, int type, int append) AVS_NOEXCEPT { return !propSetShared(map, key, { static_cast(type), (length >= 0) ? std::string(d, length) : std::string(d) }, append, this); } int ScriptEnvironment::propSetClip(AVSMap* map, const char* key, PClip& clip, int append) AVS_NOEXCEPT { return !propSetShared(map, key, clip, append, this); // ptVideoNode } int ScriptEnvironment::propSetFrame(AVSMap* map, const char* key, const PVideoFrame &frame, int append) AVS_NOEXCEPT { return !propSetShared(map, key, frame, append, this); // ptVideoFrame } const int64_t* ScriptEnvironment::propGetIntArray(const AVSMap* map, const char* key, int* error) AVS_NOEXCEPT { const VSArrayBase* arr = propGetShared(map, key, 0, error, AVSPropertyType::PROPERTYTYPE_INT, this); if (arr) { return reinterpret_cast(arr)->getDataPointer(); } else { return nullptr; } } const double* ScriptEnvironment::propGetFloatArray(const AVSMap* map, const char* key, int* error) AVS_NOEXCEPT { const VSArrayBase* arr = propGetShared(map, key, 0, error, AVSPropertyType::PROPERTYTYPE_FLOAT, this); if (arr) { return reinterpret_cast(arr)->getDataPointer(); } else { return nullptr; } } int ScriptEnvironment::propSetIntArray(AVSMap* map, const char* key, const int64_t* i, int size) AVS_NOEXCEPT { assert(map && key && size >= 0); if (size < 0) return 1; if (!isValidVSMapKey(key)) return 1; map->insert(key, new VSIntArray(i, size)); return 0; } int ScriptEnvironment::propSetFloatArray(AVSMap* map, const char* key, const double* d, int size) AVS_NOEXCEPT { assert(map && key && size >= 0); if (size < 0) return 1; if (!isValidVSMapKey(key)) return 1; map->insert(key, new VSFloatArray(d, size)); return 0; } AVSMap* ScriptEnvironment::createMap() AVS_NOEXCEPT { return new AVSMap(); } void ScriptEnvironment::freeMap(AVSMap* map) AVS_NOEXCEPT { delete map; } void ScriptEnvironment::clearMap(AVSMap* map) AVS_NOEXCEPT { assert(map); map->clear(); } // end of frame prop support functions PDevice ScriptEnvironment::GetDevice(AvsDeviceType device_type, int device_index) const { return Devices->GetDevice(device_type, device_index); } int ScriptEnvironment::SetMemoryMax(AvsDeviceType type, int index, int mem) { return Devices->GetDevice(type, index)->SetMemoryMax(mem); } bool ScriptEnvironment::AcquireGlobalLock(const char* name) { if (!name) return false; std::string lock_name(name); std::mutex& mtx = GlobalLockManager::get_mutex(lock_name); mtx.lock(); // Blocks until lock is acquired. GlobalLockManager::acquire_lock_for_env(lock_name, this); // Track for cleanup. return true; } void ScriptEnvironment::ReleaseGlobalLock(const char* name) { if (!name) return; std::string lock_name(name); std::mutex& mtx = GlobalLockManager::get_mutex(lock_name); GlobalLockManager::release_lock_for_env(lock_name, this); // Untrack. mtx.unlock(); } PVideoFrame ScriptEnvironment::GetOnDeviceFrame(const PVideoFrame& src, Device* device) { typedef int diff_t; size_t srchead = GetFrameHead(src); // make space for alignment size_t size = GetFrameTail(src) - srchead; VideoFrame *res = GetNewFrame(size, frame_align - 1, device); const diff_t offset = (diff_t)(AlignPointer(res->vfb->GetWritePtr(), frame_align) - res->vfb->GetWritePtr()); // first line offset for proper alignment const diff_t diff = offset - (diff_t)srchead; res->offset = src->offset + diff; res->pitch = src->pitch; res->row_size = src->row_size; res->height = src->height; res->offsetU = src->pitchUV ? (src->offsetU + diff) : res->offset; res->offsetV = src->pitchUV ? (src->offsetV + diff) : res->offset; res->pitchUV = src->pitchUV; res->row_sizeUV = src->row_sizeUV; res->heightUV = src->heightUV; res->offsetA = src->pitchA ? (src->offsetA + diff) : 0; res->pitchA = src->pitchA; res->row_sizeA = src->row_sizeA; res->pixel_type = src->pixel_type; *res->properties = *src->properties; return PVideoFrame(res); } ThreadPool* ScriptEnvironment::NewThreadPool(size_t nThreads) { // Creates threads with threadIDs (which envI->GetThreadId() is returning) starting from // (nTotalThreads+0) to (nTotalThreads+nThreads-1) ThreadPool* pool = new ThreadPool(nThreads, nTotalThreads, threadEnv.get()); ThreadPoolRegistry.emplace_back(pool); nTotalThreads += nThreads; // TotalThreads: 1 //*Prefetch(3) // added threads are 3, threadids: 1+0,1+1,1+2 (1,2,3) // TotalThreads = 4 from now // MaxFilterInstances -> 3->rounded up to 4 (next power of two). Number of instantiations // ChildFilter[0..3] (size = MaxFilterInstances) // GetThreadID & (4-1) = GetThreadID & 3 // ThreadID 1,2,3 will map to ChildFilter[x] where x is 1,2,3 // TotalThreads: 4 //*Prefetch(6) // added threads are 6, threadids: 4+0,4+1,4+2,4+3,4+4,4+5 (4,5,6,7,8,9) // TotalThreads = 10 from now // MaxFilterInstances -> 6->rounded up to 8 (next power of two). Number of instantiations // ChildFilter[0..7] (size = MaxFilterInstances) // GetThreadID & (8-1) = GetThreadID & 7 // ThreadID 4,5,6,7,8,9 will map to ChildFilter[x] where x is 4,5,6,7,0,1 // TotalThreads: 10 //*Prefetch(3) // added threads are 3, threadids: 10+0,10+1,10+2 (10,11,12) // TotalThreads = 13 from now // MaxFilterInstances -> 3->rounded up to 4 (next power of two). Number of instantiations // ChildFilter[0..3] (size = MaxFilterInstances) // GetThreadID & (4-1) = GetThreadID & 3 // ThreadID 10,11,12 will map to ChildFilter[x] where x is 2,3,0 // PF remark: this is not too memory friendly, because the excessive numbers of MT_MULTI_INSTANCE filters // Prefetch(3) will create 4 instances // Prefetch(4) will create 8 instances // Prefetch(9) will still create 16 instances, of which 7 is not accessed at all nMaxFilterInstances = nThreads; // really n/a // AEP_FILTERCHAIN_THREADS environment property ID returns this value. Unlikely if someone used it // for meaningful purposes. // Avisynth does not use that internally, and called from a filter preceesing another Prefetch, // only the last Prefetch's value is effectively returned, belonging to the actual 'env'. // Since this method basically enables MT operation, // upgrade all MTGuards to MT-mode. // iterates through all filters in the chain, even is an earlier Prefetch has set the MT threads earlier for (MTGuard* guard : MTGuardRegistry) { if (guard != NULL) guard->EnableMT(nThreads); } return pool; } void ScriptEnvironment::SetDeviceOpt(DeviceOpt opt, int val) { Devices->SetDeviceOpt(opt, val, threadEnv.get()); } void ScriptEnvironment::UpdateFunctionExports(const char* funcName, const char* funcParams, const char *exportVar) { std::unique_lock env_lock(plugin_mutex); plugin_manager->UpdateFunctionExports(funcName, funcParams, exportVar); } extern void ApplyMessage(PVideoFrame* frame, const VideoInfo& vi, const char* message, int size, int textcolor, int halocolor, int bgcolor, IScriptEnvironment* env); extern void ApplyMessageEx(PVideoFrame* frame, const VideoInfo& vi, const char* message, int size, int textcolor, int halocolor, int bgcolor, bool utf8, IScriptEnvironment* env); const AVS_Linkage* ScriptEnvironment::GetAVSLinkage() { extern const AVS_Linkage* const AVS_linkage; // In interface.cpp return AVS_linkage; } void ScriptEnvironment::ApplyMessageEx(PVideoFrame* frame, const VideoInfo& vi, const char* message, int size, int textcolor, int halocolor, int bgcolor, bool utf8) { #ifdef ENABLE_CUDA if ((*frame)->GetDevice()->device_type == DEV_TYPE_CUDA) { // if frame is CUDA frame, copy to CPU and apply PVideoFrame copy = GetOnDeviceFrame(*frame, Devices->GetCPUDevice()); CopyCUDAFrame(copy, *frame, threadEnv.get(), true); ::ApplyMessageEx(©, vi, message, size, textcolor, halocolor, bgcolor, utf8, threadEnv.get()); CopyCUDAFrame(*frame, copy, threadEnv.get(), true); } else #endif { ::ApplyMessageEx(frame, vi, message, size, textcolor, halocolor, bgcolor, utf8, threadEnv.get()); } } void ScriptEnvironment::ApplyMessage(PVideoFrame* frame, const VideoInfo& vi, const char* message, int size, int textcolor, int halocolor, int bgcolor) { ApplyMessageEx(frame, vi, message, size, textcolor, halocolor, bgcolor, false /* utf8 */); } void ScriptEnvironment::DeleteScriptEnvironment() { // Provide a method to delete this ScriptEnvironment in // the same malloc context in which it was created below. delete this; } AVSC_API(IScriptEnvironment*, CreateScriptEnvironment)(int version) { return CreateScriptEnvironment2(version); } // Can be called from C interface create_script_environment with specially marking the C interface source IScriptEnvironment2* CreateScriptEnvironment2_internal(int version, bool fromAvs25, bool fromC) { /* Some plugins use OpenMP. But OMP threads do not exit immediately * after all work is exhausted, and keep spinning for a small amount * of time waiting for new jobs. If we unload the OMP DLL (indirectly * by unloading its plugin that started it) while its threads are * running, the sky comes crashing down. This results in crashes * from OMP plugins if the IScriptEnvironment is destructed shortly * after a GetFrame() call. * * OMP_WAIT_POLICY=passive changes the behavior of OMP thread pools * to shut down immediately instead of continuing to spin. * This solves our problem at the cost of some performance. */ #ifdef AVS_WINDOWS _putenv("OMP_WAIT_POLICY=passive"); #endif // When a CPP plugin explicitely requests avs2.5 interface if (fromAvs25) { auto IEnv25 = (new ScriptEnvironment())->GetMainThreadEnv()->GetEnv25(); // return a disguised IScriptEnvironment_Avs25 return reinterpret_cast(IEnv25); } else if (fromC && version < 11) { // V11 supports 64 bit data types; no difference in IScriptEnvironment auto IEnvPreV11C = (new ScriptEnvironment())->GetMainThreadEnv()->GetEnvPreV11C(); // return a disguised IScriptEnvironment_AvsC return reinterpret_cast(IEnvPreV11C); } else if (version <= AVISYNTH_INTERFACE_VERSION) return (new ScriptEnvironment())->GetMainThreadEnv(); else return NULL; } AVSC_API(IScriptEnvironment2*, CreateScriptEnvironment2)(int version) { if (version <= AVISYNTH_CLASSIC_INTERFACE_VERSION_25) return CreateScriptEnvironment2_internal(version, true, false); // avs 2.5, non-C else if (version <= AVISYNTH_INTERFACE_VERSION) return CreateScriptEnvironment2_internal(version, false, false); // modern avs, non-C return nullptr; } /////////////// ================================================ FILE: avs_core/core/avisynth.def ================================================ LIBRARY AviSynth.dll EXPORTS DllGetClassObject PRIVATE DllCanUnloadNow PRIVATE CreateScriptEnvironment = _CreateScriptEnvironment@4 CreateScriptEnvironment2 = _CreateScriptEnvironment2@4 avs_add_function = _avs_add_function@20 avs_at_exit = _avs_at_exit@12 avs_bit_blt = _avs_bit_blt@28 avs_check_version = _avs_check_version@8 avs_clip_get_error = _avs_clip_get_error@4 avs_copy_clip = _avs_copy_clip@4 avs_copy_value = _avs_copy_value@12 avs_copy_video_frame = _avs_copy_video_frame@4 avs_create_script_environment = _avs_create_script_environment@4 avs_function_exists = _avs_function_exists@8 avs_get_audio = _avs_get_audio@24 avs_get_cpu_flags = _avs_get_cpu_flags@4 avs_get_frame = _avs_get_frame@8 avs_get_parity = _avs_get_parity@8 avs_get_var = _avs_get_var@8 avs_get_version = _avs_get_version@4 avs_get_video_info = _avs_get_video_info@4 avs_invoke = _avs_invoke@20 avs_make_writable = _avs_make_writable@8 avs_new_c_filter = _avs_new_c_filter@20 avs_new_video_frame_a = _avs_new_video_frame_a@12 avs_release_clip = _avs_release_clip@4 avs_release_value = _avs_release_value@8 avs_release_video_frame = _avs_release_video_frame@4 avs_save_string = _avs_save_string@12 avs_set_cache_hints = _avs_set_cache_hints@12 avs_set_global_var = _avs_set_global_var@16 avs_set_memory_max = _avs_set_memory_max@8 avs_set_to_clip = _avs_set_to_clip@8 avs_set_var = _avs_set_var@16 avs_set_working_dir = _avs_set_working_dir@8 avs_subframe = _avs_subframe@24 avs_take_clip = _avs_take_clip@12 avs_vsprintf = _avs_vsprintf@12 avs_sprintf avs_delete_script_environment = _avs_delete_script_environment@4 avs_subframe_planar = _avs_subframe_planar@36 avs_get_error = _avs_get_error@4 avs_is_yv24 = _avs_is_yv24@4 avs_is_yv16 = _avs_is_yv16@4 avs_is_yv12 = _avs_is_yv12@4 avs_is_yv411 = _avs_is_yv411@4 avs_is_y8 = _avs_is_y8@4 avs_is_color_space = _avs_is_color_space@8 avs_get_plane_width_subsampling = _avs_get_plane_width_subsampling@8 avs_get_plane_height_subsampling = _avs_get_plane_height_subsampling@8 avs_bits_per_pixel = _avs_bits_per_pixel@4 avs_bytes_from_pixels = _avs_bytes_from_pixels@8 avs_row_size = _avs_row_size@8 avs_bmp_size = _avs_bmp_size@4 avs_get_pitch_p = _avs_get_pitch_p@8 avs_get_row_size_p = _avs_get_row_size_p@8 avs_get_height_p = _avs_get_height_p@8 avs_get_read_ptr_p = _avs_get_read_ptr_p@8 avs_is_writable = _avs_is_writable@4 avs_get_write_ptr_p = _avs_get_write_ptr_p@8 avs_is_yuv444p16 = _avs_is_yuv444p16@4 avs_is_yuv422p16 = _avs_is_yuv422p16@4 avs_is_yuv420p16 = _avs_is_yuv420p16@4 avs_is_y16 = _avs_is_y16@4 avs_is_yuv444ps = _avs_is_yuv444ps@4 avs_is_yuv422ps = _avs_is_yuv422ps@4 avs_is_yuv420ps = _avs_is_yuv420ps@4 avs_is_y32 = _avs_is_y32@4 avs_num_components = _avs_num_components@4 avs_component_size = _avs_component_size@4 avs_bits_per_component = _avs_bits_per_component@4 avs_is_444 = _avs_is_444@4 avs_is_422 = _avs_is_422@4 avs_is_420 = _avs_is_420@4 avs_is_y = _avs_is_y@4 avs_is_yuva = _avs_is_yuva@4 avs_is_planar_rgb = _avs_is_planar_rgb@4 avs_is_planar_rgba = _avs_is_planar_rgba@4 avs_is_rgb48 = _avs_is_rgb48@4 avs_is_rgb64 = _avs_is_rgb64@4 avs_subframe_planar_a = _avs_subframe_planar_a@40 avs_copy_frame_props = _avs_copy_frame_props@12 avs_get_frame_props_ro = _avs_get_frame_props_ro@8 avs_get_frame_props_rw = _avs_get_frame_props_rw@8 avs_prop_num_keys = _avs_prop_num_keys@8 avs_prop_get_key = _avs_prop_get_key@12 avs_prop_num_elements = _avs_prop_num_elements@12 avs_prop_get_type = _avs_prop_get_type@12 avs_prop_get_int = _avs_prop_get_int@20 avs_prop_get_float = _avs_prop_get_float@20 avs_prop_get_data = _avs_prop_get_data@20 avs_prop_get_data_size = _avs_prop_get_data_size@20 avs_prop_get_clip = _avs_prop_get_clip@20 avs_prop_get_frame = _avs_prop_get_frame@20 avs_prop_delete_key = _avs_prop_delete_key@12 avs_prop_set_int = _avs_prop_set_int@24 avs_prop_set_float = _avs_prop_set_float@24 avs_prop_set_data = _avs_prop_set_data@24 avs_prop_set_clip = _avs_prop_set_clip@20 avs_prop_set_frame = _avs_prop_set_frame@20 avs_prop_get_int_array = _avs_prop_get_int_array@16 avs_prop_get_float_array = _avs_prop_get_float_array@16 avs_prop_set_int_array = _avs_prop_set_int_array@20 avs_prop_set_float_array = _avs_prop_set_float_array@20 avs_clear_map = _avs_clear_map@8 avs_new_video_frame_p = _avs_new_video_frame_p@12 avs_new_video_frame_p_a = _avs_new_video_frame_p_a@16 avs_get_env_property = _avs_get_env_property@8 avs_pool_allocate = _avs_pool_allocate@16 avs_pool_free = _avs_pool_free@8 avs_get_var_try = _avs_get_var_try@12 avs_get_var_bool = _avs_get_var_bool@12 avs_get_var_int = _avs_get_var_int@12 avs_get_var_double = _avs_get_var_double@16 avs_get_var_string = _avs_get_var_string@12 avs_get_var_long = _avs_get_var_long@16 avs_is_property_writable = _avs_is_property_writable@4 avs_make_property_writable = _avs_make_property_writable@8 avs_video_frame_get_pixel_type = _avs_video_frame_get_pixel_type@4 avs_video_frame_amend_pixel_type = _avs_video_frame_amend_pixel_type@8 avs_is_channel_mask_known = _avs_is_channel_mask_known@4 avs_set_channel_mask = _avs_set_channel_mask@12 avs_get_channel_mask = _avs_get_channel_mask@4 avs_set_to_error = _avs_set_to_error@8 avs_set_to_bool = _avs_set_to_bool@8 avs_set_to_int = _avs_set_to_int@8 avs_set_to_string = _avs_set_to_string@8 avs_set_to_float = _avs_set_to_float@8 avs_set_to_double = _avs_set_to_double@12 avs_set_to_long = _avs_set_to_long@12 avs_set_to_array = _avs_set_to_array@12 avs_set_to_void = _avs_set_to_void@4 avs_get_as_bool = _avs_get_as_bool@8 avs_get_as_clip = _avs_get_as_clip@12 avs_get_as_int = _avs_get_as_int@8 avs_get_as_long = _avs_get_as_long@8 avs_get_as_string = _avs_get_as_string@8 avs_get_as_float = _avs_get_as_float@8 avs_get_as_error = _avs_get_as_error@8 avs_get_as_array = _avs_get_as_array@8 avs_get_array_elt = _avs_get_array_elt@12 avs_get_array_size = _avs_get_array_size@8 avs_prop_get_int_saturated = _avs_prop_get_int_saturated@20 avs_prop_get_float_saturated = _avs_prop_get_float_saturated@20 avs_prop_get_data_type_hint = _avs_prop_get_data_type_hint@20 avs_prop_set_data_h = _avs_prop_set_data_h@28 avs_add_function_r = _avs_add_function_r@20 avs_val_defined = _avs_val_defined@8 avs_val_is_clip = _avs_val_is_clip@8 avs_val_is_bool = _avs_val_is_bool@8 avs_val_is_int = _avs_val_is_int@8 avs_val_is_long_strict = _avs_val_is_long_strict@8 avs_val_is_float = _avs_val_is_float@8 avs_val_is_floatf_strict = _avs_val_is_floatf_strict@8 avs_val_is_string = _avs_val_is_string@8 avs_val_is_array = _avs_val_is_array@8 avs_val_is_error = _avs_val_is_error@8 avs_acquire_global_lock = _avs_acquire_global_lock@8 avs_release_global_lock = _avs_release_global_lock@8 avs_get_cpu_flags_ex = _avs_get_cpu_flags_ex@4 ================================================ FILE: avs_core/core/avisynth.rc ================================================ #include #include "version.h" #define VER_FILEVERSION AVS_MAJOR_VER,AVS_MINOR_VER,AVS_BUGFIX_VER #define VER_PRODUCTVERSION AVS_MAJOR_VER,AVS_MINOR_VER,AVS_BUGFIX_VER #define VER_COMPANYNAME_STR "The Public\0" #define VER_FILEDESCRIPTION_STR "AviSynth video processing scripting language\0" #define VER_FILEVERSION_STR AVS_PPSTR(AVS_MAJOR_VER) ", " AVS_PPSTR(AVS_MINOR_VER) ", " AVS_PPSTR(AVS_BUGFIX_VER) "\0" #define VER_INTERNALNAME_STR AVS_FULLVERSION "\0" #define VER_LEGALCOPYRIGHT_STR " 2000-2026 Ben Rudiak-Gould and others\0" #define VER_ORIGINALFILENAME_STR "avisynth.dll\0" #define VER_PRODUCTNAME_STR AVS_FULLVERSION "\0" #define VER_PRODUCTVERSION_STR VER_FILEVERSION_STR #define VER_COMMENTS_STR "Homepage: http://avisynth.nl\0" #ifndef _DEBUG #define VER_DEBUG 0 #else #define VER_DEBUG VS_FF_DEBUG #endif #define AVS_ICON 0 #define AVSI_ICON 1 VS_VERSION_INFO VERSIONINFO FILEVERSION VER_FILEVERSION PRODUCTVERSION VER_PRODUCTVERSION FILEFLAGSMASK VS_FFI_FILEFLAGSMASK FILEFLAGS (VS_FF_PRERELEASE|VER_DEBUG) FILEOS VOS__WINDOWS32 FILETYPE VFT_DLL FILESUBTYPE VFT2_UNKNOWN BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904E4" BEGIN VALUE "CompanyName", VER_COMPANYNAME_STR VALUE "FileDescription", VER_FILEDESCRIPTION_STR VALUE "FileVersion", VER_FILEVERSION_STR VALUE "InternalName", VER_INTERNALNAME_STR VALUE "LegalCopyright", VER_LEGALCOPYRIGHT_STR // VALUE "LegalTrademarks1", VER_LEGALTRADEMARKS1_STR // VALUE "LegalTrademarks2", VER_LEGALTRADEMARKS2_STR VALUE "OriginalFilename", VER_ORIGINALFILENAME_STR VALUE "ProductName", VER_PRODUCTNAME_STR VALUE "ProductVersion", VER_PRODUCTVERSION_STR VALUE "Comments", VER_COMMENTS_STR END END BLOCK "VarFileInfo" BEGIN /* The following line should only be modified for localized versions. */ /* It consists of any number of WORD,WORD pairs, with each pair */ /* describing a language,codepage combination supported by the file. */ /* */ /* For example, a file might have values "0x409,1252" indicating that it */ /* supports English language (0x409) in the Windows ANSI codepage (1252). */ VALUE "Translation", 0x409, 1252 END END LANGUAGE LANG_NEUTRAL, SUBLANG_SYS_DEFAULT AVS_ICON ICON "../../distrib/Icons/Ico/AvsDocWindows.ico" AVSI_ICON ICON "../../distrib/Icons/Ico/AvsiDocWindows.ico" ================================================ FILE: avs_core/core/avisynth64.def ================================================ LIBRARY AviSynth.dll EXPORTS DllGetClassObject PRIVATE DllCanUnloadNow PRIVATE ================================================ FILE: avs_core/core/avisynth_c.cpp ================================================ // Avisynth C Interface // Based on Copyright 2003 Kevin Atkinson // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // #include #include #include "AVSMap.h" #include "internal.h" #ifdef AVS_WINDOWS #include #else #include #endif #include #include struct AVS_Clip { PClip clip; IScriptEnvironment* env; const char* error; AVS_Clip() : env(0), error(0) {} }; class C_VideoFilter : public IClip { public: // but don't use AVS_Clip child; AVS_ScriptEnvironment env; AVS_FilterInfo d; public: C_VideoFilter() { memset(&d, 0, sizeof(d)); } PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env); const VideoInfo& __stdcall GetVideoInfo(); bool __stdcall GetParity(int n); int __stdcall SetCacheHints(int cachehints, int frame_range); AVSC_CC ~C_VideoFilter(); }; ///////////////////////////////////////////////////////////////////// // // // extern "C" int AVSC_CC avs_is_rgb48(const AVS_VideoInfo * p) { return ((p->pixel_type & AVS_CS_BGR24) == AVS_CS_BGR24) && ((p->pixel_type & AVS_CS_SAMPLE_BITS_MASK) == AVS_CS_SAMPLE_BITS_16); } extern "C" int AVSC_CC avs_is_rgb64(const AVS_VideoInfo * p) { return ((p->pixel_type & AVS_CS_BGR32) == AVS_CS_BGR32) && ((p->pixel_type & AVS_CS_SAMPLE_BITS_MASK) == AVS_CS_SAMPLE_BITS_16); } extern "C" int AVSC_CC avs_is_yv24(const AVS_VideoInfo * p) { return (p->pixel_type & AVS_CS_PLANAR_MASK) == (AVS_CS_YV24 & AVS_CS_PLANAR_FILTER); } extern "C" int AVSC_CC avs_is_yv16(const AVS_VideoInfo * p) { return (p->pixel_type & AVS_CS_PLANAR_MASK) == (AVS_CS_YV16 & AVS_CS_PLANAR_FILTER); } extern "C" int AVSC_CC avs_is_yv12(const AVS_VideoInfo * p) { return (p->pixel_type & AVS_CS_PLANAR_MASK) == (AVS_CS_YV12 & AVS_CS_PLANAR_FILTER); } extern "C" int AVSC_CC avs_is_yv411(const AVS_VideoInfo * p) { return (p->pixel_type & AVS_CS_PLANAR_MASK) == (AVS_CS_YV411 & AVS_CS_PLANAR_FILTER); } extern "C" int AVSC_CC avs_is_y8(const AVS_VideoInfo * p) { return (p->pixel_type & AVS_CS_PLANAR_MASK) == (AVS_CS_Y8 & AVS_CS_PLANAR_FILTER); } extern "C" int AVSC_CC avs_is_yuv444p16(const AVS_VideoInfo * p) { return (p->pixel_type & AVS_CS_PLANAR_MASK) == (AVS_CS_YUV444P16 & AVS_CS_PLANAR_FILTER); } extern "C" int AVSC_CC avs_is_yuv422p16(const AVS_VideoInfo * p) { return (p->pixel_type & AVS_CS_PLANAR_MASK) == (AVS_CS_YUV422P16 & AVS_CS_PLANAR_FILTER); } extern "C" int AVSC_CC avs_is_yuv420p16(const AVS_VideoInfo * p) { return (p->pixel_type & AVS_CS_PLANAR_MASK) == (AVS_CS_YUV420P16 & AVS_CS_PLANAR_FILTER); } extern "C" int AVSC_CC avs_is_y16(const AVS_VideoInfo * p) { return (p->pixel_type & AVS_CS_PLANAR_MASK) == (AVS_CS_Y16 & AVS_CS_PLANAR_FILTER); } extern "C" int AVSC_CC avs_is_yuv444ps(const AVS_VideoInfo * p) { return (p->pixel_type & AVS_CS_PLANAR_MASK) == (AVS_CS_YUV444PS & AVS_CS_PLANAR_FILTER); } extern "C" int AVSC_CC avs_is_yuv422ps(const AVS_VideoInfo * p) { return (p->pixel_type & AVS_CS_PLANAR_MASK) == (AVS_CS_YUV422PS & AVS_CS_PLANAR_FILTER); } extern "C" int AVSC_CC avs_is_yuv420ps(const AVS_VideoInfo * p) { return (p->pixel_type & AVS_CS_PLANAR_MASK) == (AVS_CS_YUV420PS & AVS_CS_PLANAR_FILTER); } extern "C" int AVSC_CC avs_is_y32(const AVS_VideoInfo * p) { return (p->pixel_type & AVS_CS_PLANAR_MASK) == (AVS_CS_Y32 & AVS_CS_PLANAR_FILTER); } extern "C" int AVSC_CC avs_is_444(const AVS_VideoInfo * p) { return ((p->pixel_type & AVS_CS_PLANAR_MASK & ~AVS_CS_SAMPLE_BITS_MASK) == (AVS_CS_GENERIC_YUV444 & AVS_CS_PLANAR_FILTER)) || ((p->pixel_type & AVS_CS_PLANAR_MASK & ~AVS_CS_SAMPLE_BITS_MASK) == (AVS_CS_GENERIC_YUVA444 & AVS_CS_PLANAR_FILTER)); } extern "C" int AVSC_CC avs_is_422(const AVS_VideoInfo * p) { return ((p->pixel_type & AVS_CS_PLANAR_MASK & ~AVS_CS_SAMPLE_BITS_MASK) == (AVS_CS_GENERIC_YUV422 & AVS_CS_PLANAR_FILTER)) || ((p->pixel_type & AVS_CS_PLANAR_MASK & ~AVS_CS_SAMPLE_BITS_MASK) == (AVS_CS_GENERIC_YUVA422 & AVS_CS_PLANAR_FILTER)); } extern "C" int AVSC_CC avs_is_420(const AVS_VideoInfo * p) { return ((p->pixel_type & AVS_CS_PLANAR_MASK & ~AVS_CS_SAMPLE_BITS_MASK) == (AVS_CS_GENERIC_YUV420 & AVS_CS_PLANAR_FILTER)) || ((p->pixel_type & AVS_CS_PLANAR_MASK & ~AVS_CS_SAMPLE_BITS_MASK) == (AVS_CS_GENERIC_YUVA420 & AVS_CS_PLANAR_FILTER)); } extern "C" int AVSC_CC avs_is_y(const AVS_VideoInfo * p) { return (p->pixel_type & AVS_CS_PLANAR_MASK & ~AVS_CS_SAMPLE_BITS_MASK) == (AVS_CS_GENERIC_Y & AVS_CS_PLANAR_FILTER); } extern "C" int AVSC_CC avs_is_color_space(const AVS_VideoInfo * p, int c_space) { return avs_is_planar(p) ? ((p->pixel_type & AVS_CS_PLANAR_MASK) == (c_space & AVS_CS_PLANAR_FILTER)) : (((p->pixel_type & ~AVS_CS_SAMPLE_BITS_MASK & c_space) == (c_space & ~AVS_CS_SAMPLE_BITS_MASK)) && // RGB got sample bits ((p->pixel_type & AVS_CS_SAMPLE_BITS_MASK) == (c_space & AVS_CS_SAMPLE_BITS_MASK))); } extern "C" int AVSC_CC avs_is_yuva(const AVS_VideoInfo * p) { return !!(p->pixel_type & AVS_CS_YUVA); } extern "C" int AVSC_CC avs_is_planar_rgb(const AVS_VideoInfo * p) { return !!(p->pixel_type & AVS_CS_PLANAR) && !!(p->pixel_type & AVS_CS_BGR) && !!(p->pixel_type & AVS_CS_RGB_TYPE); } extern "C" int AVSC_CC avs_is_planar_rgba(const AVS_VideoInfo * p) { return !!(p->pixel_type & AVS_CS_PLANAR) && !!(p->pixel_type & AVS_CS_BGR) && !!(p->pixel_type & AVS_CS_RGBA_TYPE); } extern "C" int AVSC_CC avs_get_plane_width_subsampling(const AVS_VideoInfo * p, int plane) { try { return ((VideoInfo*)p)->GetPlaneWidthSubsampling(plane); } catch (const AvisynthError& err) { (void)err; // silence warning about unused variable; variable is kept for debugging return -1; } } extern "C" int AVSC_CC avs_get_plane_height_subsampling(const AVS_VideoInfo * p, int plane) { try { return ((VideoInfo*)p)->GetPlaneHeightSubsampling(plane); } catch (const AvisynthError& err) { (void)err; // silence warning about unused variable; variable is kept for debugging return -1; } } extern "C" int AVSC_CC avs_bits_per_pixel(const AVS_VideoInfo * p) { return ((VideoInfo*)p)->BitsPerPixel(); } extern "C" int AVSC_CC avs_bytes_from_pixels(const AVS_VideoInfo * p, int pixels) { return ((VideoInfo*)p)->BytesFromPixels(pixels); } // This method should be called avs_row_size_p, // but we won't change it anymore to avoid breaking // the interface. extern "C" int AVSC_CC avs_row_size(const AVS_VideoInfo * p, int plane) { return ((VideoInfo*)p)->RowSize(plane); } extern "C" int AVSC_CC avs_bmp_size(const AVS_VideoInfo * vi) { return ((VideoInfo*)vi)->BMPSize(); } ///////////////////////////////////////////////////////////////////// // // // extern "C" int AVSC_CC avs_get_pitch_p(const AVS_VideoFrame * p, int plane) { // Memo: the lines in class PVideoFrame: // VideoFrame* p; // VideoFrame* operator->() const { return p; } // help when you use the arrow operator on a PVideoFrame object, it will return // the "VideoFrame* p" pointer, allowing you to access members of the // VideoFrame class directly. return (*(const PVideoFrame*)&p)->GetPitch(plane); } extern "C" int AVSC_CC avs_get_row_size_p(const AVS_VideoFrame * p, int plane) { return (*(const PVideoFrame*)&p)->GetRowSize(plane); } extern "C" int AVSC_CC avs_get_height_p(const AVS_VideoFrame * p, int plane) { return (*(const PVideoFrame*)&p)->GetHeight(plane); } extern "C" const BYTE * AVSC_CC avs_get_read_ptr_p(const AVS_VideoFrame * p, int plane) { return (*(const PVideoFrame*)&p)->GetReadPtr(plane); } extern "C" int AVSC_CC avs_is_writable(const AVS_VideoFrame * p) { return (*(const PVideoFrame*)&p)->IsWritable() ? 1 : 0; } // V9 extern "C" int AVSC_CC avs_is_property_writable(const AVS_VideoFrame * p) { return (*(const PVideoFrame*)&p)->IsPropertyWritable() ? 1 : 0; } // V10 extern "C" int AVSC_CC avs_video_frame_get_pixel_type(const AVS_VideoFrame * p) { return (*(const PVideoFrame*)&p)->GetPixelType(); } // V10 void AVSC_CC avs_video_frame_amend_pixel_type(AVS_VideoFrame* p, int new_pixel_type) { (*(PVideoFrame*)&p)->AmendPixelType(new_pixel_type); } extern "C" BYTE * AVSC_CC avs_get_write_ptr_p(const AVS_VideoFrame * p, int plane) { return (*(const PVideoFrame*)&p)->GetWritePtr(plane); } extern "C" void AVSC_CC avs_release_video_frame(AVS_VideoFrame * f) { ((PVideoFrame*)&f)->~PVideoFrame(); } extern "C" AVS_VideoFrame * AVSC_CC avs_copy_video_frame(AVS_VideoFrame * f) { AVS_VideoFrame* fnew; new ((PVideoFrame*)&fnew) PVideoFrame(*(PVideoFrame*)&f); return fnew; } extern "C" int AVSC_CC avs_num_components(const AVS_VideoInfo * p) { return ((VideoInfo*)p)->NumComponents(); } extern "C" int AVSC_CC avs_component_size(const AVS_VideoInfo * p) { return ((VideoInfo*)p)->ComponentSize(); } extern "C" int AVSC_CC avs_bits_per_component(const AVS_VideoInfo * p) { return ((VideoInfo*)p)->BitsPerComponent(); } // V10.1 extern "C" bool AVSC_CC avs_is_channel_mask_known(const AVS_VideoInfo * p) { return ((VideoInfo*)p)->IsChannelMaskKnown(); } extern "C" void AVSC_CC avs_set_channel_mask(const AVS_VideoInfo * p, bool isChannelMaskKnown, unsigned int dwChannelMask) { ((VideoInfo*)p)->SetChannelMask(isChannelMaskKnown, dwChannelMask); } extern "C" unsigned int AVSC_CC avs_get_channel_mask(const AVS_VideoInfo * p) { return ((VideoInfo*)p)->GetChannelMask(); } ////////////////////////////////////////////////////////// // // frame properties // extern "C" void AVSC_CC avs_copy_frame_props(AVS_ScriptEnvironment * p, const AVS_VideoFrame * src, AVS_VideoFrame * dst) { p->error = 0; try { p->env->copyFrameProps(*(const PVideoFrame*)&src, *(PVideoFrame*)&dst); } catch (const AvisynthError& err) { p->error = err.msg; } } extern "C" const AVS_Map * AVSC_CC avs_get_frame_props_ro(AVS_ScriptEnvironment * p, const AVS_VideoFrame * frame) { p->error = 0; try { return (const AVS_Map*)(p->env->getFramePropsRO(*(const PVideoFrame*)&frame)); } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" AVS_Map * AVSC_CC avs_get_frame_props_rw(AVS_ScriptEnvironment * p, AVS_VideoFrame * frame) { p->error = 0; try { return (AVS_Map*)(p->env->getFramePropsRW(*(PVideoFrame*)&frame)); } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" int AVSC_CC avs_prop_num_keys(AVS_ScriptEnvironment * p, const AVS_Map * map) { p->error = 0; try { return (p->env->propNumKeys((const AVSMap*)map)); } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" const char* AVSC_CC avs_prop_get_key(AVS_ScriptEnvironment * p, const AVS_Map * map, int index) { p->error = 0; try { const char* key = (p->env->propGetKey((const AVSMap*)map, index)); return p->env->SaveString(key); } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" int AVSC_CC avs_prop_num_elements(AVS_ScriptEnvironment * p, const AVS_Map * map, const char* key) { p->error = 0; try { return (p->env->propNumElements((const AVSMap*)map, key)); } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" char AVSC_CC avs_prop_get_type(AVS_ScriptEnvironment * p, const AVS_Map * map, const char* key) { p->error = 0; try { return (p->env->propGetType((const AVSMap*)map, key)); } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" int AVSC_CC avs_prop_delete_key(AVS_ScriptEnvironment * p, AVS_Map * map, const char* key) { p->error = 0; try { return (p->env->propDeleteKey((AVSMap*)map, key)); } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" int64_t AVSC_CC avs_prop_get_int(AVS_ScriptEnvironment * p, const AVS_Map * map, const char* key, int index, int* error) { p->error = 0; try { return (p->env->propGetInt((const AVSMap*)map, key, index, error)); } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" int AVSC_CC avs_prop_get_int_saturated(AVS_ScriptEnvironment* p, const AVS_Map* map, const char* key, int index, int* error) { p->error = 0; try { return (p->env->propGetIntSaturated((const AVSMap*)map, key, index, error)); } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" double AVSC_CC avs_prop_get_float(AVS_ScriptEnvironment * p, const AVS_Map * map, const char* key, int index, int* error) { p->error = 0; try { return (p->env->propGetFloat((const AVSMap*)map, key, index, error)); } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } // v11 extern "C" float AVSC_CC avs_prop_get_float_saturated(AVS_ScriptEnvironment* p, const AVS_Map* map, const char* key, int index, int* error) { p->error = 0; try { return (p->env->propGetFloatSaturated((const AVSMap*)map, key, index, error)); } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" const char* AVSC_CC avs_prop_get_data(AVS_ScriptEnvironment * p, const AVS_Map * map, const char* key, int index, int* error) { p->error = 0; try { const char* data = p->env->propGetData((const AVSMap*)map, key, index, error); if (!data) return nullptr; else return data; } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" int AVSC_CC avs_prop_get_data_size(AVS_ScriptEnvironment * p, const AVS_Map * map, const char* key, int index, int* error) { p->error = 0; try { return (p->env->propGetDataSize((const AVSMap*)map, key, index, error)); } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" int AVSC_CC avs_prop_get_data_type_hint(AVS_ScriptEnvironment* p, const AVS_Map* map, const char* key, int index, int* error) { p->error = 0; try { return (p->env->propGetDataTypeHint((const AVSMap*)map, key, index, error)); } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" AVS_Clip* AVSC_CC avs_prop_get_clip(AVS_ScriptEnvironment* p, const AVS_Map* map, const char* key, int index, int* error) { p->error = 0; try { PClip c0 = p->env->propGetClip((const AVSMap*)map, key, index, error); AVS_Clip* c; new((PClip*)&c) PClip(c0); return c; } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" const AVS_VideoFrame * AVSC_CC avs_prop_get_frame(AVS_ScriptEnvironment * p, const AVS_Map * map, const char* key, int index, int* error) { p->error = 0; try { const PVideoFrame f0 = p->env->propGetFrame((const AVSMap*)map, key, index, error); AVS_VideoFrame* f; new((PVideoFrame*)&f) PVideoFrame(f0); return f; } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" int AVSC_CC avs_prop_set_int(AVS_ScriptEnvironment * p, AVS_Map * map, const char* key, int64_t i, int append) { p->error = 0; try { return (p->env->propSetInt((AVSMap*)map, key, i, append)); } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" int AVSC_CC avs_prop_set_float(AVS_ScriptEnvironment * p, AVS_Map * map, const char* key, double d, int append) { p->error = 0; try { return (p->env->propSetFloat((AVSMap*)map, key, d, append)); } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" int AVSC_CC avs_prop_set_data(AVS_ScriptEnvironment * p, AVS_Map * map, const char* key, const char* d, int length, int append) { // length = -1 -> auto strlen p->error = 0; try { return (p->env->propSetData((AVSMap*)map, key, d, length, append)); } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" int AVSC_CC avs_prop_set_data_h(AVS_ScriptEnvironment* p, AVS_Map* map, const char* key, const char* d, int length, int type, int append) { // length = -1 -> auto strlen p->error = 0; try { return (p->env->propSetDataH((AVSMap*)map, key, d, length, type, append)); } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" int AVSC_CC avs_prop_set_clip(AVS_ScriptEnvironment * p, AVS_Map * map, const char* key, AVS_Clip * clip, int append) { p->error = 0; try { return (p->env->propSetClip((AVSMap*)map, key, *(PClip*)clip, append)); } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" int AVSC_CC avs_prop_set_frame(AVS_ScriptEnvironment * p, AVS_Map * map, const char* key, const AVS_VideoFrame * frame, int append) { p->error = 0; try { return (p->env->propSetFrame((AVSMap*)map, key, *(PVideoFrame*)&frame, append)); } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" const int64_t * AVSC_CC avs_prop_get_int_array(AVS_ScriptEnvironment * p, const AVS_Map * map, const char* key, int* error) { p->error = 0; try { return p->env->propGetIntArray((const AVSMap*)map, key, error); } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" const double* AVSC_CC avs_prop_get_float_array(AVS_ScriptEnvironment * p, const AVS_Map * map, const char* key, int* error) { p->error = 0; try { return p->env->propGetFloatArray((const AVSMap*)map, key, error); } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" int AVSC_CC avs_prop_set_int_array(AVS_ScriptEnvironment * p, AVS_Map * map, const char* key, const int64_t * i, int size) { p->error = 0; try { return (p->env->propSetIntArray((AVSMap*)map, key, i, size)); } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" int AVSC_CC avs_prop_set_float_array(AVS_ScriptEnvironment * p, AVS_Map * map, const char* key, const double* d, int size) { p->error = 0; try { return (p->env->propSetFloatArray((AVSMap*)map, key, d, size)); } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" void AVSC_CC avs_clear_map(AVS_ScriptEnvironment * p, AVS_Map * map) { p->error = 0; try { p->env->clearMap((AVSMap*)map); } catch (const AvisynthError& err) { p->error = err.msg; } } ///////////////////////////////////////////////////////////////////// // // C_VideoFilter // PVideoFrame C_VideoFilter::GetFrame(int n, IScriptEnvironment* env) { if (d.get_frame) { d.error = 0; AVS_VideoFrame* f = d.get_frame(&d, n); if (d.error) throw AvisynthError(d.error); if (d.child != NULL && d.child->error) throw AvisynthError(d.child->error); PVideoFrame fr((VideoFrame*)f); ((PVideoFrame*)&f)->~PVideoFrame(); return fr; } else { return d.child->clip->GetFrame(n, env); } } void __stdcall C_VideoFilter::GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) { if (d.get_audio) { d.error = 0; d.get_audio(&d, buf, start, count); if (d.error) throw AvisynthError(d.error); } else { d.child->clip->GetAudio(buf, start, count, env); } } const VideoInfo& __stdcall C_VideoFilter::GetVideoInfo() { return *(VideoInfo*)&d.vi; } bool __stdcall C_VideoFilter::GetParity(int n) { if (d.get_parity) { d.error = 0; int res = d.get_parity(&d, n); if (d.error) throw AvisynthError(d.error); return !!res; } else { return d.child->clip->GetParity(n); } } int __stdcall C_VideoFilter::SetCacheHints(int cachehints, int frame_range) { if (d.set_cache_hints) { d.error = 0; int res = d.set_cache_hints(&d, cachehints, frame_range); if (d.error) throw AvisynthError(d.error); return res; } // We do not pass cache requests upwards, only to the hosted filter. return 0; } C_VideoFilter::~C_VideoFilter() { if (d.free_filter) d.free_filter(&d); } ///////////////////////////////////////////////////////////////////// // // AVS_Clip // extern "C" void AVSC_CC avs_release_clip(AVS_Clip * p) { delete p; } AVS_Clip* AVSC_CC avs_copy_clip(AVS_Clip* p) { return new AVS_Clip(*p); } extern "C" const char* AVSC_CC avs_clip_get_error(AVS_Clip * p) // return 0 if no error { return p->error; } extern "C" int AVSC_CC avs_get_version(AVS_Clip * p) { return p->clip->GetVersion(); } extern "C" const AVS_VideoInfo * AVSC_CC avs_get_video_info(AVS_Clip * p) { return (const AVS_VideoInfo*)&p->clip->GetVideoInfo(); } extern "C" AVS_VideoFrame * AVSC_CC avs_get_frame(AVS_Clip * p, int n) { p->error = 0; try { PVideoFrame f0 = p->clip->GetFrame(n, p->env); AVS_VideoFrame* f; new((PVideoFrame*)&f) PVideoFrame(f0); return f; } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" int AVSC_CC avs_get_parity(AVS_Clip * p, int n) // return field parity if field_based, else parity of first field in frame { try { p->error = 0; return p->clip->GetParity(n); } catch (const AvisynthError& err) { p->error = err.msg; return -1; } } extern "C" int AVSC_CC avs_get_audio(AVS_Clip * p, void* buf, int64_t start, int64_t count) // start and count are in samples { try { p->error = 0; p->clip->GetAudio(buf, start, count, p->env); return 0; } catch (const AvisynthError& err) { p->error = err.msg; return -1; } } extern "C" int AVSC_CC avs_set_cache_hints(AVS_Clip * p, int cachehints, int frame_range) // We do not pass cache requests upwards, only to the next filter. { try { p->error = 0; return p->clip->SetCacheHints(cachehints, frame_range); } catch (const AvisynthError& err) { p->error = err.msg; return -1; } } ////////////////////////////////////////////////////////////////// // // // extern "C" AVS_Clip * AVSC_CC avs_take_clip(AVS_Value v, AVS_ScriptEnvironment * env) { AVS_Clip* c = new AVS_Clip; c->env = env->env; c->clip = (IClip*)v.d.clip; return c; } // v11 API AVS_Value type checkers. extern "C" int AVSC_CC avs_val_defined(AVS_Value v) { return ((const AVSValue*)(&v))->Defined() ? 1 : 0; } extern "C" int AVSC_CC avs_val_is_clip(AVS_Value v) { return ((const AVSValue*)(&v))->IsClip() ? 1 : 0; } extern "C" int AVSC_CC avs_val_is_bool(AVS_Value v) { return ((const AVSValue*)(&v))->IsBool() ? 1 : 0; } extern "C" int AVSC_CC avs_val_is_int(AVS_Value v) { return ((const AVSValue*)(&v))->IsInt() ? 1 : 0; } extern "C" int AVSC_CC avs_val_is_long_strict(AVS_Value v) { return ((const AVSValue*)(&v))->IsLongStrict() ? 1 : 0; } extern "C" int AVSC_CC avs_val_is_float(AVS_Value v) { return ((const AVSValue*)(&v))->IsFloat() ? 1 : 0; } extern "C" int AVSC_CC avs_val_is_floatf_strict(AVS_Value v) { return ((const AVSValue*)(&v))->IsFloatfStrict() ? 1 : 0; } extern "C" int AVSC_CC avs_val_is_string(AVS_Value v) { return ((const AVSValue*)(&v))->IsString() ? 1 : 0; } extern "C" int AVSC_CC avs_val_is_array(AVS_Value v) { return ((const AVSValue*)(&v))->IsArray() ? 1 : 0; } extern "C" int AVSC_CC avs_val_is_error(AVS_Value v) { return v.type == 'e' ? 1 : 0; } // v11 API AVS_Value setters extern "C" void AVSC_CC avs_set_to_error(AVS_Value* v, const char* v0) { new(v) AVSValue(v0); /*string->error*/ v->type = 'e'; } extern "C" void AVSC_CC avs_set_to_bool(AVS_Value* v, int v0) { new(v) AVSValue(v0 != 0); } extern "C" void AVSC_CC avs_set_to_int(AVS_Value* v, int v0) { new(v) AVSValue(v0); } extern "C" void AVSC_CC avs_set_to_float(AVS_Value* v, float v0) { new(v) AVSValue(v0); } extern "C" void AVSC_CC avs_set_to_string(AVS_Value* v, const char* v0) { new(v) AVSValue(v0); } extern "C" void AVSC_CC avs_set_to_double(AVS_Value* v, double d) { new(v) AVSValue(d); } extern "C" void AVSC_CC avs_set_to_long(AVS_Value* v, int64_t l) { new(v) AVSValue(l); } extern "C" void AVSC_CC avs_set_to_array(AVS_Value* v, AVS_Value* src, int size) { new(v) AVSValue((AVSValue *)src, size); } extern "C" void AVSC_CC avs_set_to_void(AVS_Value* v) { new(v) AVSValue(); } // existed pre V11 extern "C" void AVSC_CC avs_set_to_clip(AVS_Value* v, AVS_Clip* c) { new(v) AVSValue(c->clip); } extern "C" void AVSC_CC avs_copy_value(AVS_Value * dest, AVS_Value src) { #if 0 // no need to guard multidim arrays. avs_release_value will release properly. // true: don't copy array elements recursively new(dest) AVSValue(*(const AVSValue*)&src, true); #endif // CONSTRUCTOR9-->Assign(&v, init=true) ensures that the original content // is simply overwritten and will not be freed. new(dest) AVSValue(*(const AVSValue*)&src); } // Releases/free resources contained in an AVS_Value // Such types are: // - clip // - function (not supported on C interface) // - double and long on 32 bit architects // - Avisynth+ arrays // Since AVS_Value is just a struct passed by value, nothing else happens. // If AVS_Value has no extra resource to free up, nothing is done. // release is mandatory for results of: // - avs_invoke // - avs_copy_value // - avs_set_to_double (x86) // - avs_set_to_long (x86) // - avs_set_to_array, avs_set_to_clip // - in general: all avs_set_xxx values // Note: // Unlike dynamic arrays, which have a full create-copy-modify-release cycle, // C plugins/clients can use in-source arrays, typically for assembling function // parameters ("args"). Do not call avs_release_value on such arrays, as it causes // a crash since the array itself and the elements are not maintained by the // Avisynth core.However, it is good practice to release the array content // with avs_release_value one-by-one for the resource-allocated types mentioned above. extern "C" void AVSC_CC avs_release_value(AVS_Value v) { #if 0 // This would prevent crashes when a C client calls it for an array. // However, since Avisynth+ arrays can be returned by avs_invoke, avs_copy_value, // and avs_set_to_array, this exemption is no longer valid. // This rule was not explicitly written earlier and must be enforced in clients/plugins, // see the Python wrapper issue in AvsPmod, which was fixed. if (((AVSValue*)&v)->IsArray()) { // signing for destructor: don't free array elements ((AVSValue*)&v)->MarkArrayAsNonDeepCopy(); } #endif ((AVSValue*)&v)->~AVSValue(); } // API AVS_Value getters, like INLINE versions extern "C" int AVSC_CC avs_get_as_bool(AVS_Value v) { return ((AVSValue*)&v)->AsBool() ? 1 : 0; } extern "C" AVS_Clip* AVSC_CC avs_get_as_clip(AVS_Value v, AVS_ScriptEnvironment* env) { // like the existing avs_take_clip, to fit in the avs_get_as_xxxx line AVS_Clip* c = new AVS_Clip; c->env = env->env; c->clip = (IClip*)(v.d.clip); return c; } extern "C" int AVSC_CC avs_get_as_int(AVS_Value v) { return ((AVSValue*)&v)->AsInt(); } extern "C" int64_t AVSC_CC avs_get_as_long(AVS_Value v) { return ((AVSValue*)&v)->AsLong(); } extern "C" const char* AVSC_CC avs_get_as_string(AVS_Value v) { return ((AVSValue*)&v)->AsString(); } extern "C" double AVSC_CC avs_get_as_float(AVS_Value v) { return ((AVSValue*)&v)->AsFloat(); } extern "C" const char* AVSC_CC avs_get_as_error(AVS_Value v) { if (v.type == 'e') { v.type = 's'; // 'e'rror is unknown in c++ api return ((AVSValue*)&v)->AsString(); } return nullptr; } extern "C" const AVS_Value * AVSC_CC avs_get_as_array(AVS_Value v) { return v.d.array; } extern "C" AVS_Value AVSC_CC avs_get_array_elt(AVS_Value v, int index) { // just a dumb data copy, no ref counting, no resource handling return avs_is_array(v) ? v.d.array[index] : v; } extern "C" int AVSC_CC avs_get_array_size(AVS_Value v) { return ((AVSValue*)&v)->ArraySize(); } ////////////////////////////////////////////////////////////////// // // // extern "C" AVS_Clip * AVSC_CC avs_new_c_filter(AVS_ScriptEnvironment * e, AVS_FilterInfo * *fi, AVS_Value child, int store_child) { C_VideoFilter* f = new C_VideoFilter(); AVS_Clip* ff = new AVS_Clip(); ff->clip = f; // IClip descendant ff->env = e->env; f->env.env = e->env; f->d.env = &f->env; if (store_child) { _ASSERTE(child.type == 'c'); f->child.clip = (IClip*)child.d.clip; f->child.env = e->env; f->d.child = &f->child; } *fi = &f->d; // (*fi)->free_filter will be set later by the plugin. // It is used in ~C_VideoFilter, which is called when the clip's // reference count reaches zero and it is released. This serves // as the filter destructor in C. if (child.type == 'c') f->d.vi = *(const AVS_VideoInfo*)(&((IClip*)child.d.clip)->GetVideoInfo()); return ff; } ///////////////////////////////////////////////////////////////////// // // AVS_ScriptEnvironment::add_function // struct C_VideoFilter_UserData { void* user_data; AVS_ApplyFunc func; AVS_ApplyFuncR func_r; }; AVSValue __cdecl create_c_video_filter(AVSValue args, void* user_data, IScriptEnvironment* e0) { C_VideoFilter_UserData* d = (C_VideoFilter_UserData*)user_data; AVS_ScriptEnvironment env; env.env = e0; env.error = NULL; AVS_Value res; if(d->func) res = (d->func)(&env, *(AVS_Value*)&args, d->user_data); else (d->func_r)(&env, (AVS_Value*)&res, *(AVS_Value*)&args, d->user_data); // new in v11: byref if (res.type == 'e') { throw AvisynthError(res.d.string); } else { AVSValue val; val = (*(const AVSValue*)&res); ((AVSValue*)&res)->~AVSValue(); return val; } } extern "C" int AVSC_CC avs_add_function(AVS_ScriptEnvironment * p, const char* name, const char* params, AVS_ApplyFunc applyf, void* user_data) { C_VideoFilter_UserData* dd, * d = new C_VideoFilter_UserData; p->error = 0; d->func = applyf; // return value struct d->func_r = nullptr; d->user_data = user_data; dd = (C_VideoFilter_UserData*)p->env->SaveString((const char*)d, sizeof(C_VideoFilter_UserData)); delete d; try { p->env->AddFunction(name, params, create_c_video_filter, dd); } catch (AvisynthError& err) { p->error = err.msg; return -1; } return 0; } // v11 extern "C" int AVSC_CC avs_add_function_r(AVS_ScriptEnvironment* p, const char* name, const char* params, AVS_ApplyFuncR applyf, void* user_data) { C_VideoFilter_UserData* dd, * d = new C_VideoFilter_UserData; p->error = 0; d->func = nullptr; d->func_r = applyf; // return value among parameters byref struct (Python cref callbacks like it better) d->user_data = user_data; dd = (C_VideoFilter_UserData*)p->env->SaveString((const char*)d, sizeof(C_VideoFilter_UserData)); delete d; try { p->env->AddFunction(name, params, create_c_video_filter, dd); } catch (AvisynthError& err) { p->error = err.msg; return -1; } return 0; } ///////////////////////////////////////////////////////////////////// // // AVS_ScriptEnvironment // extern "C" const char* AVSC_CC avs_get_error(AVS_ScriptEnvironment * p) // return 0 if no error { return p->error; } extern "C" int AVSC_CC avs_get_cpu_flags(AVS_ScriptEnvironment * p) { p->error = 0; return p->env->GetCPUFlags(); } extern "C" int64_t AVSC_CC avs_get_cpu_flags_ex(AVS_ScriptEnvironment* p) { p->error = 0; return p->env->GetCPUFlagsEx(); } extern "C" char* AVSC_CC avs_save_string(AVS_ScriptEnvironment * p, const char* s, int length) { p->error = 0; return p->env->SaveString(s, length); } extern "C" char* AVSC_CC avs_sprintf(AVS_ScriptEnvironment * p, const char* fmt, ...) { p->error = 0; va_list vl; va_start(vl, fmt); char* v = p->env->VSprintf(fmt, vl); va_end(vl); return v; } // note: val is really a va_list; I hope everyone typedefs va_list to a pointer extern "C" char* AVSC_CC avs_vsprintf(AVS_ScriptEnvironment * p, const char* fmt, va_list val) { p->error = 0; return p->env->VSprintf(fmt, val); } extern "C" int AVSC_CC avs_function_exists(AVS_ScriptEnvironment * p, const char* name) { p->error = 0; return p->env->FunctionExists(name); } extern "C" AVS_Value AVSC_CC avs_invoke(AVS_ScriptEnvironment* p, const char* name, AVS_Value args, const char** arg_names) { AVS_Value v = { 0,0 }; p->error = 0; try { // AVSValue(*(AVSValue*)&args) is deep-copying input array // Invoke has a special InvokePreV11C variant if pre V11 C interface // detected, which converts a possible 64 bit result to 32 bit one for // compatibility. double->float, long->int. Nothing should be done here. AVSValue v0 = p->env->Invoke(name, *(AVSValue*)&args, arg_names); new ((AVSValue*)&v) AVSValue(v0); } catch (const IScriptEnvironment::NotFound&) { p->error = "Function Not Found"; } catch (const AvisynthError& err) { p->error = err.msg; } if (p->error) v = avs_new_value_error(p->error); return v; } extern "C" AVS_Value AVSC_CC avs_get_var(AVS_ScriptEnvironment * p, const char* name) { AVS_Value v = { 0,0 }; p->error = 0; try { AVSValue v0 = p->env->GetVar(name); new ((AVSValue*)&v) AVSValue(v0); } catch (const IScriptEnvironment::NotFound&) {} catch (const AvisynthError& err) { p->error = err.msg; v = avs_new_value_error(p->error); } return v; } extern "C" int AVSC_CC avs_set_var(AVS_ScriptEnvironment * p, const char* name, AVS_Value val) { p->error = 0; try { return p->env->SetVar(p->env->SaveString(name), *(const AVSValue*)(&val)); } catch (const AvisynthError& err) { p->error = err.msg; return -1; } } extern "C" int AVSC_CC avs_set_global_var(AVS_ScriptEnvironment * p, const char* name, AVS_Value val) { p->error = 0; try { return p->env->SetGlobalVar(p->env->SaveString(name), *(const AVSValue*)(&val)); } catch (const AvisynthError& err) { p->error = err.msg; return -1; } } extern "C" AVS_VideoFrame * AVSC_CC avs_new_video_frame_a(AVS_ScriptEnvironment * p, const AVS_VideoInfo * vi, int align) { p->error = 0; try { PVideoFrame f0 = p->env->NewVideoFrame(*(const VideoInfo*)vi, align); AVS_VideoFrame* f; new((PVideoFrame*)&f) PVideoFrame(f0); return f; } catch (const AvisynthError& err) { p->error = err.msg; } return 0; } // with frame properties, and alignment // note: in general there is no need for alignment specificationm use avs_new_video_frame_p extern "C" AVS_VideoFrame * AVSC_CC avs_new_video_frame_p_a(AVS_ScriptEnvironment * p, const AVS_VideoInfo * vi, const AVS_VideoFrame * prop_src, int align) { p->error = 0; try { PVideoFrame f0 = p->env->NewVideoFrameP(*(const VideoInfo*)vi, (const PVideoFrame*)&prop_src, align); AVS_VideoFrame* f; new((PVideoFrame*)&f) PVideoFrame(f0); return f; } catch (const AvisynthError& err) { p->error = err.msg; } return 0; } // with frame properties, no extra alignment requirement extern "C" AVS_VideoFrame * AVSC_CC avs_new_video_frame_p(AVS_ScriptEnvironment * p, const AVS_VideoInfo * vi, const AVS_VideoFrame * prop_src) { p->error = 0; try { PVideoFrame f0 = p->env->NewVideoFrameP(*(const VideoInfo*)vi, (const PVideoFrame*)&prop_src, AVS_FRAME_ALIGN); AVS_VideoFrame* f; new((PVideoFrame*)&f) PVideoFrame(f0); return f; } catch (const AvisynthError& err) { p->error = err.msg; } return 0; } extern "C" int AVSC_CC avs_make_writable(AVS_ScriptEnvironment * p, AVS_VideoFrame * *pvf) { p->error = 0; try { return p->env->MakeWritable((PVideoFrame*)(pvf)); } catch (const AvisynthError& err) { p->error = err.msg; } return -1; } // Since V9 extern "C" int AVSC_CC avs_make_property_writable(AVS_ScriptEnvironment * p, AVS_VideoFrame * *pvf) { p->error = 0; try { return p->env->MakePropertyWritable((PVideoFrame*)(pvf)); } catch (const AvisynthError& err) { p->error = err.msg; } return -1; } extern "C" void AVSC_CC avs_bit_blt(AVS_ScriptEnvironment * p, BYTE * dstp, int dst_pitch, const BYTE * srcp, int src_pitch, int row_size, int height) { p->error = 0; try { p->env->BitBlt(dstp, dst_pitch, srcp, src_pitch, row_size, height); } catch (const AvisynthError& err) { p->error = err.msg; } } struct ShutdownFuncData { AVS_ShutdownFunc func; void* user_data; }; void __cdecl shutdown_func_bridge(void* user_data, IScriptEnvironment* env) { ShutdownFuncData* d = (ShutdownFuncData*)user_data; AVS_ScriptEnvironment e; e.env = env; e.error = NULL; d->func(d->user_data, &e); } extern "C" void AVSC_CC avs_at_exit(AVS_ScriptEnvironment * p, AVS_ShutdownFunc function, void* user_data) { p->error = 0; ShutdownFuncData* dd, * d = new ShutdownFuncData; d->func = function; d->user_data = user_data; dd = (ShutdownFuncData*)p->env->SaveString((const char*)d, sizeof(ShutdownFuncData)); delete d; p->env->AtExit(shutdown_func_bridge, dd); } extern "C" int AVSC_CC avs_check_version(AVS_ScriptEnvironment * p, int version) { p->error = 0; try { p->env->CheckVersion(version); return 0; } catch (const AvisynthError& err) { p->error = err.msg; return -1; } } extern "C" AVS_VideoFrame * AVSC_CC avs_subframe(AVS_ScriptEnvironment * p, AVS_VideoFrame * src0, int rel_offset, int new_pitch, int new_row_size, int new_height) { p->error = 0; try { PVideoFrame f0 = p->env->Subframe((VideoFrame*)src0, rel_offset, new_pitch, new_row_size, new_height); AVS_VideoFrame* f; new((PVideoFrame*)&f) PVideoFrame(f0); return f; } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" AVS_VideoFrame * AVSC_CC avs_subframe_planar(AVS_ScriptEnvironment * p, AVS_VideoFrame * src0, int rel_offset, int new_pitch, int new_row_size, int new_height, int rel_offsetU, int rel_offsetV, int new_pitchUV) { p->error = 0; try { PVideoFrame f0 = p->env->SubframePlanar((VideoFrame*)src0, rel_offset, new_pitch, new_row_size, new_height, rel_offsetU, rel_offsetV, new_pitchUV); AVS_VideoFrame* f; new((PVideoFrame*)&f) PVideoFrame(f0); return f; } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } // Interface V8 extern "C" AVS_VideoFrame * AVSC_CC avs_subframe_planar_a(AVS_ScriptEnvironment * p, AVS_VideoFrame * src0, int rel_offset, int new_pitch, int new_row_size, int new_height, int rel_offsetU, int rel_offsetV, int new_pitchUV, int rel_offsetA) { p->error = 0; try { PVideoFrame f0 = p->env->SubframePlanarA((VideoFrame*)src0, rel_offset, new_pitch, new_row_size, new_height, rel_offsetU, rel_offsetV, new_pitchUV, rel_offsetA); AVS_VideoFrame* f; new((PVideoFrame*)&f) PVideoFrame(f0); return f; } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" int AVSC_CC avs_set_memory_max(AVS_ScriptEnvironment * p, int mem) { p->error = 0; try { return p->env->SetMemoryMax(mem); } catch (const AvisynthError& err) { p->error = err.msg; return -1; } } extern "C" int AVSC_CC avs_set_working_dir(AVS_ScriptEnvironment * p, const char* newdir) { p->error = 0; try { return p->env->SetWorkingDir(newdir); } catch (const AvisynthError& err) { p->error = err.msg; return -1; } } // V12 extern "C" int AVSC_CC avs_acquire_global_lock(AVS_ScriptEnvironment* p, const char* name) { p->error = 0; try { return p->env->AcquireGlobalLock(name) ? 1 : 0; } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } // V12 extern "C" void AVSC_CC avs_release_global_lock(AVS_ScriptEnvironment* p, const char* name) { p->error = 0; try { p->env->ReleaseGlobalLock(name); } catch (const AvisynthError& err) { p->error = err.msg; } } // Interface V8. See AVS_AEP_xxx enums extern "C" size_t AVSC_CC avs_get_env_property(AVS_ScriptEnvironment * p, int avs_aep_prop) { p->error = 0; try { return p->env->GetEnvProperty((AvsEnvProperty)avs_aep_prop); } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } // Interface V8, buffer pool, Support functions // see AVS_ALLOCTYPE_xxx enum extern "C" void * AVSC_CC avs_pool_allocate(AVS_ScriptEnvironment * p, size_t nBytes, size_t alignment, int avs_alloc_type) { p->error = 0; try { return p->env->Allocate(nBytes, alignment, (AvsAllocType)avs_alloc_type); } catch (const AvisynthError& err) { p->error = err.msg; return 0; } } extern "C" void AVSC_CC avs_pool_free(AVS_ScriptEnvironment * p, void* ptr) { p->error = 0; try { return p->env->Free(ptr); } catch (const AvisynthError& err) { p->error = err.msg; } } // Returns TRUE (1) and the requested variable. If the method fails, returns 0 (FALSE) and does not touch 'val'. // The returned AVS_Value *val value must be be released with avs_release_value only on success // AVS_Value *val is not caller allocated extern "C" int AVSC_CC avs_get_var_try(AVS_ScriptEnvironment * p, const char* name, AVS_Value *val) { p->error = 0; AVSValue v0; const bool success = p->env->GetVarTry(name, &v0); if (success) { new ((AVSValue*)val) AVSValue(v0); return 1; } return 0; } // Return the value of the requested variable. // If the variable was not found or had the wrong type, // return the supplied default value. extern "C" int AVSC_CC avs_get_var_bool(AVS_ScriptEnvironment * p, const char* name, int def) { p->error = 0; return (int)(p->env->GetVarBool(name, (bool)def)); } extern "C" int AVSC_CC avs_get_var_int(AVS_ScriptEnvironment * p, const char* name, int def) { p->error = 0; return p->env->GetVarInt(name, def); } extern "C" double AVSC_CC avs_get_var_double(AVS_ScriptEnvironment * p, const char* name, double def) { p->error = 0; return p->env->GetVarDouble(name, def); } extern "C" const char * AVSC_CC avs_get_var_string(AVS_ScriptEnvironment * p, const char* name, const char* def) { p->error = 0; return p->env->GetVarString(name, def); } extern "C" int64_t AVSC_CC avs_get_var_long(AVS_ScriptEnvironment * p, const char* name, int64_t def) { p->error = 0; return p->env->GetVarLong(name, def); } ///////////////////////////////////////////////////////////////////// // // // // prototype from avisynth.cpp IScriptEnvironment2* CreateScriptEnvironment2_internal(int version, bool fromAvs25, bool fromC); extern "C" AVS_ScriptEnvironment * AVSC_CC avs_create_script_environment(int version) { AVS_ScriptEnvironment* e = new AVS_ScriptEnvironment; try { if (version < AVISYNTH_CLASSIC_INTERFACE_VERSION) version = AVISYNTH_CLASSIC_INTERFACE_VERSION; // always request a more modern ScriptEnvironment. e->env = CreateScriptEnvironment2_internal(version, false, true); // flag: from C e->error = NULL; } catch (const AvisynthError& err) { e->error = err.msg; e->env = 0; } return e; } ///////////////////////////////////////////////////////////////////// // // // extern "C" void AVSC_CC avs_delete_script_environment(AVS_ScriptEnvironment * e) { if (e) { if (e->env) { try { e->env->DeleteScriptEnvironment(); } catch (const AvisynthError& err) { (void)err; // silence warning about unused variable; variable is kept for debugging } e->env = 0; } delete e; } } ================================================ FILE: avs_core/core/avs_simd_c.h ================================================ // AviSynth+. Copyright 2025 AviSynth+ Project // https://avs-plus.net // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. // SIMD-like C++ classes (C)2025 Ferenc Pintér #ifndef __AVS_SIMD_C_H__ #define __AVS_SIMD_C_H__ // Auto-vectorization friendly types for smart compilers // Some helper static functions, marked with c++ 17 [[maybe_unused]] attribute #include // force inline variants #include #include #include #include #include #include #if defined(_MSC_VER) && !defined(__clang__) && defined(INTEL_INTRINSICS) #include // covers SSE2 through AVX2 for MSVC #endif // Determine if we can use vector attribute // As of 2025 clang (llvm) supports vector attributes and also produces fast code // gcc can use it but may produce slower code with than without vector attributes. // (gcc 12.2 on aarch64 Raspberry Pi 5 is slow) // We still keep it here, maybe non-arm platforms can benefit with gcc as well. // Note: llvm defines __clang__ as well #if defined(__GNUC__) || defined(__clang__) #define HAS_VECTOR_ATTRIBUTE 1 #else #define HAS_VECTOR_ATTRIBUTE 0 #endif // Vector type definitions #if HAS_VECTOR_ATTRIBUTE // GCC/Clang supports vector attribute using uint8_vec32_t = uint8_t __attribute__((vector_size(32))); // 256-bit (32 bytes) using uint8_vec16_t = uint8_t __attribute__((vector_size(16))); // 128-bit (16 bytes) using uint8_vec8_t = uint8_t __attribute__((vector_size(8))); // 64-bit (8 bytes) using uint8_vec4_t = uint8_t __attribute__((vector_size(4))); // 32-bit (4 bytes) using int16_vec16_t = int16_t __attribute__((vector_size(32))); // 256-bit (32 bytes) using int16_vec8_t = int16_t __attribute__((vector_size(16))); // 128-bit (16 bytes) using int16_vec4_t = int16_t __attribute__((vector_size(8))); // 64-bit (8 bytes) using uint16_vec16_t = uint16_t __attribute__((vector_size(32))); // 256-bit (32 bytes) using uint16_vec8_t = uint16_t __attribute__((vector_size(16))); // 128-bit (16 bytes) using uint16_vec4_t = uint16_t __attribute__((vector_size(8))); // 64-bit (8 bytes) using int32_vec8_t = int32_t __attribute__((vector_size(32))); // 256-bit (32 bytes) using int32_vec4_t = int32_t __attribute__((vector_size(16))); // 128-bit (16 bytes) using int32_vec2_t = int32_t __attribute__((vector_size(8))); // 64-bit (8 bytes) using float_vec8_t = float __attribute__((vector_size(32))); // 256-bit (32 bytes) using float_vec4_t = float __attribute__((vector_size(16))); // 128-bit (16 bytes) using float_vec2_t = float __attribute__((vector_size(8))); // 64-bit (8 bytes) #else // For MSVC: use __declspec(align) + plain array in a struct, may help optimizer template struct alignas(N * sizeof(T)) Avs_SimdArray { T v[N]; AVS_FORCEINLINE T& operator[](size_t i) { return v[i]; } AVS_FORCEINLINE const T& operator[](size_t i) const { return v[i]; } // Trivial fill AVS_FORCEINLINE void fill(T val) { if constexpr (sizeof(T) == 1) { memset(v, val, N); // intrinsic, single rep stosd or movdqu } else { // Seemingly MSVC (as of in 2026) will not vectorize a loop here, but will inline these for (size_t i = 0; i < N; ++i) v[i] = val; } } // Iterators for compatibility AVS_FORCEINLINE T* begin() { return v; } AVS_FORCEINLINE T* end() { return v + N; } AVS_FORCEINLINE const T* begin() const { return v; } AVS_FORCEINLINE const T* end() const { return v + N; } static constexpr size_t size() { return N; } }; using uint8_vec32_t = Avs_SimdArray; using uint8_vec16_t = Avs_SimdArray; using uint8_vec8_t = Avs_SimdArray; using uint8_vec4_t = Avs_SimdArray; using int16_vec16_t = Avs_SimdArray; using int16_vec8_t = Avs_SimdArray; using int16_vec4_t = Avs_SimdArray; using uint16_vec16_t = Avs_SimdArray; using uint16_vec8_t = Avs_SimdArray; using uint16_vec4_t = Avs_SimdArray; using int32_vec8_t = Avs_SimdArray; using int32_vec4_t = Avs_SimdArray; using int32_vec2_t = Avs_SimdArray; using float_vec8_t = Avs_SimdArray; using float_vec4_t = Avs_SimdArray; using float_vec2_t = Avs_SimdArray; #endif // HAS_VECTOR_ATTRIBUTE // Type traits for vector elements template struct vector_traits {}; #define DEFINE_VECTOR_TRAITS(VecType, ElemType, Size) \ template <> struct vector_traits { \ using element_type = ElemType; \ static constexpr size_t size = Size; \ }; // Covering 8 to 32 bytes long vectors. // No int64_t or double, they are not relevant in AviSynth DEFINE_VECTOR_TRAITS(uint8_vec32_t, uint8_t, 32) DEFINE_VECTOR_TRAITS(uint8_vec16_t, uint8_t, 16) DEFINE_VECTOR_TRAITS(uint8_vec8_t, uint8_t, 8) DEFINE_VECTOR_TRAITS(uint8_vec4_t, uint8_t, 4) DEFINE_VECTOR_TRAITS(int16_vec16_t, int16_t, 16) DEFINE_VECTOR_TRAITS(int16_vec8_t, int16_t, 8) DEFINE_VECTOR_TRAITS(int16_vec4_t, int16_t, 4) DEFINE_VECTOR_TRAITS(uint16_vec16_t, uint16_t, 16) DEFINE_VECTOR_TRAITS(uint16_vec8_t, uint16_t, 8) DEFINE_VECTOR_TRAITS(uint16_vec4_t, uint16_t, 4) DEFINE_VECTOR_TRAITS(int32_vec8_t, int32_t, 8) DEFINE_VECTOR_TRAITS(int32_vec4_t, int32_t, 4) DEFINE_VECTOR_TRAITS(int32_vec2_t, int32_t, 2) DEFINE_VECTOR_TRAITS(float_vec8_t, float, 8) DEFINE_VECTOR_TRAITS(float_vec4_t, float, 4) DEFINE_VECTOR_TRAITS(float_vec2_t, float, 2) // Specialization for array-based vector operations #if !HAS_VECTOR_ATTRIBUTE template ::element_type> class VectorOps { public: static AVS_FORCEINLINE VecType add(const VecType& a, const VecType& b) { VecType result; #if defined(_MSC_VER) && !defined(__clang__) && defined(INTEL_INTRINSICS) && defined(__AVX__) if constexpr (sizeof(VecType) == 32) { // Force the use of YMM __m256 va = _mm256_loadu_ps(reinterpret_cast(&a)); __m256 vb = _mm256_loadu_ps(reinterpret_cast(&b)); __m256 vr = _mm256_add_ps(va, vb); _mm256_storeu_ps(reinterpret_cast(&result), vr); return result; } #endif for (size_t i = 0; i < vector_traits::size; ++i) { result[i] = a[i] + b[i]; } return result; } static AVS_FORCEINLINE VecType subtract(const VecType& a, const VecType& b) { VecType result; for (size_t i = 0; i < vector_traits::size; ++i) { result[i] = a[i] - b[i]; } return result; } static AVS_FORCEINLINE VecType multiply(const VecType& a, const VecType& b) { VecType result; for (size_t i = 0; i < vector_traits::size; ++i) { result[i] = a[i] * b[i]; } return result; } static AVS_FORCEINLINE VecType scalar_multiply(const VecType& a, ScalarType scalar) { VecType result; #if defined(_MSC_VER) && !defined(__clang__) && defined(INTEL_INTRINSICS) && defined(__AVX__) if constexpr (sizeof(VecType) == 32 && std::is_same_v) { if constexpr (sizeof(VecType) == 32) { // Use 'set1' which the compiler usually optimizes to a broadcast __m256 v_a = _mm256_loadu_ps((const float*)&a); __m256 v_res = _mm256_mul_ps(v_a, _mm256_set1_ps(scalar)); _mm256_storeu_ps((float*)&result, v_res); return result; } } #endif for (size_t i = 0; i < vector_traits::size; ++i) { result[i] = a[i] * scalar; } return result; } static AVS_FORCEINLINE VecType left_shift(const VecType& a, int shift) { VecType result; for (size_t i = 0; i < vector_traits::size; ++i) { result[i] = a[i] << shift; } return result; } static AVS_FORCEINLINE VecType right_shift(const VecType& a, int shift) { VecType result; for (size_t i = 0; i < vector_traits::size; ++i) { result[i] = a[i] >> shift; } return result; } }; #endif // Template for vector class wrapper // Passing "Derived" allows syntax for assigning a wrapper class to a derived class. template class VectorWrapper { private: using ElementType = typename vector_traits::element_type; static constexpr size_t N = vector_traits::size; VecType data; public: // Default constructor AVS_FORCEINLINE VectorWrapper() { #if HAS_VECTOR_ATTRIBUTE data = VecType{}; // empty initializer #else data.fill(ElementType{}); #endif } // Constructor from scalar AVS_FORCEINLINE explicit VectorWrapper(ElementType val) { #if HAS_VECTOR_ATTRIBUTE data = VecType{}; for (size_t i = 0; i < N; ++i) { data[i] = val; } #else #if defined(_MSC_VER) && !defined(__clang__) && defined(INTEL_INTRINSICS) if constexpr (sizeof(VecType) == 32 && std::is_same_v) { #if defined(__AVX__) if (val == 0.0f) { __m256 zero = _mm256_setzero_ps(); _mm256_storeu_ps((float*)&data, zero); return; } __m256 v = _mm256_set1_ps(val); _mm256_storeu_ps((float*)&data, v); return; #else // __m128 path if (val == 0.0f) { __m128 zero = _mm_setzero_ps(); _mm_storeu_ps((float*)&data, zero); // 2x128 = 32 bytes, so we can store 16 bytes at a time with _mm_storeu_ps((float*)((char*)&data + 16), zero); return; } __m128 v = _mm_set1_ps(val); // possibly optimized to a broadcast _mm_storeu_ps((float*)&data, v); _mm_storeu_ps((float*)((char*)&data + 16), v); return; #endif } // 32 bytes if constexpr (sizeof(VecType) == 16 && std::is_same_v) { if (val == 0.0f) { __m128 zero = _mm_setzero_ps(); _mm_storeu_ps((float*)&data, zero); return; } __m128 v = _mm_set1_ps(val); // possibly optimized to a broadcast _mm_storeu_ps((float*)&data, v); return; } // 16 bytes #endif data.fill(val); #endif } // Constructor from raw vector type AVS_FORCEINLINE explicit VectorWrapper(const VecType& vec) { #if HAS_VECTOR_ATTRIBUTE data = vec; // native vector assign, optimal #else memcpy(&data, &vec, sizeof(data)); // fixed-size, MSVC inlines to movq/movdqu #endif } // Conversion operator, allowing implicit conversion to the derived type. // Supporting syntax like: Int32x4 = src * coeff; where the right side is a VectorWrapper AVS_FORCEINLINE operator Derived() const { return static_cast(data); } // Copy constructor // Note: There is no need to define assignment operators for move or copy, as the underlying 'data' type // (either array or vector attribute) already provides support for these operations. // 2026: but yes, we need! For MSVC optimizer's sake at least. #ifdef HAS_VECTOR_ATTRIBUTE AVS_FORCEINLINE VectorWrapper(const VectorWrapper& other) : data(other.data) {} #else AVS_FORCEINLINE VectorWrapper(const VectorWrapper& other) { memcpy(&data, &other.data, sizeof(data)); } AVS_FORCEINLINE VectorWrapper& operator=(const VectorWrapper& other) { memcpy(&data, &other.data, sizeof(data)); return *this; } #endif // Constructors from initializer list, e.g. x = {32768, 0, 0, 0}; // Constexpr variadic template constructor for compile-time initialization.Thx AI :) template > AVS_FORCEINLINE constexpr VectorWrapper(ElementType arg, Args... args) { static_assert(sizeof...(args) + 1 == N, "Initializer list must have exactly N elements."); ElementType values[] = { arg, static_cast(args)... }; for (size_t i = 0; i < N; ++i) { data[i] = values[i]; } } // std::initializer_list constructor for runtime initialization AVS_FORCEINLINE VectorWrapper(std::initializer_list values) { if (values.size() != N) { throw std::logic_error("Initializer list must have exactly N elements"); } size_t i = 0; for (auto val : values) { data[i++] = val; } } // Load only the lower half of the vector (e.g., 8 bytes for a 16-byte vector) AVS_FORCEINLINE void load_lo(const ElementType* ptr) { #if HAS_VECTOR_ATTRIBUTE for (size_t i = 0; i < N / 2; ++i) { data[i] = ptr[i]; } for (size_t i = N / 2; i < N; ++i) { data[i] = ElementType{}; // Zero out the upper half } #else memcpy(data.v, ptr, sizeof(data.v) / 2); // avoid std::copy!!!at least for MSVC memset(data.v + N / 2, 0, sizeof(data.v) / 2); // zero upper half #endif } // Conversions from other types as long as their size matches // Full and half size // Full: Widening or narrowing without range checks, e.g., no saturation when converting down. // This one must be used as src=Int32x4::convert_from(src16) and NOT as src32.convert_from(src16). template AVS_FORCEINLINE static VectorWrapper convert_from(const VectorWrapper& other) { static_assert(vector_traits::size == vector_traits::size, "Vector sizes must match for convert_from."); #if HAS_VECTOR_ATTRIBUTE VecType result_vec; result_vec = __builtin_convertvector(other.raw(), VecType); return VectorWrapper(result_vec); #else VecType result; for (size_t i = 0; i < vector_traits::size; ++i) { result[i] = static_cast::element_type>(other[i]); } return VectorWrapper(result); #endif } // Static factory: Widening or narrowing the lower half of a larger vector template AVS_FORCEINLINE static VectorWrapper convert_from_lo(const VectorWrapper& other) { static_assert(vector_traits::size == vector_traits::size / 2, "Source vector must have twice the elements of target for convert_from_lo."); VectorWrapper result; for (size_t i = 0; i < vector_traits::size; ++i) { // Access via operator[] which is public result.raw()[i] = static_cast(other[i]); } return result; } // Static factory: Widening or narrowing the upper half of a larger vector template AVS_FORCEINLINE static VectorWrapper convert_from_hi(const VectorWrapper& other) { static_assert(vector_traits::size == vector_traits::size / 2, "Source vector must have twice the elements of target for convert_from_hi."); constexpr auto half_size = vector_traits::size / 2; VectorWrapper result; for (size_t i = 0; i < vector_traits::size; ++i) { result.raw()[i] = static_cast(other[half_size + i]); } return result; } // Fill an integer vector/array from integer pointer source. // Versions for uint8_t, int16_t (short), uint16_t and int32_t AVS_FORCEINLINE void load_from_any_intptr(const uint8_t* ptr) { static_assert( std::is_same_v::element_type, int32_t> || std::is_same_v::element_type, int16_t> || std::is_same_v::element_type, uint16_t> || std::is_same_v::element_type, uint8_t>, "load_from_any_intptr is only valid for int32_t, int16_t, uint16_t or uint8_t target element types." ); for (size_t i = 0; i < vector_traits::size; ++i) { data[i] = static_cast::element_type>(ptr[i]); } } AVS_FORCEINLINE void load_from_any_intptr(const short* ptr) { static_assert( std::is_same_v::element_type, int32_t> || std::is_same_v::element_type, int16_t> || std::is_same_v::element_type, uint16_t> || std::is_same_v::element_type, uint8_t>, "load_from_any_intptr is only valid for int32_t, int16_t, uint16_t or uint8_t target element types." ); for (size_t i = 0; i < vector_traits::size; ++i) { data[i] = static_cast::element_type>(ptr[i]); } } AVS_FORCEINLINE void load_from_any_intptr(const uint16_t* ptr) { static_assert( std::is_same_v::element_type, int32_t> || std::is_same_v::element_type, int16_t> || std::is_same_v::element_type, uint16_t> || std::is_same_v::element_type, uint8_t>, "load_from_any_intptr is only valid for int32_t, int16_t, uint16_t or uint8_t target element types." ); for (size_t i = 0; i < vector_traits::size; ++i) { data[i] = static_cast::element_type>(ptr[i]); } } AVS_FORCEINLINE void load_from_any_intptr(const int32_t* ptr) { static_assert( std::is_same_v::element_type, int32_t> || std::is_same_v::element_type, int16_t> || std::is_same_v::element_type, uint16_t> || std::is_same_v::element_type, uint8_t>, "load_from_any_intptr is only valid for int32_t, int16_t, uint16_t or uint8_t target element types." ); for (size_t i = 0; i < vector_traits::size; ++i) { data[i] = static_cast::element_type>(ptr[i]); } } // Syntax: variable.load(myPointer); // Load from pointer (potentially unaligned) AVS_FORCEINLINE void load(const ElementType* ptr) { #if HAS_VECTOR_ATTRIBUTE for (size_t i = 0; i < N; ++i) { data[i] = ptr[i]; } #else memcpy(data.v, ptr, sizeof(data.v)); // avoid std::copy!!! At least for MSVC #endif } // Syntax: variable = VecType::from_ptr(myPointer); // Static factory method AVS_FORCEINLINE static VectorWrapper from_ptr(const ElementType* ptr) { VectorWrapper result; #if HAS_VECTOR_ATTRIBUTE result.load(ptr); // Reuse the instance method #else constexpr size_t byte_size = sizeof(result.data); // Use _MSC_VER (one underscore) and check for actual size #if defined(_MSC_VER) && !defined(__clang__) && defined(INTEL_INTRINSICS) if constexpr (byte_size == 4) { __m128i tmp = _mm_setzero_si128(); memcpy(&tmp, ptr, 4); // Coax MSVC into MOVD memcpy(&result.data, &tmp, 4); } else if constexpr (byte_size == 8) { __m128i tmp = _mm_setzero_si128(); memcpy(&tmp, ptr, 8); // Coax MSVC into MOVQ memcpy(&result.data, &tmp, 8); } else if constexpr (byte_size == 16) { __m128i tmp = _mm_loadu_si128(reinterpret_cast(ptr)); memcpy(&result.data, &tmp, 16); } else if constexpr (byte_size == 32) { #if defined(__AVX__) // Use a single 256-bit load. This stops the XMM-to-stack-back-to-YMM MSVC habit. _mm256_storeu_ps((float*)&result.raw(), _mm256_loadu_ps(ptr)); #else __m128i tmp1 = _mm_loadu_si128(reinterpret_cast(ptr)); __m128i tmp1next16 = _mm_loadu_si128(reinterpret_cast(ptr + 16)); memcpy(&result.data, &tmp1, 16); memcpy(reinterpret_cast(&result.data) + 16, &tmp1next16, 16); #endif } else { // Fallback for 32+ byte or unusual sizes memcpy(&result.data, ptr, byte_size); } #else memcpy(&result.data, ptr, byte_size); #endif #endif return result; } // Syntax: variable = VecType::from_ptr_lo(myPointer); // Loads the lower half of the vector and zeros the upper half. AVS_FORCEINLINE static VectorWrapper from_ptr_lo(const ElementType* ptr) { VectorWrapper result; #if HAS_VECTOR_ATTRIBUTE // Standard attribute-based load result.load_lo(ptr); #else constexpr size_t total_bytes = sizeof(result.data); #if defined(_MSC_VER) && !defined(__clang__) && defined(INTEL_INTRINSICS) if constexpr (total_bytes == 16) { // Int16x8 or Int32x4 case: Load 8 bytes, zero top 8. // _mm_loadl_epi64 generates MOVQ (XMM load 64-bit). __m128i tmp = _mm_loadl_epi64(reinterpret_cast(ptr)); memcpy(&result.data, &tmp, 16); } else if constexpr (total_bytes == 32) { #if defined(__AVX__) __m128i tmp = _mm_loadu_si128(reinterpret_cast(ptr)); // Load 16 bytes into low half, zero top 16. __m256i tmp256 = _mm256_setzero_si256(); tmp256 = _mm256_insertf128_si256(tmp256, tmp, 0); memcpy(&result.data, &tmp256, 32); #else // 256-bit case: Load 16 bytes into low half, zero top 16. __m128i lo = _mm_loadu_si128(reinterpret_cast(ptr)); memcpy(&result.data, &lo, 16); // clear high 16 bytes memset(reinterpret_cast(&result.data) + 16, 0, 16); #endif } else { result.load_lo(ptr); } #else result.load_lo(ptr); #endif #endif return result; } // Store to pointer (potentially unaligned) AVS_FORCEINLINE void store(ElementType* ptr) const { #if HAS_VECTOR_ATTRIBUTE for (size_t i = 0; i < N; ++i) { ptr[i] = data[i]; } #else memcpy(ptr, data.v, sizeof(data.v)); // with Avs_SimdArray; or &data[0] with std::array #endif } // Addition operator (+) AVS_FORCEINLINE VectorWrapper operator+(const VectorWrapper& other) const { #if HAS_VECTOR_ATTRIBUTE return VectorWrapper(data + other.data); #else return VectorWrapper(VectorOps::add(data, other.data)); #endif } // Subtraction operator (-) AVS_FORCEINLINE VectorWrapper operator-(const VectorWrapper& other) const { #if HAS_VECTOR_ATTRIBUTE return VectorWrapper(data - other.data); #else return VectorWrapper(VectorOps::subtract(data, other.data)); #endif } // Multiplication operator (*) AVS_FORCEINLINE VectorWrapper operator*(const VectorWrapper& other) const { #if HAS_VECTOR_ATTRIBUTE return VectorWrapper(data * other.data); #else return VectorWrapper(VectorOps::multiply(data, other.data)); #endif } // Scalar multiplication (*val) AVS_FORCEINLINE VectorWrapper operator*(ElementType scalar) const { #if HAS_VECTOR_ATTRIBUTE return VectorWrapper(data * scalar); #else return VectorWrapper(VectorOps::scalar_multiply(data, scalar)); #endif } // Left shift operator (<<) VectorWrapper operator<<(int shift) const { #if HAS_VECTOR_ATTRIBUTE return VectorWrapper(data << shift); #else return VectorWrapper(VectorOps::left_shift(data, shift)); #endif } // Right shift operator (arithmetic) (>>) AVS_FORCEINLINE VectorWrapper operator>>(int shift) const { #if HAS_VECTOR_ATTRIBUTE return VectorWrapper(data >> shift); #else return VectorWrapper(VectorOps::right_shift(data, shift)); #endif } // We do not define special operators for logical shift, but provide a function. AVS_FORCEINLINE VectorWrapper shift_right_logical(int shift) const { // Cast to unsigned type for logical shift using UnsignedVecType = std::make_unsigned_t::element_type>; VecType result; for (size_t i = 0; i < vector_traits::size; ++i) { result[i] = static_cast(data[i]) >> shift; } return VectorWrapper(result); } // Addition assignment operator (+=) AVS_FORCEINLINE VectorWrapper& operator+=(const VectorWrapper& other) { #if HAS_VECTOR_ATTRIBUTE data += other.data; #else data = VectorOps::add(data, other.data); #endif return *this; } // Subtract assignment operator (-=) AVS_FORCEINLINE VectorWrapper& operator-=(const VectorWrapper& other) { #if HAS_VECTOR_ATTRIBUTE data -= other.data; #else data = VectorOps::sub(data, other.data); #endif return *this; } // Multiplication assignment operator (*=) AVS_FORCEINLINE VectorWrapper& operator*=(const VectorWrapper& other) { #if HAS_VECTOR_ATTRIBUTE data *= other.data; #else data = VectorOps::mul(data, other.data); #endif return *this; } // right shift assignment operator (>>=) AVS_FORCEINLINE VectorWrapper& operator>>=(int shift) { #if HAS_VECTOR_ATTRIBUTE data >>= shift; #else data = VectorOps::right_shift(data, shift); #endif return *this; } // left shift assignment operator (<<=) AVS_FORCEINLINE VectorWrapper& operator<<=(int shift) { #if HAS_VECTOR_ATTRIBUTE data <<= shift; #else data = VectorOps::left_shift(data, shift); #endif return *this; } // Minimum operation: z = x.min(scalar) AVS_FORCEINLINE VectorWrapper min(ElementType scalar) const { #if HAS_VECTOR_ATTRIBUTE VecType result; for (size_t i = 0; i < N; ++i) { result[i] = data[i] < scalar ? data[i] : scalar; } return VectorWrapper(result); #else VecType result; for (size_t i = 0; i < N; ++i) { result[i] = std::min(data[i], scalar); } return VectorWrapper(result); #endif } // Maximum operation: z = x.max(scalar) AVS_FORCEINLINE VectorWrapper max(ElementType scalar) const { #if HAS_VECTOR_ATTRIBUTE VecType result; for (size_t i = 0; i < N; ++i) { result[i] = data[i] > scalar ? data[i] : scalar; } return VectorWrapper(result); #else VecType result; for (size_t i = 0; i < N; ++i) { result[i] = std::max(data[i], scalar); } return VectorWrapper(result); #endif } // Minimum operation (element-wise): z = x.min(y) AVS_FORCEINLINE VectorWrapper min(const VectorWrapper& other) const { #if HAS_VECTOR_ATTRIBUTE // Use a ternary operator with a comparison to simulate min operation VecType result; for (size_t i = 0; i < N; ++i) { result[i] = data[i] < other.data[i] ? data[i] : other.data[i]; } return VectorWrapper(result); #else VecType result; for (size_t i = 0; i < N; ++i) { result[i] = std::min(data[i], other.data[i]); } return VectorWrapper(result); #endif } // Maximum operation (element-wise) : z = x.max(y) AVS_FORCEINLINE VectorWrapper max(const VectorWrapper& other) const { #if HAS_VECTOR_ATTRIBUTE // Use a ternary operator with a comparison to simulate max operation VecType result; for (size_t i = 0; i < N; ++i) { result[i] = data[i] > other.data[i] ? data[i] : other.data[i]; } return VectorWrapper(result); #else VecType result; for (size_t i = 0; i < N; ++i) { result[i] = std::max(data[i], other.data[i]); } return VectorWrapper(result); #endif } // Static min functions similar to SIMD intrinsics: z = min(x, y) AVS_FORCEINLINE static VectorWrapper min(const VectorWrapper& a, const VectorWrapper& b) { return a.min(b); } // Static max function similar to SIMD intrinsics: z = max(x, y) AVS_FORCEINLINE static VectorWrapper max(const VectorWrapper& a, const VectorWrapper& b) { return a.max(b); } // Accessor for raw data AVS_FORCEINLINE const VecType& raw() const { return data; } AVS_FORCEINLINE VecType& raw() { return data; } // Element access (const and non-const versions) AVS_FORCEINLINE ElementType operator[](size_t idx) const { return data[idx]; } // a set method instead of non-const operator[] // use: x.set(index, value) instead of x[index] = value AVS_FORCEINLINE void set(size_t idx, ElementType value) { data[idx] = value; } AVS_FORCEINLINE int32_t horiz_add_int32() const { #if defined(_MSC_VER) && !defined(__clang__) && defined(INTEL_INTRINSICS) static_assert(N * sizeof(ElementType) <= 16, "horiz_add_int32: vector too large for XMM"); __m128i v = _mm_setzero_si128(); // zero upper lanes for sub-16-byte vectors memcpy(&v, &data, N * sizeof(ElementType)); // SSE2 only, hadd simulation with shuffles and adds if constexpr (N * sizeof(ElementType) <= 4) { return _mm_cvtsi128_si32(v); } else if constexpr (N * sizeof(ElementType) <= 8) { __m128i hi32 = _mm_shuffle_epi32(v, _MM_SHUFFLE(1, 1, 1, 1)); return _mm_cvtsi128_si32(_mm_add_epi32(v, hi32)); } else { // 4x int32 // v = [D, C, B, A] __m128i hi64 = _mm_unpackhi_epi64(v, v); // [B, A, D, C] v = _mm_add_epi32(v, hi64); // [D+B, C+A, B+D, A+C] __m128i hi32 = _mm_shuffle_epi32(v, _MM_SHUFFLE(1, 1, 1, 1)); // [C+A, C+A, C+A, C+A] v = _mm_add_epi32(v, hi32); // [..., ..., ..., A+C+B+D] return _mm_cvtsi128_si32(v); } #else int32_t sum = 0; for (size_t i = 0; i < N; ++i) #if HAS_VECTOR_ATTRIBUTE sum += data[i]; #else sum += data.v[i]; #endif return sum; #endif } AVS_FORCEINLINE float horiz_add_float() const { #if defined(_MSC_VER) && !defined(__clang__) && defined(INTEL_INTRINSICS) static_assert(N * sizeof(ElementType) <= 16, "horiz_add_float: vector too large for XMM"); __m128 v = _mm_setzero_ps(); memcpy(&v, &data, N * sizeof(ElementType)); // SSE2 only, not haddps, only quick shuffles and adds if constexpr (N <= 1) { return _mm_cvtss_f32(v); } else if constexpr (N <= 2) { __m128 hi32 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(1, 1, 1, 1)); return _mm_cvtss_f32(_mm_add_ss(v, hi32)); } else { // v = [D, C, B, A] __m128 hi64 = _mm_movehl_ps(v, v); // [B, A, D, C] v = _mm_add_ps(v, hi64); // [D+B, C+A, B+D, A+C] __m128 hi32 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(1, 1, 1, 1)); // [C+A, C+A, C+A, C+A] v = _mm_add_ss(v, hi32); // [..., ..., ..., A+C+B+D] return _mm_cvtss_f32(v); } #else float sum = 0.0f; for (size_t i = 0; i < N; ++i) #if HAS_VECTOR_ATTRIBUTE sum += static_cast(data[i]); #else sum += static_cast(data.v[i]); #endif return sum; #endif } static constexpr size_t size() { return N; } }; // Scalar multiplication (scalar on left) template AVS_FORCEINLINE VectorWrapper operator*( typename vector_traits::element_type scalar, const VectorWrapper& vec) { return vec * scalar; } // Stream output operator template std::ostream& operator<<(std::ostream& os, const VectorWrapper& vec) { os << "["; for (size_t i = 0; i < vector_traits::size; ++i) { os << vec[i]; if (i < vector_traits::size - 1) os << ", "; } os << "]"; return os; } // Concrete class definitions for 8, 16 and 32 bytes vectors class Uint8x32 : public VectorWrapper { public: using Base = VectorWrapper; using Base::Base; using Base::operator=; }; class Uint8x16 : public VectorWrapper { public: using Base = VectorWrapper; using Base::Base; using Base::operator=; }; class Uint8x8 : public VectorWrapper { public: using Base = VectorWrapper; using Base::Base; using Base::operator=; }; class Uint8x4 : public VectorWrapper { public: using Base = VectorWrapper; using Base::Base; using Base::operator=; }; class Int16x16 : public VectorWrapper { public: using Base = VectorWrapper; using Base::Base; using Base::operator=; }; class Int16x8 : public VectorWrapper { public: using Base = VectorWrapper; using Base::Base; using Base::operator=; }; class Int16x4 : public VectorWrapper { public: using Base = VectorWrapper; using Base::Base; using Base::operator=; }; class Uint16x16 : public VectorWrapper { public: using Base = VectorWrapper; using Base::Base; using Base::operator=; }; class Uint16x8 : public VectorWrapper { public: using Base = VectorWrapper; using Base::Base; using Base::operator=; }; class Uint16x4 : public VectorWrapper { public: using Base = VectorWrapper; using Base::Base; using Base::operator=; }; class Int32x8 : public VectorWrapper { public: using Base = VectorWrapper; using Base::Base; using Base::operator=; }; class Int32x4 : public VectorWrapper { public: using Base = VectorWrapper; using Base::Base; using Base::operator=; }; class Int32x2 : public VectorWrapper { public: using Base = VectorWrapper; using Base::Base; using Base::operator=; }; class Float8 : public VectorWrapper { public: using Base = VectorWrapper; using Base::Base; using Base::operator=; }; class Float4 : public VectorWrapper { public: using Base = VectorWrapper; using Base::Base; using Base::operator=; }; class Float2 : public VectorWrapper { public: using Base = VectorWrapper; using Base::Base; using Base::operator=; }; // Saturated narrowing integer conversion functions. // 8x int32_t -> 8x uint8_t // Guaranteed to stay in XMM/YMM registers [[maybe_unused]] static AVS_FORCEINLINE void convert_and_saturate_int32x8_to_uint8x8(const Int32x8& src1, Uint8x8& result) { #if defined(_MSC_VER) && !defined(__clang__) && defined(INTEL_INTRINSICS) // Assuming Int32x8 is composed of two __m128i (low/high) or one __m256i // If using 128-bit wrappers: __m128i src1_lo; __m128i src1_hi; memcpy(&src1_lo, &src1, 16); // first 4 ints memcpy(&src1_hi, reinterpret_cast(&src1) + 16, 16); // second 4 ints // Step 1: Pack 32-bit to 16-bit (Signed Saturation) __m128i v16 = _mm_packs_epi32(src1_lo, src1_hi); // Step 2: Pack 16-bit to 8-bit (Unsigned Saturation) // We use v16 twice because pack instructions always process 128-bits into 128-bits __m128i v8 = _mm_packus_epi16(v16, v16); // Step 3: Store only the low 8 bytes (64-bits) _mm_storel_epi64(reinterpret_cast<__m128i*>(&result), v8); #else // Fallback for LLVM (which handles the loop perfectly) for (size_t i = 0; i < 8; ++i) { result.set(i, static_cast(std::min(std::max(src1[i], 0), 255))); } #endif } // 4x int32_t -> 4x uint8_t // Prevents the "Extract-to-GPR" penalty seen in your assembly [[maybe_unused]] static AVS_FORCEINLINE void convert_and_saturate_int32x4_to_uint8x4(const Int32x4& src1, Uint8x4& result) { #if defined(_MSC_VER) && !defined(__clang__) && defined(INTEL_INTRINSICS) __m128i a; memcpy(&a, &src1, 16); // Step 1: 32-bit signed -> 16-bit signed saturation // [i32, i32, i32, i32] -> [i16, i16, i16, i16, i16, i16, i16, i16] // We duplicate 'a' to fill the 128-bit output __m128i v16 = _mm_packs_epi32(a, a); // Step 2: 16-bit signed -> 8-bit unsigned saturation // This clamps everything to [0, 255] __m128i v8 = _mm_packus_epi16(v16, v16); // Step 3: Store only the low 32 bits (4 bytes) // This replaces those 4 'mov byte ptr' instructions with one 'movd' int packed_pixels = _mm_cvtsi128_si32(v8); memcpy(&result, &packed_pixels, 4); #else // LLVM/Clang handles the loop fine, as you noted for (size_t i = 0; i < 4; ++i) { result.set(i, static_cast(std::min(std::max(src1[i], 0), 255))); } #endif } // 8x int32_t -> 8x uint16_t [[maybe_unused]] static AVS_FORCEINLINE void convert_and_saturate_int32x8_to_uint16x8(const Int32x8& src1, Uint16x8& result) { for (size_t i = 0; i < 8; ++i) { result.set(i, static_cast(std::min(std::max(src1[i], 0), 65535))); } } // 4x int32_t -> 4x uint16_t with 0 <= x <= limit [[maybe_unused]] static AVS_FORCEINLINE void convert_and_saturate_int32x4_to_uint16x4_limit(const Int32x4& src1, Uint16x4& result, const uint16_t limit) { #if defined(_MSC_VER) && !defined(__clang__) && defined(INTEL_INTRINSICS) __m128i a; memcpy(&a, &src1, 16); #if defined(__AVX__) || defined(__SSE4_1__) __m128i packed = _mm_packus_epi32(a, a); __m128i vlimit = _mm_set1_epi16(static_cast(limit)); __m128i clamped = _mm_min_epu16(packed, vlimit); _mm_storel_epi64(reinterpret_cast<__m128i*>(&result), clamped); #else // SSE2 Fallback: Bias trick + manual unsigned min const __m128i bias = _mm_set1_epi32(32768); const __m128i bias16 = _mm_set1_epi16(-32768); __m128i biased = _mm_sub_epi32(a, bias); __m128i packed = _mm_packs_epi32(biased, biased); __m128i unbiased = _mm_sub_epi16(packed, bias16); __m128i vlimit = _mm_set1_epi16(static_cast(limit)); const __m128i sign_bias = _mm_set1_epi16(-32768); __m128i u_shifted = _mm_add_epi16(unbiased, sign_bias); __m128i l_shifted = _mm_add_epi16(vlimit, sign_bias); __m128i mask = _mm_cmpgt_epi16(u_shifted, l_shifted); __m128i final = _mm_or_si128(_mm_and_si128(mask, vlimit), _mm_andnot_si128(mask, unbiased)); _mm_storel_epi64(reinterpret_cast<__m128i*>(&result), final); #endif #else for (size_t i = 0; i < 4; ++i) { result.set(i, static_cast(std::min(std::max(src1[i], 0), (int)limit))); } #endif } // 4x int32_t -> 4x uint16_t [[maybe_unused]] static AVS_FORCEINLINE void convert_and_saturate_int32x4_to_uint16x4(const Int32x4& src1, Uint16x4& result) { #if defined(_MSC_VER) && !defined(__clang__) && defined(INTEL_INTRINSICS) __m128i a; memcpy(&a, &src1, 16); #if defined(__AVX__) || defined(__SSE4_1__) // Packs 4+4 lanes into 8 lanes of uint16. We use 'a' twice. __m128i packed = _mm_packus_epi32(a, a); // Store only the low 64 bits (4x uint16) _mm_storel_epi64(reinterpret_cast<__m128i*>(&result), packed); #else // SSE2 Fallback: The Bias Trick const __m128i bias = _mm_set1_epi32(32768); const __m128i bias16 = _mm_set1_epi16(-32768); __m128i biased = _mm_sub_epi32(a, bias); __m128i packed = _mm_packs_epi32(biased, biased); __m128i final = _mm_sub_epi16(packed, bias16); _mm_storel_epi64(reinterpret_cast<__m128i*>(&result), final); #endif #else for (size_t i = 0; i < 4; ++i) { result.set(i, static_cast(std::min(std::max(src1[i], 0), 65535))); } #endif } // Combined horizontal add of 4 Int32x4 vectors into one Int32x4 of sums [[maybe_unused]] AVS_FORCEINLINE Int32x4 make_from_horiz_sums( const Int32x4& r0, const Int32x4& r1, const Int32x4& r2, const Int32x4& r3) { #if defined(_MSC_VER) && !defined(__clang__) && defined(INTEL_INTRINSICS) __m128i a, b, c, d; memcpy(&a, &r0, 16); memcpy(&b, &r1, 16); memcpy(&c, &r2, 16); memcpy(&d, &r3, 16); // 1. Interleave to pair up elements (SSE2) __m128i t0 = _mm_unpacklo_epi32(a, b); // [a0, b0, a1, b1] __m128i t1 = _mm_unpackhi_epi32(a, b); // [a2, b2, a3, b3] __m128i t2 = _mm_unpacklo_epi32(c, d); // [c0, d0, c1, d1] __m128i t3 = _mm_unpackhi_epi32(c, d); // [c2, d2, c3, d3] // 2. First vertical add (Partial sums) __m128i sum_ab = _mm_add_epi32(t0, t1); // [a0+a2, b0+b2, a1+a3, b1+b3] __m128i sum_cd = _mm_add_epi32(t2, t3); // [c0+c2, d0+d2, c1+c3, d1+d3] // 3. Final pairing using 64-bit unpacks (SSE2) __m128i res_lo = _mm_unpacklo_epi64(sum_ab, sum_cd); // [a0+a2, b0+b2, c0+c2, d0+d2] __m128i res_hi = _mm_unpackhi_epi64(sum_ab, sum_cd); // [a1+a3, b1+b3, c1+c3, d1+d3] // 4. Final vertical add __m128i res = _mm_add_epi32(res_lo, res_hi); // [sumA, sumB, sumC, sumD] Int32x4 out; memcpy(&out, &res, 16); return out; #else Int32x4 out; out.set(0, r0.horiz_add_int32()); out.set(1, r1.horiz_add_int32()); out.set(2, r2.horiz_add_int32()); out.set(3, r3.horiz_add_int32()); return out; #endif } // two 4x int32_t -> 8x uint16_t // like an _mm_packus_epi32 [[maybe_unused]] static AVS_FORCEINLINE void convert_and_saturate_int32x4x2_to_uint16x8(const Int32x4& src1, const Int32x4& src2, Uint16x8& result) { #if defined(_MSC_VER) && !defined(__clang__) && defined(INTEL_INTRINSICS) __m128i a, b; memcpy(&a, &src1, 16); memcpy(&b, &src2, 16); // Though MSVC does not have sse4.1 arch granularity #if defined(__AVX__) || defined(__SSE4_1__) // SSE4.1+: direct unsigned pack __m128i packed = _mm_packus_epi32(a, b); memcpy(&result, &packed, 16); #else // SSE2 fallback: bias trick // _mm_packs_epi32 does signed saturation, so bias into signed range first // subtract 32768, pack as signed, then the result is offset by 32768 const __m128i bias = _mm_set1_epi32(32768); const __m128i bias16 = _mm_set1_epi16(-32768); // same bit pattern, adds back __m128i a_biased = _mm_sub_epi32(a, bias); __m128i b_biased = _mm_sub_epi32(b, bias); __m128i packed = _mm_packs_epi32(a_biased, b_biased); // signed sat to int16 __m128i unbiased = _mm_sub_epi16(packed, bias16); // restore: wraps correctly memcpy(&result, &unbiased, 16); #endif #else for (size_t i = 0; i < 4; ++i) { result.set(i, static_cast(std::min(std::max(src1[i], 0), 65535))); result.set(i + 4, static_cast(std::min(std::max(src2[i], 0), 65535))); } #endif } // two 4x int32_t -> 8x uint16_t // like a _mm_packus_epi32 followed by a max(x,limit) [[maybe_unused]] static AVS_FORCEINLINE void convert_and_saturate_int32x4x2_to_uint16x8_limit(const Int32x4& src1, const Int32x4& src2, Uint16x8& result, const uint16_t limit) { #if defined(_MSC_VER) && !defined(__clang__) && defined(INTEL_INTRINSICS) __m128i a, b; memcpy(&a, &src1, 16); memcpy(&b, &src2, 16); #if defined(__AVX__) || defined(__SSE4_1__) __m128i packed = _mm_packus_epi32(a, b); __m128i vlimit = _mm_set1_epi16(static_cast(limit)); __m128i clamped = _mm_min_epu16(packed, vlimit); memcpy(&result, &clamped, 16); #else // SSE2: same bias trick for pack, then scalar min (limit path is rare/short) const __m128i bias = _mm_set1_epi32(32768); const __m128i bias16 = _mm_set1_epi16(-32768); __m128i a_biased = _mm_sub_epi32(a, bias); __m128i b_biased = _mm_sub_epi32(b, bias); __m128i packed = _mm_packs_epi32(a_biased, b_biased); __m128i unbiased = _mm_sub_epi16(packed, bias16); // SSE2 has no _mm_min_epu16, emulate with signed comparison bias __m128i vlimit = _mm_set1_epi16(static_cast(limit)); // unsigned min: a < b unsigned <=> (a - 32768) < (b - 32768) signed const __m128i sign_bias = _mm_set1_epi16(-32768); __m128i u_shifted = _mm_add_epi16(unbiased, sign_bias); __m128i l_shifted = _mm_add_epi16(vlimit, sign_bias); __m128i mask = _mm_cmpgt_epi16(u_shifted, l_shifted); // 0xFFFF where unbiased > limit __m128i clamped = _mm_or_si128(_mm_and_si128(mask, vlimit), _mm_andnot_si128(mask, unbiased)); memcpy(&result, &clamped, 16); #endif #else for (size_t i = 0; i < 4; ++i) { result.set(i, static_cast(std::min(std::max(src1[i], 0), (int)limit))); result.set(i + 4, static_cast(std::min(std::max(src2[i], 0), (int)limit))); } #endif } // two 4x int32_t -> 8x uint8_t // like an _mm_packs_epi32 followed by _mm_packus_epi16 [[maybe_unused]] static AVS_FORCEINLINE void convert_and_saturate_int32x4x2_to_uint8x8(const Int32x4& src1, const Int32x4& src2, Uint8x8& result) { #if defined(_MSC_VER) && !defined(__clang__) && defined(INTEL_INTRINSICS) __m128i a, b; memcpy(&a, &src1, 16); memcpy(&b, &src2, 16); __m128i packed16 = _mm_packs_epi32(a, b); // [s1_0..s1_3, s2_0..s2_3] as int16 with signed sat __m128i packed8 = _mm_packus_epi16(packed16, packed16); // uint8 with unsigned sat, result in low 8 bytes memcpy(&result, &packed8, 8); // movq equivalent #else for (size_t i = 0; i < 4; ++i) { result.set(i, static_cast(std::min(std::max(src1[i], 0), 255))); result.set(i + 4, static_cast(std::min(std::max(src2[i], 0), 255))); } // This one is optimized with LLVM, but not with gcc or MSVC /* bravo LLVM x86-64 icx 2025.1.0, using return Int32x4 movdqu xmm0, xmmword ptr [rdi] packssdw xmm0, xmm0 packuswb xmm0, xmm0 movdqu xmm1, xmmword ptr [rsi + 16] packssdw xmm1, xmm1 packuswb xmm1, xmm1 movd eax, xmm0 movd ecx, xmm1 shl rcx, 32 or rax, rcx ret */ #endif } // int16 * int16->int32 with partial result addition. // Simulates the _mm_madd_epi16 x86 SIMD intrinsic function. // returns [a0*b0 + a1*b1, a2*b2 + a3*b3, a4*b4 + a5*b5, a6*b6 + a7*b7] // When the pre-addition order is not important use the reduce_add version, // which may be easier to optimize on non-x86 architectures. // (only LLVM was able to optimize the x86 version and compile into real madd) [[maybe_unused]] static AVS_FORCEINLINE Int32x4 simul_madd_epi16(const Int16x8& a, const Int16x8& b) { Int32x4 result; // pairwise multiplication and horizontal addition // Yes, I know c++ integer promotion rules, but maybe the compiler // will see our forced static_casting the already short type. // Otherwise, yes, it makes no sense. for (size_t i = 0; i < 4; ++i) { size_t idx = i * 2; int32_t sum = static_cast(a[idx]) * static_cast(b[idx]) + static_cast(a[idx + 1]) * static_cast(b[idx + 1]); result.set(i, sum); } return result; } // int16 * int16 -> int32 with partial result addition. // Unlike the classic x86 SIMD madd_epi16, the sum of multiplications // is not horizontally adjacent, instead, the lanes are added together. // returns [a0*b0 + a4*b4, a1*b1 + a5*b5, a2*b2 + a6*b6, a3*b3 + a7*b7] // However, since the order is not always important, this approach is // beneficial for non-x64 processor architectures when the compiler // recognizes the widening multiplication pattern. [[maybe_unused]] static AVS_FORCEINLINE Int32x4 mul16x16_reduce_to_Int32x4(const Int16x8 &a, const Int16x8 &b) { Int32x4 result_lo, result_hi; for (size_t i = 0; i < 4; ++i) { result_lo.set(i, static_cast(a[i]) * static_cast(b[i])); } for (size_t i = 0; i < 4; ++i) { result_hi.set(i, static_cast(a[i + 4]) * static_cast(b[i + 4])); } Int32x4 result = result_lo + result_hi; return result; } [[maybe_unused]] static AVS_FORCEINLINE Int32x4 mul16x16_to_Int32x4(const Int16x4& a, const Int16x4& b) { Int32x4 result; for (size_t i = 0; i < 4; ++i) { result.set(i, static_cast(a[i]) * static_cast(b[i])); } return result; } #endif // __AVS_SIMD_C_H__ ================================================ FILE: avs_core/core/bitblt.cpp ================================================ // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include "bitblt.h" #include #include "memcpy_amd.h" #include #include #include #ifdef INTEL_INTRINSICS #if defined(X86_32) && defined(MSVC_PURE) // Assembler bitblit by Steady static void asm_BitBlt_ISSE(BYTE* dstp, int dst_pitch, const BYTE* srcp, int src_pitch, int row_size, int height) { // Warning! : If you modify this routine, check the generated assembler to make sure // the stupid compiler is saving the ebx register in the entry prologue. // And don't just add an extra push/pop ebx pair around the code, try to // convince the compiler to do the right thing, it's not hard, usually a // slight shuffle or a well placed "__asm mov ebx,ebx" does the trick. if(row_size==0 || height==0) return; //abort on goofs //move backwards for easier looping and to disable hardware prefetch const BYTE* srcStart=srcp+src_pitch*(height-1); BYTE* dstStart=dstp+dst_pitch*(height-1); if(row_size < 64) { _asm { mov esi,srcStart //move rows from bottom up mov edi,dstStart mov edx,row_size dec edx mov ebx,height align 16 memoptS_rowloop: mov ecx,edx // rep movsb memoptS_byteloop: mov AL,[esi+ecx] mov [edi+ecx],AL sub ecx,1 jnc memoptS_byteloop sub esi,src_pitch sub edi,dst_pitch dec ebx jne memoptS_rowloop }; return; }//end small version else if( (int(dstp) | row_size | src_pitch | dst_pitch) & 7) {//not QW aligned //unaligned version makes no assumptions on alignment _asm { //****** initialize mov esi,srcStart //bottom row mov AL,[esi] mov edi,dstStart mov edx,row_size mov ebx,height //********** loop starts here *********** align 16 memoptU_rowloop: mov ecx,edx //row_size dec ecx //offset to last byte in row add ecx,esi //ecx= ptr last byte in row and ecx,~63 //align to first byte in cache line memoptU_prefetchloop: mov AX,[ecx] //tried AL,AX,EAX, AX a tiny bit faster sub ecx,64 cmp ecx,esi jae memoptU_prefetchloop //************ write ************* movq mm6,[esi] //move the first unaligned bytes movntq [edi],mm6 //************************ mov eax,edi neg eax mov ecx,eax and eax,63 //eax=bytes from [edi] to start of next 64 byte cache line and ecx,7 //ecx=bytes from [edi] to next QW align 16 memoptU_prewrite8loop: //write out odd QW's so 64 bit write is cache line aligned cmp ecx,eax //start of cache line ? jz memoptU_pre8done //if not, write single QW movq mm7,[esi+ecx] movntq [edi+ecx],mm7 add ecx,8 jmp memoptU_prewrite8loop align 16 memoptU_write64loop: movntq [edi+ecx-64],mm0 movntq [edi+ecx-56],mm1 movntq [edi+ecx-48],mm2 movntq [edi+ecx-40],mm3 movntq [edi+ecx-32],mm4 movntq [edi+ecx-24],mm5 movntq [edi+ecx-16],mm6 movntq [edi+ecx- 8],mm7 memoptU_pre8done: add ecx,64 cmp ecx,edx //while(offset <= row_size) do {... ja memoptU_done64 movq mm0,[esi+ecx-64] movq mm1,[esi+ecx-56] movq mm2,[esi+ecx-48] movq mm3,[esi+ecx-40] movq mm4,[esi+ecx-32] movq mm5,[esi+ecx-24] movq mm6,[esi+ecx-16] movq mm7,[esi+ecx- 8] jmp memoptU_write64loop memoptU_done64: sub ecx,64 //went to far align 16 memoptU_write8loop: add ecx,8 //next QW cmp ecx,edx //any QW's left in row ? ja memoptU_done8 movq mm0,[esi+ecx-8] movntq [edi+ecx-8],mm0 jmp memoptU_write8loop memoptU_done8: movq mm1,[esi+edx-8] //write the last unaligned bytes movntq [edi+edx-8],mm1 sub esi,src_pitch sub edi,dst_pitch dec ebx //row counter (=height at start) jne memoptU_rowloop sfence emms }; return; }//end unaligned version else {//QW aligned version (fastest) //else dstp and row_size QW aligned - hope for the best from srcp //QW aligned version should generally be true when copying full rows _asm { mov esi,srcStart //start of bottom row mov edi,dstStart mov ebx,height mov edx,row_size align 16 memoptA_rowloop: mov ecx,edx //row_size dec ecx //offset to last byte in row //********forward routine add ecx,esi and ecx,~63 //align prefetch to first byte in cache line(~3-4% faster) align 16 memoptA_prefetchloop: mov AX,[ecx] sub ecx,64 cmp ecx,esi jae memoptA_prefetchloop mov eax,edi xor ecx,ecx neg eax and eax,63 //eax=bytes from edi to start of cache line align 16 memoptA_prewrite8loop: //write out odd QW's so 64bit write is cache line aligned cmp ecx,eax //start of cache line ? jz memoptA_pre8done //if not, write single QW movq mm7,[esi+ecx] movntq [edi+ecx],mm7 add ecx,8 jmp memoptA_prewrite8loop align 16 memoptA_write64loop: movntq [edi+ecx-64],mm0 movntq [edi+ecx-56],mm1 movntq [edi+ecx-48],mm2 movntq [edi+ecx-40],mm3 movntq [edi+ecx-32],mm4 movntq [edi+ecx-24],mm5 movntq [edi+ecx-16],mm6 movntq [edi+ecx- 8],mm7 memoptA_pre8done: add ecx,64 cmp ecx,edx ja memoptA_done64 //less than 64 bytes left movq mm0,[esi+ecx-64] movq mm1,[esi+ecx-56] movq mm2,[esi+ecx-48] movq mm3,[esi+ecx-40] movq mm4,[esi+ecx-32] movq mm5,[esi+ecx-24] movq mm6,[esi+ecx-16] movq mm7,[esi+ecx- 8] jmp memoptA_write64loop memoptA_done64: sub ecx,64 align 16 memoptA_write8loop: //less than 8 QW's left add ecx,8 cmp ecx,edx ja memoptA_done8 //no QW's left movq mm7,[esi+ecx-8] movntq [edi+ecx-8],mm7 jmp memoptA_write8loop memoptA_done8: sub esi,src_pitch sub edi,dst_pitch dec ebx //row counter (height) jne memoptA_rowloop sfence emms }; return; }//end aligned version }//end BitBlt_memopt() #endif //X86_32 #endif // INTEL_INTRINSICS void BitBlt(BYTE* dstp, int dst_pitch, const BYTE* srcp, int src_pitch, int row_size, int height) { if ( (!height) || (!row_size) ) return; #ifdef INTEL_INTRINSICS #if defined(X86_32) && defined(MSVC_PURE) const int cpuf = GetCPUFlags(); if ((cpuf & CPUF_INTEGER_SSE) && !(cpuf & CPUF_AVX)) { if (height == 1 || (src_pitch == dst_pitch && dst_pitch == row_size)) { memcpy_amd(dstp, srcp, row_size*height); } else { asm_BitBlt_ISSE(dstp,dst_pitch,srcp,src_pitch,row_size,height); } return; } #endif #endif // INTEL_INTRINSICS if (height == 1 || (dst_pitch == src_pitch && src_pitch == row_size)) { memcpy(dstp, srcp, row_size*height); } else { for (int y = height; y > 0; --y) { memcpy(dstp, srcp, row_size); dstp += dst_pitch; srcp += src_pitch; } } } ================================================ FILE: avs_core/core/bitblt.h ================================================ // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef AVSCORE_BITBLT_H #define AVSCORE_BITBLT_H typedef unsigned char BYTE; void BitBlt(BYTE* dstp, int dst_pitch, const BYTE* srcp, int src_pitch, int row_size, int height); #endif // AVSCORE_BITBLT_H ================================================ FILE: avs_core/core/cache.cpp ================================================ // Avisynth v2.6. Copyright 2002-2009 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include "cache.h" #include "internal.h" #include "LruCache.h" #include "InternalEnvironment.h" #include "DeviceManager.h" #include #include #include #ifdef X86_32 #include #endif #include #ifdef AVS_WINDOWS #include #else #include #endif extern const AVSFunction Cache_filters[] = { { "Cache", BUILTIN_FUNC_PREFIX, "c[name]s", CacheGuard::Create }, { "InternalCache", BUILTIN_FUNC_PREFIX, "c[name]s", CacheGuard::Create }, { 0 } }; class CacheStack { InternalEnvironment* env; bool retSupressCaching; public: CacheStack(InternalEnvironment* env) : env(env) , retSupressCaching(env->GetSupressCaching()) { } ~CacheStack() { env->GetSupressCaching() = retSupressCaching; } }; struct CachePimpl { PClip child; VideoInfo vi; // Video cache std::shared_ptr > VideoCache; // Audio cache CachePolicyHint AudioPolicy; char* AudioCache; int SampleSize; int64_t MaxSampleCount; int64_t AudioCacheStart; int64_t CacheCount; int64_t ac_expected_next; int ac_too_small_count; long ac_currentscore; CachePimpl(const PClip& _child, CacheMode mode) : child(_child), vi(_child->GetVideoInfo()), VideoCache(std::make_shared >(0, mode)), AudioPolicy(vi.HasAudio() ? CACHE_AUDIO_AUTO_START_OFF : CACHE_AUDIO_NOTHING), // Don't cache audio per default, auto mode. AudioCache(NULL), SampleSize(0), MaxSampleCount(0), AudioCacheStart(0), CacheCount(0), ac_expected_next(0), ac_too_small_count(0), ac_currentscore(20) { SampleSize = vi.BytesPerAudioSample(); } ~CachePimpl() { if (AudioCache) free(AudioCache); AudioCache = NULL; } }; AvsCache::AvsCache(const PClip& _child, Device* device, std::mutex& CacheGuardMutex, InternalEnvironment* env) : Env(env), _pimpl(NULL), device(device), CacheGuardMutex(CacheGuardMutex) { _pimpl = new CachePimpl(_child, env->GetCacheMode()); env->ManageCache(MC_RegisterCache, reinterpret_cast(this)); _RPT5(0, "AvsCache::AvsCache registered. cache_id=%p child=%p w=%d h=%d VideoCacheSize=%Iu\n", (void*)this, (void*)_child, _pimpl->vi.width, _pimpl->vi.height, _pimpl->VideoCache->size()); const int dummy = 0; // child is usually MTGuard, which forwards this request to its child filter - the real one const bool overAvs25 = (_child->GetVersion() >= 5); CachePolicyHint childAudioPolicy = (CachePolicyHint)(overAvs25 ? _child->SetCacheHints(CACHE_GETCHILD_AUDIO_MODE, dummy) : 0); // if not set by the plugin, get default (set in CachePimpl ctor) if (childAudioPolicy == 0) childAudioPolicy = (CachePolicyHint)this->SetCacheHints(CACHE_GET_AUDIO_POLICY, dummy); switch (childAudioPolicy) { case CachePolicyHint(0): break; // n/a case CACHE_AUDIO: // Explicitly do cache audio, X byte cache. case CACHE_AUDIO_NOTHING: // Explicitly do not cache audio. case CACHE_AUDIO_AUTO_START_OFF: // Audio cache off (auto mode), X byte initial cache. case CACHE_AUDIO_AUTO_START_ON: // Audio cache on (auto mode), X byte initial cache. // ask child for desired audio cache size // e.g. EnsureVBRMP3Sync explicitely requests CACHE_AUDIO and 1024*1024 // This will create cache only if clip has audio this->SetCacheHints(childAudioPolicy, overAvs25 ? _child->SetCacheHints(CACHE_GETCHILD_AUDIO_SIZE, dummy) : 0); // if size=0 remains the default break; default: env->ThrowError("Cache: Filter returned invalid response to CACHE_GETCHILD_AUDIO_MODE. %d", childAudioPolicy); } } AvsCache::~AvsCache() { _RPT5(0, "AvsCache::AvsCache unregister. cache_id=%p child=%p w=%d h=%d VideoCacheSize=%Iu\n", (void *)this, (void *)_pimpl->child, _pimpl->vi.width, _pimpl->vi.height, _pimpl->VideoCache->size()); // P.F. Env->ManageCache(MC_UnRegisterCache, reinterpret_cast(this)); delete _pimpl; } PVideoFrame __stdcall AvsCache::GetFrame(int n, IScriptEnvironment* env_) { #ifdef _DEBUG constexpr auto BUFSIZE = 255; std::unique_ptr buf(new char[BUFSIZE+1]); #endif InternalEnvironment* env = GetAndRevealCamouflagedEnv(env_); // Protect plugins that cannot handle out-of-bounds frame indices n = clamp(n, 0, GetVideoInfo().num_frames-1); if (_pimpl->VideoCache->requested_capacity() > _pimpl->VideoCache->capacity()) env->ManageCache(MC_NodAndExpandCache, reinterpret_cast(this)); else env->ManageCache(MC_NodCache, reinterpret_cast(this)); PVideoFrame result; LruCache::handle cache_handle; CacheStack cache_stack(env); #ifdef _DEBUG std::chrono::time_point t_start, t_end; t_start = std::chrono::high_resolution_clock::now(); // t_start starts in the constructor. Used in logging LruLookupResult LruLookupRes = _pimpl->VideoCache->lookup(n, &cache_handle, true, result, &env->GetSupressCaching()); /* std::string name = FuncName; snprintf(buf.get(), BUFSIZE, "AvsCache::GetFrame lookup follows: [%s] n=%6d Thread=%zu", name.c_str(), n, env->GetEnvProperty(AEP_THREAD_ID)); _RPT0(0, buf.get()); snprintf(buf.get(), BUFSIZE, "AvsCache::GetFrame lookup ready: [%s] n=%6d Thread=%zu res=%d", name.c_str(), n, env->GetEnvProperty(AEP_THREAD_ID), (int)LruLookupRes); _RPT0(0, buf.get()); */ #ifdef _DEBUG std::string name = FuncName; #endif switch (LruLookupRes) #else // fill result in lookup before releasing cache handle lock switch(_pimpl->VideoCache->lookup(n, &cache_handle, true, result, &env->GetSupressCaching())) #endif { case LRU_LOOKUP_NOT_FOUND: { try { #ifdef _DEBUG snprintf(buf.get(), BUFSIZE, "AvsCache::GetFrame LRU_LOOKUP_NOT_FOUND Start: [%s] n=%6d child=%p\n", name.c_str(), n, (void*)_pimpl->child); // P.F. _RPT0(0, buf.get()); #endif //cache_handle.first->value = _pimpl->child->GetFrame(n, env); result = _pimpl->child->GetFrame(n, env); // P.F. fill result immediately // check device if (result->GetFrameBuffer()->device != device) { const char* error_msg = env->Sprintf("Frame device mismatch: Assumed: %s Actual: %s", device->GetName(), result->GetFrameBuffer()->device->GetName()); result = env->NewVideoFrame(_pimpl->vi); env->ApplyMessage(&result, _pimpl->vi, error_msg, _pimpl->vi.width / 5, 0xa0a0a0, 0, 0); } cache_handle.first->value = result; // not after commit! #ifdef X86_32 _mm_empty(); #endif _pimpl->VideoCache->commit_value(&cache_handle); } catch (...) { _pimpl->VideoCache->rollback(&cache_handle); throw; } #ifdef _DEBUG t_end = std::chrono::high_resolution_clock::now(); std::chrono::duration elapsed_seconds = t_end - t_start; std::string name = FuncName; if (NULL == cache_handle.first->value) { snprintf(buf.get(), BUFSIZE, "AvsCache::GetFrame LRU_LOOKUP_NOT_FOUND End: HEY! got nulled! [%s] n=%6d child=%p frame=%p framebefore=%p SeekTimeWithGetFrame:%f\n", name.c_str(), n, (void *)_pimpl->child, (void *)cache_handle.first->value, (void *)result, elapsed_seconds.count()); // P.F. _RPT0(0, buf.get()); } else { snprintf(buf.get(), BUFSIZE, "AvsCache::GetFrame LRU_LOOKUP_NOT_FOUND End: [%s] n=%6d child=%p frame=%p framebefore=%p videoCacheSize=%zu SeekTimeWithGetFrame:%f\n", name.c_str(), n, (void *)_pimpl->child, (void *)cache_handle.first->value, (void *)result, _pimpl->VideoCache->size(), elapsed_seconds.count()); // P.F. _RPT0(0, buf.get()); } #endif // result = cache_handle.first->value; not here! // its content may change after commit when the last lock is released // (cache is being restructured by other threads, new frames, etc...) break; } case LRU_LOOKUP_FOUND_AND_READY: { // theoretically cache_handle here may point to wrong entry, // because the lock in lookup is released before this readout // solution: // when LRU_LOOKUP_FOUND_AND_READY, the cache_handle.first->value is copied and returned in result itself // result = cache_handle.first->value; // old method not needed, result is filled already by lookup #ifdef _DEBUG t_end = std::chrono::high_resolution_clock::now(); std::chrono::duration elapsed_seconds = t_end - t_start; std::string name = FuncName; snprintf(buf.get(), BUFSIZE, "AvsCache::GetFrame LRU_LOOKUP_FOUND_AND_READY: [%s] n=%6d child=%p frame=%p vfb=%p videoCacheSize=%zu SeekTime :%f\n", name.c_str(), n, (void *)_pimpl->child, (void *)result, (void *)result->GetFrameBuffer(), _pimpl->VideoCache->size(), elapsed_seconds.count()); _RPT0(0, buf.get()); assert(result != NULL); #endif break; } case LRU_LOOKUP_NO_CACHE: { #ifdef _DEBUG snprintf(buf.get(), BUFSIZE, "AvsCache::GetFrame LRU_LOOKUP_NO_CACHE: [%s] n=%6d child=%p\n", name.c_str(), n, (void*)_pimpl->child); // P.F. _RPT0(0, buf.get()); #endif result = _pimpl->child->GetFrame(n, env); #ifdef _DEBUG t_end = std::chrono::high_resolution_clock::now(); std::chrono::duration elapsed_seconds = t_end - t_start; snprintf(buf.get(), BUFSIZE, "AvsCache::GetFrame LRU_LOOKUP_NO_CACHE: [%s] n=%6d child=%p frame=%p vfb=%p videoCacheSize=%zu SeekTime :%f\n", name.c_str(), n, (void *)_pimpl->child, (void *)result, (void *)result->GetFrameBuffer(), _pimpl->VideoCache->size(), elapsed_seconds.count()); // P.F. _RPT0(0, buf.get()); #endif break; } case LRU_LOOKUP_FOUND_BUT_NOTAVAIL: // Fall-through intentional default: { assert(0); break; } } return result; } void AvsCache::FillAudioZeros(void* buf, size_t start_offset, size_t count) { const int bps = _pimpl->vi.BytesPerAudioSample(); unsigned char* byte_buf = (unsigned char*)buf; memset(byte_buf + start_offset * bps, 0, count * bps); } void __stdcall AvsCache::GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) { if (count <= 0) return; if (count > 0 && static_cast(count) > std::numeric_limits::max()) env->ThrowError("GetAudio error: Count exceeds platform maximum buffer size limit."); // ----------------------------------------------------------- // Enforce audio bounds // ----------------------------------------------------------- VideoInfo * vi = &(_pimpl->vi); if ((!vi->HasAudio()) || (start + count <= 0) || (start >= vi->num_audio_samples)) { // Completely skip. FillAudioZeros(buf, 0, (size_t)count); count = 0; return; } if (start < 0) { // Partial initial skip FillAudioZeros(buf, 0, static_cast(-start)); // Fill all samples before 0 with silence. count += start; // Subtract start bytes from count. buf = ((BYTE*)buf) - start * vi->BytesPerAudioSample(); start = 0; } if (start + count > vi->num_audio_samples) { // Partial ending skip FillAudioZeros(buf, (size_t)(vi->num_audio_samples - start), (size_t)(count - (vi->num_audio_samples - start))); // Fill end samples count = (vi->num_audio_samples - start); } // ----------------------------------------------------------- // Caching // ----------------------------------------------------------- long _cs = _pimpl->ac_currentscore; if (start < _pimpl->ac_expected_next) _cs = InterlockedExchangeAdd(&_pimpl->ac_currentscore, -5) - 5; // revisiting old ground - a cache could help else if (start > _pimpl->ac_expected_next) _cs = InterlockedDecrement(&_pimpl->ac_currentscore); // skipping chunks - a cache might not help else // (start == ac_expected_next) _cs = InterlockedIncrement(&_pimpl->ac_currentscore); // strict linear reading - why bother with a cache if (_cs < -2000000) _pimpl->ac_currentscore = -2000000; else if (_cs > 90) _pimpl->ac_currentscore = 90; // Change from AUTO_OFF to AUTO_ON if (_pimpl->AudioPolicy == CACHE_AUDIO_AUTO_START_OFF && _pimpl->ac_currentscore <= 0) { // align size to 8192 byte boundary int64_t new_size = (_pimpl->vi.BytesFromAudioSamples(count) + 8191) & -8192; new_size = min((int64_t)4096 * 1024, new_size); _RPT2(0, "CA:%x: Automatically adding %d byte audiocache!\n", this, (int)new_size); SetCacheHints(CACHE_AUDIO_AUTO_START_ON, (int)new_size); } // Change from AUTO_ON to AUTO_OFF if (_pimpl->AudioPolicy == CACHE_AUDIO_AUTO_START_ON && (_pimpl->ac_currentscore > 80)) { _RPT1(0, "CA:%x: Automatically deleting cache!\n", this); SetCacheHints(CACHE_AUDIO_AUTO_START_OFF, 0); } _pimpl->ac_expected_next = start + count; if (_pimpl->AudioPolicy == CACHE_AUDIO_AUTO_START_OFF || _pimpl->AudioPolicy == CACHE_AUDIO_NOTHING) { _pimpl->child->GetAudio(buf, start, count, env); return; // We are ok to return now! } std::unique_lock global_lock(CacheGuardMutex); while (count > _pimpl->MaxSampleCount) { //is cache big enough? _RPT1(0, "CA:%x:Cache too small->caching last audio\n", this); _pimpl->ac_too_small_count++; // But the current cache might have 99% of what was requested?? if (_pimpl->ac_too_small_count > 2 && _pimpl->MaxSampleCount < _pimpl->vi.AudioSamplesFromBytes(8192 * 1024)) { // Max size = 8MB! //automatically upsize cache! int64_t new_size = (_pimpl->vi.BytesFromAudioSamples(std::max(count, _pimpl->AudioCacheStart + _pimpl->CacheCount - start)) + 8192) & -8192; // Yes +1 to +8192 bytes new_size = std::min((int64_t)8192 * 1024, new_size); _RPT2(0, "CA:%x: Autoupsizing buffer to %d bytes!\n", this, (int)new_size); SetCacheHints(_pimpl->AudioPolicy, (int)new_size); // updates maxsamplecount!! _pimpl->ac_too_small_count = 0; } else { global_lock.unlock(); _pimpl->child->GetAudio(buf, start, count, env); global_lock.lock(); _pimpl->CacheCount = std::min(count, _pimpl->MaxSampleCount); // Remember maxsamplecount gets updated _pimpl->AudioCacheStart = start + count - _pimpl->CacheCount; BYTE* buff = (BYTE*)buf; buff += _pimpl->vi.BytesFromAudioSamples(_pimpl->AudioCacheStart - start); memcpy(_pimpl->AudioCache, buff, (size_t)_pimpl->vi.BytesFromAudioSamples(_pimpl->CacheCount)); global_lock.unlock(); return; } } if ((start < _pimpl->AudioCacheStart) || (start > _pimpl->AudioCacheStart + _pimpl->MaxSampleCount)) { //first sample is before cache or beyond linear reach -> restart cache _RPT1(0, "CA:%x: Restart\n", this); _pimpl->CacheCount = std::min(count, _pimpl->MaxSampleCount); _pimpl->AudioCacheStart = start; _pimpl->child->GetAudio(_pimpl->AudioCache, _pimpl->AudioCacheStart, _pimpl->CacheCount, env); } else { if (start + count > _pimpl->AudioCacheStart + _pimpl->CacheCount) { // Does the cache fail to cover the request? if (start + count > _pimpl->AudioCacheStart + _pimpl->MaxSampleCount) { // Is cache shifting necessary? int shiftsamples = (int)((start + count) - (_pimpl->AudioCacheStart + _pimpl->MaxSampleCount)); // Align end of cache with end of request if ((start - _pimpl->AudioCacheStart) / 2 > shiftsamples) { //shift half cache if possible shiftsamples = (int)((start - _pimpl->AudioCacheStart) / 2); } if (shiftsamples >= (int)_pimpl->CacheCount) { // Can we save any existing data _pimpl->AudioCacheStart = start + count - _pimpl->MaxSampleCount; // Maximise linear access _pimpl->CacheCount = 0; } else { memmove(_pimpl->AudioCache, _pimpl->AudioCache + shiftsamples * _pimpl->SampleSize, (size_t)((_pimpl->CacheCount - shiftsamples) * _pimpl->SampleSize)); _pimpl->AudioCacheStart = _pimpl->AudioCacheStart + shiftsamples; _pimpl->CacheCount = _pimpl->CacheCount - shiftsamples; } } // Read just enough to complete the current request, append it to the cache _pimpl->child->GetAudio(_pimpl->AudioCache + _pimpl->CacheCount * _pimpl->SampleSize, _pimpl->AudioCacheStart + _pimpl->CacheCount, start + count - (_pimpl->AudioCacheStart + _pimpl->CacheCount), env); _pimpl->CacheCount += (size_t)(start + count - (_pimpl->AudioCacheStart + _pimpl->CacheCount)); } } //copy cache to buf memcpy(buf, _pimpl->AudioCache + (size_t)(start - _pimpl->AudioCacheStart) * _pimpl->SampleSize, (size_t)(count * _pimpl->SampleSize)); } const VideoInfo& __stdcall AvsCache::GetVideoInfo() { return _pimpl->vi; } bool __stdcall AvsCache::GetParity(int n) { return _pimpl->child->GetParity(n); } int __stdcall AvsCache::SetCacheHints(int cachehints, int frame_range) { // _RPT3(0, "AvsCache::SetCacheHints called. cache=%p hint=%d frame_range=%d\n", (void *)this, cachehints, frame_range); switch(cachehints) { /********************************************* MISC *********************************************/ // By returning IS_CACHE_ANS to IS_CACHE_REQ, we tell the caller we are a cache case CACHE_IS_CACHE_REQ: return CACHE_IS_CACHE_ANS; case CACHE_GET_POLICY: // Get the current policy. return CACHE_GENERIC; case CACHE_DONT_CACHE_ME: return 1; case CACHE_GET_MTMODE: return MT_NICE_FILTER; /********************************************* VIDEO *********************************************/ case CACHE_SET_MIN_CAPACITY: { // This is not atomic, but frankly, we don't care size_t min, max; _pimpl->VideoCache->limits(&min, &max); min = frame_range; _pimpl->VideoCache->set_limits(min, max); break; } case CACHE_SET_MAX_CAPACITY: { // This is not atomic, but frankly, we don't care size_t min, max; _pimpl->VideoCache->limits(&min, &max); max = frame_range; _pimpl->VideoCache->set_limits(min, max); _RPT3(0, "AvsCache::SetCacheHints CACHE_SET_MAX_CAPACITY cache=%p hint=%d frame_range=%d\n", (void *)this, cachehints, frame_range); break; } case CACHE_GET_MIN_CAPACITY: { size_t min, max; _pimpl->VideoCache->limits(&min, &max); return (int)min; } case CACHE_GET_MAX_CAPACITY: { size_t min, max; _pimpl->VideoCache->limits(&min, &max); return (int)max; } case CACHE_GET_SIZE: return (int)_pimpl->VideoCache->size(); case CACHE_GET_REQUESTED_CAP: return (int)_pimpl->VideoCache->requested_capacity(); case CACHE_GET_CAPACITY: return (int)_pimpl->VideoCache->capacity(); case CACHE_GET_WINDOW: // Get the current window h_span. case CACHE_GET_RANGE: // Get the current generic frame range. return 2; break; case CACHE_GENERIC: case CACHE_FORCE_GENERIC: case CACHE_NOTHING: case CACHE_WINDOW: case CACHE_PREFETCH_FRAME: // Queue request to prefetch frame N. case CACHE_PREFETCH_GO: // Action video prefetches. break; /********************************************* AUDIO *********************************************/ case CACHE_AUDIO: case CACHE_AUDIO_AUTO_START_ON: if (!_pimpl->vi.HasAudio()) break; // Range means for audio. // 0 == Create a default buffer (256kb). // Positive. Allocate X bytes for cache. if (frame_range == 0) { if (_pimpl->AudioPolicy != CACHE_AUDIO_AUTO_START_OFF) // We already have a policy - no need for a default one. break; frame_range = 256 * 1024; } if (frame_range/_pimpl->SampleSize > _pimpl->MaxSampleCount) { // Only make bigger const bool audio_cache_existed = _pimpl->AudioCache != nullptr; // keep content, newly added bytes are undefined on increase // but CacheCount keeps track on that fact char * NewAudioCache = (char*)realloc(_pimpl->AudioCache, frame_range); if (NewAudioCache == NULL) { throw std::bad_alloc(); } _pimpl->AudioCache = NewAudioCache; _pimpl->MaxSampleCount = frame_range/_pimpl->SampleSize; if(audio_cache_existed) _pimpl->CacheCount = std::min(_pimpl->CacheCount, _pimpl->MaxSampleCount); else { _pimpl->AudioCacheStart = 0; _pimpl->CacheCount = 0; } } _pimpl->AudioPolicy = (CachePolicyHint)cachehints; break; case CACHE_AUDIO_AUTO_START_OFF: case CACHE_AUDIO_NOTHING: free(_pimpl->AudioCache); _pimpl->AudioCache = NULL; _pimpl->MaxSampleCount = 0; _pimpl->AudioCacheStart = 0; _pimpl->CacheCount = 0; _pimpl->AudioPolicy = (CachePolicyHint)cachehints; break; case CACHE_GET_AUDIO_POLICY: // Get the current audio policy. return _pimpl->AudioPolicy; case CACHE_GET_AUDIO_SIZE: // Get the current audio cache size. return (int)(_pimpl->SampleSize * _pimpl->MaxSampleCount); // n/a ignore them, not implemented even in 2.6 case CACHE_PREFETCH_AUDIO_BEGIN: // Begin queue request to prefetch audio (take critical section). case CACHE_PREFETCH_AUDIO_STARTLO: // Set low 32 bits of start. case CACHE_PREFETCH_AUDIO_STARTHI: // Set high 32 bits of start. case CACHE_PREFETCH_AUDIO_COUNT: // Set low 32 bits of length. case CACHE_PREFETCH_AUDIO_COMMIT: // Enqueue request transaction to prefetch audio (release critical section). case CACHE_PREFETCH_AUDIO_GO: // Action audio prefetch break; default: return 0; } return 0; } CacheGuard::CacheGuard(const PClip& child, const char *name, IScriptEnvironment* env) : child(child), vi(child->GetVideoInfo()), globalEnv(env) { if (name) this->name = name; // other fields are set OK already hints.AudioPolicy = vi.HasAudio() ? CACHE_AUDIO_AUTO_START_OFF : CACHE_AUDIO_NOTHING; hints.default_AudioPolicy = hints.AudioPolicy; } CacheGuard::~CacheGuard() { } PClip CacheGuard::GetCache(IScriptEnvironment* env_, bool use_child_if_notfound) { std::unique_lock global_lock(mutex); InternalEnvironment* env = GetAndRevealCamouflagedEnv(env_); Device* device = env->GetCurrentDevice(); for (auto entry : deviceCaches) { if (entry.first == device) { return entry.second; } } // not found for current device, creation may not be good (e.g. GetFrame(0) from an Invoke) if (use_child_if_notfound) return child; // not found for current device, create it AvsCache* cache = new AvsCache(child, device, /*ref*/mutex, static_cast(globalEnv)); // apply cache hints if it is changed if (hints.min != hints.default_min) cache->SetCacheHints(CACHE_SET_MIN_CAPACITY, (int)hints.min); if (hints.max != hints.default_max) cache->SetCacheHints(CACHE_SET_MAX_CAPACITY, (int)hints.max); if (hints.AudioPolicy != hints.default_AudioPolicy || hints.AudioSize != hints.default_AudioSize) cache->SetCacheHints(hints.AudioPolicy, hints.AudioSize); deviceCaches.emplace_back(device, cache); return deviceCaches.back().second; } void CacheGuard::ApplyHints(int cachehints, int frame_range) { std::unique_lock global_lock(mutex); for (auto entry : deviceCaches) { entry.second->SetCacheHints(cachehints, frame_range); } } int CacheGuard::GetOrDefault(int cachehints, int frame_range, int def) { std::unique_lock global_lock(mutex); for (auto entry : deviceCaches) { return entry.second->SetCacheHints(cachehints, frame_range); } return def; } PVideoFrame __stdcall CacheGuard::GetFrame(int n, IScriptEnvironment* env_) { InternalEnvironment* IEnv = GetAndRevealCamouflagedEnv(env_); IScriptEnvironment* env = static_cast(IEnv); ScopedCounter getframe_counter(IEnv->GetFrameRecursiveCount()); /* if (!name.empty()) _RPT2(0, "CacheGuard::GetFrame call further GetFrame: %s %d\n", name.c_str(), n); */ // do not create cache from inside Invoke (e.g. when calling GetFrame(0) from constructor during instantation) //const bool chainedCtor = IEnv->GetInvokeStackSize() > 0; const bool chainedCtor = false; return GetCache(env, chainedCtor)->GetFrame(n, env); } void __stdcall CacheGuard::GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env_) { InternalEnvironment* IEnv = GetAndRevealCamouflagedEnv(env_); IScriptEnvironment* env = static_cast(IEnv); ScopedCounter getframe_counter(IEnv->GetFrameRecursiveCount()); // do not create cache from inside Invoke (e.g. when calling GetFrame(0) from constructor during instantation) //const bool chainedCtor = IEnv->GetInvokeStackSize() > 0; const bool chainedCtor = false; return GetCache(env, chainedCtor)->GetAudio(buf, start, count, env); } const VideoInfo& __stdcall CacheGuard::GetVideoInfo() { return vi; } bool __stdcall CacheGuard::GetParity(int n) { return child->GetParity(n); } int __stdcall CacheGuard::SetCacheHints(int cachehints, int frame_range) { #ifdef _DEBUG std::string hintname; switch (cachehints) { case CACHE_DONT_CACHE_ME: hintname = "CACHE_DONT_CACHE_ME"; break; case CACHE_SET_MIN_CAPACITY: hintname = "CACHE_SET_MIN_CAPACITY"; break; case CACHE_SET_MAX_CAPACITY: hintname = "CACHE_SET_MAX_CAPACITY"; break; case CACHE_GET_MIN_CAPACITY: hintname = "CACHE_GET_MIN_CAPACITY"; break; case CACHE_GET_MAX_CAPACITY: hintname = "CACHE_GET_MAX_CAPACITY"; break; case CACHE_GET_SIZE: hintname = "CACHE_GET_SIZE"; break; case CACHE_GET_REQUESTED_CAP: hintname = "CACHE_GET_REQUESTED_CAP"; break; case CACHE_GET_CAPACITY: hintname = "CACHE_GET_CAPACITY"; break; case CACHE_GET_MTMODE: hintname = "CACHE_GET_MTMODE"; break; case CACHE_IS_CACHE_REQ: hintname = "CACHE_IS_CACHE_REQ"; break; case CACHE_IS_CACHE_ANS: hintname = "CACHE_IS_CACHE_ANS"; break; case CACHE_IS_MTGUARD_REQ: hintname = "CACHE_IS_MTGUARD_REQ"; break; case CACHE_IS_MTGUARD_ANS: hintname = "CACHE_IS_MTGUARD_ANS"; break; case CACHE_INFORM_NUM_THREADS: hintname = "CACHE_INFORM_NUM_THREADS"; break; case CACHE_GET_DEV_TYPE: hintname = "CACHE_GET_DEV_TYPE"; break; case CACHE_GET_CHILD_DEV_TYPE: hintname = "CACHE_GET_CHILD_DEV_TYPE"; break; } if (cachehints != CACHE_GET_DEV_TYPE && cachehints != CACHE_GET_CHILD_DEV_TYPE) { // dont't care for the above if (hintname == "") _RPT3(0, "CacheGuard::SetCacheHints called. cache=%p hint=%d frame_range=%d\n", (void*)this, cachehints, frame_range); // P.F. else _RPT4(0, "CacheGuard::SetCacheHints called. cache=%p hint=%d (%s) frame_range=%d\n", (void*)this, cachehints, hintname.c_str(), frame_range); // P.F. } #endif switch (cachehints) { /********************************************* MISC *********************************************/ // By returning IS_CACHE_ANS to IS_CACHE_REQ, we tell the caller we are a cache case CACHE_IS_CACHE_REQ: return CACHE_IS_CACHE_ANS; case CACHE_GET_POLICY: // Get the current policy. return CACHE_GENERIC; case CACHE_DONT_CACHE_ME: return 1; case CACHE_GET_MTMODE: return MT_NICE_FILTER; /********************************************* AVS 2.5 TRANSLATION *********************************************/ // Ignore 2.5 CACHE_NOTHING requests case CACHE_25_NOTHING: break; // Map 2.5 CACHE_RANGE calls to CACHE_WINDOW // force minimum range to 2 case CACHE_25_RANGE: if (frame_range < 2) frame_range = 2; SetCacheHints(CACHE_WINDOW, frame_range); break; // Map 2.5 CACHE_ALL calls to CACHE_GENERIC case CACHE_25_ALL: SetCacheHints(CACHE_GENERIC, frame_range); break; // Map 2.5 CACHE_AUDIO calls to CACHE_AUDIO case CACHE_25_AUDIO: SetCacheHints(CACHE_AUDIO, frame_range); break; // Map 2.5 CACHE_AUDIO_NONE calls to CACHE_AUDIO_NONE case CACHE_25_AUDIO_NONE: SetCacheHints(CACHE_AUDIO_NONE, 0); break; // Map 2.5 CACHE_AUDIO_AUTO calls to CACHE_AUDIO_AUTO case CACHE_25_AUDIO_AUTO: SetCacheHints(CACHE_AUDIO_AUTO, frame_range); break; /********************************************* VIDEO *********************************************/ case CACHE_SET_MIN_CAPACITY: hints.min = frame_range; ApplyHints(cachehints, frame_range); break; case CACHE_SET_MAX_CAPACITY: hints.max = frame_range; ApplyHints(cachehints, frame_range); break; case CACHE_GET_MIN_CAPACITY: return (int)hints.min; case CACHE_GET_MAX_CAPACITY: return (int)hints.max; case CACHE_GET_SIZE: case CACHE_GET_REQUESTED_CAP: case CACHE_GET_CAPACITY: return GetOrDefault(cachehints, frame_range, 0); case CACHE_GET_WINDOW: // Get the current window h_span. case CACHE_GET_RANGE: // Get the current generic frame range. return 2; break; case CACHE_GENERIC: case CACHE_FORCE_GENERIC: case CACHE_NOTHING: case CACHE_WINDOW: case CACHE_PREFETCH_FRAME: // Queue request to prefetch frame N. case CACHE_PREFETCH_GO: // Action video prefetches. break; /********************************************* AUDIO *********************************************/ case CACHE_GETCHILD_AUDIO_MODE: case CACHE_GETCHILD_AUDIO_SIZE: return (child->GetVersion() >= 5) ? child->SetCacheHints(cachehints, 0) : 0; case CACHE_AUDIO: case CACHE_AUDIO_AUTO_START_ON: // auto mode, initially cache case CACHE_AUDIO_AUTO_START_OFF: // auto mode, initially don't cache case CACHE_AUDIO_NOTHING: hints.AudioPolicy = (CachePolicyHint)cachehints; hints.AudioSize = frame_range; ApplyHints(cachehints, frame_range); break; case CACHE_GET_AUDIO_POLICY: // Get the current audio policy. return hints.AudioPolicy; case CACHE_GET_AUDIO_SIZE: // Get the current audio cache size. return (child->GetVersion() >= 5) ? GetOrDefault(cachehints, frame_range, 0) : 0; case CACHE_PREFETCH_AUDIO_BEGIN: // Begin queue request to prefetch audio (take critical section). case CACHE_PREFETCH_AUDIO_STARTLO: // Set low 32 bits of start. case CACHE_PREFETCH_AUDIO_STARTHI: // Set high 32 bits of start. case CACHE_PREFETCH_AUDIO_COUNT: // Set low 32 bits of length. case CACHE_PREFETCH_AUDIO_COMMIT: // Enqueue request transaction to prefetch audio (release critical section). case CACHE_PREFETCH_AUDIO_GO: // Action audio prefetch break; case CACHE_GET_DEV_TYPE: case CACHE_GET_CHILD_DEV_TYPE: return (child->GetVersion() >= 5) ? child->SetCacheHints(cachehints, 0) : 0; /***************************************************** Passes actual number of threads after a Prefetch call *****************************************************/ case CACHE_INFORM_NUM_THREADS: // pass the request to the child return (child->GetVersion() >= 5) ? child->SetCacheHints(cachehints, frame_range) : 0; default: return 0; } return 0; } AVSValue __cdecl CacheGuard::Create(AVSValue args, void*, IScriptEnvironment* env) { PClip p = 0; if (args.IsClip()) { p = args.AsClip(); } else if (args.IsArray() && args[0].IsClip()) { p = args[0].AsClip(); } const char* name = nullptr; if (args.IsArray() && args.ArraySize() >= 2 && args[1].IsString()) name = args[1].AsString(); if (p) // If the child is a clip { if ( (p->GetVersion() >= 5) && (p->SetCacheHints(CACHE_DONT_CACHE_ME, 0) != 0) ) { // Don't create cache instance if the child doesn't want to be cached // DONT_CACHE_ME is disabling audio cache as well, even if filter // would specify it by CACHE_GETCHILD_AUDIO_MODE return p; /* This is op, not args! */ } else { return new CacheGuard(p, name, env); } } else { return args; } } bool __stdcall CacheGuard::IsCache(const PClip& p) { return ((p->GetVersion() >= 5) && (p->SetCacheHints(CACHE_IS_CACHE_REQ, 0) == CACHE_IS_CACHE_ANS)); } ================================================ FILE: avs_core/core/cache.h ================================================ // Avisynth v2.6. Copyright 2002-2009 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __Cache_H__ #define __Cache_H__ #include #include #include #include struct CachePimpl; class InternalEnvironment; class AvsCache : public IClip { private: IScriptEnvironment* Env; CachePimpl* _pimpl; Device* device; std::mutex& CacheGuardMutex; // just reference! void FillAudioZeros(void* buf, size_t start_offset, size_t count); public: #ifdef _DEBUG std::string FuncName = ""; // P.F. Invoked function's name whose queue owns the cache object #endif AvsCache(const PClip& child, Device* device, std::mutex &CacheGuardMutex, InternalEnvironment* env); ~AvsCache(); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env); const VideoInfo& __stdcall GetVideoInfo(); bool __stdcall GetParity(int n); int __stdcall SetCacheHints(int cachehints,int frame_range); Device* GetDevice() const { return device; } static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env); static bool __stdcall IsCache(const PClip& c); }; class CacheGuard : public IClip { private: struct CacheHints { size_t min, max; size_t default_min, default_max; CachePolicyHint AudioPolicy, default_AudioPolicy; int AudioSize, default_AudioSize; CacheHints() : min(0), max(std::numeric_limits::max()), default_min(min), default_max(max), AudioPolicy(CACHE_AUDIO), default_AudioPolicy(AudioPolicy), AudioSize(0), default_AudioSize(AudioSize) { } }; PClip child; VideoInfo vi; IScriptEnvironment* globalEnv; std::vector> deviceCaches; CacheHints hints; mutable std::mutex mutex; PClip GetCache(IScriptEnvironment* env_, bool use_child_if_notfound); void ApplyHints(int cachehints, int frame_range); int GetOrDefault(int cachehints, int frame_range, int def); public: CacheGuard(const PClip& child, const char *name, IScriptEnvironment* env); ~CacheGuard(); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env); const VideoInfo& __stdcall GetVideoInfo(); bool __stdcall GetParity(int n); int __stdcall SetCacheHints(int cachehints, int frame_range); static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env); static bool __stdcall IsCache(const PClip& c); private: std::string name; enum { // Old 2.5 poorly defined cache hints. // Reserve values used by 2.5 API // Do not use in new filters CACHE_25_NOTHING=0, CACHE_25_RANGE=1, CACHE_25_ALL=2, CACHE_25_AUDIO=3, CACHE_25_AUDIO_NONE=4, CACHE_25_AUDIO_AUTO=5, }; }; #endif // __Cache_H__ ================================================ FILE: avs_core/core/clip_info.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __CLIP_INFO_H__ #define __CLIP_INFO_H__ extern "C" const GUID CLSID_CAVIFileSynth; // {E6D6B700-124D-11D4-86F3-DB80AFD98778} extern "C" const GUID IID_IAvisynthClipInfo; // {E6D6B708-124D-11D4-86F3-DB80AFD98778} struct IAvisynthClipInfo : IUnknown { virtual int __stdcall GetError(const char** ppszMessage) = 0; virtual bool __stdcall GetParity(int n) = 0; virtual bool __stdcall IsFieldBased() = 0; }; #endif ================================================ FILE: avs_core/core/cpuid.cpp ================================================ // Avisynth v1.0 beta. Copyright 2000 Ben Rudiak-Gould. // http://www.math.berkeley.edu/~benrg/avisynth.html // VirtualDub - Video processing and capture application // Copyright (C) 1998-2000 Avery Lee // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include #include #include #include // needed for linux and bsd l2cache size query #if defined(AVS_LINUX) || defined(AVS_BSD) #include #include #include #endif // Neon/Dotprod request in WinAPI ... #if defined(ARM64) && defined(AVS_WINDOWS) #include #include #endif // --- Platform-specific headers for x86/x64 --- #if defined(X86_32) || defined(X86_64) #ifdef AVS_WINDOWS #include // MSVC/Clang-CL #else // Non-Windows (GCC, Clang-GNU, etc.) #include #include #undef __cpuid static inline void __cpuid(int cpuinfo[4], int leaf) { unsigned int eax, ebx, ecx, edx; // for deeper leaves __get_cpuid is not enough __get_cpuid_count(leaf, 0, &eax, &ebx, &ecx, &edx); cpuinfo[0] = eax; cpuinfo[1] = ebx; cpuinfo[2] = ecx; cpuinfo[3] = edx; } #endif // AVS_WINDOWS #endif // defined(X86_32) || defined(X86_64) // --- Platform-specific headers for ARM64 --- #if defined(ARM64) #if defined(AVS_LINUX) || defined(AVS_BSD) // HWCAP values are needed for Linux/BSD #include // Note: may be required on some systems, // but AT_HWCAP and values like HWCAP_DOTPROD are often found in sys/auxv.h or defined by toolchain. // We assume standard GNU/Clang behavior where flags like HWCAP_DOTPROD are available. #include #elif defined(AVS_MACOS) // macOS/Apple Silicon uses sysctl for features #include #include #endif #endif #define IS_BIT_SET(bitfield, bit) ((bitfield) & (1<<(bit)) ? true : false) #if defined(X86_32) || defined(X86_64) static uint32_t get_xcr0() { uint32_t xcr0; // _XCR_XFEATURE_ENABLED_MASK: 0 #if defined(GCC) || defined(CLANG) __asm__("xgetbv" : "=a" (xcr0) : "c" (0) : "%edx"); #else xcr0 = (uint32_t)_xgetbv(0); #endif return xcr0; } // --- Helper for __cpuid_count/ex (required for Leaf 4 sub-leaves) --- static void __cpuid_count_wrapper(int info[4], int leaf, int subleaf) { #ifdef AVS_WINDOWS // MSVC uses __cpuidex __cpuidex(info, leaf, subleaf); #elif defined(GCC) || defined(CLANG) // GCC/Clang uses __cpuid_count __cpuid_count(leaf, subleaf, info[0], info[1], info[2], info[3]); #else // Fallback or error if no intrinsic is available info[0] = info[1] = info[2] = info[3] = 0; #endif } // Helper function to determine the AVX10 version (e.g., 10.2) // Returns the minor version (0 for none, 1 for 10.1, 2 for 10.2, etc.) static int get_avx10_minor_version() { int info[4]; int max_sub_leaf_7; // 1. Check max CPUID Leaf 7 sub-leaf to ensure Sub-leaf 1 is available. // Call Leaf 7, Sub-leaf 0. Max Sub-leaf is returned in EAX. __cpuid_count_wrapper(info, 7, 0); max_sub_leaf_7 = info[0]; // EAX holds the Max Sub-leaf // If max sub-leaf is less than 1, we cannot query the AVX10 version. if (max_sub_leaf_7 < 1) { return 0; // AVX10 version not supported or enumerable } // 2. Query CPUID Leaf 7, Sub-leaf 1 for the AVX10 Version (Major/Minor) __cpuid_count_wrapper(info, 7, 1); // EAX[31:24] = Major Version int major_version = (info[0] >> 24) & 0xFF; // EAX[23:16] = Minor Version int minor_version = (info[0] >> 16) & 0xFF; // AVX10 has a major version of 10. // This check confirms the version returned is for AVX10. if (major_version == 10) { return minor_version; } return 0; // Not an AVX10 major version } #endif // defined(X86_32) || defined(X86_64) // ------------------------------------------------------------------ // Core aarch64 (ARMv8/v9) Feature Detection Function // ------------------------------------------------------------------ #if defined(ARM64) static int64_t ARMCheckForExtensions() { int64_t result = 0; // Tier 1: CPUF_ARM_NEON (Mandatory for AArch64) // We can assume NEON for any successful ARM64 build. result |= CPUF_ARM_NEON; #if defined(AVS_LINUX) || defined(AVS_BSD) // Linux/BSD HWCAP detection (uses AT_HWCAP/AT_HWCAP2) // aarch64 implies -march=armv8-a // HWCAP_NEON (Basic NEON) is covered by the assumption above. unsigned long hwcap = getauxval(AT_HWCAP); unsigned long hwcap2 = getauxval(AT_HWCAP2); // When DOTPROD exists, we have at least Armv8.1-a // optional in v8.1-a, mandatory in v8.4-a // Safe gcc/clang flags: -march=armv8.1-a+dotprod if ((hwcap & HWCAP_ASIMDDP)) { result |= CPUF_ARM_DOTPROD; } // SVE2 (Scalable Vector Extension version 2) optional in v8.5-a, mandatory in v9.0-a // Safe flags: -march=armv8.5-a+sve2 if (hwcap2 & HWCAP2_SVE2) { result |= CPUF_ARM_SVE2; } // CPUF_ARM_SVE2_1 (incremental SVE2 part 1) // optional in v9.1-a, mandatory in v9.2-a #ifdef HWCAP2_SVE2P1 #ifdef CPUF_ARM_SVE2_1 if (hwcap2 & HWCAP2_SVE2P1) { result |= CPUF_ARM_SVE2_1; } #endif #endif // CPUF_ARM_I8MM (AdvSIMD Int8 matrix multiply, Armv8.2-I8MM) // optional in v8.2-a, mandatory in v8.6-a // Safe flags: -march=armv8.2-a+i8mm if (hwcap2 & HWCAP2_I8MM) { result |= CPUF_ARM_I8MM; } #elif defined(AVS_MACOS) // macOS (Apple Silicon) detection via sysctlbyname. // https://developer.apple.com/documentation/kernel/1387446-sysctlbyname/determining_instruction_set_characteristics int value = 0; size_t len = sizeof(value); // Check for the DOTPROD feature, which is guaranteed on modern Apple Silicon. // All Apple Silicon devices (M1, M2, M3, etc.) are based on ARMv8.6-a or later. // The sysctl function returns 0 on success and populates 'value'. if (sysctlbyname("hw.optional.arm.FEAT_DotProd", &value, &len, NULL, 0) == 0 && value) { result |= CPUF_ARM_DOTPROD; } if (sysctlbyname("hw.optional.arm.FEAT_I8MM", &value, &len, NULL, 0) == 0 && value) { result |= CPUF_ARM_I8MM; } // SVE2 is mandatory for general ARMv9.0-a compliance, Apple has chosen not to // implement SVE or SVE2 in its M-series CPUs to date (2025). // No check required here as the hardware does not support it. #elif defined(AVS_WINDOWS) // Windows ARM64 detection using IsProcessorFeaturePresent // Windows ARM SVE/SVE2 features via WinAPI flags are available since SDK 26100 (Windows 11 24H2). // CPUF_ARM_DOTPROD (Dot Product) #if defined(PF_ARM_V82_DP_INSTRUCTIONS_AVAILABLE) if (IsProcessorFeaturePresent(PF_ARM_V82_DP_INSTRUCTIONS_AVAILABLE)) { result |= CPUF_ARM_DOTPROD; } #endif #if defined(PF_ARM_V8_DOTPROD_INSTRUCTIONS_AVAILABLE) if (IsProcessorFeaturePresent(PF_ARM_V8_DOTPROD_INSTRUCTIONS_AVAILABLE)) { result |= CPUF_ARM_DOTPROD; } #endif #if defined(PF_ARM_SVE2_INSTRUCTIONS_AVAILABLE) if (IsProcessorFeaturePresent(PF_ARM_SVE2_INSTRUCTIONS_AVAILABLE)) { result |= CPUF_ARM_SVE2; } #endif #if defined(PF_ARM_V82_I8MM_INSTRUCTIONS_AVAILABLE) if (IsProcessorFeaturePresent(PF_ARM_V82_I8MM_INSTRUCTIONS_AVAILABLE)) { result |= CPUF_ARM_I8MM; } #endif #if defined(PF_ARM_SVE2_1_INSTRUCTIONS_AVAILABLE) if (IsProcessorFeaturePresent(PF_ARM_SVE2_1_INSTRUCTIONS_AVAILABLE)) { result |= CPUF_ARM_SVE2_1; } #endif #endif // Platform-specific ARM64 feature detection return result; } #endif // defined(ARM64) // ------------------------------------------------------------------ // Core x86/x64 Feature Detection Function // (Refactored for cleaner architecture switch) // ------------------------------------------------------------------ #if defined(X86_32) || defined(X86_64) static int64_t X86CheckForExtensions() { int64_t result = 0; int cpuinfo[4]; #if defined(X86_32) || defined(X86_64) // Check CPUID Leaf 1 __cpuid(cpuinfo, 1); if (IS_BIT_SET(cpuinfo[3], 0)) result |= CPUF_FPU; if (IS_BIT_SET(cpuinfo[3], 23)) result |= CPUF_MMX; if (IS_BIT_SET(cpuinfo[3], 25)) result |= CPUF_SSE | CPUF_INTEGER_SSE; if (IS_BIT_SET(cpuinfo[3], 26)) result |= CPUF_SSE2; if (IS_BIT_SET(cpuinfo[2], 0)) result |= CPUF_SSE3; if (IS_BIT_SET(cpuinfo[2], 9)) result |= CPUF_SSSE3; if (IS_BIT_SET(cpuinfo[2], 19)) result |= CPUF_SSE4_1; if (IS_BIT_SET(cpuinfo[2], 20)) result |= CPUF_SSE4_2; if (IS_BIT_SET(cpuinfo[2], 22)) result |= CPUF_MOVBE; if (IS_BIT_SET(cpuinfo[2], 23)) result |= CPUF_POPCNT; if (IS_BIT_SET(cpuinfo[2], 25)) result |= CPUF_AES; if (IS_BIT_SET(cpuinfo[2], 29)) result |= CPUF_F16C; // AVX and XCR0 Check (Needed for AVX2 and AVX-512) bool xgetbv_supported = IS_BIT_SET(cpuinfo[2], 27); bool avx_supported = IS_BIT_SET(cpuinfo[2], 28); if (xgetbv_supported && avx_supported) { uint32_t xgetbv0_32 = get_xcr0(); // Check OS support for AVX (XMM and YMM state) if ((xgetbv0_32 & 0x6u) == 0x6u) { result |= CPUF_AVX; if (IS_BIT_SET(cpuinfo[2], 12)) result |= CPUF_FMA3; __cpuid_count_wrapper(cpuinfo, 7, 0); if (IS_BIT_SET(cpuinfo[1], 5)) result |= CPUF_AVX2; } // Check OS support for AVX-512 (OPMASK, ZMM0-ZMM15, ZMM16-ZMM31 states) if ((xgetbv0_32 & (0x7u << 5)) && (xgetbv0_32 & (0x3u << 1))) { // Leaf 7, Sub-leaf 0 results are already in cpuinfo (from AVX2 check) // --- EBX: Core Base Features & Specialized Features --- if (IS_BIT_SET(cpuinfo[1], 16)) result |= CPUF_AVX512F; if (IS_BIT_SET(cpuinfo[1], 17)) result |= CPUF_AVX512DQ; if (IS_BIT_SET(cpuinfo[1], 21)) result |= CPUF_AVX512IFMA; if (IS_BIT_SET(cpuinfo[1], 26)) result |= CPUF_AVX512PF; if (IS_BIT_SET(cpuinfo[1], 27)) result |= CPUF_AVX512ER; if (IS_BIT_SET(cpuinfo[1], 28)) result |= CPUF_AVX512CD; if (IS_BIT_SET(cpuinfo[1], 30)) result |= CPUF_AVX512BW; if (IS_BIT_SET(cpuinfo[1], 31)) result |= CPUF_AVX512VL; // --- ECX: ICL/RKL Features (VBMI, VNNI, Cryptography) --- if (IS_BIT_SET(cpuinfo[2], 1)) result |= CPUF_AVX512VBMI; if (IS_BIT_SET(cpuinfo[2], 6)) result |= CPUF_AVX512VBMI2; /* Deprecated: * AVX-512 Vector Pair to Two Intersect (VP2INTERSECT) instruction set * has been found to be slower than alternative implementations using * existing instructions. Newer CPUs may not implement this feature. if (IS_BIT_SET(cpuinfo[2], 2)) result |= CPUF_AVX512VP2INTERSECT; */ const bool has_avx512_crypto = IS_BIT_SET(cpuinfo[2], 7) || IS_BIT_SET(cpuinfo[2], 8) || IS_BIT_SET(cpuinfo[2], 9); /* Avisynth don't use crypto features. if (IS_BIT_SET(cpuinfo[2], 8)) result |= CPUF_AVX512GFNI; if (IS_BIT_SET(cpuinfo[2], 9)) result |= CPUF_AVX512VAES; if (IS_BIT_SET(cpuinfo[2], 10)) result |= CPUF_AVX512VPCLMULQDQ; */ if (IS_BIT_SET(cpuinfo[2], 11)) result |= CPUF_AVX512VNNI; if (IS_BIT_SET(cpuinfo[2], 12)) result |= CPUF_AVX512BITALG; if (IS_BIT_SET(cpuinfo[2], 14)) result |= CPUF_AVX512VPOPCNTDQ; // --- AVX-512 (Leaf 7, Sub-leaf 1) --- __cpuid_count_wrapper(cpuinfo, 7, 1); // EAX: /* Deprecated: * AVX-512 4-way VNNI with Word Granularity (4VNNIW) and * AVX-512 4-way Fused Multiply-Add Single precision (4FMAPS) * have been deprecated and replaced by more versatile instructions * in AVX10. Newer CPUs may not implement these features. if (IS_BIT_SET(cpuinfo[0], 4)) result |= CPUF_AVX5124VNNIW; if (IS_BIT_SET(cpuinfo[0], 5)) result |= CPUF_AVX5124FMAPS; */ // EDX: if (IS_BIT_SET(cpuinfo[3], 16)) result |= CPUF_AVX512FP16; if (IS_BIT_SET(cpuinfo[3], 17)) result |= CPUF_AVX512BF16; int avx10_minor = get_avx10_minor_version(); // 0 if no AVX10 // --- Composite Feature Flags and AVX10 --- constexpr int64_t avx512_base_mask = CPUF_AVX512F | CPUF_AVX512CD | CPUF_AVX512BW | CPUF_AVX512DQ | CPUF_AVX512VL; constexpr int64_t avx512_fast_core_mask = CPUF_AVX512VBMI | CPUF_AVX512VNNI | CPUF_AVX512VBMI2 | CPUF_AVX512BITALG | CPUF_AVX512VPOPCNTDQ; // 1. Check for Base AVX-512 if ((result & avx512_base_mask) == avx512_base_mask) { // Check for AVX512_FAST (Pre-AVX10 minimum Ice Lake) // Base + Core ICL + Crypto (to distinguish from older server CPUs) const bool has_avx512_fast = ((result & avx512_fast_core_mask) == avx512_fast_core_mask) && has_avx512_crypto; const bool has_avx10 = (avx10_minor >= 1); // The "Base" group feature flag is set only if FAST is present! // Since only-Base means a very old throttling CPU, we disable AVX512 group flag by default. // User can later re-enable it via SetMaxCPU("AVX512base+") if (has_avx512_fast || has_avx10) { result |= CPUF_AVX512_BASE; // fulfilling base mask is not enough result |= CPUF_AVX512_FAST; } // Check for AVX10, no AVS flags atm. if (has_avx10) { //result |= CPUF_AVX10; // not yet, RFU } } // GCC/clang compiler flags for matching CPUF_AVX512_BASE // " -mfma -mbmi2 -mavx512f -mavx512cd -mavx512bw -mavx512dq -mavx512vl " // for matching CPUF_AVX512_FAST: //" -mfma -mbmi2 -mavx512f -mavx512cd -mavx512bw -mavx512dq -mavx512vl -mavx512vnni -mavx512vbmi -mavx512vbmi2 -mavx512bitalg -mavx512vpopcntdq " } } #else result |= CPUF_FORCE; return result; #endif #if defined(X86_32) || defined(X86_64) // Check CPUID Extended Leaf 0x80000001 (for 3DNow! and FMA4) __cpuid(cpuinfo, 0x80000000); if (cpuinfo[0] >= 0x80000001) { __cpuid(cpuinfo, 0x80000001); if (IS_BIT_SET(cpuinfo[3], 31)) result |= CPUF_3DNOW; if (IS_BIT_SET(cpuinfo[3], 30)) result |= CPUF_3DNOW_EXT; if (IS_BIT_SET(cpuinfo[3], 22)) result |= CPUF_INTEGER_SSE; if (result & CPUF_AVX) { if (IS_BIT_SET(cpuinfo[2], 16)) result |= CPUF_FMA4; } } #endif return result; } #endif // defined(X86_32) || defined(X86_64) // ------------------------------------------------------------------ // Master Feature Detection Function (Dispatcher) // ------------------------------------------------------------------ static int64_t CPUCheckForExtensions() { int64_t result = 0; #if defined(X86_32) || defined(X86_64) result |= X86CheckForExtensions(); #elif defined(ARM64) result |= ARMCheckForExtensions(); #else // Fallback for architectures without specific detection implemented #endif return result; } #if defined(ARM64) && (defined(AVS_LINUX) || defined(AVS_BSD)) static size_t parse_sysfs_size_string(const char* size_str) { if (size_str == nullptr) { return 0; } char* endptr; long value = strtol(size_str, &endptr, 10); if (value <= 0) { return 0; } if (*endptr == 'K' || *endptr == 'k') { return (size_t)value * 1024; } else if (*endptr == 'M' || *endptr == 'm') { return (size_t)value * 1024 * 1024; } else if (*endptr == 'G' || *endptr == 'g') { return (size_t)value * 1024 * 1024 * 1024; } return (size_t)value; } #endif // defined(ARM64) && (defined(AVS_LINUX) || defined(AVS_BSD)) // ------------------------------------------------------------------ // Core L2 Cache Detection Function // ------------------------------------------------------------------ static size_t DetectL2CacheSize() { #if defined(X86_32) || defined(X86_64) int info[4]; // ------------------------------------------------------- // 1. PRIMARY METHOD: Deterministic Cache Parameters (Leaf 4) // (Modern, cross-vendor, and supports topology) // ------------------------------------------------------- for (int i = 0; ; ++i) { // We use the helper that supports sub-leaves (i) __cpuid_count_wrapper(info, 0x4, i); // EAX[4:0] = Cache Type: 1=Data, 2=Instruction, 3=Unified int cache_type = info[0] & 0x1F; // EAX[7:5] = Cache Level: 1=L1, 2=L2, 3=L3, ... int cache_level = (info[0] >> 5) & 0b111; // Check for end of list (type 0) if (cache_type == 0) { break; } // We look for Cache Level 2, regardless of whether it's reported as Unified (3) or Instruction (2). if (cache_level == 2) { // Cache Size (Bytes) = (Ways + 1) * (Partitions + 1) * (Line Size + 1) * (Sets + 1) size_t line_size = (info[1] & 0xFFF) + 1; // EBX[11:0] size_t partitions = ((info[1] >> 12) & 0x3FF) + 1; // EBX[21:12] size_t ways = ((info[1] >> 22) & 0x3FF) + 1; // EBX[31:22] size_t sets = (size_t)info[2] + 1; // ECX[31:0] return ways * partitions * line_size * sets; } } // ------------------------------------------------------- // 2. FALLBACK METHOD: AMD Extended Cache (Leaf 80000006) // (Legacy method, but reliable for older AMD CPUs) // ------------------------------------------------------- __cpuid(info, 0x80000000); // Check if the CPU supports extended leaf 80000006 if (info[0] >= 0x80000006) { __cpuid(info, 0x80000006); // ECX[31:16] is L2 cache size in KB. Convert to bytes. return (size_t)(info[2] >> 16) * 1024; } // 3. If neither method worked, return 0. return 0; #elif defined(ARM64) // Cache detection on ARM is highly vendor/OS-specific. // --- Linux/BSD Implementation (e.g., Raspberry Pi 5) --- #if defined(AVS_LINUX) || defined(AVS_BSD) // Detection via /sys filesystem (standard on Linux/BSD for cache info). // The path targets the L2 cache size for cpu0 (per core L2 on RPi5/Cortex-A76). // e.g. cat /sys/devices/system/cpu/cpu0/cache/index2/size returns 512K on RPi5 static constexpr const char* ARM_L2_CACHE_SYSFS_PATH = "/sys/devices/system/cpu/cpu0/cache/index2/size"; FILE* file = fopen(ARM_L2_CACHE_SYSFS_PATH, "r"); if (file) { char size_str[32] = { 0 }; if (fgets(size_str, sizeof(size_str) - 1, file) != NULL) { // Remove trailing newline character size_t str_len = strlen(size_str); if (str_len > 0 && size_str[str_len - 1] == '\n') { size_str[str_len - 1] = '\0'; } // Parse the string (e.g., "512K") and return in bytes. size_t l2_cache_bytes = parse_sysfs_size_string(size_str); fclose(file); return l2_cache_bytes; } fclose(file); } #elif defined(AVS_MACOS) // macOS/Apple Silicon detection via sysctlbyname. // https://developer.apple.com/documentation/kernel/1387446-sysctlbyname/determining_system_capabilities // The generic 'hw.l2cachesize' is for the least performant core (E-cores). // For performance optimization, we target the L2 cache of the high-performance (P) cores. // These are typically designated as perflevel0. // Note: sysctl returns the cache size in bytes. int l2_cache_bytes = 0; size_t len = sizeof(l2_cache_bytes); // Check for the L2 cache size of the high-performance cores (P-cores), // which is the largest and most relevant for optimization. if (sysctlbyname("hw.perflevel0.l2cachesize", &l2_cache_bytes, &len, NULL, 0) == 0 && l2_cache_bytes > 0) { // Return size in bytes. return static_cast(l2_cache_bytes); } // Fallback to the generic L2 key (typically the E-core cache size). if (sysctlbyname("hw.l2cachesize", &l2_cache_bytes, &len, NULL, 0) == 0 && l2_cache_bytes > 0) { // Return size in bytes. return static_cast(l2_cache_bytes); } #endif // Returning 0 is a safe default for a portable cross-platform implementation. return 0; #else return 0; #endif } class _CPUFlags { private: size_t L2CacheSize; // in bytes int64_t lCPUExtensionsAvailable; _CPUFlags() { lCPUExtensionsAvailable = CPUCheckForExtensions(); L2CacheSize = DetectL2CacheSize(); } public: static _CPUFlags& getInstance() { static _CPUFlags theInstance; return theInstance; } int GetCPUFlags() { return lCPUExtensionsAvailable & 0xFFFFFFFF; } int64_t GetCPUFlagsEx() { return lCPUExtensionsAvailable; } void SetCPUFlags(int64_t new_flags) { lCPUExtensionsAvailable = new_flags; } size_t GetL2CacheSize() { return L2CacheSize; } }; int GetCPUFlags() { return _CPUFlags::getInstance().GetCPUFlags(); } int64_t GetCPUFlagsEx() { return _CPUFlags::getInstance().GetCPUFlagsEx(); } size_t GetL2CacheSize() { return _CPUFlags::getInstance().GetL2CacheSize(); } ================================================ FILE: avs_core/core/exception.cpp ================================================ // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. /* First cut for breaking out system exceptions from the evil and most * unhelpful "Unrecognized exception!". * * This initial version just decodes the exception code, latter if one * is so inclined the info structure could be pulled apart and the * state of the machine presented. So far just knowing "Integer Divide * by Zero" was happening has been a real boon. */ #include "exception.h" #ifdef AVS_WINDOWS #include #else #include #endif #include #ifdef AVS_WINDOWS static const char * StringSystemError(const unsigned code) { switch (code) { case STATUS_GUARD_PAGE_VIOLATION: // 0x80000001 return "System exception - Guard Page Violation"; case STATUS_DATATYPE_MISALIGNMENT: // 0x80000002 return "System exception - Datatype Misalignment"; case STATUS_BREAKPOINT: // 0x80000003 return "System exception - Breakpoint"; case STATUS_SINGLE_STEP: // 0x80000004 return "System exception - Single Step"; //------------------------------------------------------------------------------ case STATUS_ACCESS_VIOLATION: // 0xc0000005 return "System exception - Access Violation"; case STATUS_IN_PAGE_ERROR: // 0xc0000006 return " System exception - In Page Error"; case STATUS_INVALID_HANDLE: // 0xc0000008 return "System exception - Invalid Handle"; case STATUS_NO_MEMORY: // 0xc0000017 return "System exception - No Memory"; case STATUS_ILLEGAL_INSTRUCTION: // 0xc000001d return "System exception - Illegal Instruction"; case STATUS_NONCONTINUABLE_EXCEPTION: // 0xc0000025 return "System exception - Noncontinuable Exception"; case STATUS_INVALID_DISPOSITION: // 0xc0000026 return "System exception - Invalid Disposition"; case STATUS_ARRAY_BOUNDS_EXCEEDED: // 0xc000008c return "System exception - Array Bounds Exceeded"; case STATUS_FLOAT_DENORMAL_OPERAND: // 0xc000008d return "System exception - Float Denormal Operand"; case STATUS_FLOAT_DIVIDE_BY_ZERO: // 0xc000008e return "System exception - Float Divide by Zero"; case STATUS_FLOAT_INEXACT_RESULT: // 0xc000008f return "System exception - Float Inexact Result"; case STATUS_FLOAT_INVALID_OPERATION: // 0xc0000090 return "System exception - Float Invalid Operation"; case STATUS_FLOAT_OVERFLOW: // 0xc0000091 return "System exception - Float Overflow"; case STATUS_FLOAT_STACK_CHECK: // 0xc0000092 return "System exception - Float Stack Check"; case STATUS_FLOAT_UNDERFLOW: // 0xc0000093 return "System exception - Float Underflow"; case STATUS_INTEGER_DIVIDE_BY_ZERO: // 0xc0000094 return "System exception - Integer Divide by Zero"; case STATUS_INTEGER_OVERFLOW: // 0xc0000095 return "System exception - Integer Overflow"; case STATUS_PRIVILEGED_INSTRUCTION: // 0xc0000096 return "System exception - Privileged Instruction"; case STATUS_STACK_OVERFLOW: // 0xc00000fd return "System exception - Stack Overflow"; //------------------------------------------------------------------------------ case 0xC0000135: // 0xc0000135 return "DLL Not Found"; case 0xC0000142: // 0xc0000142 return "DLL Initialization Failed"; case 0xC06d007E: // 0xc06d007e return "Delay-load Module Not Found"; case 0xC06d007F: // 0xc06d007e return "Delay-load Proceedure Not Found"; //------------------------------------------------------------------------------ default: assert(0); return "Unrecognized system exception!"; } // Should never-ever get here assert(0); } // Seh is Windows-only, right? void SehTranslatorFunction(unsigned int code, struct _EXCEPTION_POINTERS *record) { throw SehException(code, record->ExceptionRecord->ExceptionAddress, StringSystemError(code)); } #endif ================================================ FILE: avs_core/core/exception.h ================================================ // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef AVSCORE_EXCEPTION_H #define AVSCORE_EXCEPTION_H #include #if defined(MSVC) // IMPORTANT: Project must be compiled with /EHa #include extern void SehTranslatorFunction(unsigned int, struct _EXCEPTION_POINTERS*); class SehGuard { public: SehGuard() { m_prev = _set_se_translator(SehTranslatorFunction); } ~SehGuard() { _set_se_translator(m_prev); } private: _se_translator_function m_prev; }; #else // TODO: port to unix signals class SehGuard { public: SehGuard() { } ~SehGuard() { } }; #endif class SehException { public: SehException(unsigned int code, const void* addr, const char* msg) : m_msg(msg), m_addr(addr), m_code(code) { } const char* m_msg; const void* m_addr; unsigned int m_code; }; #endif // AVSCORE_EXCEPTION_H ================================================ FILE: avs_core/core/findfirst.h ================================================ /* * Copyright (C) 2011 Mathieu Turcotte (mathieuturcotte.ca) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. */ #ifndef FINDFIRST_H_ #define FINDFIRST_H_ #include #include #include /* http://en.wikipedia.org/wiki/Attrib */ #define _A_NORMAL 0x00 /* Normal file. */ #define _A_RDONLY 0x01 /* Read only file. */ #define _A_HIDDEN 0x02 /* Hidden file. */ #define _A_SYSTEM 0x04 /* System file. */ #define _A_SUBDIR 0x10 /* Subdirectory. */ #define _A_ARCH 0x20 /* Archive file. */ struct _finddata_t { unsigned attrib; time_t time_create; time_t time_access; time_t time_write; off_t size; char name[260]; }; /* * Returns a unique search handle identifying the file or group of * files matching the filespec specification, which can be used in * a subsequent call to findnext or to findclose. Otherwise, findfirst * returns NULL and sets errno to EINVAL if filespec or fileinfo * was NULL or if the operating system returned an unexpected error * and ENOENT if the file specification could not be matched. */ intptr_t _findfirst(const char* filespec, struct _finddata_t* fileinfo); /* * Find the next entry, if any, that matches the filespec argument * of a previous call to findfirst, and then alter the fileinfo * structure contents accordingly. If successful, returns 0. Otherwise, * returns -1 and sets errno to EINVAL if handle or fileinfo was NULL * or if the operating system returned an unexpected error and ENOENT * if no more matching files could be found. */ int _findnext(intptr_t handle, struct _finddata_t* fileinfo); /* * Closes the specified search handle and releases associated * resources. If successful, findclose returns 0. Otherwise, it * returns -1 and sets errno to ENOENT, indicating that no more * matching files could be found. */ int _findclose(intptr_t handle); #endif /* FINDFIRST_H_ */ ================================================ FILE: avs_core/core/fonts/fixedfonts.cpp ================================================ /* Font set #1 ----------- Copyright (c) 2019 Dimitar Toshkov Zhekov, with Reserved Font Name "Terminus Font". This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL Based on http://terminus-font.sourceforge.net/ v4.48 Sizes: 6x12, 8x14, 8x16, 10x18, 10x20, 11x22, 12x24, 14x28 and 16x32. Weights: normal and bold (except for 6x12, where bold=normal) Terminus Font 4.48, Copyright(C) 2019 Dimitar Toshkov Zhekov. Report bugs to Font set #2 ----------- 10x20 info_h font from old avisynth info.h + 4 extra characters by pinterf Avisynth+ source code integration by pinterf */ #include "fixedfonts.h" #include #include #include #include #include // The font definitions in this file were autogenerated // by special functions for reading BDF file and exporting it as cpp source namespace fixed_font_12n { // -- start of autogenerated text --- // definition section for font: ter-u12n.bdf constexpr int CHARCOUNT = 1354; constexpr int WIDTH = 6; constexpr int HEIGHT = 12; constexpr int OFFSET_X = 0; constexpr int OFFSET_Y = 0; constexpr FixedFont_info_t fixedfont_info = { "Terminus", // font name "ter-u12n.bdf", // font name internal CHARCOUNT, // num of chars WIDTH, HEIGHT, OFFSET_X, OFFSET_Y, false // bold }; // font bitmap definitions constexpr std::array fixedfont_bitmap = { 0x0000,0x0000,0xd800,0x8800,0x0000,0x8800,0x8800,0x0000,0x8800,0xd800,0x0000,0x0000, // u0000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0020 0x0000,0x0000,0x2000,0x2000,0x2000,0x2000,0x2000,0x0000,0x2000,0x2000,0x0000,0x0000, // u0021 0x0000,0x5000,0x5000,0x5000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0022 0x0000,0x0000,0x5000,0x5000,0xf800,0x5000,0x5000,0xf800,0x5000,0x5000,0x0000,0x0000, // u0023 0x0000,0x0000,0x2000,0x7000,0xa800,0xa000,0x7000,0x2800,0xa800,0x7000,0x2000,0x0000, // u0024 0x0000,0x0000,0x4800,0xa800,0x5000,0x1000,0x2000,0x2800,0x5400,0x4800,0x0000,0x0000, // u0025 0x0000,0x0000,0x2000,0x5000,0x5000,0x2000,0x6800,0x9000,0x9000,0x6800,0x0000,0x0000, // u0026 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0027 0x0000,0x0000,0x1000,0x2000,0x4000,0x4000,0x4000,0x4000,0x2000,0x1000,0x0000,0x0000, // u0028 0x0000,0x0000,0x4000,0x2000,0x1000,0x1000,0x1000,0x1000,0x2000,0x4000,0x0000,0x0000, // u0029 0x0000,0x0000,0x0000,0x0000,0x5000,0x2000,0xf800,0x2000,0x5000,0x0000,0x0000,0x0000, // u002a 0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0xf800,0x2000,0x2000,0x0000,0x0000,0x0000, // u002b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x4000,0x0000, // u002c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000, // u002d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000, // u002e 0x0000,0x0000,0x0800,0x0800,0x1000,0x1000,0x2000,0x2000,0x4000,0x4000,0x0000,0x0000, // u002f 0x0000,0x0000,0x7000,0x8800,0x9800,0xa800,0xc800,0x8800,0x8800,0x7000,0x0000,0x0000, // u0030 0x0000,0x0000,0x2000,0x6000,0x2000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u0031 0x0000,0x0000,0x7000,0x8800,0x8800,0x0800,0x1000,0x2000,0x4000,0xf800,0x0000,0x0000, // u0032 0x0000,0x0000,0x7000,0x8800,0x0800,0x3000,0x0800,0x0800,0x8800,0x7000,0x0000,0x0000, // u0033 0x0000,0x0000,0x0800,0x1800,0x2800,0x4800,0x8800,0xf800,0x0800,0x0800,0x0000,0x0000, // u0034 0x0000,0x0000,0xf800,0x8000,0x8000,0xf000,0x0800,0x0800,0x8800,0x7000,0x0000,0x0000, // u0035 0x0000,0x0000,0x7000,0x8000,0x8000,0xf000,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u0036 0x0000,0x0000,0xf800,0x0800,0x0800,0x1000,0x1000,0x2000,0x2000,0x2000,0x0000,0x0000, // u0037 0x0000,0x0000,0x7000,0x8800,0x8800,0x7000,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u0038 0x0000,0x0000,0x7000,0x8800,0x8800,0x8800,0x7800,0x0800,0x0800,0x7000,0x0000,0x0000, // u0039 0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000, // u003a 0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x4000,0x0000, // u003b 0x0000,0x0000,0x0000,0x0800,0x1000,0x2000,0x4000,0x2000,0x1000,0x0800,0x0000,0x0000, // u003c 0x0000,0x0000,0x0000,0x0000,0xf800,0x0000,0x0000,0xf800,0x0000,0x0000,0x0000,0x0000, // u003d 0x0000,0x0000,0x0000,0x4000,0x2000,0x1000,0x0800,0x1000,0x2000,0x4000,0x0000,0x0000, // u003e 0x0000,0x0000,0x7000,0x8800,0x8800,0x1000,0x2000,0x0000,0x2000,0x2000,0x0000,0x0000, // u003f 0x0000,0x0000,0x7000,0x8800,0x9800,0xa800,0xa800,0x9800,0x8000,0x7800,0x0000,0x0000, // u0040 0x0000,0x0000,0x7000,0x8800,0x8800,0x8800,0xf800,0x8800,0x8800,0x8800,0x0000,0x0000, // u0041 0x0000,0x0000,0xf000,0x8800,0x8800,0xf000,0x8800,0x8800,0x8800,0xf000,0x0000,0x0000, // u0042 0x0000,0x0000,0x7000,0x8800,0x8000,0x8000,0x8000,0x8000,0x8800,0x7000,0x0000,0x0000, // u0043 0x0000,0x0000,0xe000,0x9000,0x8800,0x8800,0x8800,0x8800,0x9000,0xe000,0x0000,0x0000, // u0044 0x0000,0x0000,0xf800,0x8000,0x8000,0xf000,0x8000,0x8000,0x8000,0xf800,0x0000,0x0000, // u0045 0x0000,0x0000,0xf800,0x8000,0x8000,0xf000,0x8000,0x8000,0x8000,0x8000,0x0000,0x0000, // u0046 0x0000,0x0000,0x7000,0x8800,0x8000,0x8000,0xb800,0x8800,0x8800,0x7000,0x0000,0x0000, // u0047 0x0000,0x0000,0x8800,0x8800,0x8800,0xf800,0x8800,0x8800,0x8800,0x8800,0x0000,0x0000, // u0048 0x0000,0x0000,0x7000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u0049 0x0000,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x9000,0x9000,0x6000,0x0000,0x0000, // u004a 0x0000,0x0000,0x8800,0x9000,0xa000,0xc000,0xc000,0xa000,0x9000,0x8800,0x0000,0x0000, // u004b 0x0000,0x0000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0xf800,0x0000,0x0000, // u004c 0x0000,0x0000,0x8800,0xd800,0xa800,0xa800,0x8800,0x8800,0x8800,0x8800,0x0000,0x0000, // u004d 0x0000,0x0000,0x8800,0x8800,0xc800,0xa800,0x9800,0x8800,0x8800,0x8800,0x0000,0x0000, // u004e 0x0000,0x0000,0x7000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u004f 0x0000,0x0000,0xf000,0x8800,0x8800,0x8800,0xf000,0x8000,0x8000,0x8000,0x0000,0x0000, // u0050 0x0000,0x0000,0x7000,0x8800,0x8800,0x8800,0x8800,0x8800,0xa800,0x7000,0x0800,0x0000, // u0051 0x0000,0x0000,0xf000,0x8800,0x8800,0x8800,0xf000,0xa000,0x9000,0x8800,0x0000,0x0000, // u0052 0x0000,0x0000,0x7000,0x8800,0x8000,0x7000,0x0800,0x0800,0x8800,0x7000,0x0000,0x0000, // u0053 0x0000,0x0000,0xf800,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000, // u0054 0x0000,0x0000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u0055 0x0000,0x0000,0x8800,0x8800,0x8800,0x5000,0x5000,0x5000,0x2000,0x2000,0x0000,0x0000, // u0056 0x0000,0x0000,0x8800,0x8800,0x8800,0x8800,0xa800,0xa800,0xd800,0x8800,0x0000,0x0000, // u0057 0x0000,0x0000,0x8800,0x8800,0x5000,0x2000,0x2000,0x5000,0x8800,0x8800,0x0000,0x0000, // u0058 0x0000,0x0000,0x8800,0x8800,0x5000,0x5000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000, // u0059 0x0000,0x0000,0xf800,0x0800,0x1000,0x2000,0x4000,0x8000,0x8000,0xf800,0x0000,0x0000, // u005a 0x0000,0x0000,0x7000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7000,0x0000,0x0000, // u005b 0x0000,0x0000,0x4000,0x4000,0x2000,0x2000,0x1000,0x1000,0x0800,0x0800,0x0000,0x0000, // u005c 0x0000,0x0000,0x7000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x7000,0x0000,0x0000, // u005d 0x0000,0x2000,0x5000,0x8800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0x0000, // u005f 0x4000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0060 0x0000,0x0000,0x0000,0x0000,0x7000,0x0800,0x7800,0x8800,0x8800,0x7800,0x0000,0x0000, // u0061 0x0000,0x0000,0x8000,0x8000,0xf000,0x8800,0x8800,0x8800,0x8800,0xf000,0x0000,0x0000, // u0062 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0x8000,0x8000,0x8800,0x7000,0x0000,0x0000, // u0063 0x0000,0x0000,0x0800,0x0800,0x7800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0000,0x0000, // u0064 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0xf800,0x8000,0x8000,0x7800,0x0000,0x0000, // u0065 0x0000,0x0000,0x1800,0x2000,0x7000,0x2000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000, // u0066 0x0000,0x0000,0x0000,0x0000,0x7800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0800,0x7000, // u0067 0x0000,0x0000,0x8000,0x8000,0xf000,0x8800,0x8800,0x8800,0x8800,0x8800,0x0000,0x0000, // u0068 0x0000,0x2000,0x2000,0x0000,0x6000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u0069 0x0000,0x0800,0x0800,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x4800,0x3000, // u006a 0x0000,0x0000,0x4000,0x4000,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x0000,0x0000, // u006b 0x0000,0x0000,0x6000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u006c 0x0000,0x0000,0x0000,0x0000,0xf000,0xa800,0xa800,0xa800,0xa800,0xa800,0x0000,0x0000, // u006d 0x0000,0x0000,0x0000,0x0000,0xf000,0x8800,0x8800,0x8800,0x8800,0x8800,0x0000,0x0000, // u006e 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u006f 0x0000,0x0000,0x0000,0x0000,0xf000,0x8800,0x8800,0x8800,0x8800,0xf000,0x8000,0x8000, // u0070 0x0000,0x0000,0x0000,0x0000,0x7800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0800,0x0800, // u0071 0x0000,0x0000,0x0000,0x0000,0xb800,0xc000,0x8000,0x8000,0x8000,0x8000,0x0000,0x0000, // u0072 0x0000,0x0000,0x0000,0x0000,0x7800,0x8000,0x7000,0x0800,0x0800,0xf000,0x0000,0x0000, // u0073 0x0000,0x0000,0x2000,0x2000,0x7000,0x2000,0x2000,0x2000,0x2000,0x1800,0x0000,0x0000, // u0074 0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0000,0x0000, // u0075 0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0x5000,0x5000,0x2000,0x2000,0x0000,0x0000, // u0076 0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0xa800,0xa800,0xa800,0x7000,0x0000,0x0000, // u0077 0x0000,0x0000,0x0000,0x0000,0x8800,0x5000,0x2000,0x2000,0x5000,0x8800,0x0000,0x0000, // u0078 0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0800,0x7000, // u0079 0x0000,0x0000,0x0000,0x0000,0xf800,0x1000,0x2000,0x4000,0x8000,0xf800,0x0000,0x0000, // u007a 0x0000,0x0000,0x1800,0x2000,0x2000,0x4000,0x2000,0x2000,0x2000,0x1800,0x0000,0x0000, // u007b 0x0000,0x0000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000, // u007c 0x0000,0x0000,0x6000,0x1000,0x1000,0x0800,0x1000,0x1000,0x1000,0x6000,0x0000,0x0000, // u007d 0x0000,0x4800,0xa800,0x9000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a0 0x0000,0x0000,0x2000,0x2000,0x0000,0x2000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000, // u00a1 0x0000,0x0000,0x0000,0x2000,0x7000,0xa800,0xa000,0xa000,0xa800,0x7000,0x2000,0x0000, // u00a2 0x0000,0x0000,0x3000,0x4800,0x4000,0xf000,0x4000,0x4000,0x4800,0xf800,0x0000,0x0000, // u00a3 0x0000,0x0000,0x0000,0x4800,0x3000,0x4800,0x4800,0x3000,0x4800,0x0000,0x0000,0x0000, // u00a4 0x0000,0x0000,0x8800,0x8800,0x5000,0x2000,0x7000,0x2000,0x7000,0x2000,0x0000,0x0000, // u00a5 0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u00a6 0x0000,0x3000,0x4800,0x2000,0x5000,0x4800,0x2800,0x1000,0x4800,0x3000,0x0000,0x0000, // u00a7 0x5000,0x5000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a8 0x0000,0x0000,0x7800,0x8400,0xb400,0xa400,0xa400,0xb400,0x8400,0x7800,0x0000,0x0000, // u00a9 0x3000,0x0800,0x3800,0x4800,0x3800,0x0000,0x7800,0x0000,0x0000,0x0000,0x0000,0x0000, // u00aa 0x0000,0x0000,0x0000,0x1400,0x2800,0x5000,0xa000,0x5000,0x2800,0x1400,0x0000,0x0000, // u00ab 0x0000,0x0000,0x0000,0x0000,0xf800,0x0800,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000, // u00ac 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7800,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ad 0x0000,0x0000,0x7800,0x8400,0xb400,0xac00,0xb400,0xac00,0x8400,0x7800,0x0000,0x0000, // u00ae 0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00af 0x0000,0x2000,0x5000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b0 0x0000,0x0000,0x0000,0x2000,0x2000,0xf800,0x2000,0x2000,0x0000,0xf800,0x0000,0x0000, // u00b1 0x0000,0x3000,0x4800,0x1000,0x2000,0x7800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b2 0x0000,0x7000,0x0800,0x3000,0x0800,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b3 0x1000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b4 0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0x8800,0x8800,0x9800,0xe800,0x8000,0x8000, // u00b5 0x0000,0x0000,0x7800,0xa800,0xa800,0xa800,0x6800,0x2800,0x2800,0x2800,0x0000,0x0000, // u00b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x4000, // u00b8 0x0000,0x1000,0x3000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b9 0x3000,0x4800,0x4800,0x4800,0x3000,0x0000,0x7800,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ba 0x0000,0x0000,0x0000,0xa000,0x5000,0x2800,0x1400,0x2800,0x5000,0xa000,0x0000,0x0000, // u00bb 0x4000,0xc000,0x4400,0x4800,0x5000,0x2000,0x4800,0x9800,0x2800,0x7800,0x0800,0x0800, // u00bc 0x4000,0xc000,0x4400,0x4800,0x5000,0x2000,0x4000,0x9800,0x2400,0x0800,0x1000,0x3c00, // u00bd 0xe000,0x1000,0x6000,0x1400,0xe800,0x1000,0x2400,0x4c00,0x9400,0x3c00,0x0400,0x0400, // u00be 0x0000,0x0000,0x2000,0x2000,0x0000,0x2000,0x4000,0x8800,0x8800,0x7000,0x0000,0x0000, // u00bf 0x4000,0x2000,0x7000,0x8800,0x8800,0x8800,0xf800,0x8800,0x8800,0x8800,0x0000,0x0000, // u00c0 0x1000,0x2000,0x7000,0x8800,0x8800,0x8800,0xf800,0x8800,0x8800,0x8800,0x0000,0x0000, // u00c1 0x2000,0x5000,0x7000,0x8800,0x8800,0x8800,0xf800,0x8800,0x8800,0x8800,0x0000,0x0000, // u00c2 0x2800,0x5000,0x7000,0x8800,0x8800,0x8800,0xf800,0x8800,0x8800,0x8800,0x0000,0x0000, // u00c3 0x5000,0x5000,0x7000,0x8800,0x8800,0x8800,0xf800,0x8800,0x8800,0x8800,0x0000,0x0000, // u00c4 0x2000,0x5000,0x7000,0x8800,0x8800,0x8800,0xf800,0x8800,0x8800,0x8800,0x0000,0x0000, // u00c5 0x0000,0x0000,0x7c00,0x9000,0x9000,0xfc00,0x9000,0x9000,0x9000,0x9c00,0x0000,0x0000, // u00c6 0x0000,0x0000,0x7000,0x8800,0x8000,0x8000,0x8000,0x8000,0x8800,0x7000,0x2000,0x4000, // u00c7 0x4000,0x2000,0xf800,0x8000,0x8000,0xf000,0x8000,0x8000,0x8000,0xf800,0x0000,0x0000, // u00c8 0x1000,0x2000,0xf800,0x8000,0x8000,0xf000,0x8000,0x8000,0x8000,0xf800,0x0000,0x0000, // u00c9 0x2000,0x5000,0xf800,0x8000,0x8000,0xf000,0x8000,0x8000,0x8000,0xf800,0x0000,0x0000, // u00ca 0x5000,0x5000,0xf800,0x8000,0x8000,0xf000,0x8000,0x8000,0x8000,0xf800,0x0000,0x0000, // u00cb 0x4000,0x2000,0x7000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u00cc 0x1000,0x2000,0x7000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u00cd 0x2000,0x5000,0x7000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u00ce 0x5000,0x5000,0x7000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u00cf 0x0000,0x0000,0xe000,0x9000,0x8800,0xe800,0x8800,0x8800,0x9000,0xe000,0x0000,0x0000, // u00d0 0x2800,0x5000,0x8800,0x8800,0xc800,0xa800,0x9800,0x8800,0x8800,0x8800,0x0000,0x0000, // u00d1 0x4000,0x2000,0x7000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u00d2 0x1000,0x2000,0x7000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u00d3 0x2000,0x5000,0x7000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u00d4 0x2800,0x5000,0x7000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u00d5 0x5000,0x5000,0x7000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u00d6 0x0000,0x0000,0x0000,0x0000,0x8800,0x5000,0x2000,0x5000,0x8800,0x0000,0x0000,0x0000, // u00d7 0x0000,0x0000,0x7400,0x8800,0x9800,0xa800,0xc800,0x8800,0x8800,0x7000,0x0000,0x0000, // u00d8 0x4000,0x2000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u00d9 0x1000,0x2000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u00da 0x2000,0x5000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u00db 0x5000,0x5000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u00dc 0x1000,0x2000,0x8800,0x8800,0x5000,0x5000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000, // u00dd 0x0000,0x0000,0x8000,0xf000,0x8800,0x8800,0x8800,0xf000,0x8000,0x8000,0x0000,0x0000, // u00de 0x0000,0x0000,0xe000,0x9000,0x9000,0xf000,0x8800,0x8800,0xc800,0xb000,0x0000,0x0000, // u00df 0x0000,0x0000,0x4000,0x2000,0x7000,0x0800,0x7800,0x8800,0x8800,0x7800,0x0000,0x0000, // u00e0 0x0000,0x0000,0x1000,0x2000,0x7000,0x0800,0x7800,0x8800,0x8800,0x7800,0x0000,0x0000, // u00e1 0x0000,0x0000,0x2000,0x5000,0x7000,0x0800,0x7800,0x8800,0x8800,0x7800,0x0000,0x0000, // u00e2 0x0000,0x0000,0x2800,0x5000,0x7000,0x0800,0x7800,0x8800,0x8800,0x7800,0x0000,0x0000, // u00e3 0x0000,0x0000,0x5000,0x5000,0x7000,0x0800,0x7800,0x8800,0x8800,0x7800,0x0000,0x0000, // u00e4 0x0000,0x0000,0x2000,0x5000,0x7000,0x0800,0x7800,0x8800,0x8800,0x7800,0x0000,0x0000, // u00e5 0x0000,0x0000,0x0000,0x0000,0x7000,0x2800,0x6800,0xb000,0xa000,0x7800,0x0000,0x0000, // u00e6 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0x8000,0x8000,0x8800,0x7000,0x2000,0x4000, // u00e7 0x0000,0x0000,0x4000,0x2000,0x7000,0x8800,0xf800,0x8000,0x8000,0x7800,0x0000,0x0000, // u00e8 0x0000,0x0000,0x1000,0x2000,0x7000,0x8800,0xf800,0x8000,0x8000,0x7800,0x0000,0x0000, // u00e9 0x0000,0x0000,0x2000,0x5000,0x7000,0x8800,0xf800,0x8000,0x8000,0x7800,0x0000,0x0000, // u00ea 0x0000,0x0000,0x5000,0x5000,0x7000,0x8800,0xf800,0x8000,0x8000,0x7800,0x0000,0x0000, // u00eb 0x0000,0x0000,0x4000,0x2000,0x6000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u00ec 0x0000,0x0000,0x1000,0x2000,0x6000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u00ed 0x0000,0x0000,0x2000,0x5000,0x6000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u00ee 0x0000,0x0000,0x5000,0x5000,0x6000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u00ef 0x0000,0xa000,0x4000,0xa000,0x7000,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u00f0 0x0000,0x0000,0x2800,0x5000,0xf000,0x8800,0x8800,0x8800,0x8800,0x8800,0x0000,0x0000, // u00f1 0x0000,0x0000,0x4000,0x2000,0x7000,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u00f2 0x0000,0x0000,0x1000,0x2000,0x7000,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u00f3 0x0000,0x0000,0x2000,0x5000,0x7000,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u00f4 0x0000,0x0000,0x2800,0x5000,0x7000,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u00f5 0x0000,0x0000,0x5000,0x5000,0x7000,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u00f6 0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0xf800,0x0000,0x2000,0x2000,0x0000,0x0000, // u00f7 0x0000,0x0000,0x0000,0x0000,0x7400,0x9800,0xa800,0xc800,0x8800,0x7000,0x0000,0x0000, // u00f8 0x0000,0x0000,0x4000,0x2000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0000,0x0000, // u00f9 0x0000,0x0000,0x1000,0x2000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0000,0x0000, // u00fa 0x0000,0x0000,0x2000,0x5000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0000,0x0000, // u00fb 0x0000,0x0000,0x5000,0x5000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0000,0x0000, // u00fc 0x0000,0x0000,0x1000,0x2000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0800,0x7000, // u00fd 0x0000,0x0000,0x8000,0x8000,0xf000,0x8800,0x8800,0x8800,0x8800,0xf000,0x8000,0x8000, // u00fe 0x0000,0x0000,0x5000,0x5000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0800,0x7000, // u00ff 0x7000,0x0000,0x7000,0x8800,0x8800,0x8800,0xf800,0x8800,0x8800,0x8800,0x0000,0x0000, // u0100 0x0000,0x0000,0x7000,0x0000,0x7000,0x0800,0x7800,0x8800,0x8800,0x7800,0x0000,0x0000, // u0101 0x5000,0x2000,0x7000,0x8800,0x8800,0x8800,0xf800,0x8800,0x8800,0x8800,0x0000,0x0000, // u0102 0x0000,0x0000,0x5000,0x2000,0x7000,0x0800,0x7800,0x8800,0x8800,0x7800,0x0000,0x0000, // u0103 0x0000,0x0000,0x7000,0x8800,0x8800,0x8800,0xf800,0x8800,0x8800,0x8800,0x1000,0x0c00, // u0104 0x0000,0x0000,0x0000,0x0000,0x7000,0x0800,0x7800,0x8800,0x8800,0x7800,0x1000,0x0c00, // u0105 0x1000,0x2000,0x7000,0x8800,0x8000,0x8000,0x8000,0x8000,0x8800,0x7000,0x0000,0x0000, // u0106 0x0000,0x0000,0x1000,0x2000,0x7000,0x8800,0x8000,0x8000,0x8800,0x7000,0x0000,0x0000, // u0107 0x2000,0x5000,0x7000,0x8800,0x8000,0x8000,0x8000,0x8000,0x8800,0x7000,0x0000,0x0000, // u0108 0x0000,0x0000,0x2000,0x5000,0x7000,0x8800,0x8000,0x8000,0x8800,0x7000,0x0000,0x0000, // u0109 0x2000,0x2000,0x7000,0x8800,0x8000,0x8000,0x8000,0x8000,0x8800,0x7000,0x0000,0x0000, // u010a 0x0000,0x0000,0x2000,0x2000,0x7000,0x8800,0x8000,0x8000,0x8800,0x7000,0x0000,0x0000, // u010b 0x5000,0x2000,0x7000,0x8800,0x8000,0x8000,0x8000,0x8000,0x8800,0x7000,0x0000,0x0000, // u010c 0x0000,0x0000,0x5000,0x2000,0x7000,0x8800,0x8000,0x8000,0x8800,0x7000,0x0000,0x0000, // u010d 0xa000,0x4000,0xe000,0x9000,0x8800,0x8800,0x8800,0x8800,0x9000,0xe000,0x0000,0x0000, // u010e 0x5000,0x2000,0x0800,0x0800,0x7800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0000,0x0000, // u010f 0x0000,0x0000,0xe000,0x9000,0x8800,0xe800,0x8800,0x8800,0x9000,0xe000,0x0000,0x0000, // u0110 0x0000,0x0000,0x0800,0x3c00,0x0800,0x7800,0x8800,0x8800,0x8800,0x7800,0x0000,0x0000, // u0111 0x7000,0x0000,0xf800,0x8000,0x8000,0xf000,0x8000,0x8000,0x8000,0xf800,0x0000,0x0000, // u0112 0x0000,0x0000,0x7000,0x0000,0x7000,0x8800,0xf800,0x8000,0x8000,0x7800,0x0000,0x0000, // u0113 0x5000,0x2000,0xf800,0x8000,0x8000,0xf000,0x8000,0x8000,0x8000,0xf800,0x0000,0x0000, // u0114 0x0000,0x0000,0x5000,0x2000,0x7000,0x8800,0xf800,0x8000,0x8000,0x7800,0x0000,0x0000, // u0115 0x2000,0x2000,0xf800,0x8000,0x8000,0xf000,0x8000,0x8000,0x8000,0xf800,0x0000,0x0000, // u0116 0x0000,0x0000,0x2000,0x2000,0x7000,0x8800,0xf800,0x8000,0x8000,0x7800,0x0000,0x0000, // u0117 0x0000,0x0000,0xf800,0x8000,0x8000,0xf000,0x8000,0x8000,0x8000,0xf800,0x1000,0x0c00, // u0118 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0xf800,0x8000,0x8000,0x7800,0x2000,0x1800, // u0119 0x5000,0x2000,0xf800,0x8000,0x8000,0xf000,0x8000,0x8000,0x8000,0xf800,0x0000,0x0000, // u011a 0x0000,0x0000,0x5000,0x2000,0x7000,0x8800,0xf800,0x8000,0x8000,0x7800,0x0000,0x0000, // u011b 0x2000,0x5000,0x7000,0x8800,0x8000,0x8000,0xb800,0x8800,0x8800,0x7000,0x0000,0x0000, // u011c 0x0000,0x0000,0x2000,0x5000,0x7800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0800,0x7000, // u011d 0x5000,0x2000,0x7000,0x8800,0x8000,0x8000,0xb800,0x8800,0x8800,0x7000,0x0000,0x0000, // u011e 0x0000,0x0000,0x5000,0x2000,0x7800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0800,0x7000, // u011f 0x2000,0x2000,0x7000,0x8800,0x8000,0x8000,0xb800,0x8800,0x8800,0x7000,0x0000,0x0000, // u0120 0x0000,0x0000,0x2000,0x2000,0x7800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0800,0x7000, // u0121 0x0000,0x0000,0x7000,0x8800,0x8000,0x8000,0xb800,0x8800,0x8800,0x7000,0x2000,0x4000, // u0122 0x0000,0x0000,0x1000,0x2000,0x7800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0800,0x7000, // u0123 0x2000,0x5000,0x8800,0x8800,0x8800,0xf800,0x8800,0x8800,0x8800,0x8800,0x0000,0x0000, // u0124 0x2000,0x5000,0x8000,0x8000,0xf000,0x8800,0x8800,0x8800,0x8800,0x8800,0x0000,0x0000, // u0125 0x0000,0x0000,0x4800,0xfc00,0x4800,0x7800,0x4800,0x4800,0x4800,0x4800,0x0000,0x0000, // u0126 0x0000,0x0000,0x4000,0xf000,0x4000,0x7000,0x4800,0x4800,0x4800,0x4800,0x0000,0x0000, // u0127 0x2800,0x5000,0x7000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u0128 0x0000,0x0000,0x2800,0x5000,0x6000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u0129 0x7000,0x0000,0x7000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u012a 0x0000,0x0000,0x7000,0x0000,0x6000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u012b 0x5000,0x2000,0x7000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u012c 0x0000,0x0000,0x5000,0x2000,0x6000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u012d 0x0000,0x0000,0x7000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x7000,0x2000,0x1800, // u012e 0x0000,0x2000,0x2000,0x0000,0x6000,0x2000,0x2000,0x2000,0x2000,0x7000,0x2000,0x1800, // u012f 0x2000,0x2000,0x7000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u0130 0x0000,0x0000,0x0000,0x0000,0x6000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u0131 0x0000,0x0000,0x8800,0x8800,0x8800,0x8800,0x8800,0xa800,0xa800,0x9000,0x0000,0x0000, // u0132 0x0000,0x8800,0x8800,0x0000,0x9800,0x8800,0x8800,0x8800,0x8800,0x8800,0x2800,0x1000, // u0133 0x1000,0x2800,0x3800,0x1000,0x1000,0x1000,0x1000,0x9000,0x9000,0x6000,0x0000,0x0000, // u0134 0x0000,0x0000,0x0800,0x1400,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x4800,0x3000, // u0135 0x0000,0x0000,0x8800,0x9000,0xa000,0xc000,0xc000,0xa000,0x9000,0xa800,0x2000,0x4000, // u0136 0x0000,0x0000,0x4000,0x4000,0x4800,0x5000,0x6000,0x6000,0x5000,0x6800,0x2000,0x4000, // u0137 0x0000,0x0000,0x0000,0x0000,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x0000,0x0000, // u0138 0x2000,0x4000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0xf800,0x0000,0x0000, // u0139 0x1000,0x2000,0x6000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u013a 0x0000,0x0000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0xf800,0x2000,0x4000, // u013b 0x0000,0x0000,0x6000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x7000,0x2000,0x4000, // u013c 0x5000,0x2000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0xf800,0x0000,0x0000, // u013d 0x5000,0x2000,0x6000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u013e 0x0000,0x0000,0x8000,0x8000,0x8000,0x9000,0x9000,0x8000,0x8000,0xf800,0x0000,0x0000, // u013f 0x0000,0x0000,0x6000,0x2000,0x2000,0x2400,0x2400,0x2000,0x2000,0x7000,0x0000,0x0000, // u0140 0x0000,0x0000,0x4000,0x4000,0x4000,0x6000,0xc000,0x4000,0x4000,0x7c00,0x0000,0x0000, // u0141 0x0000,0x0000,0x6000,0x2000,0x2000,0x3000,0x6000,0x2000,0x2000,0x7000,0x0000,0x0000, // u0142 0x1000,0x2000,0x8800,0x8800,0xc800,0xa800,0x9800,0x8800,0x8800,0x8800,0x0000,0x0000, // u0143 0x0000,0x0000,0x1000,0x2000,0xf000,0x8800,0x8800,0x8800,0x8800,0x8800,0x0000,0x0000, // u0144 0x0000,0x0000,0x8800,0x8800,0xc800,0xa800,0x9800,0x8800,0x8800,0xa800,0x2000,0x4000, // u0145 0x0000,0x0000,0x0000,0x0000,0xf000,0x8800,0x8800,0x8800,0x8800,0xa800,0x2000,0x4000, // u0146 0x5000,0x2000,0x8800,0x8800,0xc800,0xa800,0x9800,0x8800,0x8800,0x8800,0x0000,0x0000, // u0147 0x0000,0x0000,0x5000,0x2000,0xf000,0x8800,0x8800,0x8800,0x8800,0x8800,0x0000,0x0000, // u0148 0x0000,0x4000,0x4000,0x8000,0xf000,0x8800,0x8800,0x8800,0x8800,0x8800,0x0000,0x0000, // u0149 0x0000,0x0000,0x8800,0x8800,0xc800,0xa800,0x9800,0x8800,0x8800,0x8800,0x0800,0x1000, // u014a 0x0000,0x0000,0x0000,0x0000,0xf000,0x8800,0x8800,0x8800,0x8800,0x8800,0x0800,0x1000, // u014b 0x7000,0x0000,0x7000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u014c 0x0000,0x0000,0x7000,0x0000,0x7000,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u014d 0x5000,0x2000,0x7000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u014e 0x0000,0x0000,0x5000,0x2000,0x7000,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u014f 0x2800,0x5000,0x7000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u0150 0x0000,0x0000,0x2800,0x5000,0x7000,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u0151 0x0000,0x0000,0x7c00,0x9000,0x9000,0x9c00,0x9000,0x9000,0x9000,0x7c00,0x0000,0x0000, // u0152 0x0000,0x0000,0x0000,0x0000,0x7000,0xa800,0xa800,0xb000,0xa000,0x7800,0x0000,0x0000, // u0153 0x1000,0x2000,0xf000,0x8800,0x8800,0x8800,0xf000,0xa000,0x9000,0x8800,0x0000,0x0000, // u0154 0x0000,0x0000,0x1000,0x2000,0xb800,0xc000,0x8000,0x8000,0x8000,0x8000,0x0000,0x0000, // u0155 0x0000,0x0000,0xf000,0x8800,0x8800,0x8800,0xf000,0xa000,0x9000,0xa800,0x2000,0x4000, // u0156 0x0000,0x0000,0x0000,0x0000,0xb800,0xc000,0x8000,0x8000,0x8000,0xc000,0x4000,0x8000, // u0157 0x5000,0x2000,0xf000,0x8800,0x8800,0x8800,0xf000,0xa000,0x9000,0x8800,0x0000,0x0000, // u0158 0x0000,0x0000,0x5000,0x2000,0xb800,0xc000,0x8000,0x8000,0x8000,0x8000,0x0000,0x0000, // u0159 0x1000,0x2000,0x7000,0x8800,0x8000,0x7000,0x0800,0x0800,0x8800,0x7000,0x0000,0x0000, // u015a 0x0000,0x0000,0x1000,0x2000,0x7800,0x8000,0x7000,0x0800,0x0800,0xf000,0x0000,0x0000, // u015b 0x2000,0x5000,0x7000,0x8800,0x8000,0x7000,0x0800,0x0800,0x8800,0x7000,0x0000,0x0000, // u015c 0x0000,0x0000,0x2000,0x5000,0x7800,0x8000,0x7000,0x0800,0x0800,0xf000,0x0000,0x0000, // u015d 0x0000,0x0000,0x7000,0x8800,0x8000,0x7000,0x0800,0x0800,0x8800,0x7000,0x2000,0x4000, // u015e 0x0000,0x0000,0x0000,0x0000,0x7800,0x8000,0x7000,0x0800,0x0800,0xf000,0x2000,0x4000, // u015f 0x5000,0x2000,0x7000,0x8800,0x8000,0x7000,0x0800,0x0800,0x8800,0x7000,0x0000,0x0000, // u0160 0x0000,0x0000,0x5000,0x2000,0x7800,0x8000,0x7000,0x0800,0x0800,0xf000,0x0000,0x0000, // u0161 0x0000,0x0000,0xf800,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x3000,0x1000,0x2000, // u0162 0x0000,0x0000,0x2000,0x2000,0x7000,0x2000,0x2000,0x2000,0x2000,0x1800,0x1000,0x2000, // u0163 0x5000,0x2000,0xf800,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000, // u0164 0x5000,0x2000,0x2000,0x2000,0x7000,0x2000,0x2000,0x2000,0x2000,0x1800,0x0000,0x0000, // u0165 0x0000,0x0000,0xf800,0x2000,0x2000,0x7000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000, // u0166 0x0000,0x0000,0x2000,0x2000,0x7000,0x2000,0x7000,0x2000,0x2000,0x1800,0x0000,0x0000, // u0167 0x2800,0x5000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u0168 0x0000,0x0000,0x2800,0x5000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0000,0x0000, // u0169 0x7000,0x0000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u016a 0x0000,0x0000,0x7000,0x0000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0000,0x0000, // u016b 0x5000,0x2000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u016c 0x0000,0x0000,0x5000,0x2000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0000,0x0000, // u016d 0x2000,0x5000,0xa800,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u016e 0x0000,0x0000,0x2000,0x5000,0xa800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0000,0x0000, // u016f 0x2800,0x5000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u0170 0x0000,0x0000,0x2800,0x5000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0000,0x0000, // u0171 0x0000,0x0000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x2000,0x1800, // u0172 0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7800,0x1000,0x0c00, // u0173 0x2000,0x5000,0x8800,0x8800,0x8800,0x8800,0xa800,0xa800,0xd800,0x8800,0x0000,0x0000, // u0174 0x0000,0x0000,0x2000,0x5000,0x8800,0x8800,0xa800,0xa800,0xa800,0x7000,0x0000,0x0000, // u0175 0x2000,0x5000,0x8800,0x8800,0x5000,0x5000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000, // u0176 0x0000,0x0000,0x2000,0x5000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0800,0x7000, // u0177 0x5000,0x5000,0x8800,0x8800,0x5000,0x5000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000, // u0178 0x1000,0x2000,0xf800,0x0800,0x1000,0x2000,0x4000,0x8000,0x8000,0xf800,0x0000,0x0000, // u0179 0x0000,0x0000,0x1000,0x2000,0xf800,0x1000,0x2000,0x4000,0x8000,0xf800,0x0000,0x0000, // u017a 0x2000,0x2000,0xf800,0x0800,0x1000,0x2000,0x4000,0x8000,0x8000,0xf800,0x0000,0x0000, // u017b 0x0000,0x0000,0x2000,0x2000,0xf800,0x1000,0x2000,0x4000,0x8000,0xf800,0x0000,0x0000, // u017c 0x5000,0x2000,0xf800,0x0800,0x1000,0x2000,0x4000,0x8000,0x8000,0xf800,0x0000,0x0000, // u017d 0x0000,0x0000,0x5000,0x2000,0xf800,0x1000,0x2000,0x4000,0x8000,0xf800,0x0000,0x0000, // u017e 0x0000,0x0000,0x1800,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000, // u017f 0x0000,0x0000,0x7000,0x8800,0x0800,0x0800,0x0800,0x0800,0x8800,0x7000,0x0000,0x0000, // u0186 0x0000,0x0000,0xf800,0x0800,0x0800,0x7800,0x0800,0x0800,0x0800,0xf800,0x0000,0x0000, // u018e 0x0000,0x0000,0x7000,0x8800,0x0800,0x0800,0xf800,0x8800,0x8800,0x7000,0x0000,0x0000, // u018f 0x0000,0x0000,0x7000,0x8800,0x8000,0x6000,0x8000,0x8000,0x8800,0x7000,0x0000,0x0000, // u0190 0x0000,0x0000,0x1000,0x2800,0x2000,0x7000,0x2000,0x2000,0x2000,0x2000,0xa000,0x4000, // u0192 0x0000,0x0000,0x8800,0x8800,0xc800,0xa800,0x9800,0x8800,0x8800,0xc800,0x4000,0x8000, // u019d 0x0000,0x0000,0x0000,0x0000,0xf000,0x8800,0x8800,0x8800,0x8800,0x8800,0x0800,0x0800, // u019e 0x0000,0x0000,0xf800,0x0800,0x1000,0xf800,0x2000,0x4000,0x8000,0xf800,0x0000,0x0000, // u01b5 0x0000,0x0000,0x0000,0x0000,0xf800,0x1000,0x7800,0x2000,0x4000,0xf800,0x0000,0x0000, // u01b6 0x0000,0x0000,0xf800,0x0800,0x1000,0x3000,0x0800,0x0800,0x8800,0x7000,0x0000,0x0000, // u01b7 0x5000,0x2000,0x7000,0x8800,0x8800,0x8800,0xf800,0x8800,0x8800,0x8800,0x0000,0x0000, // u01cd 0x0000,0x0000,0x5000,0x2000,0x7000,0x0800,0x7800,0x8800,0x8800,0x7800,0x0000,0x0000, // u01ce 0x5000,0x2000,0x7000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u01cf 0x0000,0x0000,0x5000,0x2000,0x6000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u01d0 0x5000,0x2000,0x7000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u01d1 0x0000,0x0000,0x5000,0x2000,0x7000,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u01d2 0x5000,0x2000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u01d3 0x0000,0x0000,0x5000,0x2000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0000,0x0000, // u01d4 0x7800,0x0000,0x7c00,0x9000,0x9000,0xfc00,0x9000,0x9000,0x9000,0x9c00,0x0000,0x0000, // u01e2 0x0000,0x0000,0x7000,0x0000,0x7000,0x2800,0x6800,0xb000,0xa000,0x7800,0x0000,0x0000, // u01e3 0x0000,0x0000,0x7800,0x8000,0x8000,0xb800,0x8800,0x9c00,0x8800,0x7000,0x0000,0x0000, // u01e4 0x0000,0x0000,0x0000,0x0000,0x7800,0x8800,0x9c00,0x8800,0x8800,0x7800,0x0800,0x7000, // u01e5 0x5000,0x2000,0x7000,0x8800,0x8000,0x8000,0xb800,0x8800,0x8800,0x7000,0x0000,0x0000, // u01e6 0x0000,0x0000,0x5000,0x2000,0x7800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0800,0x7000, // u01e7 0x5000,0x2000,0x8800,0x9000,0xa000,0xc000,0xc000,0xa000,0x9000,0x8800,0x0000,0x0000, // u01e8 0x5000,0x2000,0x4000,0x4000,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x0000,0x0000, // u01e9 0x0000,0x0000,0x7000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x2000,0x1800, // u01ea 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0x8800,0x8800,0x8800,0x7000,0x2000,0x1800, // u01eb 0x7000,0x0000,0x7000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x2000,0x1800, // u01ec 0x0000,0x0000,0x7000,0x0000,0x7000,0x8800,0x8800,0x8800,0x8800,0x7000,0x2000,0x1800, // u01ed 0x5000,0x2000,0xf800,0x0800,0x1000,0x3000,0x0800,0x0800,0x8800,0x7000,0x0000,0x0000, // u01ee 0x0000,0x0000,0x5000,0x2000,0xf800,0x0800,0x1000,0x3000,0x0800,0x0800,0x8800,0x7000, // u01ef 0x0000,0x0000,0x1400,0x0800,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x4800,0x3000, // u01f0 0x1000,0x2000,0x7000,0x8800,0x8000,0x8000,0xb800,0x8800,0x8800,0x7000,0x0000,0x0000, // u01f4 0x0000,0x0000,0x1000,0x2000,0x7800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0800,0x7000, // u01f5 0x0800,0x1000,0x7c00,0x9000,0x9000,0xfc00,0x9000,0x9000,0x9000,0x9c00,0x0000,0x0000, // u01fc 0x0000,0x0000,0x1000,0x2000,0x7000,0x2800,0x6800,0xb000,0xa000,0x7800,0x0000,0x0000, // u01fd 0x1000,0x2000,0x7400,0x8800,0x9800,0xa800,0xc800,0x8800,0x8800,0x7000,0x0000,0x0000, // u01fe 0x0000,0x0000,0x1000,0x2000,0x7400,0x9800,0xa800,0xc800,0x8800,0x7000,0x0000,0x0000, // u01ff 0x0000,0x0000,0x7000,0x8800,0x8000,0x7000,0x0800,0x0800,0x8800,0x7000,0x2000,0x4000, // u0218 0x0000,0x0000,0x0000,0x0000,0x7800,0x8000,0x7000,0x0800,0x0800,0xf000,0x2000,0x4000, // u0219 0x0000,0x0000,0xf800,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x3000,0x1000,0x2000, // u021a 0x0000,0x0000,0x2000,0x2000,0x7000,0x2000,0x2000,0x2000,0x2000,0x1800,0x0800,0x1000, // u021b 0x7000,0x0000,0x8800,0x8800,0x5000,0x5000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000, // u0232 0x0000,0x0000,0x7000,0x0000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0800,0x7000, // u0233 0x0000,0x0000,0x0000,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x4800,0x3000, // u0237 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0x0800,0x0800,0x8800,0x7000,0x0000,0x0000, // u0254 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0xf800,0x0800,0x8800,0x7000,0x0000,0x0000, // u0258 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0x0800,0xf800,0x8800,0x7000,0x0000,0x0000, // u0259 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0x6000,0x8000,0x8800,0x7000,0x0000,0x0000, // u025b 0x0000,0x0000,0x0000,0x0000,0xf000,0x8800,0x8800,0x8800,0x8800,0xc800,0x4000,0x8000, // u0272 0x0000,0x0000,0x0000,0x0000,0xf800,0x0800,0x1000,0x3000,0x0800,0x0800,0x8800,0x7000, // u0292 0x1000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bb 0x1000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bc 0x2000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bd 0x2000,0x5000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02c6 0x5000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02c7 0x5000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02d8 0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02d9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x2000,0x1800, // u02db 0x2800,0x5000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02dc 0x2800,0x5000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02dd 0x4000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0300 0x1000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0301 0x2000,0x5000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0302 0x2800,0x5000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0303 0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0304 0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0305 0x5000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0306 0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0307 0x5000,0x5000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0308 0x2000,0x5000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030a 0x2800,0x5000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030b 0x5000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000, // u0329 0x4000,0x8000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0384 0x1000,0x2000,0x5000,0x5000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0385 0x4000,0x8000,0x7000,0x8800,0x8800,0x8800,0xf800,0x8800,0x8800,0x8800,0x0000,0x0000, // u0386 0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0387 0x4000,0x8000,0xf800,0x8000,0x8000,0xf000,0x8000,0x8000,0x8000,0xf800,0x0000,0x0000, // u0388 0x4000,0x8000,0x8800,0x8800,0x8800,0xf800,0x8800,0x8800,0x8800,0x8800,0x0000,0x0000, // u0389 0x4000,0x8000,0x7000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u038a 0x4000,0x8000,0x7000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u038c 0x4000,0x8000,0x8800,0x8800,0x5000,0x5000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000, // u038e 0x4000,0x8000,0x7000,0x8800,0x8800,0x8800,0x8800,0x8800,0x5000,0xd800,0x0000,0x0000, // u038f 0x1000,0x2000,0x5000,0x5000,0x6000,0x2000,0x2000,0x2000,0x2000,0x1800,0x0000,0x0000, // u0390 0x0000,0x0000,0x7000,0x8800,0x8800,0x8800,0xf800,0x8800,0x8800,0x8800,0x0000,0x0000, // u0391 0x0000,0x0000,0xf000,0x8800,0x8800,0xf000,0x8800,0x8800,0x8800,0xf000,0x0000,0x0000, // u0392 0x0000,0x0000,0xf800,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x0000,0x0000, // u0393 0x0000,0x0000,0x2000,0x2000,0x5000,0x5000,0x8800,0x8800,0x8800,0xf800,0x0000,0x0000, // u0394 0x0000,0x0000,0xf800,0x8000,0x8000,0xf000,0x8000,0x8000,0x8000,0xf800,0x0000,0x0000, // u0395 0x0000,0x0000,0xf800,0x0800,0x1000,0x2000,0x4000,0x8000,0x8000,0xf800,0x0000,0x0000, // u0396 0x0000,0x0000,0x8800,0x8800,0x8800,0xf800,0x8800,0x8800,0x8800,0x8800,0x0000,0x0000, // u0397 0x0000,0x0000,0x7000,0x8800,0x8800,0xa800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u0398 0x0000,0x0000,0x7000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u0399 0x0000,0x0000,0x8800,0x9000,0xa000,0xc000,0xc000,0xa000,0x9000,0x8800,0x0000,0x0000, // u039a 0x0000,0x0000,0x2000,0x2000,0x5000,0x5000,0x8800,0x8800,0x8800,0x8800,0x0000,0x0000, // u039b 0x0000,0x0000,0x8800,0xd800,0xa800,0xa800,0x8800,0x8800,0x8800,0x8800,0x0000,0x0000, // u039c 0x0000,0x0000,0x8800,0x8800,0xc800,0xa800,0x9800,0x8800,0x8800,0x8800,0x0000,0x0000, // u039d 0x0000,0x0000,0xf800,0x0000,0x0000,0x7000,0x0000,0x0000,0x0000,0xf800,0x0000,0x0000, // u039e 0x0000,0x0000,0x7000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u039f 0x0000,0x0000,0xf800,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x0000,0x0000, // u03a0 0x0000,0x0000,0xf000,0x8800,0x8800,0x8800,0xf000,0x8000,0x8000,0x8000,0x0000,0x0000, // u03a1 0x0000,0x0000,0xf800,0x4000,0x2000,0x1000,0x1000,0x2000,0x4000,0xf800,0x0000,0x0000, // u03a3 0x0000,0x0000,0xf800,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000, // u03a4 0x0000,0x0000,0x8800,0x8800,0x5000,0x5000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000, // u03a5 0x0000,0x0000,0x2000,0x7000,0xa800,0xa800,0xa800,0xa800,0x7000,0x2000,0x0000,0x0000, // u03a6 0x0000,0x0000,0x8800,0x8800,0x5000,0x2000,0x2000,0x5000,0x8800,0x8800,0x0000,0x0000, // u03a7 0x0000,0x0000,0xa800,0xa800,0xa800,0xa800,0xa800,0x7000,0x2000,0x2000,0x0000,0x0000, // u03a8 0x0000,0x0000,0x7000,0x8800,0x8800,0x8800,0x8800,0x8800,0x5000,0xd800,0x0000,0x0000, // u03a9 0x5000,0x5000,0x7000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u03aa 0x5000,0x5000,0x8800,0x8800,0x5000,0x5000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000, // u03ab 0x0000,0x0000,0x1000,0x2000,0x6800,0x9000,0x9000,0x9000,0x9000,0x6800,0x0000,0x0000, // u03ac 0x0000,0x0000,0x1000,0x2000,0x7000,0x8800,0x6000,0x8000,0x8800,0x7000,0x0000,0x0000, // u03ad 0x0000,0x0000,0x1000,0x2000,0xf000,0x8800,0x8800,0x8800,0x8800,0x8800,0x0800,0x0800, // u03ae 0x0000,0x0000,0x1000,0x2000,0x6000,0x2000,0x2000,0x2000,0x2000,0x1800,0x0000,0x0000, // u03af 0x1000,0x2000,0x5000,0x5000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u03b0 0x0000,0x0000,0x0000,0x0000,0x6800,0x9000,0x9000,0x9000,0x9000,0x6800,0x0000,0x0000, // u03b1 0x0000,0x0000,0xe000,0x9000,0x9000,0xf000,0x8800,0x8800,0x8800,0xf000,0x8000,0x8000, // u03b2 0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0x8800,0x5000,0x5000,0x2000,0x2000,0x2000, // u03b3 0x0000,0x0000,0xf000,0x4000,0x2000,0x7000,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u03b4 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0x6000,0x8000,0x8800,0x7000,0x0000,0x0000, // u03b5 0x0000,0x0000,0xf800,0x1000,0x2000,0x4000,0x8000,0x8000,0x8000,0x7000,0x0800,0x1000, // u03b6 0x0000,0x0000,0x0000,0x0000,0xf000,0x8800,0x8800,0x8800,0x8800,0x8800,0x0800,0x0800, // u03b7 0x0000,0x0000,0x3000,0x4800,0x4800,0x7800,0x4800,0x4800,0x4800,0x3000,0x0000,0x0000, // u03b8 0x0000,0x0000,0x0000,0x0000,0x6000,0x2000,0x2000,0x2000,0x2000,0x1800,0x0000,0x0000, // u03b9 0x0000,0x0000,0x0000,0x0000,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x0000,0x0000, // u03ba 0x0000,0x0000,0x4000,0x4000,0x2000,0x2000,0x5000,0x5000,0x8800,0x8800,0x0000,0x0000, // u03bb 0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0x8800,0x8800,0x9800,0xe800,0x8000,0x8000, // u03bc 0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0x5000,0x5000,0x2000,0x2000,0x0000,0x0000, // u03bd 0x0000,0x0000,0x7800,0x8000,0x8000,0x7000,0x8000,0x8000,0x8000,0x7000,0x0800,0x1000, // u03be 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u03bf 0x0000,0x0000,0x0000,0x0000,0xf800,0x8800,0x8800,0x8800,0x8800,0x8800,0x0000,0x0000, // u03c0 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0x8800,0x8800,0x8800,0xf000,0x8000,0x8000, // u03c1 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0x8000,0x8000,0x8000,0x7000,0x0800,0x1000, // u03c2 0x0000,0x0000,0x0000,0x0000,0x7800,0x9000,0x9000,0x9000,0x9000,0x6000,0x0000,0x0000, // u03c3 0x0000,0x0000,0x0000,0x0000,0xf800,0x2000,0x2000,0x2000,0x2000,0x1000,0x0000,0x0000, // u03c4 0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u03c5 0x0000,0x0000,0x0000,0x0000,0x9000,0xa800,0xa800,0xa800,0xa800,0x7000,0x2000,0x2000, // u03c6 0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0x5000,0x2000,0x2000,0x5000,0x8800,0x8800, // u03c7 0x0000,0x0000,0x0000,0x0000,0xa800,0xa800,0xa800,0xa800,0xa800,0x7000,0x2000,0x2000, // u03c8 0x0000,0x0000,0x0000,0x0000,0x5000,0x8800,0xa800,0xa800,0xa800,0x5000,0x0000,0x0000, // u03c9 0x0000,0x0000,0x5000,0x5000,0x6000,0x2000,0x2000,0x2000,0x2000,0x1800,0x0000,0x0000, // u03ca 0x0000,0x0000,0x5000,0x5000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u03cb 0x0000,0x0000,0x1000,0x2000,0x7000,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u03cc 0x0000,0x0000,0x1000,0x2000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u03cd 0x0000,0x0000,0x1000,0x2000,0x5000,0x8800,0xa800,0xa800,0xa800,0x5000,0x0000,0x0000, // u03ce 0x0000,0x0000,0x3000,0x4800,0x4800,0x3c00,0x0800,0xc800,0x4800,0x3000,0x0000,0x0000, // u03d1 0x0000,0x0000,0x0000,0x2000,0x7000,0xa800,0xa800,0xa800,0xa800,0x7000,0x2000,0x0000, // u03d5 0x0000,0x0000,0x0000,0x0000,0xc400,0x2800,0x1000,0x2000,0x5000,0x8c00,0x0000,0x0000, // u03f0 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0x8800,0x8800,0x8800,0xf000,0x8000,0x7000, // u03f1 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0x8000,0x8000,0x8800,0x7000,0x0000,0x0000, // u03f2 0x0000,0x0800,0x0800,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x4800,0x3000, // u03f3 0x0000,0x0000,0x7000,0x8800,0x8800,0xf800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u03f4 0x0000,0x0000,0x0000,0x0000,0x7800,0x8000,0xf000,0x8000,0x8000,0x7800,0x0000,0x0000, // u03f5 0x0000,0x0000,0x0000,0x0000,0xf000,0x0800,0x7800,0x0800,0x0800,0xf000,0x0000,0x0000, // u03f6 0x4000,0x2000,0xf800,0x8000,0x8000,0xf000,0x8000,0x8000,0x8000,0xf800,0x0000,0x0000, // u0400 0x5000,0x5000,0xf800,0x8000,0x8000,0xf000,0x8000,0x8000,0x8000,0xf800,0x0000,0x0000, // u0401 0x0000,0x0000,0xe000,0x4000,0x4000,0x7000,0x4800,0x4800,0x4800,0x4800,0x0800,0x1000, // u0402 0x1000,0x2000,0xf800,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x0000,0x0000, // u0403 0x0000,0x0000,0x7000,0x8800,0x8000,0xf000,0x8000,0x8000,0x8800,0x7000,0x0000,0x0000, // u0404 0x0000,0x0000,0x7000,0x8800,0x8000,0x7000,0x0800,0x0800,0x8800,0x7000,0x0000,0x0000, // u0405 0x0000,0x0000,0x7000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u0406 0x5000,0x5000,0x7000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u0407 0x0000,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x9000,0x9000,0x6000,0x0000,0x0000, // u0408 0x0000,0x0000,0x6000,0xa000,0xb000,0xa800,0xa800,0xa800,0xa800,0xb000,0x0000,0x0000, // u0409 0x0000,0x0000,0xa000,0xa000,0xb000,0xe800,0xa800,0xa800,0xa800,0xb000,0x0000,0x0000, // u040a 0x0000,0x0000,0xe000,0x4000,0x4000,0x7000,0x4800,0x4800,0x4800,0x4800,0x0000,0x0000, // u040b 0x1000,0x2000,0x8800,0x9000,0xa000,0xc000,0xc000,0xa000,0x9000,0x8800,0x0000,0x0000, // u040c 0x4000,0x2000,0x8800,0x8800,0x9800,0xa800,0xc800,0x8800,0x8800,0x8800,0x0000,0x0000, // u040d 0x5000,0x2000,0x8800,0x8800,0x8800,0x8800,0x7800,0x0800,0x0800,0x7000,0x0000,0x0000, // u040e 0x0000,0x0000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0xf800,0x2000,0x2000, // u040f 0x0000,0x0000,0x7000,0x8800,0x8800,0x8800,0xf800,0x8800,0x8800,0x8800,0x0000,0x0000, // u0410 0x0000,0x0000,0xf000,0x8000,0x8000,0xf000,0x8800,0x8800,0x8800,0xf000,0x0000,0x0000, // u0411 0x0000,0x0000,0xf000,0x8800,0x8800,0xf000,0x8800,0x8800,0x8800,0xf000,0x0000,0x0000, // u0412 0x0000,0x0000,0xf800,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x0000,0x0000, // u0413 0x0000,0x0000,0x3800,0x4800,0x4800,0x4800,0x4800,0x4800,0x4800,0xfc00,0x8400,0x0000, // u0414 0x0000,0x0000,0xf800,0x8000,0x8000,0xf000,0x8000,0x8000,0x8000,0xf800,0x0000,0x0000, // u0415 0x0000,0x0000,0xa800,0xa800,0xa800,0x7000,0x7000,0xa800,0xa800,0xa800,0x0000,0x0000, // u0416 0x0000,0x0000,0x7000,0x8800,0x0800,0x3000,0x0800,0x0800,0x8800,0x7000,0x0000,0x0000, // u0417 0x0000,0x0000,0x8800,0x8800,0x9800,0xa800,0xc800,0x8800,0x8800,0x8800,0x0000,0x0000, // u0418 0x5000,0x2000,0x8800,0x8800,0x9800,0xa800,0xc800,0x8800,0x8800,0x8800,0x0000,0x0000, // u0419 0x0000,0x0000,0x8800,0x9000,0xa000,0xc000,0xc000,0xa000,0x9000,0x8800,0x0000,0x0000, // u041a 0x0000,0x0000,0x3800,0x4800,0x4800,0x4800,0x4800,0x4800,0x4800,0x8800,0x0000,0x0000, // u041b 0x0000,0x0000,0x8800,0xd800,0xa800,0xa800,0x8800,0x8800,0x8800,0x8800,0x0000,0x0000, // u041c 0x0000,0x0000,0x8800,0x8800,0x8800,0xf800,0x8800,0x8800,0x8800,0x8800,0x0000,0x0000, // u041d 0x0000,0x0000,0x7000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u041e 0x0000,0x0000,0xf800,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x0000,0x0000, // u041f 0x0000,0x0000,0xf000,0x8800,0x8800,0x8800,0xf000,0x8000,0x8000,0x8000,0x0000,0x0000, // u0420 0x0000,0x0000,0x7000,0x8800,0x8000,0x8000,0x8000,0x8000,0x8800,0x7000,0x0000,0x0000, // u0421 0x0000,0x0000,0xf800,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000, // u0422 0x0000,0x0000,0x8800,0x8800,0x8800,0x8800,0x7800,0x0800,0x0800,0x7000,0x0000,0x0000, // u0423 0x0000,0x2000,0x7000,0xa800,0xa800,0xa800,0xa800,0xa800,0xa800,0x7000,0x2000,0x0000, // u0424 0x0000,0x0000,0x8800,0x8800,0x5000,0x2000,0x2000,0x5000,0x8800,0x8800,0x0000,0x0000, // u0425 0x0000,0x0000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7c00,0x0400,0x0400, // u0426 0x0000,0x0000,0x8800,0x8800,0x8800,0x8800,0x7800,0x0800,0x0800,0x0800,0x0000,0x0000, // u0427 0x0000,0x0000,0xa800,0xa800,0xa800,0xa800,0xa800,0xa800,0xa800,0x7800,0x0000,0x0000, // u0428 0x0000,0x0000,0xa800,0xa800,0xa800,0xa800,0xa800,0xa800,0xa800,0x7c00,0x0400,0x0400, // u0429 0x0000,0x0000,0xc000,0x4000,0x7000,0x4800,0x4800,0x4800,0x4800,0x7000,0x0000,0x0000, // u042a 0x0000,0x0000,0x8800,0x8800,0xc800,0xa800,0xa800,0xa800,0xa800,0xc800,0x0000,0x0000, // u042b 0x0000,0x0000,0x4000,0x4000,0x7000,0x4800,0x4800,0x4800,0x4800,0x7000,0x0000,0x0000, // u042c 0x0000,0x0000,0x7000,0x8800,0x0800,0x3800,0x0800,0x0800,0x8800,0x7000,0x0000,0x0000, // u042d 0x0000,0x0000,0x9000,0xa800,0xa800,0xa800,0xe800,0xa800,0xa800,0x9000,0x0000,0x0000, // u042e 0x0000,0x0000,0x7800,0x8800,0x8800,0x8800,0x7800,0x2800,0x4800,0x8800,0x0000,0x0000, // u042f 0x0000,0x0000,0x0000,0x0000,0x7000,0x0800,0x7800,0x8800,0x8800,0x7800,0x0000,0x0000, // u0430 0x0000,0x0000,0x7000,0x8000,0xf000,0x8800,0x8800,0x8800,0x8800,0xf000,0x0000,0x0000, // u0431 0x0000,0x0000,0xe000,0x9000,0x9000,0xf000,0x8800,0x8800,0x8800,0xf000,0x0000,0x0000, // u0432 0x0000,0x0000,0x0000,0x0000,0xf800,0x8000,0x8000,0x8000,0x8000,0x8000,0x0000,0x0000, // u0433 0x0000,0x0000,0x0000,0x0000,0x7800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0800,0x7000, // u0434 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0xf800,0x8000,0x8000,0x7800,0x0000,0x0000, // u0435 0x0000,0x0000,0x0000,0x0000,0xa800,0xa800,0x7000,0xa800,0xa800,0xa800,0x0000,0x0000, // u0436 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0x3000,0x0800,0x8800,0x7000,0x0000,0x0000, // u0437 0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0000,0x0000, // u0438 0x0000,0x0000,0x5000,0x2000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0000,0x0000, // u0439 0x0000,0x0000,0x0000,0x0000,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x0000,0x0000, // u043a 0x0000,0x0000,0x0000,0x0000,0x3800,0x4800,0x4800,0x4800,0x4800,0x8800,0x0000,0x0000, // u043b 0x0000,0x0000,0x0000,0x0000,0x8800,0xd800,0xa800,0x8800,0x8800,0x8800,0x0000,0x0000, // u043c 0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0xf800,0x8800,0x8800,0x8800,0x0000,0x0000, // u043d 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u043e 0x0000,0x0000,0x0000,0x0000,0xf800,0x8800,0x8800,0x8800,0x8800,0x8800,0x0000,0x0000, // u043f 0x0000,0x0000,0x0000,0x0000,0xf000,0x8800,0x8800,0x8800,0x8800,0xf000,0x8000,0x8000, // u0440 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0x8000,0x8000,0x8800,0x7000,0x0000,0x0000, // u0441 0x0000,0x0000,0x0000,0x0000,0xf800,0x2000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000, // u0442 0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0800,0x7000, // u0443 0x0000,0x0000,0x0000,0x2000,0x7000,0xa800,0xa800,0xa800,0xa800,0x7000,0x2000,0x0000, // u0444 0x0000,0x0000,0x0000,0x0000,0x8800,0x5000,0x2000,0x2000,0x5000,0x8800,0x0000,0x0000, // u0445 0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7c00,0x0400,0x0400, // u0446 0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0x8800,0x7800,0x0800,0x0800,0x0000,0x0000, // u0447 0x0000,0x0000,0x0000,0x0000,0xa800,0xa800,0xa800,0xa800,0xa800,0x7800,0x0000,0x0000, // u0448 0x0000,0x0000,0x0000,0x0000,0xa800,0xa800,0xa800,0xa800,0xa800,0x7c00,0x0400,0x0400, // u0449 0x0000,0x0000,0x0000,0x0000,0xc000,0x4000,0x7000,0x4800,0x4800,0x7000,0x0000,0x0000, // u044a 0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0xc800,0xa800,0xa800,0xc800,0x0000,0x0000, // u044b 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x7000,0x4800,0x4800,0x7000,0x0000,0x0000, // u044c 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0x3800,0x0800,0x8800,0x7000,0x0000,0x0000, // u044d 0x0000,0x0000,0x0000,0x0000,0x9000,0xa800,0xa800,0xe800,0xa800,0x9000,0x0000,0x0000, // u044e 0x0000,0x0000,0x0000,0x0000,0x7800,0x8800,0x8800,0x7800,0x2800,0x4800,0x0000,0x0000, // u044f 0x0000,0x0000,0x4000,0x2000,0x7000,0x8800,0xf800,0x8000,0x8000,0x7800,0x0000,0x0000, // u0450 0x0000,0x0000,0x5000,0x5000,0x7000,0x8800,0xf800,0x8000,0x8000,0x7800,0x0000,0x0000, // u0451 0x0000,0x0000,0x4000,0xf000,0x4000,0x7000,0x4800,0x4800,0x4800,0x4800,0x0800,0x1000, // u0452 0x0000,0x0000,0x1000,0x2000,0xf800,0x8000,0x8000,0x8000,0x8000,0x8000,0x0000,0x0000, // u0453 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0xe000,0x8000,0x8800,0x7000,0x0000,0x0000, // u0454 0x0000,0x0000,0x0000,0x0000,0x7800,0x8000,0x7000,0x0800,0x0800,0xf000,0x0000,0x0000, // u0455 0x0000,0x2000,0x2000,0x0000,0x6000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u0456 0x0000,0x0000,0x5000,0x5000,0x6000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u0457 0x0000,0x0800,0x0800,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x4800,0x3000, // u0458 0x0000,0x0000,0x0000,0x0000,0x6000,0xa000,0xb000,0xa800,0xa800,0xb000,0x0000,0x0000, // u0459 0x0000,0x0000,0x0000,0x0000,0xa000,0xa000,0xf000,0xa800,0xa800,0xb000,0x0000,0x0000, // u045a 0x0000,0x0000,0x4000,0xf000,0x4000,0x7000,0x4800,0x4800,0x4800,0x4800,0x0000,0x0000, // u045b 0x0000,0x0000,0x0800,0x1000,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x0000,0x0000, // u045c 0x0000,0x0000,0x4000,0x2000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0000,0x0000, // u045d 0x0000,0x0000,0x5000,0x2000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0800,0x7000, // u045e 0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0x8800,0x8800,0x8800,0xf800,0x2000,0x2000, // u045f 0x0000,0x0000,0x4000,0xf000,0x4000,0x7000,0x4800,0x4800,0x4800,0x7000,0x0000,0x0000, // u0462 0x0000,0x0000,0x4000,0x4000,0xe000,0x4000,0x7000,0x4800,0x4800,0x7000,0x0000,0x0000, // u0463 0x0000,0x0000,0xf800,0x8800,0x5000,0x2000,0x7000,0xa800,0xa800,0xa800,0x0000,0x0000, // u046a 0x0000,0x0000,0x0000,0x0000,0xf800,0x5000,0x2000,0x7000,0xa800,0xa800,0x0000,0x0000, // u046b 0x0800,0x0800,0xf800,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x0000,0x0000, // u0490 0x0000,0x0000,0x0800,0x0800,0xf800,0x8000,0x8000,0x8000,0x8000,0x8000,0x0000,0x0000, // u0491 0x0000,0x0000,0x7c00,0x4000,0x4000,0x4000,0xf000,0x4000,0x4000,0x4000,0x0000,0x0000, // u0492 0x0000,0x0000,0x0000,0x0000,0x7800,0x4000,0x4000,0xf000,0x4000,0x4000,0x0000,0x0000, // u0493 0x0000,0x0000,0xf800,0x8000,0x8000,0x8000,0xf000,0x8800,0x8800,0x8800,0x0800,0x1000, // u0494 0x0000,0x0000,0x0000,0x0000,0xf800,0x8000,0x8000,0xe000,0x9000,0x9000,0x1000,0x2000, // u0495 0x0000,0x0000,0xa800,0xa800,0xa800,0x7000,0x7000,0xa800,0xa800,0xac00,0x0400,0x0400, // u0496 0x0000,0x0000,0x0000,0x0000,0xa800,0xa800,0x7000,0xa800,0xa800,0xac00,0x0400,0x0400, // u0497 0x0000,0x0000,0x7000,0x8800,0x0800,0x3000,0x0800,0x0800,0x8800,0x7000,0x2000,0x2000, // u0498 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0x3000,0x0800,0x8800,0x7000,0x2000,0x2000, // u0499 0x0000,0x0000,0x8800,0x9000,0xa000,0xc000,0xc000,0xa000,0x9000,0x8c00,0x0400,0x0400, // u049a 0x0000,0x0000,0x0000,0x0000,0x4800,0x5000,0x6000,0x6000,0x5000,0x4c00,0x0400,0x0400, // u049b 0x0000,0x0000,0x8400,0xa800,0xb000,0xe000,0xe000,0xb000,0xa800,0x8400,0x0000,0x0000, // u049c 0x0000,0x0000,0x0000,0x0000,0xa800,0xb000,0xe000,0xe000,0xb000,0xa800,0x0000,0x0000, // u049d 0x0000,0x0000,0xc400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x0000,0x0000, // u04a0 0x0000,0x0000,0x0000,0x0000,0xc800,0x5000,0x6000,0x6000,0x5000,0x4800,0x0000,0x0000, // u04a1 0x0000,0x0000,0x8800,0x8800,0x8800,0xf800,0x8800,0x8800,0x8800,0x8c00,0x0400,0x0400, // u04a2 0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0xf800,0x8800,0x8800,0x8c00,0x0400,0x0400, // u04a3 0x0000,0x0000,0x9c00,0x9000,0x9000,0xf000,0x9000,0x9000,0x9000,0x9000,0x0000,0x0000, // u04a4 0x0000,0x0000,0x0000,0x0000,0x9c00,0x9000,0xf000,0x9000,0x9000,0x9000,0x0000,0x0000, // u04a5 0x0000,0x0000,0x7000,0x8800,0x8000,0x8000,0x8000,0x8000,0x8800,0x7000,0x2000,0x2000, // u04aa 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0x8000,0x8000,0x8800,0x7000,0x2000,0x2000, // u04ab 0x0000,0x0000,0x8800,0x8800,0x5000,0x5000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000, // u04ae 0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0x8800,0x5000,0x5000,0x2000,0x2000,0x2000, // u04af 0x0000,0x0000,0x8800,0x8800,0x5000,0x5000,0x2000,0x7000,0x2000,0x2000,0x0000,0x0000, // u04b0 0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0x8800,0x5000,0x5000,0x2000,0x7000,0x2000, // u04b1 0x0000,0x0000,0x8800,0x8800,0x5000,0x2000,0x2000,0x5000,0x8800,0x8c00,0x0400,0x0400, // u04b2 0x0000,0x0000,0x0000,0x0000,0x8800,0x5000,0x2000,0x2000,0x5000,0x8c00,0x0400,0x0400, // u04b3 0x0000,0x0000,0x8800,0x8800,0x8800,0x8800,0x7800,0x0800,0x0800,0x0c00,0x0400,0x0400, // u04b6 0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0x8800,0x7800,0x0800,0x0c00,0x0400,0x0400, // u04b7 0x0000,0x0000,0x8800,0x8800,0xa800,0xa800,0x7800,0x2800,0x2800,0x0800,0x0000,0x0000, // u04b8 0x0000,0x0000,0x0000,0x0000,0x8800,0xa800,0xa800,0x7800,0x2800,0x0800,0x0000,0x0000, // u04b9 0x0000,0x0000,0x8000,0x8000,0x8000,0xf000,0x8800,0x8800,0x8800,0x8800,0x0000,0x0000, // u04ba 0x0000,0x0000,0x0000,0x0000,0x8000,0x8000,0xf000,0x8800,0x8800,0x8800,0x0000,0x0000, // u04bb 0x0000,0x0000,0x7000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u04c0 0x5000,0x2000,0xa800,0xa800,0xa800,0x7000,0x7000,0xa800,0xa800,0xa800,0x0000,0x0000, // u04c1 0x0000,0x0000,0x5000,0x2000,0xa800,0xa800,0x7000,0xa800,0xa800,0xa800,0x0000,0x0000, // u04c2 0x0000,0x0000,0x6000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u04cf 0x5000,0x2000,0x7000,0x8800,0x8800,0x8800,0xf800,0x8800,0x8800,0x8800,0x0000,0x0000, // u04d0 0x0000,0x0000,0x5000,0x2000,0x7000,0x0800,0x7800,0x8800,0x8800,0x7800,0x0000,0x0000, // u04d1 0x5000,0x5000,0x7000,0x8800,0x8800,0x8800,0xf800,0x8800,0x8800,0x8800,0x0000,0x0000, // u04d2 0x0000,0x0000,0x5000,0x5000,0x7000,0x0800,0x7800,0x8800,0x8800,0x7800,0x0000,0x0000, // u04d3 0x0000,0x0000,0x7c00,0x9000,0x9000,0xfc00,0x9000,0x9000,0x9000,0x9c00,0x0000,0x0000, // u04d4 0x0000,0x0000,0x0000,0x0000,0x7000,0x2800,0x6800,0xb000,0xa000,0x7800,0x0000,0x0000, // u04d5 0x5000,0x2000,0xf800,0x8000,0x8000,0xf000,0x8000,0x8000,0x8000,0xf800,0x0000,0x0000, // u04d6 0x0000,0x0000,0x5000,0x2000,0x7000,0x8800,0xf800,0x8000,0x8000,0x7800,0x0000,0x0000, // u04d7 0x0000,0x0000,0x7000,0x8800,0x0800,0x0800,0xf800,0x8800,0x8800,0x7000,0x0000,0x0000, // u04d8 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0x0800,0xf800,0x8800,0x7000,0x0000,0x0000, // u04d9 0x5000,0x5000,0x7000,0x8800,0x0800,0x0800,0xf800,0x8800,0x8800,0x7000,0x0000,0x0000, // u04da 0x0000,0x0000,0x5000,0x5000,0x7000,0x8800,0x0800,0xf800,0x8800,0x7000,0x0000,0x0000, // u04db 0x5000,0x5000,0xa800,0xa800,0xa800,0x7000,0x7000,0xa800,0xa800,0xa800,0x0000,0x0000, // u04dc 0x0000,0x0000,0x5000,0x5000,0xa800,0xa800,0x7000,0xa800,0xa800,0xa800,0x0000,0x0000, // u04dd 0x5000,0x5000,0x7000,0x8800,0x0800,0x3000,0x0800,0x0800,0x8800,0x7000,0x0000,0x0000, // u04de 0x0000,0x0000,0x5000,0x5000,0x7000,0x8800,0x3000,0x0800,0x8800,0x7000,0x0000,0x0000, // u04df 0x7000,0x0000,0x8800,0x8800,0x9800,0xa800,0xc800,0x8800,0x8800,0x8800,0x0000,0x0000, // u04e2 0x0000,0x0000,0x7000,0x0000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0000,0x0000, // u04e3 0x5000,0x5000,0x8800,0x8800,0x9800,0xa800,0xc800,0x8800,0x8800,0x8800,0x0000,0x0000, // u04e4 0x0000,0x0000,0x5000,0x5000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0000,0x0000, // u04e5 0x5000,0x5000,0x7000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u04e6 0x0000,0x0000,0x5000,0x5000,0x7000,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u04e7 0x0000,0x0000,0x7000,0x8800,0x8800,0xf800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u04e8 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0xf800,0x8800,0x8800,0x7000,0x0000,0x0000, // u04e9 0x5000,0x5000,0x7000,0x8800,0x8800,0x8800,0xf800,0x8800,0x8800,0x7000,0x0000,0x0000, // u04ea 0x0000,0x0000,0x5000,0x5000,0x7000,0x8800,0xf800,0x8800,0x8800,0x7000,0x0000,0x0000, // u04eb 0x5000,0x5000,0x7000,0x8800,0x0800,0x3800,0x0800,0x0800,0x8800,0x7000,0x0000,0x0000, // u04ec 0x0000,0x0000,0x5000,0x5000,0x7000,0x8800,0x3800,0x0800,0x8800,0x7000,0x0000,0x0000, // u04ed 0x7000,0x0000,0x8800,0x8800,0x8800,0x8800,0x7800,0x0800,0x0800,0x7000,0x0000,0x0000, // u04ee 0x0000,0x0000,0x7000,0x0000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0800,0x7000, // u04ef 0x5000,0x5000,0x8800,0x8800,0x8800,0x8800,0x7800,0x0800,0x0800,0x7000,0x0000,0x0000, // u04f0 0x0000,0x0000,0x5000,0x5000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0800,0x7000, // u04f1 0x2800,0x5000,0x8800,0x8800,0x8800,0x8800,0x7800,0x0800,0x0800,0x7000,0x0000,0x0000, // u04f2 0x0000,0x0000,0x2800,0x5000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0800,0x7000, // u04f3 0x5000,0x5000,0x8800,0x8800,0x8800,0x8800,0x7800,0x0800,0x0800,0x0800,0x0000,0x0000, // u04f4 0x0000,0x0000,0x5000,0x5000,0x8800,0x8800,0x8800,0x7800,0x0800,0x0800,0x0000,0x0000, // u04f5 0x5000,0x5000,0x8800,0x8800,0xc800,0xa800,0xa800,0xa800,0xa800,0xc800,0x0000,0x0000, // u04f8 0x0000,0x0000,0x5000,0x5000,0x8800,0x8800,0xc800,0xa800,0xa800,0xc800,0x0000,0x0000, // u04f9 0x0000,0x0000,0x8800,0x8800,0x5000,0x2000,0x5000,0x9000,0x8800,0x8800,0x0000,0x0000, // u05d0 0x0000,0x0000,0xf000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xfc00,0x0000,0x0000, // u05d1 0x0000,0x0000,0x6000,0x1000,0x1000,0x1000,0x1000,0x3000,0x4800,0x8800,0x0000,0x0000, // u05d2 0x0000,0x0000,0xfc00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000, // u05d3 0x0000,0x0000,0xf000,0x0800,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x0000,0x0000, // u05d4 0x0000,0x0000,0xc000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000, // u05d5 0x0000,0x0000,0x7800,0x1000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000, // u05d6 0x0000,0x0000,0xf000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x0000,0x0000, // u05d7 0x0000,0x0000,0x9000,0x9800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u05d8 0x0000,0x0000,0xc000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d9 0x0000,0x0000,0xf000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, // u05da 0x0000,0x0000,0xf000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xf000,0x0000,0x0000, // u05db 0x8000,0x8000,0xf800,0x0800,0x0800,0x0800,0x1000,0x2000,0x2000,0x2000,0x0000,0x0000, // u05dc 0x0000,0x0000,0xf000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0xf800,0x0000,0x0000, // u05dd 0x0000,0x0000,0xb000,0xc800,0x8800,0x8800,0x8800,0x8800,0x8800,0x9800,0x0000,0x0000, // u05de 0x0000,0x0000,0xc000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u05df 0x0000,0x0000,0x6000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x7000,0x0000,0x0000, // u05e0 0x0000,0x0000,0xf000,0x4800,0x4800,0x4800,0x4800,0x4800,0x4800,0x3000,0x0000,0x0000, // u05e1 0x0000,0x0000,0x8800,0x8800,0x8800,0x4800,0x4800,0x4800,0x3000,0xc000,0x0000,0x0000, // u05e2 0x0000,0x0000,0xf000,0x8800,0x8800,0x4800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, // u05e3 0x0000,0x0000,0xf000,0x8800,0x8800,0x4800,0x0800,0x0800,0x0800,0xf000,0x0000,0x0000, // u05e4 0x0000,0x0000,0x8800,0x8800,0x4800,0x5000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u05e5 0x0000,0x0000,0x8800,0x8800,0x4800,0x5000,0x2000,0x2000,0x1000,0xf000,0x0000,0x0000, // u05e6 0x0000,0x0000,0xf800,0x0800,0x8800,0x8800,0x9000,0xa000,0xa000,0xa000,0x8000,0x8000, // u05e7 0x0000,0x0000,0xf000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000, // u05e8 0x0000,0x0000,0xa800,0xa800,0xa800,0xa800,0xc800,0x8800,0x8800,0xf000,0x0000,0x0000, // u05e9 0x0000,0x0000,0xf000,0x4800,0x4800,0x4800,0x4800,0x4800,0x4800,0x8800,0x0000,0x0000, // u05ea 0x0000,0x0000,0xe000,0x9000,0x8800,0x8800,0x8800,0x8800,0x9000,0xe000,0x2000,0x2000, // u1e0c 0x0000,0x0000,0x0800,0x0800,0x7800,0x8800,0x8800,0x8800,0x8800,0x7800,0x2000,0x2000, // u1e0d 0x0000,0x0000,0x8800,0x9000,0xa000,0xc000,0xc000,0xa000,0x9000,0x8800,0x0000,0x7000, // u1e34 0x0000,0x0000,0x4000,0x4000,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x0000,0x7000, // u1e35 0x0000,0x0000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0xf800,0x2000,0x2000, // u1e36 0x0000,0x0000,0x6000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x7000,0x2000,0x2000, // u1e37 0x2000,0x2000,0x8800,0xd800,0xa800,0xa800,0x8800,0x8800,0x8800,0x8800,0x0000,0x0000, // u1e40 0x0000,0x0000,0x2000,0x2000,0xf000,0xa800,0xa800,0xa800,0xa800,0xa800,0x0000,0x0000, // u1e41 0x0000,0x0000,0x8800,0xd800,0xa800,0xa800,0x8800,0x8800,0x8800,0x8800,0x2000,0x2000, // u1e42 0x0000,0x0000,0x0000,0x0000,0xf000,0xa800,0xa800,0xa800,0xa800,0xa800,0x1000,0x1000, // u1e43 0x2000,0x2000,0x8800,0x8800,0xc800,0xa800,0x9800,0x8800,0x8800,0x8800,0x0000,0x0000, // u1e44 0x0000,0x0000,0x2000,0x2000,0xf000,0x8800,0x8800,0x8800,0x8800,0x8800,0x0000,0x0000, // u1e45 0x0000,0x0000,0x8800,0x8800,0xc800,0xa800,0x9800,0x8800,0x8800,0x8800,0x2000,0x2000, // u1e46 0x0000,0x0000,0x0000,0x0000,0xf000,0x8800,0x8800,0x8800,0x8800,0x8800,0x2000,0x2000, // u1e47 0x0000,0x0000,0xf800,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x1000,0x1000, // u1e6c 0x0000,0x0000,0x2000,0x2000,0x7000,0x2000,0x2000,0x2000,0x2000,0x1800,0x1000,0x1000, // u1e6d 0x0000,0x0000,0xf800,0x8000,0x8000,0xf000,0x8000,0x8000,0x8000,0xf800,0x2000,0x2000, // u1eb8 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0xf800,0x8000,0x8000,0x7800,0x2000,0x2000, // u1eb9 0x2800,0x5000,0xf800,0x8000,0x8000,0xf000,0x8000,0x8000,0x8000,0xf800,0x0000,0x0000, // u1ebc 0x0000,0x0000,0x2800,0x5000,0x7000,0x8800,0xf800,0x8000,0x8000,0x7800,0x0000,0x0000, // u1ebd 0x0000,0x0000,0x7000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x7000,0x2000,0x2000, // u1eca 0x0000,0x2000,0x2000,0x0000,0x6000,0x2000,0x2000,0x2000,0x2000,0x7000,0x2000,0x2000, // u1ecb 0x0000,0x0000,0x7000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x2000,0x2000, // u1ecc 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0x8800,0x8800,0x8800,0x7000,0x2000,0x2000, // u1ecd 0x0000,0x0000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x2000,0x2000, // u1ee4 0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7800,0x2000,0x2000, // u1ee5 0x2800,0x5000,0x8800,0x8800,0x5000,0x5000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000, // u1ef8 0x0000,0x0000,0x2800,0x5000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7800,0x0800,0x7000, // u1ef9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2001 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2002 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2003 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2004 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2005 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2006 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2007 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2008 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2009 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7800,0x0000,0x0000,0x0000,0x0000,0x0000, // u2010 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7800,0x0000,0x0000,0x0000,0x0000,0x0000, // u2011 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000, // u2012 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000, // u2013 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000, // u2014 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000, // u2015 0x0000,0x0000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000,0x0000,0x0000, // u2016 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0x0000,0xf800, // u2017 0x0000,0x1000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2018 0x0000,0x2000,0x2000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2019 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x4000,0x0000, // u201a 0x0000,0x2000,0x2000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201b 0x0000,0x2800,0x5000,0x5000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201c 0x0000,0x2800,0x2800,0x5000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x5000,0x5000,0xa000,0x0000, // u201e 0x0000,0xa000,0xa000,0x5000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201f 0x0000,0x0000,0x2000,0x7000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2020 0x0000,0x0000,0x2000,0x7000,0x2000,0x2000,0x2000,0x2000,0x7000,0x2000,0x0000,0x0000, // u2021 0x0000,0x0000,0x0000,0x0000,0x3000,0x7800,0x7800,0x3000,0x0000,0x0000,0x0000,0x0000, // u2022 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xa800,0xa800,0x0000,0x0000, // u2026 0x0000,0x0000,0x4400,0xa800,0x5000,0x2000,0x4000,0xa800,0x5400,0x2800,0x0000,0x0000, // u2030 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2032 0x0000,0x5000,0x5000,0x5000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2033 0x0000,0x0000,0x0000,0x0800,0x1000,0x2000,0x4000,0x2000,0x1000,0x0800,0x0000,0x0000, // u2039 0x0000,0x0000,0x0000,0x4000,0x2000,0x1000,0x0800,0x1000,0x2000,0x4000,0x0000,0x0000, // u203a 0x0000,0x0000,0x5000,0x5000,0x5000,0x5000,0x5000,0x0000,0x5000,0x5000,0x0000,0x0000, // u203c 0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u203e 0x0000,0x3000,0x4800,0x4800,0x4800,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2070 0x2000,0x0000,0x6000,0x2000,0x2000,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2071 0x0000,0x0800,0x1800,0x2800,0x7800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2074 0x0000,0x7000,0x4000,0x7000,0x0800,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2075 0x0000,0x3000,0x4000,0x7000,0x4800,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2076 0x0000,0x7800,0x0800,0x1000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2077 0x0000,0x3000,0x4800,0x3000,0x4800,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2078 0x0000,0x3000,0x4800,0x3800,0x0800,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2079 0x0000,0x2000,0x2000,0xf800,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207a 0x0000,0x0000,0x0000,0x7800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207b 0x0000,0x0000,0x7800,0x0000,0x7800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207c 0x0000,0x1000,0x2000,0x2000,0x2000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207d 0x0000,0x2000,0x1000,0x1000,0x1000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207e 0x0000,0x7000,0x4800,0x4800,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207f 0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x4800,0x4800,0x4800,0x3000,0x0000,0x0000, // u2080 0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x3000,0x1000,0x1000,0x3800,0x0000,0x0000, // u2081 0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x4800,0x1000,0x2000,0x7800,0x0000,0x0000, // u2082 0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x0800,0x3000,0x0800,0x7000,0x0000,0x0000, // u2083 0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1800,0x2800,0x7800,0x0800,0x0000,0x0000, // u2084 0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x4000,0x7000,0x0800,0x7000,0x0000,0x0000, // u2085 0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x4000,0x7000,0x4800,0x3000,0x0000,0x0000, // u2086 0x0000,0x0000,0x0000,0x0000,0x0000,0x7800,0x0800,0x1000,0x2000,0x2000,0x0000,0x0000, // u2087 0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x4800,0x3000,0x4800,0x3000,0x0000,0x0000, // u2088 0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x4800,0x3800,0x0800,0x3000,0x0000,0x0000, // u2089 0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0xf800,0x2000,0x2000,0x0000,0x0000, // u208a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7800,0x0000,0x0000,0x0000,0x0000, // u208b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7800,0x0000,0x7800,0x0000,0x0000,0x0000, // u208c 0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x2000,0x2000,0x2000,0x1000,0x0000,0x0000, // u208d 0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x1000,0x1000,0x1000,0x2000,0x0000,0x0000, // u208e 0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x0800,0x3800,0x4800,0x3800,0x0000,0x0000, // u2090 0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x4800,0x7800,0x4000,0x3800,0x0000,0x0000, // u2091 0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x4800,0x4800,0x4800,0x3000,0x0000,0x0000, // u2092 0x0000,0x0000,0x0000,0x0000,0x0000,0x8800,0x5000,0x2000,0x5000,0x8800,0x0000,0x0000, // u2093 0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x0800,0x7800,0x4800,0x3000,0x0000,0x0000, // u2094 0x0000,0x0000,0x0000,0x0000,0x4000,0x7000,0x4800,0x4800,0x4800,0x4800,0x0000,0x0000, // u2095 0x0000,0x0000,0x0000,0x0000,0x4000,0x4800,0x5000,0x6000,0x5000,0x4800,0x0000,0x0000, // u2096 0x0000,0x0000,0x0000,0x0000,0x6000,0x2000,0x2000,0x2000,0x2000,0x7000,0x0000,0x0000, // u2097 0x0000,0x0000,0x0000,0x0000,0x0000,0xf000,0xa800,0xa800,0xa800,0xa800,0x0000,0x0000, // u2098 0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x4800,0x4800,0x4800,0x7000,0x4000,0x4000, // u209a 0x0000,0x0000,0xc000,0xa000,0xa000,0xc800,0x9c00,0x8800,0x8800,0x8400,0x0000,0x0000, // u20a7 0x0000,0x0000,0xc800,0xa800,0xa800,0x8800,0x8800,0xa800,0xa800,0xb000,0x0000,0x0000, // u20aa 0x0000,0x0000,0x0000,0x3800,0x4400,0xf000,0x4000,0xf000,0x4400,0x3800,0x0000,0x0000, // u20ac 0x0000,0x0000,0xf800,0x2000,0x3000,0x6000,0x3000,0x6000,0x2000,0x2000,0x0000,0x0000, // u20ae 0x0000,0x0000,0x7000,0xa800,0xa000,0xa000,0xa000,0xa000,0xa800,0x7000,0x0000,0x0000, // u2102 0x0000,0x0000,0x8000,0x8000,0xf000,0x8800,0x8800,0x8800,0x8800,0x8800,0x0000,0x0000, // u210e 0x0000,0x0000,0x4000,0xf000,0x4000,0x7000,0x4800,0x4800,0x4800,0x4800,0x0000,0x0000, // u210f 0x0000,0x0000,0x8800,0xc800,0xa800,0xd800,0xa800,0x9800,0x8800,0x8800,0x0000,0x0000, // u2115 0x0000,0x0000,0x9400,0x9400,0xd000,0xf000,0xf000,0xb400,0x9000,0x9400,0x0000,0x0000, // u2116 0x0000,0x0000,0x7000,0xc800,0xa800,0xa800,0xa800,0xa800,0xa800,0x7000,0x1800,0x0000, // u211a 0x0000,0x0000,0xf000,0xa800,0xa800,0xa800,0xb000,0xb000,0xa800,0xe400,0x0000,0x0000, // u211d 0x0000,0x0000,0xf400,0x5c00,0x5400,0x5400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2122 0x0000,0x0000,0xf800,0x1800,0x2800,0x5000,0xa000,0xc000,0x8000,0xf800,0x0000,0x0000, // u2124 0x0000,0x0000,0x7000,0x8800,0x8800,0x8800,0x8800,0x8800,0x5000,0xd800,0x0000,0x0000, // u2126 0x0000,0x0000,0x4800,0x4800,0x2400,0x6800,0x9000,0x9000,0x8800,0x4800,0x0000,0x0000, // u2135 0x0000,0x0000,0x0000,0x2000,0x6000,0xfc00,0x6000,0x2000,0x0000,0x0000,0x0000,0x0000, // u2190 0x0000,0x0000,0x2000,0x7000,0xf800,0x2000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2191 0x0000,0x0000,0x0000,0x1000,0x1800,0xfc00,0x1800,0x1000,0x0000,0x0000,0x0000,0x0000, // u2192 0x0000,0x0000,0x2000,0x2000,0x2000,0x2000,0x2000,0xf800,0x7000,0x2000,0x0000,0x0000, // u2193 0x0000,0x0000,0x0000,0x4800,0xcc00,0xfc00,0xcc00,0x4800,0x0000,0x0000,0x0000,0x0000, // u2194 0x0000,0x0000,0x2000,0x7000,0xf800,0x2000,0x2000,0xf800,0x7000,0x2000,0x0000,0x0000, // u2195 0x0000,0x0000,0x0000,0x2400,0x6400,0xfc00,0x6400,0x2400,0x0000,0x0000,0x0000,0x0000, // u21a4 0x0000,0x0000,0x0000,0x9000,0x9800,0xfc00,0x9800,0x9000,0x0000,0x0000,0x0000,0x0000, // u21a6 0x0000,0x0000,0x2000,0x7000,0xf800,0x2000,0xf800,0x7000,0x2000,0xf800,0x0000,0x0000, // u21a8 0x0000,0x0000,0x0800,0x0800,0x0800,0x2800,0x6800,0xf800,0x6000,0x2000,0x0000,0x0000, // u21b5 0x0000,0x0000,0xf000,0x3000,0x5000,0x9400,0x8400,0x8400,0x8400,0x7800,0x0000,0x0000, // u21bb 0x0000,0x0000,0x2000,0x4000,0xfc00,0x0000,0xfc00,0x0800,0x1000,0x0000,0x0000,0x0000, // u21cb 0x0000,0x0000,0x1000,0x0800,0xfc00,0x0000,0xfc00,0x4000,0x2000,0x0000,0x0000,0x0000, // u21cc 0x0000,0x0000,0x0000,0x2000,0x7c00,0xe000,0x7c00,0x2000,0x0000,0x0000,0x0000,0x0000, // u21d0 0x0000,0x0000,0x2000,0x7000,0xf800,0x5000,0x5000,0x5000,0x5000,0x5000,0x0000,0x0000, // u21d1 0x0000,0x0000,0x0000,0x1000,0xf800,0x1c00,0xf800,0x1000,0x0000,0x0000,0x0000,0x0000, // u21d2 0x0000,0x0000,0x5000,0x5000,0x5000,0x5000,0x5000,0xf800,0x7000,0x2000,0x0000,0x0000, // u21d3 0x0000,0x0000,0x0000,0x4800,0xfc00,0xcc00,0xfc00,0x4800,0x0000,0x0000,0x0000,0x0000, // u21d4 0x0000,0x0000,0x2000,0x7000,0xf800,0x5000,0x5000,0xf800,0x7000,0x2000,0x0000,0x0000, // u21d5 0x0000,0x0000,0x8800,0x8800,0xf800,0x5000,0x5000,0x5000,0x2000,0x2000,0x0000,0x0000, // u2200 0x0000,0x0000,0x0000,0xf800,0x0800,0x0800,0xf800,0x0800,0x0800,0xf800,0x0000,0x0000, // u2203 0x0000,0x0000,0x1000,0xf800,0x2800,0x2800,0xf800,0x4800,0x4800,0xf800,0x8000,0x0000, // u2204 0x0000,0x0000,0x0800,0x7000,0x9800,0xa800,0xa800,0xc800,0x7000,0x8000,0x0000,0x0000, // u2205 0x0000,0x0000,0x2000,0x2000,0x5000,0x5000,0x8800,0x8800,0x8800,0xf800,0x0000,0x0000, // u2206 0x0000,0x0000,0xf800,0x8800,0x8800,0x8800,0x5000,0x5000,0x2000,0x2000,0x0000,0x0000, // u2207 0x0000,0x0000,0x0000,0x3800,0x4000,0x8000,0xf800,0x8000,0x4000,0x3800,0x0000,0x0000, // u2208 0x0000,0x0000,0x0800,0x3800,0x5000,0x9000,0xf800,0xa000,0x6000,0x7800,0x4000,0x0000, // u2209 0x0000,0x0000,0x0000,0x0000,0x7800,0x8000,0xf800,0x8000,0x7800,0x0000,0x0000,0x0000, // u220a 0x0000,0x0000,0x0000,0xe000,0x1000,0x0800,0xf800,0x0800,0x1000,0xe000,0x0000,0x0000, // u220b 0x0000,0x0000,0x8000,0xe000,0x5000,0x4800,0xf800,0x2800,0x3000,0xf000,0x1000,0x0000, // u220c 0x0000,0x0000,0x0000,0x0000,0xf000,0x0800,0xf800,0x0800,0xf000,0x0000,0x0000,0x0000, // u220d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000, // u2212 0x0000,0x0000,0x0000,0xf800,0x0000,0x2000,0x2000,0xf800,0x2000,0x2000,0x0000,0x0000, // u2213 0x0000,0x0000,0x2000,0x2000,0x0000,0x2000,0x2000,0xf800,0x2000,0x2000,0x0000,0x0000, // u2214 0x0000,0x0000,0x0000,0x0000,0x0800,0x1000,0x2000,0x4000,0x8000,0x0000,0x0000,0x0000, // u2215 0x0000,0x0000,0x0000,0x0000,0x8000,0x4000,0x2000,0x1000,0x0800,0x0000,0x0000,0x0000, // u2216 0x0000,0x0000,0x0000,0x0000,0x3000,0x7800,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2219 0x0000,0x0c00,0x0800,0x0800,0x0800,0x8800,0x8800,0x4800,0x2800,0x1800,0x0000,0x0000, // u221a 0x0000,0x0000,0x0000,0x5000,0xa800,0xa800,0xa800,0x5000,0x0000,0x0000,0x0000,0x0000, // u221e 0x0000,0x0000,0x0000,0x8000,0x8000,0x8000,0x8000,0xf800,0x0000,0x0000,0x0000,0x0000, // u221f 0x0000,0x0000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000,0x0000,0x0000, // u2225 0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x5000,0x5000,0x8800,0x8800,0x0000,0x0000, // u2227 0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0x5000,0x5000,0x2000,0x2000,0x0000,0x0000, // u2228 0x0000,0x0000,0x0000,0x0000,0x7000,0x8800,0x8800,0x8800,0x8800,0x8800,0x0000,0x0000, // u2229 0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u222a 0x0000,0x0000,0x0000,0x0000,0x6800,0xb000,0x0000,0x6800,0xb000,0x0000,0x0000,0x0000, // u2248 0x0000,0x0000,0x0000,0x0800,0xf800,0x2000,0x4000,0xf800,0x8000,0x0000,0x0000,0x0000, // u2260 0x0000,0x0000,0x0000,0x0000,0xf800,0x0000,0xf800,0x0000,0xf800,0x0000,0x0000,0x0000, // u2261 0x0000,0x1000,0x2000,0x4000,0x8000,0x4000,0x2000,0x1000,0x0000,0xf800,0x0000,0x0000, // u2264 0x0000,0x4000,0x2000,0x1000,0x0800,0x1000,0x2000,0x4000,0x0000,0xf800,0x0000,0x0000, // u2265 0x0000,0x0000,0x0000,0x1400,0x2800,0x5000,0xa000,0x5000,0x2800,0x1400,0x0000,0x0000, // u226a 0x0000,0x0000,0x0000,0xa000,0x5000,0x2800,0x1400,0x2800,0x5000,0xa000,0x0000,0x0000, // u226b 0x0000,0x0000,0x0000,0x7800,0x8000,0x8000,0x8000,0x8000,0x7800,0x0000,0x0000,0x0000, // u2282 0x0000,0x0000,0x0000,0xf000,0x0800,0x0800,0x0800,0x0800,0xf000,0x0000,0x0000,0x0000, // u2283 0x0000,0x0000,0x7800,0x8000,0x8000,0x8000,0x8000,0x7800,0x0000,0xf800,0x0000,0x0000, // u2286 0x0000,0x0000,0xf000,0x0800,0x0800,0x0800,0x0800,0xf000,0x0000,0xf800,0x0000,0x0000, // u2287 0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x2000,0x2000,0xf800,0x0000,0x0000, // u22a5 0x0000,0x0000,0x7000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x0000,0x0000, // u22c2 0x0000,0x0000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u22c3 0x0000,0x0000,0x0800,0x7000,0x9800,0xa800,0xa800,0xc800,0x7000,0x8000,0x0000,0x0000, // u2300 0x0000,0x0000,0x0000,0x0000,0x2000,0x5000,0x8800,0x8800,0x8800,0xf800,0x0000,0x0000, // u2302 0x0000,0x0000,0x7000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000, // u2308 0x0000,0x0000,0x7000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000, // u2309 0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7000,0x0000,0x0000, // u230a 0x0000,0x0000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x7000,0x0000,0x0000, // u230b 0x0000,0x0000,0x0000,0x0000,0xf800,0x8000,0x8000,0x8000,0x0000,0x0000,0x0000,0x0000, // u2310 0x0000,0x0000,0x0000,0x0000,0x8000,0x8000,0x8000,0xf800,0x0000,0x0000,0x0000,0x0000, // u2319 0x0000,0x0000,0x1000,0x2800,0x2800,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u2320 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0xa000,0xa000,0x4000,0x0000,0x0000, // u2321 0x0800,0x1000,0x1000,0x2000,0x2000,0x2000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, // u239b 0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, // u239c 0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x2000,0x2000,0x2000,0x1000,0x1000,0x0800, // u239d 0x4000,0x2000,0x2000,0x1000,0x1000,0x1000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, // u239e 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, // u239f 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1000,0x1000,0x1000,0x2000,0x2000,0x4000, // u23a0 0x7800,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, // u23a1 0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, // u23a2 0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7800, // u23a3 0x7800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, // u23a4 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, // u23a5 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x7800, // u23a6 0x0c00,0x1000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u23a7 0x2000,0x2000,0x2000,0x2000,0x2000,0xc000,0xc000,0x2000,0x2000,0x2000,0x2000,0x2000, // u23a8 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x1000,0x0c00, // u23a9 0xc000,0x2000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u23ab 0x1000,0x1000,0x1000,0x1000,0x1000,0x0c00,0x0c00,0x1000,0x1000,0x1000,0x1000,0x1000, // u23ac 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x2000,0xc000, // u23ad 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u23ae 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23af 0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23ba 0x0000,0x0000,0x0000,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0x0000,0x0000,0x0000, // u23bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00, // u23bd 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u23d0 0x9000,0x9000,0xf000,0x9000,0x9000,0x0000,0x7c00,0x1000,0x1000,0x1000,0x1000,0x0000, // u2409 0x8000,0x8000,0x8000,0x8000,0xf000,0x0000,0x3c00,0x2000,0x3800,0x2000,0x2000,0x0000, // u240a 0x8800,0x8800,0x8800,0x5000,0x2000,0x0000,0x7c00,0x1000,0x1000,0x1000,0x1000,0x0000, // u240b 0xf000,0x8000,0xe000,0x8000,0x8000,0x0000,0x3c00,0x2000,0x3800,0x2000,0x2000,0x0000, // u240c 0x6000,0x9000,0x8000,0x9000,0x6000,0x0000,0x3800,0x2400,0x3800,0x2800,0x2400,0x0000, // u240d 0x9000,0xd000,0xb000,0x9000,0x9000,0x0000,0x2000,0x2000,0x2000,0x2000,0x3c00,0x0000, // u2424 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2500 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2501 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u2502 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, // u2503 0x0000,0x0000,0x0000,0x0000,0x0000,0xa800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2508 0x0000,0x0000,0x0000,0x0000,0x0000,0xa800,0xa800,0x0000,0x0000,0x0000,0x0000,0x0000, // u2509 0x2000,0x2000,0x0000,0x2000,0x2000,0x0000,0x2000,0x2000,0x0000,0x2000,0x2000,0x0000, // u250a 0x3000,0x3000,0x0000,0x3000,0x3000,0x0000,0x3000,0x3000,0x0000,0x3000,0x3000,0x0000, // u250b 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u250c 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x3c00,0x2000,0x2000,0x2000,0x2000,0x2000, // u250d 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, // u250e 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x3c00,0x3000,0x3000,0x3000,0x3000,0x3000, // u250f 0x0000,0x0000,0x0000,0x0000,0x0000,0xe000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u2510 0x0000,0x0000,0x0000,0x0000,0x0000,0xe000,0xe000,0x2000,0x2000,0x2000,0x2000,0x2000, // u2511 0x0000,0x0000,0x0000,0x0000,0x0000,0xf000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, // u2512 0x0000,0x0000,0x0000,0x0000,0x0000,0xf000,0xf000,0x3000,0x3000,0x3000,0x3000,0x3000, // u2513 0x2000,0x2000,0x2000,0x2000,0x2000,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2514 0x2000,0x2000,0x2000,0x2000,0x2000,0x3c00,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2515 0x3000,0x3000,0x3000,0x3000,0x3000,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2516 0x3000,0x3000,0x3000,0x3000,0x3000,0x3c00,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2517 0x2000,0x2000,0x2000,0x2000,0x2000,0xe000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2518 0x2000,0x2000,0x2000,0x2000,0x2000,0xe000,0xe000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2519 0x3000,0x3000,0x3000,0x3000,0x3000,0xf000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u251a 0x3000,0x3000,0x3000,0x3000,0x3000,0xf000,0xf000,0x0000,0x0000,0x0000,0x0000,0x0000, // u251b 0x2000,0x2000,0x2000,0x2000,0x2000,0x3c00,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u251c 0x2000,0x2000,0x2000,0x2000,0x2000,0x3c00,0x3c00,0x2000,0x2000,0x2000,0x2000,0x2000, // u251d 0x3000,0x3000,0x3000,0x3000,0x3000,0x3c00,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u251e 0x2000,0x2000,0x2000,0x2000,0x2000,0x3c00,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, // u251f 0x3000,0x3000,0x3000,0x3000,0x3000,0x3c00,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, // u2520 0x3000,0x3000,0x3000,0x3000,0x3000,0x3c00,0x3c00,0x2000,0x2000,0x2000,0x2000,0x2000, // u2521 0x2000,0x2000,0x2000,0x2000,0x2000,0x3c00,0x3c00,0x3000,0x3000,0x3000,0x3000,0x3000, // u2522 0x3000,0x3000,0x3000,0x3000,0x3000,0x3c00,0x3c00,0x3000,0x3000,0x3000,0x3000,0x3000, // u2523 0x2000,0x2000,0x2000,0x2000,0x2000,0xe000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u2524 0x2000,0x2000,0x2000,0x2000,0x2000,0xe000,0xe000,0x2000,0x2000,0x2000,0x2000,0x2000, // u2525 0x3000,0x3000,0x3000,0x3000,0x3000,0xf000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u2526 0x2000,0x2000,0x2000,0x2000,0x2000,0xf000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, // u2527 0x3000,0x3000,0x3000,0x3000,0x3000,0xf000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, // u2528 0x3000,0x3000,0x3000,0x3000,0x3000,0xf000,0xf000,0x2000,0x2000,0x2000,0x2000,0x2000, // u2529 0x2000,0x2000,0x2000,0x2000,0x2000,0xf000,0xf000,0x3000,0x3000,0x3000,0x3000,0x3000, // u252a 0x3000,0x3000,0x3000,0x3000,0x3000,0xf000,0xf000,0x3000,0x3000,0x3000,0x3000,0x3000, // u252b 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u252c 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xe000,0x2000,0x2000,0x2000,0x2000,0x2000, // u252d 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0x3c00,0x2000,0x2000,0x2000,0x2000,0x2000, // u252e 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0x2000,0x2000,0x2000,0x2000,0x2000, // u252f 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, // u2530 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xf000,0x3000,0x3000,0x3000,0x3000,0x3000, // u2531 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0x3c00,0x3000,0x3000,0x3000,0x3000,0x3000, // u2532 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0x3000,0x3000,0x3000,0x3000,0x3000, // u2533 0x2000,0x2000,0x2000,0x2000,0x2000,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2534 0x2000,0x2000,0x2000,0x2000,0x2000,0xfc00,0xe000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2535 0x2000,0x2000,0x2000,0x2000,0x2000,0xfc00,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2536 0x2000,0x2000,0x2000,0x2000,0x2000,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2537 0x3000,0x3000,0x3000,0x3000,0x3000,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2538 0x3000,0x3000,0x3000,0x3000,0x3000,0xfc00,0xf000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2539 0x3000,0x3000,0x3000,0x3000,0x3000,0xfc00,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u253a 0x3000,0x3000,0x3000,0x3000,0x3000,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000, // u253b 0x2000,0x2000,0x2000,0x2000,0x2000,0xfc00,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u253c 0x2000,0x2000,0x2000,0x2000,0x2000,0xfc00,0xe000,0x2000,0x2000,0x2000,0x2000,0x2000, // u253d 0x2000,0x2000,0x2000,0x2000,0x2000,0xfc00,0x3c00,0x2000,0x2000,0x2000,0x2000,0x2000, // u253e 0x2000,0x2000,0x2000,0x2000,0x2000,0xfc00,0xfc00,0x2000,0x2000,0x2000,0x2000,0x2000, // u253f 0x3000,0x3000,0x3000,0x3000,0x3000,0xfc00,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u2540 0x2000,0x2000,0x2000,0x2000,0x2000,0xfc00,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, // u2541 0x3000,0x3000,0x3000,0x3000,0x3000,0xfc00,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, // u2542 0x3000,0x3000,0x3000,0x3000,0x3000,0xfc00,0xe000,0x2000,0x2000,0x2000,0x2000,0x2000, // u2543 0x3000,0x3000,0x3000,0x3000,0x3000,0xfc00,0x3c00,0x2000,0x2000,0x2000,0x2000,0x2000, // u2544 0x2000,0x2000,0x2000,0x2000,0x2000,0xfc00,0xf000,0x3000,0x3000,0x3000,0x3000,0x3000, // u2545 0x2000,0x2000,0x2000,0x2000,0x2000,0xfc00,0x3c00,0x3000,0x3000,0x3000,0x3000,0x3000, // u2546 0x3000,0x3000,0x3000,0x3000,0x3000,0xfc00,0xfc00,0x2000,0x2000,0x2000,0x2000,0x2000, // u2547 0x2000,0x2000,0x2000,0x2000,0x2000,0xfc00,0xfc00,0x3000,0x3000,0x3000,0x3000,0x3000, // u2548 0x3000,0x3000,0x3000,0x3000,0x3000,0xfc00,0xf000,0x3000,0x3000,0x3000,0x3000,0x3000, // u2549 0x3000,0x3000,0x3000,0x3000,0x3000,0xfc00,0x3c00,0x3000,0x3000,0x3000,0x3000,0x3000, // u254a 0x3000,0x3000,0x3000,0x3000,0x3000,0xfc00,0xfc00,0x3000,0x3000,0x3000,0x3000,0x3000, // u254b 0x0000,0x0000,0x0000,0x0000,0xfc00,0x0000,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2550 0x5000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000, // u2551 0x0000,0x0000,0x0000,0x0000,0x3c00,0x2000,0x3c00,0x2000,0x2000,0x2000,0x2000,0x2000, // u2552 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000, // u2553 0x0000,0x0000,0x0000,0x0000,0x7c00,0x4000,0x5c00,0x5000,0x5000,0x5000,0x5000,0x5000, // u2554 0x0000,0x0000,0x0000,0x0000,0xe000,0x2000,0xe000,0x2000,0x2000,0x2000,0x2000,0x2000, // u2555 0x0000,0x0000,0x0000,0x0000,0x0000,0xf000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000, // u2556 0x0000,0x0000,0x0000,0x0000,0xf000,0x1000,0xd000,0x5000,0x5000,0x5000,0x5000,0x5000, // u2557 0x2000,0x2000,0x2000,0x2000,0x3c00,0x2000,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2558 0x5000,0x5000,0x5000,0x5000,0x5000,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2559 0x5000,0x5000,0x5000,0x5000,0x5c00,0x4000,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u255a 0x2000,0x2000,0x2000,0x2000,0xe000,0x2000,0xe000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255b 0x5000,0x5000,0x5000,0x5000,0x5000,0xf000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255c 0x5000,0x5000,0x5000,0x5000,0xd000,0x1000,0xf000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255d 0x2000,0x2000,0x2000,0x2000,0x3c00,0x2000,0x3c00,0x2000,0x2000,0x2000,0x2000,0x2000, // u255e 0x5000,0x5000,0x5000,0x5000,0x5000,0x5c00,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000, // u255f 0x5000,0x5000,0x5000,0x5000,0x5c00,0x4000,0x5c00,0x5000,0x5000,0x5000,0x5000,0x5000, // u2560 0x2000,0x2000,0x2000,0x2000,0xe000,0x2000,0xe000,0x2000,0x2000,0x2000,0x2000,0x2000, // u2561 0x5000,0x5000,0x5000,0x5000,0x5000,0xd000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000, // u2562 0x5000,0x5000,0x5000,0x5000,0xd000,0x1000,0xd000,0x5000,0x5000,0x5000,0x5000,0x5000, // u2563 0x0000,0x0000,0x0000,0x0000,0xfc00,0x0000,0xfc00,0x2000,0x2000,0x2000,0x2000,0x2000, // u2564 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000, // u2565 0x0000,0x0000,0x0000,0x0000,0xfc00,0x0000,0xdc00,0x5000,0x5000,0x5000,0x5000,0x5000, // u2566 0x2000,0x2000,0x2000,0x2000,0xfc00,0x0000,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2567 0x5000,0x5000,0x5000,0x5000,0x5000,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2568 0x5000,0x5000,0x5000,0x5000,0xdc00,0x0000,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2569 0x2000,0x2000,0x2000,0x2000,0xfc00,0x2000,0xfc00,0x2000,0x2000,0x2000,0x2000,0x2000, // u256a 0x5000,0x5000,0x5000,0x5000,0x5000,0xfc00,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000, // u256b 0x5000,0x5000,0x5000,0x5000,0xdc00,0x0000,0xdc00,0x5000,0x5000,0x5000,0x5000,0x5000, // u256c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x1000,0x2000,0x2000,0x2000,0x2000,0x2000, // u256d 0x0000,0x0000,0x0000,0x0000,0x0000,0x8000,0x4000,0x2000,0x2000,0x2000,0x2000,0x2000, // u256e 0x2000,0x2000,0x2000,0x2000,0x4000,0x8000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u256f 0x2000,0x2000,0x2000,0x2000,0x1000,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2570 0x0400,0x0400,0x0800,0x0800,0x1000,0x1000,0x2000,0x2000,0x4000,0x4000,0x8000,0x8000, // u2571 0x8000,0x8000,0x4000,0x4000,0x2000,0x2000,0x1000,0x1000,0x0800,0x0800,0x0400,0x0400, // u2572 0x8400,0x8400,0x4800,0x4800,0x3000,0x3000,0x3000,0x3000,0x4800,0x4800,0x8400,0x8400, // u2573 0x0000,0x0000,0x0000,0x0000,0x0000,0xe000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2574 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2575 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2576 0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u2577 0x0000,0x0000,0x0000,0x0000,0x0000,0xe000,0xe000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2578 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2579 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u257a 0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, // u257b 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u257c 0x2000,0x2000,0x2000,0x2000,0x2000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, // u257d 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xe000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257e 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u257f 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2580 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00, // u2581 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0xfc00, // u2582 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0xfc00,0xfc00, // u2583 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, // u2584 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, // u2585 0x0000,0x0000,0x0000,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, // u2586 0x0000,0x0000,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, // u2587 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, // u2588 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, // u2589 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, // u258a 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, // u258b 0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000, // u258c 0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000, // u258d 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, // u258e 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, // u258f 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, // u2590 0x9000,0x2400,0x9000,0x2400,0x9000,0x2400,0x9000,0x2400,0x9000,0x2400,0x9000,0x2400, // u2591 0xa800,0x5400,0xa800,0x5400,0xa800,0x5400,0xa800,0x5400,0xa800,0x5400,0xa800,0x5400, // u2592 0xd800,0xb400,0xd800,0xb400,0xd800,0xb400,0xd800,0xb400,0xd800,0xb400,0xd800,0xb400, // u2593 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000, // u2596 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, // u2597 0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2598 0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, // u2599 0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, // u259a 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000, // u259b 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, // u259c 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u259d 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000, // u259e 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, // u259f 0x0000,0x0000,0x0000,0x7800,0x7800,0x7800,0x7800,0x7800,0x0000,0x0000,0x0000,0x0000, // u25a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0xf800,0x0000,0x0000, // u25ac 0x0000,0x0000,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0x0000,0x0000, // u25ae 0x0000,0x0000,0x0000,0x3000,0x3000,0x7800,0x7800,0xfc00,0xfc00,0x0000,0x0000,0x0000, // u25b2 0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xfc00,0xf000,0xc000,0x0000,0x0000,0x0000, // u25b6 0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xfc00,0xf000,0xc000,0x0000,0x0000,0x0000, // u25ba 0x0000,0x0000,0x0000,0xfc00,0xfc00,0x7800,0x7800,0x3000,0x3000,0x0000,0x0000,0x0000, // u25bc 0x0000,0x0000,0x0000,0x0c00,0x3c00,0xfc00,0xfc00,0x3c00,0x0c00,0x0000,0x0000,0x0000, // u25c0 0x0000,0x0000,0x0000,0x0c00,0x3c00,0xfc00,0xfc00,0x3c00,0x0c00,0x0000,0x0000,0x0000, // u25c4 0x0000,0x0000,0x0000,0x2000,0x7000,0xf800,0x7000,0x2000,0x0000,0x0000,0x0000,0x0000, // u25c6 0x0000,0x0000,0x0000,0x2000,0x5000,0x8800,0x5000,0x2000,0x0000,0x0000,0x0000,0x0000, // u25ca 0x0000,0x0000,0x0000,0x0000,0x3000,0x4800,0x4800,0x3000,0x0000,0x0000,0x0000,0x0000, // u25cb 0x0000,0x0000,0x0000,0x0000,0x3000,0x7800,0x7800,0x3000,0x0000,0x0000,0x0000,0x0000, // u25cf 0xfc00,0xfc00,0xfc00,0xfc00,0xcc00,0x8400,0x8400,0xcc00,0xfc00,0xfc00,0xfc00,0xfc00, // u25d8 0xfc00,0xfc00,0xfc00,0xfc00,0xcc00,0xb400,0xb400,0xcc00,0xfc00,0xfc00,0xfc00,0xfc00, // u25d9 0x0000,0x0000,0x7800,0x8400,0xcc00,0x8400,0xb400,0xb400,0x8400,0x7800,0x0000,0x0000, // u263a 0x0000,0x0000,0x7800,0xfc00,0xb400,0xfc00,0x8400,0xcc00,0xfc00,0x7800,0x0000,0x0000, // u263b 0x0000,0x0000,0x0000,0x2000,0xa800,0x7000,0xd800,0x7000,0xa800,0x2000,0x0000,0x0000, // u263c 0x0000,0x0000,0x7000,0x8800,0x8800,0x8800,0x7000,0x2000,0xf800,0x2000,0x0000,0x0000, // u2640 0x0000,0x0000,0x3c00,0x0c00,0x1400,0x7000,0x8800,0x8800,0x8800,0x7000,0x0000,0x0000, // u2642 0x0000,0x0000,0x2000,0x2000,0x7000,0xf800,0xf800,0x7000,0x2000,0x7000,0x0000,0x0000, // u2660 0x0000,0x0000,0x2000,0x7000,0x2000,0xa800,0xf800,0xa800,0x2000,0x7000,0x0000,0x0000, // u2663 0x0000,0x0000,0x0000,0x5000,0xf800,0xf800,0xf800,0x7000,0x7000,0x2000,0x0000,0x0000, // u2665 0x0000,0x0000,0x0000,0x2000,0x7000,0xf800,0x7000,0x2000,0x0000,0x0000,0x0000,0x0000, // u2666 0x0000,0x0000,0x7800,0x4800,0x7800,0x4000,0x4000,0x4000,0x4000,0x8000,0x0000,0x0000, // u266a 0x0000,0x0000,0x7800,0x4800,0x7800,0x4800,0x4800,0x4800,0x4800,0x5000,0x8000,0x0000, // u266b 0x0000,0x0000,0x0400,0x0400,0x0800,0x8800,0x9000,0x5000,0x2000,0x2000,0x0000,0x0000, // u2713 0x0000,0x0000,0x0c00,0x0c00,0x1800,0xd800,0xf000,0x7000,0x6000,0x6000,0x0000,0x0000, // u2714 0x0000,0x0000,0x4800,0x2800,0x1000,0x1000,0x2800,0x2400,0x4000,0x4000,0x0000,0x0000, // u2717 0x0000,0x0000,0x1800,0xd800,0x7000,0x3000,0x7800,0x6c00,0xc000,0xc000,0x0000,0x0000, // u2718 0x0000,0x1000,0x1000,0x2000,0x2000,0x4000,0x2000,0x2000,0x1000,0x1000,0x0000,0x0000, // u27e8 0x0000,0x4000,0x4000,0x2000,0x2000,0x1000,0x2000,0x2000,0x4000,0x4000,0x0000,0x0000, // u27e9 0x0000,0x2800,0x2800,0x5000,0x5000,0xa000,0x5000,0x5000,0x2800,0x2800,0x0000,0x0000, // u27ea 0x0000,0xa000,0xa000,0x5000,0x5000,0x2800,0x5000,0x5000,0xa000,0xa000,0x0000,0x0000, // u27eb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2800 0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2801 0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2802 0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2803 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u2804 0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u2805 0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u2806 0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u2807 0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2808 0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2809 0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280a 0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280b 0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u280c 0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u280d 0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u280e 0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u280f 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2810 0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2811 0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2812 0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2813 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u2814 0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u2815 0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u2816 0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u2817 0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2818 0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2819 0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281a 0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281b 0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u281c 0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u281d 0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u281e 0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u281f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000, // u2820 0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000, // u2821 0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000, // u2822 0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000, // u2823 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000, // u2824 0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000, // u2825 0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000, // u2826 0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000, // u2827 0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000, // u2828 0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000, // u2829 0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000, // u282a 0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000, // u282b 0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000, // u282c 0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000, // u282d 0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000, // u282e 0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000, // u282f 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000, // u2830 0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000, // u2831 0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000, // u2832 0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000, // u2833 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000, // u2834 0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000, // u2835 0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000, // u2836 0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000, // u2837 0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000, // u2838 0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000, // u2839 0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000, // u283a 0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000, // u283b 0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000, // u283c 0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000, // u283d 0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000, // u283e 0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000, // u283f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2840 0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2841 0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2842 0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2843 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u2844 0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u2845 0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u2846 0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u2847 0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2848 0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2849 0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u284a 0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u284b 0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u284c 0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u284d 0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u284e 0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u284f 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2850 0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2851 0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2852 0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2853 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u2854 0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u2855 0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u2856 0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u2857 0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2858 0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2859 0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u285a 0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u285b 0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u285c 0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u285d 0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u285e 0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u285f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000, // u2860 0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000, // u2861 0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000, // u2862 0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000, // u2863 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000, // u2864 0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000, // u2865 0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000, // u2866 0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000, // u2867 0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000, // u2868 0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000, // u2869 0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000, // u286a 0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000, // u286b 0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000, // u286c 0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000, // u286d 0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000, // u286e 0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000, // u286f 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000, // u2870 0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000, // u2871 0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000, // u2872 0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000, // u2873 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000, // u2874 0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000, // u2875 0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000, // u2876 0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000, // u2877 0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000, // u2878 0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000, // u2879 0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000, // u287a 0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000, // u287b 0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000, // u287c 0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000, // u287d 0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000, // u287e 0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000, // u287f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000, // u2880 0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000, // u2881 0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000, // u2882 0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000, // u2883 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000, // u2884 0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000, // u2885 0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000, // u2886 0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000, // u2887 0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000, // u2888 0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000, // u2889 0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000, // u288a 0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000, // u288b 0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000, // u288c 0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000, // u288d 0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000, // u288e 0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000, // u288f 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000, // u2890 0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000, // u2891 0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000, // u2892 0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000, // u2893 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000, // u2894 0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000, // u2895 0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000, // u2896 0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000, // u2897 0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000, // u2898 0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000, // u2899 0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000, // u289a 0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000, // u289b 0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000, // u289c 0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000, // u289d 0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000, // u289e 0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000, // u289f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000, // u28a0 0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000, // u28a1 0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000, // u28a2 0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000, // u28a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000, // u28a4 0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000, // u28a5 0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000, // u28a6 0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000, // u28a7 0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000, // u28a8 0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000, // u28a9 0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000, // u28aa 0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000, // u28ab 0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000, // u28ac 0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000, // u28ad 0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000, // u28ae 0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000, // u28af 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000, // u28b0 0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000, // u28b1 0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000, // u28b2 0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000, // u28b3 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000, // u28b4 0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000, // u28b5 0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000, // u28b6 0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000, // u28b7 0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000, // u28b8 0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000, // u28b9 0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000, // u28ba 0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000, // u28bb 0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000, // u28bc 0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000, // u28bd 0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000, // u28be 0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000, // u28bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000, // u28c0 0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000, // u28c1 0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000, // u28c2 0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000, // u28c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000, // u28c4 0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000, // u28c5 0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000, // u28c6 0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000, // u28c7 0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000, // u28c8 0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000, // u28c9 0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000, // u28ca 0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000, // u28cb 0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000, // u28cc 0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000, // u28cd 0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000, // u28ce 0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000, // u28cf 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000, // u28d0 0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000, // u28d1 0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000, // u28d2 0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000, // u28d3 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000, // u28d4 0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000, // u28d5 0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000, // u28d6 0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000, // u28d7 0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000, // u28d8 0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000, // u28d9 0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000, // u28da 0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000, // u28db 0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000, // u28dc 0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000, // u28dd 0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000, // u28de 0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000, // u28df 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000, // u28e0 0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000, // u28e1 0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000, // u28e2 0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000, // u28e3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000, // u28e4 0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000, // u28e5 0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000, // u28e6 0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000, // u28e7 0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000, // u28e8 0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000, // u28e9 0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000, // u28ea 0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000, // u28eb 0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000, // u28ec 0x4800,0x4800,0x0000,0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000, // u28ed 0x0800,0x0800,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000, // u28ee 0x4800,0x4800,0x0000,0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000, // u28ef 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000, // u28f0 0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000, // u28f1 0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000, // u28f2 0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000, // u28f3 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000, // u28f4 0x4000,0x4000,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000, // u28f5 0x0000,0x0000,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000, // u28f6 0x4000,0x4000,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000, // u28f7 0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000, // u28f8 0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000, // u28f9 0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000, // u28fa 0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000, // u28fb 0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000, // u28fc 0x4800,0x4800,0x0000,0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000, // u28fd 0x0800,0x0800,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000, // u28fe 0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000,0x4800,0x4800,0x0000, // u28ff 0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0x0000,0x0000,0x8800,0x8800,0x0000,0x0000, // u2e2c 0x8000,0x9000,0xb800,0x9000,0x9000,0x9000,0x2000,0x4000,0x8000,0x8000,0x8000,0x8000, // ue0a0 0x8000,0x8000,0x8000,0x8000,0xf000,0x0000,0x2400,0x3400,0x2c00,0x2400,0x2400,0x0000, // ue0a1 0x0000,0x3000,0x4800,0x4800,0x4800,0xfc00,0xfc00,0xcc00,0xcc00,0xfc00,0xfc00,0x0000, // ue0a2 0x8000,0xc000,0xe000,0xf000,0xf800,0xfc00,0xfc00,0xf800,0xf000,0xe000,0xc000,0x8000, // ue0b0 0x8000,0x4000,0x2000,0x1000,0x0800,0x0400,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000, // ue0b1 0x0400,0x0c00,0x1c00,0x3c00,0x7c00,0xfc00,0xfc00,0x7c00,0x3c00,0x1c00,0x0c00,0x0400, // ue0b2 0x0400,0x0800,0x1000,0x2000,0x4000,0x8000,0x8000,0x4000,0x2000,0x1000,0x0800,0x0400, // ue0b3 0x0000,0x0000,0x0000,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x4800,0x3000, // uf6be 0x0000,0x0000,0xf800,0x8800,0x8800,0x8800,0x8800,0x8800,0x8800,0xf800,0x0000,0x0000 // ufffd }; // codepoints array constexpr std::array fixedfont_codepoints = { 0x0000,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e, 0x002f,0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e, 0x003f,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e, 0x004f,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e, 0x005f,0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e, 0x006f,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e, 0x00a0,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af, 0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf, 0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf, 0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df, 0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef, 0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff, 0x0100,0x0101,0x0102,0x0103,0x0104,0x0105,0x0106,0x0107,0x0108,0x0109,0x010a,0x010b,0x010c,0x010d,0x010e,0x010f, 0x0110,0x0111,0x0112,0x0113,0x0114,0x0115,0x0116,0x0117,0x0118,0x0119,0x011a,0x011b,0x011c,0x011d,0x011e,0x011f, 0x0120,0x0121,0x0122,0x0123,0x0124,0x0125,0x0126,0x0127,0x0128,0x0129,0x012a,0x012b,0x012c,0x012d,0x012e,0x012f, 0x0130,0x0131,0x0132,0x0133,0x0134,0x0135,0x0136,0x0137,0x0138,0x0139,0x013a,0x013b,0x013c,0x013d,0x013e,0x013f, 0x0140,0x0141,0x0142,0x0143,0x0144,0x0145,0x0146,0x0147,0x0148,0x0149,0x014a,0x014b,0x014c,0x014d,0x014e,0x014f, 0x0150,0x0151,0x0152,0x0153,0x0154,0x0155,0x0156,0x0157,0x0158,0x0159,0x015a,0x015b,0x015c,0x015d,0x015e,0x015f, 0x0160,0x0161,0x0162,0x0163,0x0164,0x0165,0x0166,0x0167,0x0168,0x0169,0x016a,0x016b,0x016c,0x016d,0x016e,0x016f, 0x0170,0x0171,0x0172,0x0173,0x0174,0x0175,0x0176,0x0177,0x0178,0x0179,0x017a,0x017b,0x017c,0x017d,0x017e,0x017f, 0x0186,0x018e,0x018f,0x0190,0x0192,0x019d,0x019e,0x01b5,0x01b6,0x01b7,0x01cd,0x01ce,0x01cf,0x01d0,0x01d1,0x01d2, 0x01d3,0x01d4,0x01e2,0x01e3,0x01e4,0x01e5,0x01e6,0x01e7,0x01e8,0x01e9,0x01ea,0x01eb,0x01ec,0x01ed,0x01ee,0x01ef, 0x01f0,0x01f4,0x01f5,0x01fc,0x01fd,0x01fe,0x01ff,0x0218,0x0219,0x021a,0x021b,0x0232,0x0233,0x0237,0x0254,0x0258, 0x0259,0x025b,0x0272,0x0292,0x02bb,0x02bc,0x02bd,0x02c6,0x02c7,0x02d8,0x02d9,0x02db,0x02dc,0x02dd,0x0300,0x0301, 0x0302,0x0303,0x0304,0x0305,0x0306,0x0307,0x0308,0x030a,0x030b,0x030c,0x0329,0x0384,0x0385,0x0386,0x0387,0x0388, 0x0389,0x038a,0x038c,0x038e,0x038f,0x0390,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039a, 0x039b,0x039c,0x039d,0x039e,0x039f,0x03a0,0x03a1,0x03a3,0x03a4,0x03a5,0x03a6,0x03a7,0x03a8,0x03a9,0x03aa,0x03ab, 0x03ac,0x03ad,0x03ae,0x03af,0x03b0,0x03b1,0x03b2,0x03b3,0x03b4,0x03b5,0x03b6,0x03b7,0x03b8,0x03b9,0x03ba,0x03bb, 0x03bc,0x03bd,0x03be,0x03bf,0x03c0,0x03c1,0x03c2,0x03c3,0x03c4,0x03c5,0x03c6,0x03c7,0x03c8,0x03c9,0x03ca,0x03cb, 0x03cc,0x03cd,0x03ce,0x03d1,0x03d5,0x03f0,0x03f1,0x03f2,0x03f3,0x03f4,0x03f5,0x03f6,0x0400,0x0401,0x0402,0x0403, 0x0404,0x0405,0x0406,0x0407,0x0408,0x0409,0x040a,0x040b,0x040c,0x040d,0x040e,0x040f,0x0410,0x0411,0x0412,0x0413, 0x0414,0x0415,0x0416,0x0417,0x0418,0x0419,0x041a,0x041b,0x041c,0x041d,0x041e,0x041f,0x0420,0x0421,0x0422,0x0423, 0x0424,0x0425,0x0426,0x0427,0x0428,0x0429,0x042a,0x042b,0x042c,0x042d,0x042e,0x042f,0x0430,0x0431,0x0432,0x0433, 0x0434,0x0435,0x0436,0x0437,0x0438,0x0439,0x043a,0x043b,0x043c,0x043d,0x043e,0x043f,0x0440,0x0441,0x0442,0x0443, 0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,0x044a,0x044b,0x044c,0x044d,0x044e,0x044f,0x0450,0x0451,0x0452,0x0453, 0x0454,0x0455,0x0456,0x0457,0x0458,0x0459,0x045a,0x045b,0x045c,0x045d,0x045e,0x045f,0x0462,0x0463,0x046a,0x046b, 0x0490,0x0491,0x0492,0x0493,0x0494,0x0495,0x0496,0x0497,0x0498,0x0499,0x049a,0x049b,0x049c,0x049d,0x04a0,0x04a1, 0x04a2,0x04a3,0x04a4,0x04a5,0x04aa,0x04ab,0x04ae,0x04af,0x04b0,0x04b1,0x04b2,0x04b3,0x04b6,0x04b7,0x04b8,0x04b9, 0x04ba,0x04bb,0x04c0,0x04c1,0x04c2,0x04cf,0x04d0,0x04d1,0x04d2,0x04d3,0x04d4,0x04d5,0x04d6,0x04d7,0x04d8,0x04d9, 0x04da,0x04db,0x04dc,0x04dd,0x04de,0x04df,0x04e2,0x04e3,0x04e4,0x04e5,0x04e6,0x04e7,0x04e8,0x04e9,0x04ea,0x04eb, 0x04ec,0x04ed,0x04ee,0x04ef,0x04f0,0x04f1,0x04f2,0x04f3,0x04f4,0x04f5,0x04f8,0x04f9,0x05d0,0x05d1,0x05d2,0x05d3, 0x05d4,0x05d5,0x05d6,0x05d7,0x05d8,0x05d9,0x05da,0x05db,0x05dc,0x05dd,0x05de,0x05df,0x05e0,0x05e1,0x05e2,0x05e3, 0x05e4,0x05e5,0x05e6,0x05e7,0x05e8,0x05e9,0x05ea,0x1e0c,0x1e0d,0x1e34,0x1e35,0x1e36,0x1e37,0x1e40,0x1e41,0x1e42, 0x1e43,0x1e44,0x1e45,0x1e46,0x1e47,0x1e6c,0x1e6d,0x1eb8,0x1eb9,0x1ebc,0x1ebd,0x1eca,0x1ecb,0x1ecc,0x1ecd,0x1ee4, 0x1ee5,0x1ef8,0x1ef9,0x2000,0x2001,0x2002,0x2003,0x2004,0x2005,0x2006,0x2007,0x2008,0x2009,0x200a,0x200b,0x200c, 0x200d,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x2015,0x2016,0x2017,0x2018,0x2019,0x201a,0x201b,0x201c, 0x201d,0x201e,0x201f,0x2020,0x2021,0x2022,0x2026,0x2030,0x2032,0x2033,0x2039,0x203a,0x203c,0x203e,0x2070,0x2071, 0x2074,0x2075,0x2076,0x2077,0x2078,0x2079,0x207a,0x207b,0x207c,0x207d,0x207e,0x207f,0x2080,0x2081,0x2082,0x2083, 0x2084,0x2085,0x2086,0x2087,0x2088,0x2089,0x208a,0x208b,0x208c,0x208d,0x208e,0x2090,0x2091,0x2092,0x2093,0x2094, 0x2095,0x2096,0x2097,0x2098,0x209a,0x20a7,0x20aa,0x20ac,0x20ae,0x2102,0x210e,0x210f,0x2115,0x2116,0x211a,0x211d, 0x2122,0x2124,0x2126,0x2135,0x2190,0x2191,0x2192,0x2193,0x2194,0x2195,0x21a4,0x21a6,0x21a8,0x21b5,0x21bb,0x21cb, 0x21cc,0x21d0,0x21d1,0x21d2,0x21d3,0x21d4,0x21d5,0x2200,0x2203,0x2204,0x2205,0x2206,0x2207,0x2208,0x2209,0x220a, 0x220b,0x220c,0x220d,0x2212,0x2213,0x2214,0x2215,0x2216,0x2219,0x221a,0x221e,0x221f,0x2225,0x2227,0x2228,0x2229, 0x222a,0x2248,0x2260,0x2261,0x2264,0x2265,0x226a,0x226b,0x2282,0x2283,0x2286,0x2287,0x22a5,0x22c2,0x22c3,0x2300, 0x2302,0x2308,0x2309,0x230a,0x230b,0x2310,0x2319,0x2320,0x2321,0x239b,0x239c,0x239d,0x239e,0x239f,0x23a0,0x23a1, 0x23a2,0x23a3,0x23a4,0x23a5,0x23a6,0x23a7,0x23a8,0x23a9,0x23ab,0x23ac,0x23ad,0x23ae,0x23af,0x23ba,0x23bb,0x23bc, 0x23bd,0x23d0,0x2409,0x240a,0x240b,0x240c,0x240d,0x2424,0x2500,0x2501,0x2502,0x2503,0x2508,0x2509,0x250a,0x250b, 0x250c,0x250d,0x250e,0x250f,0x2510,0x2511,0x2512,0x2513,0x2514,0x2515,0x2516,0x2517,0x2518,0x2519,0x251a,0x251b, 0x251c,0x251d,0x251e,0x251f,0x2520,0x2521,0x2522,0x2523,0x2524,0x2525,0x2526,0x2527,0x2528,0x2529,0x252a,0x252b, 0x252c,0x252d,0x252e,0x252f,0x2530,0x2531,0x2532,0x2533,0x2534,0x2535,0x2536,0x2537,0x2538,0x2539,0x253a,0x253b, 0x253c,0x253d,0x253e,0x253f,0x2540,0x2541,0x2542,0x2543,0x2544,0x2545,0x2546,0x2547,0x2548,0x2549,0x254a,0x254b, 0x2550,0x2551,0x2552,0x2553,0x2554,0x2555,0x2556,0x2557,0x2558,0x2559,0x255a,0x255b,0x255c,0x255d,0x255e,0x255f, 0x2560,0x2561,0x2562,0x2563,0x2564,0x2565,0x2566,0x2567,0x2568,0x2569,0x256a,0x256b,0x256c,0x256d,0x256e,0x256f, 0x2570,0x2571,0x2572,0x2573,0x2574,0x2575,0x2576,0x2577,0x2578,0x2579,0x257a,0x257b,0x257c,0x257d,0x257e,0x257f, 0x2580,0x2581,0x2582,0x2583,0x2584,0x2585,0x2586,0x2587,0x2588,0x2589,0x258a,0x258b,0x258c,0x258d,0x258e,0x258f, 0x2590,0x2591,0x2592,0x2593,0x2596,0x2597,0x2598,0x2599,0x259a,0x259b,0x259c,0x259d,0x259e,0x259f,0x25a0,0x25ac, 0x25ae,0x25b2,0x25b6,0x25ba,0x25bc,0x25c0,0x25c4,0x25c6,0x25ca,0x25cb,0x25cf,0x25d8,0x25d9,0x263a,0x263b,0x263c, 0x2640,0x2642,0x2660,0x2663,0x2665,0x2666,0x266a,0x266b,0x2713,0x2714,0x2717,0x2718,0x27e8,0x27e9,0x27ea,0x27eb, 0x2800,0x2801,0x2802,0x2803,0x2804,0x2805,0x2806,0x2807,0x2808,0x2809,0x280a,0x280b,0x280c,0x280d,0x280e,0x280f, 0x2810,0x2811,0x2812,0x2813,0x2814,0x2815,0x2816,0x2817,0x2818,0x2819,0x281a,0x281b,0x281c,0x281d,0x281e,0x281f, 0x2820,0x2821,0x2822,0x2823,0x2824,0x2825,0x2826,0x2827,0x2828,0x2829,0x282a,0x282b,0x282c,0x282d,0x282e,0x282f, 0x2830,0x2831,0x2832,0x2833,0x2834,0x2835,0x2836,0x2837,0x2838,0x2839,0x283a,0x283b,0x283c,0x283d,0x283e,0x283f, 0x2840,0x2841,0x2842,0x2843,0x2844,0x2845,0x2846,0x2847,0x2848,0x2849,0x284a,0x284b,0x284c,0x284d,0x284e,0x284f, 0x2850,0x2851,0x2852,0x2853,0x2854,0x2855,0x2856,0x2857,0x2858,0x2859,0x285a,0x285b,0x285c,0x285d,0x285e,0x285f, 0x2860,0x2861,0x2862,0x2863,0x2864,0x2865,0x2866,0x2867,0x2868,0x2869,0x286a,0x286b,0x286c,0x286d,0x286e,0x286f, 0x2870,0x2871,0x2872,0x2873,0x2874,0x2875,0x2876,0x2877,0x2878,0x2879,0x287a,0x287b,0x287c,0x287d,0x287e,0x287f, 0x2880,0x2881,0x2882,0x2883,0x2884,0x2885,0x2886,0x2887,0x2888,0x2889,0x288a,0x288b,0x288c,0x288d,0x288e,0x288f, 0x2890,0x2891,0x2892,0x2893,0x2894,0x2895,0x2896,0x2897,0x2898,0x2899,0x289a,0x289b,0x289c,0x289d,0x289e,0x289f, 0x28a0,0x28a1,0x28a2,0x28a3,0x28a4,0x28a5,0x28a6,0x28a7,0x28a8,0x28a9,0x28aa,0x28ab,0x28ac,0x28ad,0x28ae,0x28af, 0x28b0,0x28b1,0x28b2,0x28b3,0x28b4,0x28b5,0x28b6,0x28b7,0x28b8,0x28b9,0x28ba,0x28bb,0x28bc,0x28bd,0x28be,0x28bf, 0x28c0,0x28c1,0x28c2,0x28c3,0x28c4,0x28c5,0x28c6,0x28c7,0x28c8,0x28c9,0x28ca,0x28cb,0x28cc,0x28cd,0x28ce,0x28cf, 0x28d0,0x28d1,0x28d2,0x28d3,0x28d4,0x28d5,0x28d6,0x28d7,0x28d8,0x28d9,0x28da,0x28db,0x28dc,0x28dd,0x28de,0x28df, 0x28e0,0x28e1,0x28e2,0x28e3,0x28e4,0x28e5,0x28e6,0x28e7,0x28e8,0x28e9,0x28ea,0x28eb,0x28ec,0x28ed,0x28ee,0x28ef, 0x28f0,0x28f1,0x28f2,0x28f3,0x28f4,0x28f5,0x28f6,0x28f7,0x28f8,0x28f9,0x28fa,0x28fb,0x28fc,0x28fd,0x28fe,0x28ff, 0x2e2c,0xe0a0,0xe0a1,0xe0a2,0xe0b0,0xe0b1,0xe0b2,0xe0b3,0xf6be,0xfffd }; } // namespace // -- end of autogenerated text --- namespace fixed_font_12b { // -- start of autogenerated text --- // definition section for font: ter-u12b.bdf constexpr int CHARCOUNT = 1354; constexpr int WIDTH = 6; constexpr int HEIGHT = 12; constexpr int OFFSET_X = 0; constexpr int OFFSET_Y = 0; constexpr FixedFont_info_t fixedfont_info = { "Terminus", // font name "ter-u12b.bdf", // font name internal CHARCOUNT, // num of chars WIDTH, HEIGHT, OFFSET_X, OFFSET_Y, true // bold }; // font bitmap definitions // same as 12n! // codepoints array // same as 12n! } // namespace // -- end of autogenerated text --- namespace fixed_font_14n { // -- start of autogenerated text --- // definition section for font: ter-u14n.bdf constexpr int CHARCOUNT = 1354; constexpr int WIDTH = 8; constexpr int HEIGHT = 14; constexpr int OFFSET_X = 0; constexpr int OFFSET_Y = 0; constexpr FixedFont_info_t fixedfont_info = { "Terminus", // font name "ter-u14n.bdf", // font name internal CHARCOUNT, // num of chars WIDTH, HEIGHT, OFFSET_X, OFFSET_Y, false // bold }; // font bitmap definitions constexpr std::array fixedfont_bitmap = { 0x0000,0x0000,0x6600,0x4200,0x0000,0x4200,0x4200,0x4200,0x0000,0x4200,0x4200,0x6600,0x0000,0x0000, // u0000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0020 0x0000,0x0000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x1000,0x1000,0x0000,0x0000, // u0021 0x0000,0x2400,0x2400,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0022 0x0000,0x0000,0x2400,0x2400,0x2400,0x7e00,0x2400,0x2400,0x7e00,0x2400,0x2400,0x2400,0x0000,0x0000, // u0023 0x0000,0x1000,0x1000,0x7c00,0x9200,0x9000,0x9000,0x7c00,0x1200,0x1200,0x9200,0x7c00,0x1000,0x1000, // u0024 0x0000,0x0000,0x6400,0x9400,0x6800,0x0800,0x1000,0x1000,0x2000,0x2c00,0x5200,0x4c00,0x0000,0x0000, // u0025 0x0000,0x0000,0x1800,0x2400,0x2400,0x1800,0x3000,0x4a00,0x4400,0x4400,0x4400,0x3a00,0x0000,0x0000, // u0026 0x0000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0027 0x0000,0x0000,0x0800,0x1000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x1000,0x0800,0x0000,0x0000, // u0028 0x0000,0x0000,0x2000,0x1000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1000,0x2000,0x0000,0x0000, // u0029 0x0000,0x0000,0x0000,0x0000,0x0000,0x2400,0x1800,0x7e00,0x1800,0x2400,0x0000,0x0000,0x0000,0x0000, // u002a 0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u002b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x2000,0x0000, // u002c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x0000,0x0000, // u002e 0x0000,0x0000,0x0400,0x0400,0x0800,0x0800,0x1000,0x1000,0x2000,0x2000,0x4000,0x4000,0x0000,0x0000, // u002f 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4600,0x4a00,0x5200,0x6200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u0030 0x0000,0x0000,0x0800,0x1800,0x2800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x3e00,0x0000,0x0000, // u0031 0x0000,0x0000,0x3c00,0x4200,0x4200,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x7e00,0x0000,0x0000, // u0032 0x0000,0x0000,0x3c00,0x4200,0x4200,0x0200,0x1c00,0x0200,0x0200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u0033 0x0000,0x0000,0x0200,0x0600,0x0a00,0x1200,0x2200,0x4200,0x7e00,0x0200,0x0200,0x0200,0x0000,0x0000, // u0034 0x0000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7c00,0x0200,0x0200,0x0200,0x4200,0x3c00,0x0000,0x0000, // u0035 0x0000,0x0000,0x1c00,0x2000,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u0036 0x0000,0x0000,0x7e00,0x0200,0x0200,0x0400,0x0400,0x0800,0x0800,0x1000,0x1000,0x1000,0x0000,0x0000, // u0037 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x3c00,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u0038 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x0400,0x3800,0x0000,0x0000, // u0039 0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x0000,0x0000,0x0000,0x1000,0x1000,0x0000,0x0000, // u003a 0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x0000,0x0000,0x0000,0x1000,0x1000,0x2000,0x0000, // u003b 0x0000,0x0000,0x0000,0x0400,0x0800,0x1000,0x2000,0x4000,0x2000,0x1000,0x0800,0x0400,0x0000,0x0000, // u003c 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0000,0x0000,0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u003d 0x0000,0x0000,0x0000,0x4000,0x2000,0x1000,0x0800,0x0400,0x0800,0x1000,0x2000,0x4000,0x0000,0x0000, // u003e 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x0400,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x0000, // u003f 0x0000,0x0000,0x7c00,0x8200,0x9e00,0xa200,0xa200,0xa200,0xa600,0x9a00,0x8000,0x7e00,0x0000,0x0000, // u0040 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u0041 0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x7c00,0x4200,0x4200,0x4200,0x4200,0x7c00,0x0000,0x0000, // u0042 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4000,0x4000,0x4000,0x4000,0x4200,0x4200,0x3c00,0x0000,0x0000, // u0043 0x0000,0x0000,0x7800,0x4400,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4400,0x7800,0x0000,0x0000, // u0044 0x0000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000, // u0045 0x0000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000, // u0046 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4000,0x4000,0x4e00,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u0047 0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u0048 0x0000,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u0049 0x0000,0x0000,0x0e00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x4400,0x4400,0x3800,0x0000,0x0000, // u004a 0x0000,0x0000,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x0000,0x0000, // u004b 0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000, // u004c 0x0000,0x0000,0x8200,0xc600,0xaa00,0x9200,0x9200,0x8200,0x8200,0x8200,0x8200,0x8200,0x0000,0x0000, // u004d 0x0000,0x0000,0x4200,0x4200,0x4200,0x6200,0x5200,0x4a00,0x4600,0x4200,0x4200,0x4200,0x0000,0x0000, // u004e 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u004f 0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x7c00,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000, // u0050 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4a00,0x3c00,0x0200,0x0000, // u0051 0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x7c00,0x5000,0x4800,0x4400,0x4200,0x0000,0x0000, // u0052 0x0000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x3c00,0x0200,0x0200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u0053 0x0000,0x0000,0xfe00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000, // u0054 0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u0055 0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x2400,0x2400,0x2400,0x1800,0x1800,0x0000,0x0000, // u0056 0x0000,0x0000,0x8200,0x8200,0x8200,0x8200,0x8200,0x9200,0x9200,0xaa00,0xc600,0x8200,0x0000,0x0000, // u0057 0x0000,0x0000,0x4200,0x4200,0x2400,0x2400,0x1800,0x1800,0x2400,0x2400,0x4200,0x4200,0x0000,0x0000, // u0058 0x0000,0x0000,0x8200,0x8200,0x4400,0x4400,0x2800,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000, // u0059 0x0000,0x0000,0x7e00,0x0200,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x7e00,0x0000,0x0000, // u005a 0x0000,0x0000,0x3800,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x3800,0x0000,0x0000, // u005b 0x0000,0x0000,0x4000,0x4000,0x2000,0x2000,0x1000,0x1000,0x0800,0x0800,0x0400,0x0400,0x0000,0x0000, // u005c 0x0000,0x0000,0x3800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x3800,0x0000,0x0000, // u005d 0x0000,0x1000,0x2800,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0000, // u005f 0x1000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0060 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u0061 0x0000,0x0000,0x4000,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x7c00,0x0000,0x0000, // u0062 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4000,0x4200,0x3c00,0x0000,0x0000, // u0063 0x0000,0x0000,0x0200,0x0200,0x0200,0x3e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u0064 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x0000, // u0065 0x0000,0x0000,0x0e00,0x1000,0x1000,0x7c00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000, // u0066 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x3c00, // u0067 0x0000,0x0000,0x4000,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u0068 0x0000,0x0000,0x1000,0x1000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u0069 0x0000,0x0000,0x0400,0x0400,0x0000,0x0c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x4400,0x4400,0x3800, // u006a 0x0000,0x0000,0x4000,0x4000,0x4000,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x0000,0x0000, // u006b 0x0000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u006c 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x0000,0x0000, // u006d 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u006e 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u006f 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x7c00,0x4000,0x4000, // u0070 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200, // u0071 0x0000,0x0000,0x0000,0x0000,0x0000,0x5e00,0x6000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000, // u0072 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4000,0x4000,0x3c00,0x0200,0x0200,0x7c00,0x0000,0x0000, // u0073 0x0000,0x0000,0x1000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x1000,0x1000,0x1000,0x0e00,0x0000,0x0000, // u0074 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u0075 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x2400,0x2400,0x1800,0x1800,0x0000,0x0000, // u0076 0x0000,0x0000,0x0000,0x0000,0x0000,0x8200,0x8200,0x9200,0x9200,0x9200,0x9200,0x7c00,0x0000,0x0000, // u0077 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x2400,0x1800,0x2400,0x4200,0x4200,0x0000,0x0000, // u0078 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x3c00, // u0079 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0400,0x0800,0x1000,0x2000,0x4000,0x7e00,0x0000,0x0000, // u007a 0x0000,0x0000,0x0c00,0x1000,0x1000,0x1000,0x2000,0x1000,0x1000,0x1000,0x1000,0x0c00,0x0000,0x0000, // u007b 0x0000,0x0000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000, // u007c 0x0000,0x0000,0x3000,0x0800,0x0800,0x0800,0x0400,0x0800,0x0800,0x0800,0x0800,0x3000,0x0000,0x0000, // u007d 0x0000,0x6200,0x9200,0x8c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a0 0x0000,0x0000,0x1000,0x1000,0x0000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000, // u00a1 0x0000,0x0000,0x0000,0x1000,0x1000,0x7c00,0x9200,0x9000,0x9000,0x9000,0x9200,0x7c00,0x1000,0x1000, // u00a2 0x0000,0x0000,0x1800,0x2400,0x2000,0x2000,0x7800,0x2000,0x2000,0x2000,0x2200,0x7e00,0x0000,0x0000, // u00a3 0x0000,0x0000,0x0000,0x0000,0x4400,0x3800,0x4400,0x4400,0x4400,0x3800,0x4400,0x0000,0x0000,0x0000, // u00a4 0x0000,0x0000,0x8200,0x8200,0x4400,0x2800,0x1000,0x7c00,0x1000,0x7c00,0x1000,0x1000,0x0000,0x0000, // u00a5 0x0000,0x0000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000, // u00a6 0x0000,0x3800,0x4400,0x4000,0x3000,0x4800,0x4400,0x4400,0x2400,0x1800,0x0400,0x4400,0x3800,0x0000, // u00a7 0x2400,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a8 0x0000,0x0000,0x0000,0x7e00,0x8100,0x9900,0xa500,0xa100,0xa500,0x9900,0x8100,0x7e00,0x0000,0x0000, // u00a9 0x0000,0x3800,0x0400,0x3c00,0x4400,0x3c00,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x1200,0x2400,0x4800,0x9000,0x4800,0x2400,0x1200,0x0000,0x0000, // u00ab 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0200,0x0200,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ac 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ad 0x0000,0x0000,0x0000,0x7e00,0x8100,0xb900,0xa500,0xb900,0xa900,0xa500,0x8100,0x7e00,0x0000,0x0000, // u00ae 0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00af 0x0000,0x1800,0x2400,0x2400,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x0000,0x7c00,0x0000,0x0000, // u00b1 0x0000,0x1800,0x2400,0x0400,0x0800,0x1000,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b2 0x0000,0x3800,0x0400,0x1800,0x0400,0x0400,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b3 0x0800,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4600,0x7a00,0x4000,0x4000, // u00b5 0x0000,0x0000,0x7e00,0x9200,0x9200,0x9200,0x9200,0x7200,0x1200,0x1200,0x1200,0x1200,0x0000,0x0000, // u00b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x2000, // u00b8 0x0000,0x1000,0x3000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b9 0x0000,0x3800,0x4400,0x4400,0x4400,0x3800,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x9000,0x4800,0x2400,0x1200,0x2400,0x4800,0x9000,0x0000,0x0000, // u00bb 0x2000,0x6000,0x2000,0x2200,0x2400,0x0800,0x1000,0x2200,0x4600,0x8a00,0x1e00,0x0200,0x0200,0x0000, // u00bc 0x2000,0x6000,0x2000,0x2200,0x2400,0x0800,0x1000,0x2000,0x4c00,0x9200,0x0400,0x0800,0x1e00,0x0000, // u00bd 0xe000,0x1000,0x6000,0x1200,0xe400,0x0800,0x1000,0x2200,0x4600,0x8a00,0x1e00,0x0200,0x0200,0x0000, // u00be 0x0000,0x0000,0x1000,0x1000,0x0000,0x1000,0x1000,0x2000,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u00bf 0x1000,0x0800,0x0000,0x3c00,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u00c0 0x0800,0x1000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u00c1 0x1800,0x2400,0x0000,0x3c00,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u00c2 0x3200,0x4c00,0x0000,0x3c00,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u00c3 0x2400,0x2400,0x0000,0x3c00,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u00c4 0x1800,0x2400,0x1800,0x3c00,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u00c5 0x0000,0x0000,0x7e00,0x9000,0x9000,0x9000,0xfc00,0x9000,0x9000,0x9000,0x9000,0x9e00,0x0000,0x0000, // u00c6 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4000,0x4000,0x4000,0x4000,0x4200,0x4200,0x3c00,0x1000,0x2000, // u00c7 0x1000,0x0800,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000, // u00c8 0x0800,0x1000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000, // u00c9 0x1800,0x2400,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000, // u00ca 0x2400,0x2400,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000, // u00cb 0x2000,0x1000,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u00cc 0x0800,0x1000,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u00cd 0x1800,0x2400,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u00ce 0x4400,0x4400,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u00cf 0x0000,0x0000,0x7800,0x4400,0x4200,0x4200,0xf200,0x4200,0x4200,0x4200,0x4400,0x7800,0x0000,0x0000, // u00d0 0x3200,0x4c00,0x0000,0x4200,0x4200,0x6200,0x5200,0x4a00,0x4600,0x4200,0x4200,0x4200,0x0000,0x0000, // u00d1 0x1000,0x0800,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u00d2 0x0800,0x1000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u00d3 0x1800,0x2400,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u00d4 0x3200,0x4c00,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u00d5 0x2400,0x2400,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u00d6 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x2400,0x1800,0x1800,0x2400,0x4200,0x0000,0x0000,0x0000, // u00d7 0x0000,0x0000,0x3c00,0x4300,0x4200,0x4600,0x4a00,0x5200,0x6200,0x4200,0xc200,0x3c00,0x0000,0x0000, // u00d8 0x1000,0x0800,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u00d9 0x0800,0x1000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u00da 0x1800,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u00db 0x2400,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u00dc 0x0800,0x1000,0x8200,0x8200,0x4400,0x4400,0x2800,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000, // u00dd 0x0000,0x0000,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x7c00,0x4000,0x4000,0x0000,0x0000, // u00de 0x0000,0x0000,0x3800,0x4400,0x4400,0x4800,0x7c00,0x4200,0x4200,0x4200,0x6200,0x5c00,0x0000,0x0000, // u00df 0x0000,0x0000,0x1000,0x0800,0x0000,0x3c00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u00e0 0x0000,0x0000,0x0800,0x1000,0x0000,0x3c00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u00e1 0x0000,0x0000,0x1800,0x2400,0x0000,0x3c00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u00e2 0x0000,0x0000,0x3200,0x4c00,0x0000,0x3c00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u00e3 0x0000,0x0000,0x2400,0x2400,0x0000,0x3c00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u00e4 0x0000,0x0000,0x1800,0x2400,0x1800,0x3c00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u00e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x6c00,0x1200,0x7200,0x9e00,0x9000,0x9000,0x6c00,0x0000,0x0000, // u00e6 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4000,0x4200,0x3c00,0x1000,0x2000, // u00e7 0x0000,0x0000,0x1000,0x0800,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x0000, // u00e8 0x0000,0x0000,0x0800,0x1000,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x0000, // u00e9 0x0000,0x0000,0x1800,0x2400,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x0000, // u00ea 0x0000,0x0000,0x2400,0x2400,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x0000, // u00eb 0x0000,0x0000,0x2000,0x1000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u00ec 0x0000,0x0000,0x0800,0x1000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u00ed 0x0000,0x0000,0x3000,0x4800,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u00ee 0x0000,0x0000,0x4800,0x4800,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u00ef 0x0000,0x0000,0x2800,0x1000,0x2800,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u00f0 0x0000,0x0000,0x3200,0x4c00,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u00f1 0x0000,0x0000,0x1000,0x0800,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u00f2 0x0000,0x0000,0x0800,0x1000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u00f3 0x0000,0x0000,0x1800,0x2400,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u00f4 0x0000,0x0000,0x3200,0x4c00,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u00f5 0x0000,0x0000,0x2400,0x2400,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u00f6 0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x0000,0x7c00,0x0000,0x1000,0x1000,0x0000,0x0000,0x0000, // u00f7 0x0000,0x0000,0x0000,0x0000,0x0200,0x3c00,0x4600,0x4a00,0x5200,0x6200,0x4200,0xbc00,0x0000,0x0000, // u00f8 0x0000,0x0000,0x1000,0x0800,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u00f9 0x0000,0x0000,0x0800,0x1000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u00fa 0x0000,0x0000,0x1800,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u00fb 0x0000,0x0000,0x2400,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u00fc 0x0000,0x0000,0x0800,0x1000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x3c00, // u00fd 0x0000,0x0000,0x4000,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x7c00,0x4000,0x4000, // u00fe 0x0000,0x0000,0x2400,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x3c00, // u00ff 0x3c00,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u0100 0x0000,0x0000,0x0000,0x3c00,0x0000,0x3c00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u0101 0x2400,0x1800,0x0000,0x3c00,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u0102 0x0000,0x0000,0x2400,0x1800,0x0000,0x3c00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u0103 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0400,0x0300, // u0104 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x3e00,0x0400,0x0300, // u0105 0x0800,0x1000,0x0000,0x3c00,0x4200,0x4200,0x4000,0x4000,0x4000,0x4200,0x4200,0x3c00,0x0000,0x0000, // u0106 0x0000,0x0000,0x0800,0x1000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4000,0x4200,0x3c00,0x0000,0x0000, // u0107 0x1800,0x2400,0x0000,0x3c00,0x4200,0x4200,0x4000,0x4000,0x4000,0x4200,0x4200,0x3c00,0x0000,0x0000, // u0108 0x0000,0x0000,0x1800,0x2400,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4000,0x4200,0x3c00,0x0000,0x0000, // u0109 0x1000,0x1000,0x0000,0x3c00,0x4200,0x4200,0x4000,0x4000,0x4000,0x4200,0x4200,0x3c00,0x0000,0x0000, // u010a 0x0000,0x0000,0x1000,0x1000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4000,0x4200,0x3c00,0x0000,0x0000, // u010b 0x2400,0x1800,0x0000,0x3c00,0x4200,0x4200,0x4000,0x4000,0x4000,0x4200,0x4200,0x3c00,0x0000,0x0000, // u010c 0x0000,0x0000,0x2400,0x1800,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4000,0x4200,0x3c00,0x0000,0x0000, // u010d 0x2400,0x1800,0x0000,0x7800,0x4400,0x4200,0x4200,0x4200,0x4200,0x4200,0x4400,0x7800,0x0000,0x0000, // u010e 0x2400,0x1800,0x0200,0x0200,0x0200,0x3e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u010f 0x0000,0x0000,0x7800,0x4400,0x4200,0x4200,0xf200,0x4200,0x4200,0x4200,0x4400,0x7800,0x0000,0x0000, // u0110 0x0000,0x0000,0x0200,0x0f00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u0111 0x3c00,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000, // u0112 0x0000,0x0000,0x0000,0x3c00,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x0000, // u0113 0x2400,0x1800,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000, // u0114 0x0000,0x0000,0x2400,0x1800,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x0000, // u0115 0x1000,0x1000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000, // u0116 0x0000,0x0000,0x1000,0x1000,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x0000, // u0117 0x0000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x4000,0x7e00,0x0400,0x0300, // u0118 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0800,0x0600, // u0119 0x2400,0x1800,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000, // u011a 0x0000,0x0000,0x2400,0x1800,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x0000, // u011b 0x1800,0x2400,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4e00,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u011c 0x0000,0x0000,0x1800,0x2400,0x0000,0x3e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x3c00, // u011d 0x2400,0x1800,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4e00,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u011e 0x0000,0x0000,0x2400,0x1800,0x0000,0x3e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x3c00, // u011f 0x1000,0x1000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4e00,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u0120 0x0000,0x0000,0x0800,0x0800,0x0000,0x3e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x3c00, // u0121 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4000,0x4000,0x4e00,0x4200,0x4200,0x4200,0x3c00,0x1000,0x2000, // u0122 0x0000,0x0400,0x0800,0x0800,0x0000,0x3e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x3c00, // u0123 0x1800,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u0124 0x0c00,0x1200,0x4000,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u0125 0x0000,0x0000,0x4200,0xff00,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u0126 0x0000,0x0000,0x4000,0xf000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u0127 0x3200,0x4c00,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u0128 0x0000,0x0000,0x3400,0x5800,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u0129 0x7c00,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u012a 0x0000,0x0000,0x0000,0x7800,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u012b 0x2400,0x1800,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u012c 0x0000,0x0000,0x4800,0x3000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u012d 0x0000,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x1000,0x0c00, // u012e 0x0000,0x0000,0x1000,0x1000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x1000,0x0c00, // u012f 0x1000,0x1000,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u0130 0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u0131 0x0000,0x0000,0xe700,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x5200,0x5200,0xec00,0x0000,0x0000, // u0132 0x0000,0x0000,0x4200,0x4200,0x0000,0xc600,0x4200,0x4200,0x4200,0x4200,0x4200,0xf200,0x1200,0x0c00, // u0133 0x0c00,0x1200,0x0000,0x0e00,0x0400,0x0400,0x0400,0x0400,0x0400,0x4400,0x4400,0x3800,0x0000,0x0000, // u0134 0x0000,0x0000,0x0c00,0x1200,0x0000,0x0c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x4400,0x4400,0x3800, // u0135 0x0000,0x0000,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x5200,0x1000,0x2000, // u0136 0x0000,0x0000,0x4000,0x4000,0x4000,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x5200,0x1000,0x2000, // u0137 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x0000,0x0000, // u0138 0x2000,0x4000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000, // u0139 0x0800,0x1000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u013a 0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x1000,0x2000, // u013b 0x0000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x1000,0x2000, // u013c 0x2400,0x1800,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000, // u013d 0x4800,0x3000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u013e 0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4400,0x4400,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000, // u013f 0x0000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1100,0x1100,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u0140 0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x6000,0xc000,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000, // u0141 0x0000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1800,0x3000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u0142 0x0800,0x1000,0x4200,0x4200,0x4200,0x6200,0x5200,0x4a00,0x4600,0x4200,0x4200,0x4200,0x0000,0x0000, // u0143 0x0000,0x0000,0x0800,0x1000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u0144 0x0000,0x0000,0x4200,0x4200,0x4200,0x6200,0x5200,0x4a00,0x4600,0x4200,0x4200,0x5200,0x1000,0x2000, // u0145 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x5200,0x1000,0x2000, // u0146 0x2400,0x1800,0x4200,0x4200,0x4200,0x6200,0x5200,0x4a00,0x4600,0x4200,0x4200,0x4200,0x0000,0x0000, // u0147 0x0000,0x0000,0x2400,0x1800,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u0148 0x0000,0x4000,0x4000,0x8000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u0149 0x0000,0x0000,0x4200,0x4200,0x4200,0x6200,0x5200,0x4a00,0x4600,0x4200,0x4200,0x4200,0x0200,0x0c00, // u014a 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0200,0x0c00, // u014b 0x3c00,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u014c 0x0000,0x0000,0x0000,0x3c00,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u014d 0x2400,0x1800,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u014e 0x0000,0x0000,0x2400,0x1800,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u014f 0x1200,0x2400,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u0150 0x0000,0x0000,0x1200,0x2400,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u0151 0x0000,0x0000,0x7e00,0x9000,0x9000,0x9000,0x9c00,0x9000,0x9000,0x9000,0x9000,0x7e00,0x0000,0x0000, // u0152 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x9200,0x9200,0x9e00,0x9000,0x9000,0x7c00,0x0000,0x0000, // u0153 0x0800,0x1000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x7c00,0x5000,0x4800,0x4400,0x4200,0x0000,0x0000, // u0154 0x0000,0x0000,0x0800,0x1000,0x0000,0x5e00,0x6000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000, // u0155 0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x7c00,0x5000,0x4800,0x4400,0x5200,0x1000,0x2000, // u0156 0x0000,0x0000,0x0000,0x0000,0x0000,0x5e00,0x6000,0x4000,0x4000,0x4000,0x4000,0x6000,0x2000,0x4000, // u0157 0x2400,0x1800,0x0000,0x7c00,0x4200,0x4200,0x4200,0x7c00,0x5000,0x4800,0x4400,0x4200,0x0000,0x0000, // u0158 0x0000,0x0000,0x2400,0x1800,0x0000,0x5e00,0x6000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000, // u0159 0x0800,0x1000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x3c00,0x0200,0x0200,0x4200,0x3c00,0x0000,0x0000, // u015a 0x0000,0x0000,0x0400,0x0800,0x0000,0x3e00,0x4000,0x4000,0x3c00,0x0200,0x0200,0x7c00,0x0000,0x0000, // u015b 0x1800,0x2400,0x0000,0x3c00,0x4200,0x4000,0x4000,0x3c00,0x0200,0x0200,0x4200,0x3c00,0x0000,0x0000, // u015c 0x0000,0x0000,0x1800,0x2400,0x0000,0x3e00,0x4000,0x4000,0x3c00,0x0200,0x0200,0x7c00,0x0000,0x0000, // u015d 0x0000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x3c00,0x0200,0x0200,0x4200,0x4200,0x3c00,0x1000,0x2000, // u015e 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4000,0x4000,0x3c00,0x0200,0x0200,0x7c00,0x1000,0x2000, // u015f 0x2400,0x1800,0x0000,0x3c00,0x4200,0x4000,0x4000,0x3c00,0x0200,0x0200,0x4200,0x3c00,0x0000,0x0000, // u0160 0x0000,0x0000,0x2400,0x1800,0x0000,0x3e00,0x4000,0x4000,0x3c00,0x0200,0x0200,0x7c00,0x0000,0x0000, // u0161 0x0000,0x0000,0xfe00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1800,0x0800,0x1000, // u0162 0x0000,0x0000,0x1000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x1000,0x1000,0x1000,0x0e00,0x0400,0x0800, // u0163 0x2400,0x1800,0x0000,0xfe00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000, // u0164 0x2400,0x1800,0x0000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x1000,0x1000,0x1000,0x0e00,0x0000,0x0000, // u0165 0x0000,0x0000,0xfe00,0x1000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000, // u0166 0x0000,0x0000,0x1000,0x1000,0x1000,0x7c00,0x1000,0x3800,0x1000,0x1000,0x1000,0x0e00,0x0000,0x0000, // u0167 0x3200,0x4c00,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u0168 0x0000,0x0000,0x3200,0x4c00,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u0169 0x3c00,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u016a 0x0000,0x0000,0x0000,0x3c00,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u016b 0x2400,0x1800,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u016c 0x0000,0x0000,0x2400,0x1800,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u016d 0x1800,0x2400,0x1800,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u016e 0x0000,0x0000,0x1800,0x2400,0x1800,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u016f 0x1200,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u0170 0x0000,0x0000,0x1200,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u0171 0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0800,0x0600, // u0172 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0400,0x0300, // u0173 0x1800,0x2400,0x0000,0x8200,0x8200,0x8200,0x8200,0x9200,0x9200,0xaa00,0xc600,0x8200,0x0000,0x0000, // u0174 0x0000,0x0000,0x1800,0x2400,0x0000,0x8200,0x8200,0x9200,0x9200,0x9200,0x9200,0x7c00,0x0000,0x0000, // u0175 0x1800,0x2400,0x0000,0x8200,0x8200,0x4400,0x4400,0x2800,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000, // u0176 0x0000,0x0000,0x1800,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x3c00, // u0177 0x4400,0x4400,0x0000,0x8200,0x8200,0x4400,0x4400,0x2800,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000, // u0178 0x0800,0x1000,0x0000,0x7e00,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x7e00,0x0000,0x0000, // u0179 0x0000,0x0000,0x0800,0x1000,0x0000,0x7e00,0x0400,0x0800,0x1000,0x2000,0x4000,0x7e00,0x0000,0x0000, // u017a 0x1000,0x1000,0x0000,0x7e00,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x7e00,0x0000,0x0000, // u017b 0x0000,0x0000,0x1000,0x1000,0x0000,0x7e00,0x0400,0x0800,0x1000,0x2000,0x4000,0x7e00,0x0000,0x0000, // u017c 0x2400,0x1800,0x0000,0x7e00,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x7e00,0x0000,0x0000, // u017d 0x0000,0x0000,0x2400,0x1800,0x0000,0x7e00,0x0400,0x0800,0x1000,0x2000,0x4000,0x7e00,0x0000,0x0000, // u017e 0x0000,0x0000,0x0e00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000, // u017f 0x0000,0x0000,0x3c00,0x4200,0x4200,0x0200,0x0200,0x0200,0x0200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u0186 0x0000,0x0000,0x7e00,0x0200,0x0200,0x0200,0x1e00,0x0200,0x0200,0x0200,0x0200,0x7e00,0x0000,0x0000, // u018e 0x0000,0x0000,0x3c00,0x4200,0x0200,0x0200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u018f 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4000,0x3800,0x4000,0x4000,0x4200,0x4200,0x3c00,0x0000,0x0000, // u0190 0x0000,0x0000,0x0c00,0x1200,0x1000,0x1000,0x7c00,0x1000,0x1000,0x1000,0x1000,0x1000,0x9000,0x6000, // u0192 0x0000,0x0000,0x4200,0x4200,0x4200,0x6200,0x5200,0x4a00,0x4600,0x4200,0x4200,0x4200,0x4000,0x8000, // u019d 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0200,0x0200, // u019e 0x0000,0x0000,0x7e00,0x0200,0x0400,0x0800,0x7e00,0x1000,0x2000,0x4000,0x4000,0x7e00,0x0000,0x0000, // u01b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0400,0x0800,0x7c00,0x1000,0x2000,0x7e00,0x0000,0x0000, // u01b6 0x0000,0x0000,0x7e00,0x0200,0x0400,0x0800,0x1c00,0x0200,0x0200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u01b7 0x2400,0x1800,0x0000,0x3c00,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u01cd 0x0000,0x0000,0x2400,0x1800,0x0000,0x3c00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u01ce 0x2400,0x1800,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u01cf 0x0000,0x0000,0x4800,0x3000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u01d0 0x2400,0x1800,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u01d1 0x0000,0x0000,0x2400,0x1800,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u01d2 0x2400,0x1800,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u01d3 0x0000,0x0000,0x2400,0x1800,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u01d4 0x7c00,0x0000,0x7e00,0x9000,0x9000,0x9000,0xfc00,0x9000,0x9000,0x9000,0x9000,0x9e00,0x0000,0x0000, // u01e2 0x0000,0x0000,0x0000,0x7c00,0x0000,0x6c00,0x1200,0x7200,0x9e00,0x9000,0x9000,0x6c00,0x0000,0x0000, // u01e3 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4000,0x4000,0x4e00,0x4200,0x4f00,0x4200,0x3c00,0x0000,0x0000, // u01e4 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4200,0x4200,0x4f00,0x4200,0x4200,0x3e00,0x0200,0x3c00, // u01e5 0x2400,0x1800,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4e00,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u01e6 0x0000,0x0000,0x2400,0x1800,0x0000,0x3e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x3c00, // u01e7 0x2400,0x1800,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x0000,0x0000, // u01e8 0x2400,0x1800,0x4000,0x4000,0x4000,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x0000,0x0000, // u01e9 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0800,0x0600, // u01ea 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0800,0x0600, // u01eb 0x3c00,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0800,0x0600, // u01ec 0x0000,0x0000,0x0000,0x3c00,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0800,0x0600, // u01ed 0x2400,0x1800,0x0000,0x7e00,0x0400,0x0800,0x1c00,0x0200,0x0200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u01ee 0x0000,0x0000,0x2400,0x1800,0x0000,0x7e00,0x0200,0x0400,0x0800,0x1c00,0x0200,0x0200,0x4200,0x3c00, // u01ef 0x0000,0x0000,0x1200,0x0c00,0x0000,0x0c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x4400,0x4400,0x3800, // u01f0 0x0800,0x1000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4e00,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u01f4 0x0000,0x0000,0x0400,0x0800,0x0000,0x3e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x3c00, // u01f5 0x0800,0x1000,0x0000,0x7e00,0x9000,0x9000,0x9000,0xfc00,0x9000,0x9000,0x9000,0x9e00,0x0000,0x0000, // u01fc 0x0000,0x0000,0x0800,0x1000,0x0000,0x6c00,0x1200,0x7200,0x9e00,0x9000,0x9000,0x6c00,0x0000,0x0000, // u01fd 0x0800,0x1000,0x0000,0x3d00,0x4200,0x4600,0x4a00,0x5200,0x6200,0x4200,0xc200,0x3c00,0x0000,0x0000, // u01fe 0x0000,0x0000,0x0800,0x1000,0x0200,0x3c00,0x4600,0x4a00,0x5200,0x6200,0x4200,0xbc00,0x0000,0x0000, // u01ff 0x0000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x3c00,0x0200,0x0200,0x4200,0x4200,0x3c00,0x1000,0x2000, // u0218 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4000,0x4000,0x3c00,0x0200,0x0200,0x7c00,0x1000,0x2000, // u0219 0x0000,0x0000,0xfe00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1800,0x0800,0x1000, // u021a 0x0000,0x0000,0x1000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x1000,0x1000,0x1000,0x0e00,0x0200,0x0400, // u021b 0x7c00,0x0000,0x8200,0x8200,0x4400,0x4400,0x2800,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000, // u0232 0x0000,0x0000,0x0000,0x3c00,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x3c00, // u0233 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x4400,0x4400,0x3800, // u0237 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x0200,0x0200,0x0200,0x4200,0x3c00,0x0000,0x0000, // u0254 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x0200,0x0200,0x3c00,0x0000,0x0000, // u0258 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x0200,0x0200,0x7e00,0x4200,0x4200,0x3c00,0x0000,0x0000, // u0259 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4000,0x3800,0x4000,0x4200,0x3c00,0x0000,0x0000, // u025b 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4000,0x8000, // u0272 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0200,0x0400,0x0800,0x1c00,0x0200,0x0200,0x4200,0x3c00, // u0292 0x0800,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bb 0x0800,0x0800,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bc 0x1000,0x1000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bd 0x1800,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02c6 0x2400,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02c7 0x2400,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02d8 0x1000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02d9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0800,0x0600, // u02db 0x3200,0x4c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02dc 0x1200,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02dd 0x1000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0300 0x0800,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0301 0x1800,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0302 0x3200,0x4c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0303 0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0304 0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0305 0x2400,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0306 0x1000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0307 0x2400,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0308 0x1800,0x2400,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030a 0x1200,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030b 0x2400,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1000, // u0329 0x4000,0x8000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0384 0x0800,0x1000,0x0000,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0385 0x4000,0x8000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u0386 0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0387 0x4000,0x8000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000, // u0388 0x4000,0x8000,0x4200,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u0389 0x4000,0x8000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u038a 0x4000,0x8000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u038c 0x4000,0x8000,0x0000,0x8200,0x8200,0x4400,0x4400,0x2800,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000, // u038e 0x4000,0x8000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x2400,0x2400,0x6600,0x0000,0x0000, // u038f 0x0800,0x1000,0x4800,0x4800,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0c00,0x0000,0x0000, // u0390 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u0391 0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x7c00,0x4200,0x4200,0x4200,0x4200,0x7c00,0x0000,0x0000, // u0392 0x0000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000, // u0393 0x0000,0x0000,0x1000,0x1000,0x2800,0x2800,0x4400,0x4400,0x4400,0x8200,0x8200,0xfe00,0x0000,0x0000, // u0394 0x0000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000, // u0395 0x0000,0x0000,0x7e00,0x0200,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x7e00,0x0000,0x0000, // u0396 0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u0397 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x5a00,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u0398 0x0000,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u0399 0x0000,0x0000,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x0000,0x0000, // u039a 0x0000,0x0000,0x1000,0x1000,0x2800,0x2800,0x4400,0x4400,0x4400,0x8200,0x8200,0x8200,0x0000,0x0000, // u039b 0x0000,0x0000,0x8200,0xc600,0xaa00,0x9200,0x9200,0x8200,0x8200,0x8200,0x8200,0x8200,0x0000,0x0000, // u039c 0x0000,0x0000,0x4200,0x4200,0x4200,0x6200,0x5200,0x4a00,0x4600,0x4200,0x4200,0x4200,0x0000,0x0000, // u039d 0x0000,0x0000,0x7e00,0x0000,0x0000,0x0000,0x3c00,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0000,0x0000, // u039e 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u039f 0x0000,0x0000,0x7e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u03a0 0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x7c00,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000, // u03a1 0x0000,0x0000,0x7e00,0x4000,0x2000,0x1000,0x0800,0x0800,0x1000,0x2000,0x4000,0x7e00,0x0000,0x0000, // u03a3 0x0000,0x0000,0xfe00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000, // u03a4 0x0000,0x0000,0x8200,0x8200,0x4400,0x4400,0x2800,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000, // u03a5 0x0000,0x0000,0x1000,0x7c00,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x7c00,0x1000,0x0000,0x0000, // u03a6 0x0000,0x0000,0x4200,0x4200,0x2400,0x2400,0x1800,0x1800,0x2400,0x2400,0x4200,0x4200,0x0000,0x0000, // u03a7 0x0000,0x0000,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x7c00,0x1000,0x1000,0x0000,0x0000, // u03a8 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x2400,0x2400,0x6600,0x0000,0x0000, // u03a9 0x4400,0x4400,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u03aa 0x4400,0x4400,0x0000,0x8200,0x8200,0x4400,0x4400,0x2800,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000, // u03ab 0x0000,0x0000,0x0800,0x1000,0x0000,0x3a00,0x4600,0x4400,0x4400,0x4400,0x4600,0x3a00,0x0000,0x0000, // u03ac 0x0000,0x0000,0x0800,0x1000,0x0000,0x3c00,0x4200,0x4000,0x3800,0x4000,0x4200,0x3c00,0x0000,0x0000, // u03ad 0x0000,0x0000,0x0800,0x1000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0200,0x0200, // u03ae 0x0000,0x0000,0x0800,0x1000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0c00,0x0000,0x0000, // u03af 0x0800,0x1000,0x0000,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u03b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x3a00,0x4600,0x4400,0x4400,0x4400,0x4600,0x3a00,0x0000,0x0000, // u03b1 0x0000,0x0000,0x3800,0x4400,0x4400,0x4800,0x7c00,0x4200,0x4200,0x4200,0x4200,0x7c00,0x4000,0x4000, // u03b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x8200,0x8200,0x4400,0x4400,0x2800,0x2800,0x1000,0x1000,0x1000, // u03b3 0x0000,0x0000,0x3e00,0x1000,0x0800,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u03b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4000,0x3800,0x4000,0x4200,0x3c00,0x0000,0x0000, // u03b5 0x0000,0x0000,0x7e00,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x4000,0x4000,0x3c00,0x0200,0x0400, // u03b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0200,0x0200, // u03b7 0x0000,0x0000,0x3800,0x4400,0x4400,0x4400,0x7c00,0x4400,0x4400,0x4400,0x4400,0x3800,0x0000,0x0000, // u03b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0c00,0x0000,0x0000, // u03b9 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x0000,0x0000, // u03ba 0x0000,0x0000,0x2000,0x2000,0x1000,0x1000,0x2800,0x2800,0x4400,0x4400,0x8200,0x8200,0x0000,0x0000, // u03bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4600,0x7a00,0x4000,0x4000, // u03bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x2400,0x2400,0x1800,0x1800,0x0000,0x0000, // u03bd 0x0000,0x0000,0x3e00,0x4000,0x4000,0x4000,0x3c00,0x4000,0x4000,0x4000,0x4000,0x3c00,0x0200,0x0400, // u03be 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u03bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u03c0 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x7c00,0x4000,0x4000, // u03c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4000,0x4000,0x3c00,0x0200,0x0400, // u03c2 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4400,0x4400,0x4400,0x4400,0x4400,0x3800,0x0000,0x0000, // u03c3 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x1000,0x1000,0x1000,0x1000,0x1000,0x0c00,0x0000,0x0000, // u03c4 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u03c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x4c00,0x9200,0x9200,0x9200,0x9200,0x9200,0x7c00,0x1000,0x1000, // u03c6 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x2400,0x2400,0x1800,0x2400,0x2400,0x4200,0x4200, // u03c7 0x0000,0x0000,0x0000,0x0000,0x0000,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x7c00,0x1000,0x1000, // u03c8 0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x8200,0x9200,0x9200,0x9200,0x9200,0x6c00,0x0000,0x0000, // u03c9 0x0000,0x0000,0x4800,0x4800,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0c00,0x0000,0x0000, // u03ca 0x0000,0x0000,0x2400,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u03cb 0x0000,0x0000,0x0800,0x1000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u03cc 0x0000,0x0000,0x0800,0x1000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u03cd 0x0000,0x0000,0x0800,0x1000,0x0000,0x4400,0x8200,0x9200,0x9200,0x9200,0x9200,0x6c00,0x0000,0x0000, // u03ce 0x0000,0x0000,0x3800,0x4400,0x4400,0x4400,0x3e00,0x0400,0xc400,0x4400,0x4400,0x3800,0x0000,0x0000, // u03d1 0x0000,0x0000,0x0000,0x0000,0x1000,0x7c00,0x9200,0x9200,0x9200,0x9200,0x9200,0x7c00,0x1000,0x0000, // u03d5 0x0000,0x0000,0x0000,0x0000,0x0000,0xc200,0x2400,0x1800,0x1000,0x3000,0x4800,0x8600,0x0000,0x0000, // u03f0 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x7c00,0x4000,0x3c00, // u03f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4000,0x4200,0x3c00,0x0000,0x0000, // u03f2 0x0000,0x0000,0x0400,0x0400,0x0000,0x0c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x4400,0x4400,0x3800, // u03f3 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u03f4 0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2000,0x4000,0x7c00,0x4000,0x2000,0x1e00,0x0000,0x0000, // u03f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x7800,0x0400,0x0200,0x3e00,0x0200,0x0400,0x7800,0x0000,0x0000, // u03f6 0x1000,0x0800,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000, // u0400 0x2400,0x2400,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000, // u0401 0x0000,0x0000,0xf800,0x2000,0x2000,0x3c00,0x2200,0x2200,0x2200,0x2200,0x2200,0x2400,0x0000,0x0000, // u0402 0x0800,0x1000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000, // u0403 0x0000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x4200,0x3c00,0x0000,0x0000, // u0404 0x0000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x3c00,0x0200,0x0200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u0405 0x0000,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u0406 0x4400,0x4400,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u0407 0x0000,0x0000,0x0e00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x4400,0x4400,0x3800,0x0000,0x0000, // u0408 0x0000,0x0000,0x3000,0x5000,0x9000,0x9c00,0x9200,0x9200,0x9200,0x9200,0x9200,0x9c00,0x0000,0x0000, // u0409 0x0000,0x0000,0x9000,0x9000,0x9000,0x9c00,0xf200,0x9200,0x9200,0x9200,0x9200,0x9c00,0x0000,0x0000, // u040a 0x0000,0x0000,0xf800,0x2000,0x2000,0x3c00,0x2200,0x2200,0x2200,0x2200,0x2200,0x2200,0x0000,0x0000, // u040b 0x0800,0x1000,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x0000,0x0000, // u040c 0x1000,0x0800,0x4200,0x4200,0x4200,0x4600,0x4a00,0x5200,0x6200,0x4200,0x4200,0x4200,0x0000,0x0000, // u040d 0x2400,0x1800,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x0200,0x3c00,0x0000,0x0000, // u040e 0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x7e00,0x1800,0x1800, // u040f 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u0410 0x0000,0x0000,0x7c00,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x7c00,0x0000,0x0000, // u0411 0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x7c00,0x4200,0x4200,0x4200,0x4200,0x7c00,0x0000,0x0000, // u0412 0x0000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000, // u0413 0x0000,0x0000,0x3c00,0x4400,0x4400,0x4400,0x4400,0x4400,0x4400,0x4400,0x4400,0xfe00,0x8200,0x0000, // u0414 0x0000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000, // u0415 0x0000,0x0000,0x9200,0x9200,0x9200,0x5400,0x3800,0x5400,0x9200,0x9200,0x9200,0x9200,0x0000,0x0000, // u0416 0x0000,0x0000,0x3c00,0x4200,0x4200,0x0200,0x1c00,0x0200,0x0200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u0417 0x0000,0x0000,0x4200,0x4200,0x4200,0x4600,0x4a00,0x5200,0x6200,0x4200,0x4200,0x4200,0x0000,0x0000, // u0418 0x2400,0x1800,0x4200,0x4200,0x4200,0x4600,0x4a00,0x5200,0x6200,0x4200,0x4200,0x4200,0x0000,0x0000, // u0419 0x0000,0x0000,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x0000,0x0000, // u041a 0x0000,0x0000,0x0e00,0x1200,0x2200,0x2200,0x2200,0x2200,0x2200,0x2200,0x2200,0x4200,0x0000,0x0000, // u041b 0x0000,0x0000,0x8200,0xc600,0xaa00,0x9200,0x9200,0x8200,0x8200,0x8200,0x8200,0x8200,0x0000,0x0000, // u041c 0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u041d 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u041e 0x0000,0x0000,0x7e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u041f 0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x7c00,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000, // u0420 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4000,0x4000,0x4000,0x4000,0x4200,0x4200,0x3c00,0x0000,0x0000, // u0421 0x0000,0x0000,0xfe00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000, // u0422 0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x0200,0x3c00,0x0000,0x0000, // u0423 0x0000,0x1000,0x7c00,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x7c00,0x1000,0x0000, // u0424 0x0000,0x0000,0x4200,0x4200,0x2400,0x2400,0x1800,0x1800,0x2400,0x2400,0x4200,0x4200,0x0000,0x0000, // u0425 0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3f00,0x0100,0x0100, // u0426 0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x0200,0x0200,0x0000,0x0000, // u0427 0x0000,0x0000,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x7e00,0x0000,0x0000, // u0428 0x0000,0x0000,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x7f00,0x0100,0x0100, // u0429 0x0000,0x0000,0xc000,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x7c00,0x0000,0x0000, // u042a 0x0000,0x0000,0x8200,0x8200,0x8200,0xf200,0x8a00,0x8a00,0x8a00,0x8a00,0x8a00,0xf200,0x0000,0x0000, // u042b 0x0000,0x0000,0x4000,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x7c00,0x0000,0x0000, // u042c 0x0000,0x0000,0x3c00,0x4200,0x0200,0x0200,0x1e00,0x0200,0x0200,0x0200,0x4200,0x3c00,0x0000,0x0000, // u042d 0x0000,0x0000,0x8c00,0x9200,0x9200,0x9200,0x9200,0xf200,0x9200,0x9200,0x9200,0x8c00,0x0000,0x0000, // u042e 0x0000,0x0000,0x3e00,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0a00,0x1200,0x2200,0x4200,0x0000,0x0000, // u042f 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u0430 0x0000,0x0000,0x3c00,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x7c00,0x0000,0x0000, // u0431 0x0000,0x0000,0x3800,0x4400,0x4400,0x4800,0x7c00,0x4200,0x4200,0x4200,0x4200,0x7c00,0x0000,0x0000, // u0432 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000, // u0433 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x3c00, // u0434 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x0000, // u0435 0x0000,0x0000,0x0000,0x0000,0x0000,0x9200,0x9200,0x5400,0x3800,0x5400,0x9200,0x9200,0x0000,0x0000, // u0436 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x0200,0x1c00,0x0200,0x4200,0x3c00,0x0000,0x0000, // u0437 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u0438 0x0000,0x0000,0x2400,0x1800,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u0439 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x0000,0x0000, // u043a 0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2200,0x2200,0x2200,0x2200,0x2200,0x4200,0x0000,0x0000, // u043b 0x0000,0x0000,0x0000,0x0000,0x0000,0x8200,0xc600,0xaa00,0x9200,0x8200,0x8200,0x8200,0x0000,0x0000, // u043c 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x0000,0x0000, // u043d 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u043e 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u043f 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x7c00,0x4000,0x4000, // u0440 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4000,0x4200,0x3c00,0x0000,0x0000, // u0441 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000, // u0442 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x3c00, // u0443 0x0000,0x0000,0x0000,0x0000,0x1000,0x7c00,0x9200,0x9200,0x9200,0x9200,0x9200,0x7c00,0x1000,0x0000, // u0444 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x2400,0x1800,0x2400,0x4200,0x4200,0x0000,0x0000, // u0445 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3f00,0x0100,0x0100, // u0446 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x0200,0x0000,0x0000, // u0447 0x0000,0x0000,0x0000,0x0000,0x0000,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x7e00,0x0000,0x0000, // u0448 0x0000,0x0000,0x0000,0x0000,0x0000,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x7f00,0x0100,0x0100, // u0449 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x2000,0x3c00,0x2200,0x2200,0x2200,0x3c00,0x0000,0x0000, // u044a 0x0000,0x0000,0x0000,0x0000,0x0000,0x8200,0x8200,0xf200,0x8a00,0x8a00,0x8a00,0xf200,0x0000,0x0000, // u044b 0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x7800,0x4400,0x4400,0x4400,0x7800,0x0000,0x0000, // u044c 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x0200,0x1e00,0x0200,0x4200,0x3c00,0x0000,0x0000, // u044d 0x0000,0x0000,0x0000,0x0000,0x0000,0x8c00,0x9200,0x9200,0xf200,0x9200,0x9200,0x8c00,0x0000,0x0000, // u044e 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4200,0x4200,0x3e00,0x1200,0x2200,0x4200,0x0000,0x0000, // u044f 0x0000,0x0000,0x1000,0x0800,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x0000, // u0450 0x0000,0x0000,0x2400,0x2400,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x0000, // u0451 0x0000,0x0000,0x4000,0xf000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0200,0x0c00, // u0452 0x0000,0x0000,0x0800,0x1000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000, // u0453 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4000,0x7800,0x4000,0x4200,0x3c00,0x0000,0x0000, // u0454 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4000,0x4000,0x3c00,0x0200,0x0200,0x7c00,0x0000,0x0000, // u0455 0x0000,0x0000,0x1000,0x1000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u0456 0x0000,0x0000,0x4800,0x4800,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u0457 0x0000,0x0000,0x0400,0x0400,0x0000,0x0c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x4400,0x4400,0x3800, // u0458 0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x9000,0x9c00,0x9200,0x9200,0x9200,0x9c00,0x0000,0x0000, // u0459 0x0000,0x0000,0x0000,0x0000,0x0000,0x9000,0x9000,0x9c00,0xf200,0x9200,0x9200,0x9c00,0x0000,0x0000, // u045a 0x0000,0x0000,0x4000,0xf000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u045b 0x0000,0x0000,0x0800,0x1000,0x0000,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x0000,0x0000, // u045c 0x0000,0x0000,0x1000,0x0800,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u045d 0x0000,0x0000,0x2400,0x1800,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x3c00, // u045e 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x7e00,0x1800,0x1800, // u045f 0x0000,0x0000,0x4000,0xf000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x7c00,0x0000,0x0000, // u0462 0x0000,0x0000,0x2000,0x2000,0x7800,0x2000,0x2000,0x3c00,0x2200,0x2200,0x2200,0x3c00,0x0000,0x0000, // u0463 0x0000,0x0000,0xfe00,0x8200,0x4400,0x2800,0x3800,0x5400,0x9200,0x9200,0x9200,0x9200,0x0000,0x0000, // u046a 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x4400,0x2800,0x3800,0x5400,0x9200,0x9200,0x0000,0x0000, // u046b 0x0200,0x0200,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000, // u0490 0x0000,0x0000,0x0000,0x0200,0x0200,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000, // u0491 0x0000,0x0000,0x7e00,0x4000,0x4000,0x4000,0xf800,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000, // u0492 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4000,0x4000,0xf800,0x4000,0x4000,0x4000,0x0000,0x0000, // u0493 0x0000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x0200,0x0400, // u0494 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4000,0x4000,0x7800,0x4400,0x4400,0x4400,0x0400,0x0800, // u0495 0x0000,0x0000,0x9200,0x9200,0x9200,0x5400,0x3800,0x5400,0x9200,0x9200,0x9200,0x9300,0x0100,0x0100, // u0496 0x0000,0x0000,0x0000,0x0000,0x0000,0x9200,0x9200,0x5400,0x3800,0x5400,0x9200,0x9300,0x0100,0x0100, // u0497 0x0000,0x0000,0x3c00,0x4200,0x4200,0x0200,0x1c00,0x0200,0x0200,0x4200,0x4200,0x3c00,0x1000,0x1000, // u0498 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x0200,0x1c00,0x0200,0x4200,0x3c00,0x1000,0x1000, // u0499 0x0000,0x0000,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4300,0x0100,0x0100, // u049a 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4300,0x0100,0x0100, // u049b 0x0000,0x0000,0x4200,0x4200,0x5400,0x5800,0x7000,0x7000,0x5800,0x5400,0x4200,0x4200,0x0000,0x0000, // u049c 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x5400,0x5800,0x7000,0x5800,0x5400,0x4200,0x0000,0x0000, // u049d 0x0000,0x0000,0xc200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x0000,0x0000, // u04a0 0x0000,0x0000,0x0000,0x0000,0x0000,0xc200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x0000,0x0000, // u04a1 0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x4300,0x0100,0x0100, // u04a2 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4300,0x0100,0x0100, // u04a3 0x0000,0x0000,0x4700,0x4400,0x4400,0x4400,0x7c00,0x4400,0x4400,0x4400,0x4400,0x4400,0x0000,0x0000, // u04a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x4700,0x4400,0x4400,0x7c00,0x4400,0x4400,0x4400,0x0000,0x0000, // u04a5 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4000,0x4000,0x4000,0x4000,0x4200,0x4200,0x3c00,0x1000,0x1000, // u04aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4000,0x4200,0x3c00,0x1000,0x1000, // u04ab 0x0000,0x0000,0x8200,0x8200,0x4400,0x4400,0x2800,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000, // u04ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x8200,0x8200,0x4400,0x4400,0x2800,0x2800,0x1000,0x1000,0x1000, // u04af 0x0000,0x0000,0x8200,0x8200,0x4400,0x4400,0x2800,0x1000,0x7c00,0x1000,0x1000,0x1000,0x0000,0x0000, // u04b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x8200,0x8200,0x4400,0x4400,0x2800,0x2800,0x1000,0x7c00,0x1000, // u04b1 0x0000,0x0000,0x4200,0x4200,0x2400,0x2400,0x1800,0x1800,0x2400,0x2400,0x4200,0x4300,0x0100,0x0100, // u04b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x2400,0x1800,0x2400,0x4200,0x4300,0x0100,0x0100, // u04b3 0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x0200,0x0300,0x0100,0x0100, // u04b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x0300,0x0100,0x0100, // u04b7 0x0000,0x0000,0x4200,0x4200,0x4200,0x4a00,0x4a00,0x3e00,0x0a00,0x0a00,0x0200,0x0200,0x0000,0x0000, // u04b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4a00,0x4a00,0x3e00,0x0a00,0x0200,0x0200,0x0000,0x0000, // u04b9 0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u04ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u04bb 0x0000,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u04c0 0x2400,0x1800,0x0000,0x9200,0x9200,0x9200,0x5400,0x3800,0x5400,0x9200,0x9200,0x9200,0x0000,0x0000, // u04c1 0x0000,0x0000,0x2400,0x1800,0x0000,0x9200,0x9200,0x5400,0x3800,0x5400,0x9200,0x9200,0x0000,0x0000, // u04c2 0x0000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u04cf 0x2400,0x1800,0x0000,0x3c00,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u04d0 0x0000,0x0000,0x2400,0x1800,0x0000,0x3c00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u04d1 0x2400,0x2400,0x0000,0x3c00,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u04d2 0x0000,0x0000,0x2400,0x2400,0x0000,0x3c00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u04d3 0x0000,0x0000,0x7e00,0x9000,0x9000,0x9000,0xfc00,0x9000,0x9000,0x9000,0x9000,0x9e00,0x0000,0x0000, // u04d4 0x0000,0x0000,0x0000,0x0000,0x0000,0x6c00,0x1200,0x7200,0x9e00,0x9000,0x9000,0x6c00,0x0000,0x0000, // u04d5 0x2400,0x1800,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000, // u04d6 0x0000,0x0000,0x2400,0x1800,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x0000, // u04d7 0x0000,0x0000,0x3c00,0x4200,0x0200,0x0200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u04d8 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x0200,0x0200,0x7e00,0x4200,0x4200,0x3c00,0x0000,0x0000, // u04d9 0x2400,0x2400,0x0000,0x3c00,0x4200,0x0200,0x0200,0x7e00,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u04da 0x0000,0x0000,0x2400,0x2400,0x0000,0x3c00,0x0200,0x0200,0x7e00,0x4200,0x4200,0x3c00,0x0000,0x0000, // u04db 0x4400,0x4400,0x0000,0x9200,0x9200,0x9200,0x5400,0x3800,0x5400,0x9200,0x9200,0x9200,0x0000,0x0000, // u04dc 0x0000,0x0000,0x4400,0x4400,0x0000,0x9200,0x9200,0x5400,0x3800,0x5400,0x9200,0x9200,0x0000,0x0000, // u04dd 0x2400,0x2400,0x0000,0x3c00,0x4200,0x4200,0x0200,0x1c00,0x0200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u04de 0x0000,0x0000,0x2400,0x2400,0x0000,0x3c00,0x4200,0x0200,0x1c00,0x0200,0x4200,0x3c00,0x0000,0x0000, // u04df 0x3c00,0x0000,0x4200,0x4200,0x4200,0x4600,0x4a00,0x5200,0x6200,0x4200,0x4200,0x4200,0x0000,0x0000, // u04e2 0x0000,0x0000,0x0000,0x3c00,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u04e3 0x2400,0x2400,0x0000,0x4200,0x4200,0x4200,0x4600,0x4a00,0x5200,0x6200,0x4200,0x4200,0x0000,0x0000, // u04e4 0x0000,0x0000,0x2400,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000, // u04e5 0x2400,0x2400,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u04e6 0x0000,0x0000,0x2400,0x2400,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u04e7 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u04e8 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4200,0x4200,0x3c00,0x0000,0x0000, // u04e9 0x2400,0x2400,0x0000,0x3c00,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u04ea 0x0000,0x0000,0x2400,0x2400,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4200,0x4200,0x3c00,0x0000,0x0000, // u04eb 0x2400,0x2400,0x0000,0x3c00,0x4200,0x0200,0x0200,0x1e00,0x0200,0x0200,0x4200,0x3c00,0x0000,0x0000, // u04ec 0x0000,0x0000,0x2400,0x2400,0x0000,0x3c00,0x4200,0x0200,0x1e00,0x0200,0x4200,0x3c00,0x0000,0x0000, // u04ed 0x3c00,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x0200,0x3c00,0x0000,0x0000, // u04ee 0x0000,0x0000,0x0000,0x3c00,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x3c00, // u04ef 0x2400,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x0200,0x3c00,0x0000,0x0000, // u04f0 0x0000,0x0000,0x2400,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x3c00, // u04f1 0x1200,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x0200,0x3c00,0x0000,0x0000, // u04f2 0x0000,0x0000,0x1200,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x3c00, // u04f3 0x2400,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x0200,0x0200,0x0000,0x0000, // u04f4 0x0000,0x0000,0x2400,0x2400,0x0000,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x0200,0x0000,0x0000, // u04f5 0x4800,0x4800,0x0000,0x8200,0x8200,0x8200,0xf200,0x8a00,0x8a00,0x8a00,0x8a00,0xf200,0x0000,0x0000, // u04f8 0x0000,0x0000,0x4800,0x4800,0x0000,0x8200,0x8200,0xf200,0x8a00,0x8a00,0x8a00,0xf200,0x0000,0x0000, // u04f9 0x0000,0x0000,0x4200,0x4200,0x2200,0x2200,0x1400,0x2800,0x4400,0x4400,0x4200,0x4200,0x0000,0x0000, // u05d0 0x0000,0x0000,0x7c00,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x7f00,0x0000,0x0000, // u05d1 0x0000,0x0000,0x7000,0x0800,0x0800,0x0800,0x0800,0x0800,0x1400,0x2400,0x4200,0x8200,0x0000,0x0000, // u05d2 0x0000,0x0000,0x7f00,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0000,0x0000, // u05d3 0x0000,0x0000,0x7c00,0x0200,0x0200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u05d4 0x0000,0x0000,0x3000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000, // u05d5 0x0000,0x0000,0x7c00,0x0800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000, // u05d6 0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u05d7 0x0000,0x0000,0x4c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u05d8 0x0000,0x0000,0x3000,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d9 0x0000,0x0000,0x7c00,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200, // u05da 0x0000,0x0000,0x7c00,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x7c00,0x0000,0x0000, // u05db 0x4000,0x4000,0x7e00,0x0200,0x0200,0x0200,0x0200,0x0400,0x0800,0x1000,0x1000,0x1000,0x0000,0x0000, // u05dc 0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x7e00,0x0000,0x0000, // u05dd 0x0000,0x0000,0xdc00,0x6200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4e00,0x0000,0x0000, // u05de 0x0000,0x0000,0x7000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000, // u05df 0x0000,0x0000,0x3800,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x3c00,0x0000,0x0000, // u05e0 0x0000,0x0000,0xfc00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u05e1 0x0000,0x0000,0x4200,0x4200,0x4200,0x2200,0x2200,0x2200,0x1400,0x1400,0x1800,0x6000,0x0000,0x0000, // u05e2 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x3200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200, // u05e3 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x3200,0x0200,0x0200,0x0200,0x0200,0x7c00,0x0000,0x0000, // u05e4 0x0000,0x0000,0x4200,0x4200,0x2200,0x2400,0x1800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u05e5 0x0000,0x0000,0x4200,0x4200,0x2200,0x2400,0x1800,0x1000,0x0800,0x0800,0x0400,0x7c00,0x0000,0x0000, // u05e6 0x0000,0x0000,0x7e00,0x0200,0x0200,0x4200,0x4200,0x4400,0x4800,0x4800,0x4800,0x4800,0x4000,0x4000, // u05e7 0x0000,0x0000,0x7c00,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0000,0x0000, // u05e8 0x0000,0x0000,0x9200,0x9200,0x9200,0x9200,0x9200,0xa200,0xc200,0x8200,0x8400,0xf800,0x0000,0x0000, // u05e9 0x0000,0x0000,0xfc00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x8200,0x0000,0x0000, // u05ea 0x0000,0x0000,0x7800,0x4400,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4400,0x7800,0x1000,0x1000, // u1e0c 0x0000,0x0000,0x0200,0x0200,0x0200,0x3e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0800,0x0800, // u1e0d 0x0000,0x0000,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x0000,0x3c00, // u1e34 0x0000,0x0000,0x4000,0x4000,0x4000,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x0000,0x3c00, // u1e35 0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x1000,0x1000, // u1e36 0x0000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x1000,0x1000, // u1e37 0x1000,0x1000,0x8200,0xc600,0xaa00,0x9200,0x9200,0x8200,0x8200,0x8200,0x8200,0x8200,0x0000,0x0000, // u1e40 0x0000,0x0000,0x1000,0x1000,0x0000,0xfc00,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x0000,0x0000, // u1e41 0x0000,0x0000,0x8200,0xc600,0xaa00,0x9200,0x9200,0x8200,0x8200,0x8200,0x8200,0x8200,0x1000,0x1000, // u1e42 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x0800,0x0800, // u1e43 0x1000,0x1000,0x4200,0x4200,0x4200,0x6200,0x5200,0x4a00,0x4600,0x4200,0x4200,0x4200,0x0000,0x0000, // u1e44 0x0000,0x0000,0x1000,0x1000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u1e45 0x0000,0x0000,0x4200,0x4200,0x4200,0x6200,0x5200,0x4a00,0x4600,0x4200,0x4200,0x4200,0x1000,0x1000, // u1e46 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x1000,0x1000, // u1e47 0x0000,0x0000,0xfe00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0800,0x0800, // u1e6c 0x0000,0x0000,0x1000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x1000,0x1000,0x1000,0x0e00,0x0400,0x0400, // u1e6d 0x0000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x4000,0x7e00,0x1000,0x1000, // u1eb8 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x1000,0x1000, // u1eb9 0x3200,0x4c00,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000, // u1ebc 0x0000,0x0000,0x3200,0x4c00,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x0000, // u1ebd 0x0000,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x1000,0x1000, // u1eca 0x0000,0x0000,0x1000,0x1000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x1000,0x1000, // u1ecb 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x1000,0x1000, // u1ecc 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x1000,0x1000, // u1ecd 0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x1000,0x1000, // u1ee4 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0800,0x0800, // u1ee5 0x6400,0x9800,0x0000,0x8200,0x8200,0x4400,0x4400,0x2800,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000, // u1ef8 0x0000,0x0000,0x3200,0x4c00,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x3c00, // u1ef9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2001 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2002 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2003 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2004 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2005 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2006 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2007 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2008 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2009 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2010 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2011 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2012 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2013 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2014 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2015 0x0000,0x0000,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x0000,0x0000, // u2016 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0000,0x7e00, // u2017 0x0000,0x0800,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2018 0x0000,0x0800,0x0800,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2019 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x1000,0x0000, // u201a 0x0000,0x1000,0x1000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201b 0x0000,0x1200,0x2400,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201c 0x0000,0x1200,0x1200,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2400,0x2400,0x4800,0x0000, // u201e 0x0000,0x4800,0x4800,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201f 0x0000,0x0000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000, // u2020 0x0000,0x0000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x0000,0x0000, // u2021 0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x3c00,0x3c00,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000, // u2022 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9200,0x9200,0x0000,0x0000, // u2026 0x0000,0x0000,0x4800,0xa800,0x5000,0x1000,0x2000,0x2000,0x4000,0x5400,0xaa00,0x9400,0x0000,0x0000, // u2030 0x0000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2032 0x0000,0x2400,0x2400,0x2400,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2033 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0800,0x1000,0x2000,0x1000,0x0800,0x0400,0x0000,0x0000, // u2039 0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x1000,0x0800,0x0400,0x0800,0x1000,0x2000,0x0000,0x0000, // u203a 0x0000,0x0000,0x2400,0x2400,0x2400,0x2400,0x2400,0x2400,0x2400,0x0000,0x2400,0x2400,0x0000,0x0000, // u203c 0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u203e 0x0000,0x1800,0x2400,0x2400,0x2400,0x2400,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2070 0x1000,0x0000,0x3000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2071 0x0000,0x0400,0x0c00,0x1400,0x3e00,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2074 0x0000,0x3800,0x2000,0x3800,0x0400,0x0400,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2075 0x0000,0x1800,0x2000,0x3800,0x2400,0x2400,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2076 0x0000,0x3c00,0x0400,0x0800,0x0800,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2077 0x0000,0x1800,0x2400,0x1800,0x2400,0x2400,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2078 0x0000,0x1800,0x2400,0x2400,0x1c00,0x0400,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2079 0x0000,0x0000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207a 0x0000,0x0000,0x0000,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207b 0x0000,0x0000,0x0000,0x7c00,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207c 0x0000,0x0800,0x1000,0x1000,0x1000,0x1000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207d 0x0000,0x1000,0x0800,0x0800,0x0800,0x0800,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207e 0x0000,0x0000,0x3800,0x2400,0x2400,0x2400,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x2400,0x2400,0x2400,0x2400,0x1800,0x0000,0x0000, // u2080 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x3000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u2081 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x2400,0x0400,0x0800,0x1000,0x3c00,0x0000,0x0000, // u2082 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x0400,0x1800,0x0400,0x0400,0x3800,0x0000,0x0000, // u2083 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0c00,0x1400,0x3e00,0x0400,0x0400,0x0000,0x0000, // u2084 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x2000,0x3800,0x0400,0x0400,0x3800,0x0000,0x0000, // u2085 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x2000,0x3800,0x2400,0x2400,0x1800,0x0000,0x0000, // u2086 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x0400,0x0800,0x0800,0x1000,0x1000,0x0000,0x0000, // u2087 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x2400,0x1800,0x2400,0x2400,0x1800,0x0000,0x0000, // u2088 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x2400,0x2400,0x1c00,0x0400,0x1800,0x0000,0x0000, // u2089 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x0000,0x0000, // u208a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000, // u208b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0000,0x7c00,0x0000,0x0000,0x0000, // u208c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1000,0x1000,0x1000,0x1000,0x0800,0x0000,0x0000, // u208d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x0800,0x0800,0x0800,0x0800,0x1000,0x0000,0x0000, // u208e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x0400,0x1c00,0x2400,0x1c00,0x0000,0x0000, // u2090 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x2400,0x3c00,0x2000,0x1c00,0x0000,0x0000, // u2091 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x2400,0x2400,0x2400,0x1800,0x0000,0x0000, // u2092 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x2800,0x1000,0x2800,0x4400,0x0000,0x0000, // u2093 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x0400,0x3c00,0x2400,0x1800,0x0000,0x0000, // u2094 0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x3800,0x2400,0x2400,0x2400,0x2400,0x0000,0x0000, // u2095 0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2400,0x2800,0x3000,0x2800,0x2400,0x0000,0x0000, // u2096 0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000, // u2097 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7800,0x5400,0x5400,0x5400,0x5400,0x0000,0x0000, // u2098 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x2400,0x2400,0x2400,0x3800,0x2000,0x2000, // u209a 0x0000,0x0000,0xf000,0x8800,0x8800,0x8800,0xf400,0x8400,0x8e00,0x8400,0x8400,0x8200,0x0000,0x0000, // u20a7 0x0000,0x0000,0xf200,0x8a00,0x8a00,0xaa00,0xaa00,0xaa00,0xaa00,0xa200,0xa200,0xbc00,0x0000,0x0000, // u20aa 0x0000,0x0000,0x0000,0x1c00,0x2200,0x4000,0xf800,0x4000,0xf800,0x4000,0x2200,0x1c00,0x0000,0x0000, // u20ac 0x0000,0x0000,0xfe00,0x1000,0x1000,0x1c00,0x7000,0x1c00,0x7000,0x1000,0x1000,0x1000,0x0000,0x0000, // u20ae 0x0000,0x0000,0x3c00,0x5200,0x5200,0x5000,0x5000,0x5000,0x5000,0x5200,0x5200,0x3c00,0x0000,0x0000, // u2102 0x0000,0x0000,0x4000,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u210e 0x0000,0x0000,0x4000,0xf000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u210f 0x0000,0x0000,0x4200,0x4200,0x6200,0x5200,0x6a00,0x5600,0x4a00,0x4600,0x4200,0x4200,0x0000,0x0000, // u2115 0x0000,0x0000,0x9600,0x9600,0x9600,0xd000,0xf000,0xf000,0xb000,0x9600,0x9000,0x9600,0x0000,0x0000, // u2116 0x0000,0x0000,0x3c00,0x5200,0x5200,0x5200,0x5200,0x5200,0x5200,0x5200,0x5a00,0x3c00,0x0600,0x0000, // u211a 0x0000,0x0000,0xf800,0xa400,0xa400,0xa400,0xa400,0xb800,0xa800,0xb400,0xaa00,0xe600,0x0000,0x0000, // u211d 0x0000,0x0000,0xfb00,0x5500,0x5500,0x5100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2122 0x0000,0x0000,0x7e00,0x0200,0x0600,0x0a00,0x1400,0x2800,0x5000,0x6000,0x4000,0x7e00,0x0000,0x0000, // u2124 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x2400,0x2400,0x6600,0x0000,0x0000, // u2126 0x0000,0x0000,0x4400,0x4400,0x2200,0x2200,0x3400,0x5800,0x8800,0x8800,0x8400,0x4400,0x0000,0x0000, // u2135 0x0000,0x0000,0x0000,0x0000,0x2000,0x4000,0xfe00,0x4000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2190 0x0000,0x0000,0x1000,0x3800,0x5400,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000, // u2191 0x0000,0x0000,0x0000,0x0000,0x0800,0x0400,0xfe00,0x0400,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000, // u2192 0x0000,0x0000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x5400,0x3800,0x1000,0x0000,0x0000, // u2193 0x0000,0x0000,0x0000,0x0000,0x2400,0x4200,0xff00,0x4200,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2194 0x0000,0x0000,0x1000,0x3800,0x5400,0x1000,0x1000,0x1000,0x1000,0x5400,0x3800,0x1000,0x0000,0x0000, // u2195 0x0000,0x0000,0x0000,0x0000,0x2200,0x4200,0xfe00,0x4200,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a4 0x0000,0x0000,0x0000,0x0000,0x8800,0x8400,0xfe00,0x8400,0x8800,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a6 0x0000,0x0000,0x1000,0x3800,0x5400,0x1000,0x1000,0x1000,0x5400,0x3800,0x1000,0x7c00,0x0000,0x0000, // u21a8 0x0000,0x0000,0x0200,0x0200,0x0200,0x0200,0x0200,0x2200,0x4200,0xfe00,0x4000,0x2000,0x0000,0x0000, // u21b5 0x0000,0x0000,0x0000,0xf000,0x3000,0x5000,0x9200,0x8200,0x8200,0x4400,0x3800,0x0000,0x0000,0x0000, // u21bb 0x0000,0x0000,0x0000,0x2000,0x4000,0xfe00,0x0000,0xfe00,0x0400,0x0800,0x0000,0x0000,0x0000,0x0000, // u21cb 0x0000,0x0000,0x0000,0x0800,0x0400,0xfe00,0x0000,0xfe00,0x4000,0x2000,0x0000,0x0000,0x0000,0x0000, // u21cc 0x0000,0x0000,0x0000,0x0000,0x2000,0x7e00,0xc000,0x7e00,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d0 0x0000,0x0000,0x1000,0x3800,0x6c00,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x0000,0x0000, // u21d1 0x0000,0x0000,0x0000,0x0000,0x0800,0xfc00,0x0600,0xfc00,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d2 0x0000,0x0000,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x6c00,0x3800,0x1000,0x0000,0x0000, // u21d3 0x0000,0x0000,0x0000,0x0000,0x2400,0x7e00,0xc300,0x7e00,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d4 0x0000,0x0000,0x1000,0x3800,0x6c00,0x2800,0x2800,0x2800,0x2800,0x6c00,0x3800,0x1000,0x0000,0x0000, // u21d5 0x0000,0x0000,0x8200,0x8200,0x8200,0x7c00,0x4400,0x4400,0x2800,0x2800,0x1000,0x1000,0x0000,0x0000, // u2200 0x0000,0x0000,0x0000,0x7e00,0x0200,0x0200,0x0200,0x7e00,0x0200,0x0200,0x0200,0x7e00,0x0000,0x0000, // u2203 0x0000,0x0000,0x0400,0x7e00,0x0a00,0x0a00,0x1200,0x7e00,0x1200,0x2200,0x2200,0x7e00,0x4000,0x0000, // u2204 0x0000,0x0000,0x0200,0x0400,0x7c00,0x8a00,0x9200,0x9200,0xa200,0x7c00,0x4000,0x8000,0x0000,0x0000, // u2205 0x0000,0x0000,0x1000,0x1000,0x2800,0x2800,0x4400,0x4400,0x4400,0x8200,0x8200,0xfe00,0x0000,0x0000, // u2206 0x0000,0x0000,0xfe00,0x8200,0x8200,0x4400,0x4400,0x4400,0x2800,0x2800,0x1000,0x1000,0x0000,0x0000, // u2207 0x0000,0x0000,0x0000,0x1e00,0x2000,0x4000,0x4000,0x7e00,0x4000,0x4000,0x2000,0x1e00,0x0000,0x0000, // u2208 0x0000,0x0000,0x0200,0x1e00,0x2400,0x4400,0x4800,0x7e00,0x4800,0x5000,0x3000,0x3e00,0x2000,0x0000, // u2209 0x0000,0x0000,0x0000,0x0000,0x1e00,0x2000,0x4000,0x7e00,0x4000,0x2000,0x1e00,0x0000,0x0000,0x0000, // u220a 0x0000,0x0000,0x0000,0x7800,0x0400,0x0200,0x0200,0x7e00,0x0200,0x0200,0x0400,0x7800,0x0000,0x0000, // u220b 0x0000,0x0000,0x4000,0x7800,0x2400,0x2200,0x1200,0x7e00,0x1200,0x0a00,0x0c00,0x7c00,0x0400,0x0000, // u220c 0x0000,0x0000,0x0000,0x0000,0x7800,0x0400,0x0200,0x7e00,0x0200,0x0400,0x7800,0x0000,0x0000,0x0000, // u220d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2212 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x0000,0x0000, // u2213 0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x0000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x0000,0x0000, // u2214 0x0000,0x0000,0x0000,0x0000,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000,0x0000,0x0000,0x0000, // u2215 0x0000,0x0000,0x0000,0x0000,0x8000,0x4000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0000,0x0000,0x0000, // u2216 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2219 0x0000,0x0600,0x0400,0x0400,0x0400,0x0400,0x4400,0x4400,0x4400,0x2400,0x1400,0x0c00,0x0000,0x0000, // u221a 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x9200,0x9200,0x9200,0x7c00,0x0000,0x0000,0x0000,0x0000, // u221e 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u221f 0x0000,0x0000,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x0000,0x0000, // u2225 0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x2800,0x2800,0x4400,0x4400,0x8200,0x8200,0x0000,0x0000, // u2227 0x0000,0x0000,0x0000,0x0000,0x8200,0x8200,0x4400,0x4400,0x2800,0x2800,0x1000,0x1000,0x0000,0x0000, // u2228 0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u2229 0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u222a 0x0000,0x0000,0x0000,0x0000,0x0000,0x3200,0x4c00,0x0000,0x3200,0x4c00,0x0000,0x0000,0x0000,0x0000, // u2248 0x0000,0x0000,0x0000,0x0000,0x0200,0x7e00,0x0800,0x1000,0x7e00,0x4000,0x0000,0x0000,0x0000,0x0000, // u2260 0x0000,0x0000,0x0000,0x0000,0x7e00,0x0000,0x0000,0x7e00,0x0000,0x0000,0x7e00,0x0000,0x0000,0x0000, // u2261 0x0000,0x0000,0x0000,0x0400,0x0800,0x1000,0x2000,0x1000,0x0800,0x0400,0x0000,0x3e00,0x0000,0x0000, // u2264 0x0000,0x0000,0x0000,0x2000,0x1000,0x0800,0x0400,0x0800,0x1000,0x2000,0x0000,0x7c00,0x0000,0x0000, // u2265 0x0000,0x0000,0x0000,0x0900,0x1200,0x2400,0x4800,0x9000,0x4800,0x2400,0x1200,0x0900,0x0000,0x0000, // u226a 0x0000,0x0000,0x0000,0x9000,0x4800,0x2400,0x1200,0x0900,0x1200,0x2400,0x4800,0x9000,0x0000,0x0000, // u226b 0x0000,0x0000,0x0000,0x0000,0x3e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x3e00,0x0000,0x0000,0x0000, // u2282 0x0000,0x0000,0x0000,0x0000,0x7c00,0x0200,0x0200,0x0200,0x0200,0x0200,0x7c00,0x0000,0x0000,0x0000, // u2283 0x0000,0x0000,0x0000,0x3e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x3e00,0x0000,0x7e00,0x0000,0x0000, // u2286 0x0000,0x0000,0x0000,0x7c00,0x0200,0x0200,0x0200,0x0200,0x0200,0x7c00,0x0000,0x7e00,0x0000,0x0000, // u2287 0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xfe00,0x0000,0x0000, // u22a5 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000, // u22c2 0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000, // u22c3 0x0000,0x0000,0x0200,0x0400,0x7c00,0x8a00,0x9200,0x9200,0xa200,0x7c00,0x4000,0x8000,0x0000,0x0000, // u2300 0x0000,0x0000,0x0000,0x0000,0x1000,0x2800,0x4400,0x8200,0x8200,0x8200,0x8200,0xfe00,0x0000,0x0000, // u2302 0x0000,0x0000,0x3800,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2308 0x0000,0x0000,0x3800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000, // u2309 0x0000,0x0000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x3800,0x0000,0x0000, // u230a 0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x3800,0x0000,0x0000, // u230b 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2310 0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2319 0x0000,0x0000,0x0c00,0x1200,0x1200,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2320 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x9000,0x9000,0x6000,0x0000,0x0000, // u2321 0x0400,0x0800,0x1000,0x1000,0x2000,0x2000,0x2000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, // u239b 0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, // u239c 0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x2000,0x2000,0x2000,0x1000,0x1000,0x0800,0x0400, // u239d 0x4000,0x2000,0x1000,0x1000,0x0800,0x0800,0x0800,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u239e 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u239f 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0800,0x0800,0x0800,0x1000,0x1000,0x2000,0x4000, // u23a0 0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, // u23a1 0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, // u23a2 0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7c00, // u23a3 0x7c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u23a4 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u23a5 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x7c00, // u23a6 0x0e00,0x1000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u23a7 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0xc000,0xc000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u23a8 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x1000,0x0e00, // u23a9 0xe000,0x1000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, // u23ab 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0600,0x0600,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, // u23ac 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1000,0xe000, // u23ad 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u23ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23af 0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23ba 0x0000,0x0000,0x0000,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x0000,0x0000,0x0000, // u23bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00, // u23bd 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u23d0 0x8800,0x8800,0xf800,0x8800,0x8800,0x8800,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0000, // u2409 0x8000,0x8000,0x8000,0x8000,0x8000,0xf800,0x0000,0x1f00,0x1000,0x1c00,0x1000,0x1000,0x1000,0x0000, // u240a 0x8800,0x8800,0x5000,0x5000,0x2000,0x2000,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0000, // u240b 0xf800,0x8000,0xe000,0x8000,0x8000,0x8000,0x0000,0x1f00,0x1000,0x1c00,0x1000,0x1000,0x1000,0x0000, // u240c 0x7000,0x8800,0x8000,0x8000,0x8800,0x7000,0x0000,0x1e00,0x1100,0x1100,0x1e00,0x1200,0x1100,0x0000, // u240d 0x8800,0xc800,0xa800,0x9800,0x8800,0x8800,0x0000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1f00,0x0000, // u2424 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2500 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2501 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2502 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2503 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xaa00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2508 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xaa00,0xaa00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2509 0x1000,0x1000,0x1000,0x0000,0x1000,0x1000,0x0000,0x1000,0x1000,0x1000,0x0000,0x1000,0x1000,0x0000, // u250a 0x1800,0x1800,0x1800,0x0000,0x1800,0x1800,0x0000,0x1800,0x1800,0x1800,0x0000,0x1800,0x1800,0x0000, // u250b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u250c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x1f00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u250d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u250e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u250f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2510 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf000,0xf000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2511 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2512 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2513 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2514 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1f00,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2515 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2516 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1f00,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2517 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xf000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2518 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xf000,0xf000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2519 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u251a 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u251b 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1f00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u251c 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1f00,0x1f00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u251d 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1f00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u251e 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u251f 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2520 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1f00,0x1f00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2521 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1f00,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2522 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1f00,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2523 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xf000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2524 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xf000,0xf000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2525 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2526 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2527 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2528 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0xf800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2529 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xf800,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u252a 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u252b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u252c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xf000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u252d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x1f00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u252e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u252f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2530 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2531 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2532 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2533 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2534 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xff00,0xf000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2535 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xff00,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2536 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2537 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2538 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2539 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u253a 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u253b 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xff00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u253c 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xff00,0xf000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u253d 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xff00,0x1f00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u253e 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xff00,0xff00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u253f 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2540 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2541 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2542 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0xf000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2543 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0x1f00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2544 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xff00,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2545 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xff00,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2546 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0xff00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2547 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2548 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2549 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u254a 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u254b 0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x0000,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2550 0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800, // u2551 0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x1000,0x1f00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2552 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800, // u2553 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x2000,0x2f00,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800, // u2554 0x0000,0x0000,0x0000,0x0000,0x0000,0xf000,0x1000,0xf000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2555 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800, // u2556 0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0x0800,0xe800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800, // u2557 0x1000,0x1000,0x1000,0x1000,0x1000,0x1f00,0x1000,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2558 0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2559 0x2800,0x2800,0x2800,0x2800,0x2800,0x2f00,0x2000,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255a 0x1000,0x1000,0x1000,0x1000,0x1000,0xf000,0x1000,0xf000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255b 0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255c 0x2800,0x2800,0x2800,0x2800,0x2800,0xe800,0x0800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255d 0x1000,0x1000,0x1000,0x1000,0x1000,0x1f00,0x1000,0x1f00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u255e 0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2f00,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800, // u255f 0x2800,0x2800,0x2800,0x2800,0x2800,0x2f00,0x2000,0x2f00,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800, // u2560 0x1000,0x1000,0x1000,0x1000,0x1000,0xf000,0x1000,0xf000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2561 0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0xe800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800, // u2562 0x2800,0x2800,0x2800,0x2800,0x2800,0xe800,0x0800,0xe800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800, // u2563 0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x0000,0xff00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2564 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800, // u2565 0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x0000,0xef00,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800, // u2566 0x1000,0x1000,0x1000,0x1000,0x1000,0xff00,0x0000,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2567 0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2568 0x2800,0x2800,0x2800,0x2800,0x2800,0xef00,0x0000,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2569 0x1000,0x1000,0x1000,0x1000,0x1000,0xff00,0x1000,0xff00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u256a 0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0xff00,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800, // u256b 0x2800,0x2800,0x2800,0x2800,0x2800,0xef00,0x0000,0xef00,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800, // u256c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u256d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0x2000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u256e 0x1000,0x1000,0x1000,0x1000,0x1000,0x2000,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u256f 0x1000,0x1000,0x1000,0x1000,0x1000,0x0800,0x0700,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2570 0x0100,0x0200,0x0200,0x0400,0x0400,0x0800,0x0800,0x1000,0x1000,0x2000,0x2000,0x4000,0x4000,0x8000, // u2571 0x8000,0x4000,0x4000,0x2000,0x2000,0x1000,0x1000,0x0800,0x0800,0x0400,0x0400,0x0200,0x0200,0x0100, // u2572 0x8100,0x4200,0x4200,0x2400,0x2400,0x1800,0x1800,0x1800,0x1800,0x2400,0x2400,0x4200,0x4200,0x8100, // u2573 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2574 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2575 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2576 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2577 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf000,0xf000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2578 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2579 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u257b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257c 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u257d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xf000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257e 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u257f 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2580 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00, // u2581 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00, // u2582 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0xff00,0xff00, // u2583 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u2584 0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u2585 0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u2586 0x0000,0x0000,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u2587 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u2588 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, // u2589 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, // u258a 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, // u258b 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, // u258c 0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000, // u258d 0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000, // u258e 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, // u258f 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u2590 0x8800,0x2200,0x8800,0x2200,0x8800,0x2200,0x8800,0x2200,0x8800,0x2200,0x8800,0x2200,0x8800,0x2200, // u2591 0xaa00,0x5500,0xaa00,0x5500,0xaa00,0x5500,0xaa00,0x5500,0xaa00,0x5500,0xaa00,0x5500,0xaa00,0x5500, // u2592 0xee00,0xbb00,0xee00,0xbb00,0xee00,0xbb00,0xee00,0xbb00,0xee00,0xbb00,0xee00,0xbb00,0xee00,0xbb00, // u2593 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, // u2596 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u2597 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2598 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u2599 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u259a 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, // u259b 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u259c 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u259d 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, // u259e 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u259f 0x0000,0x0000,0x0000,0x0000,0x3c00,0x3c00,0x3c00,0x3c00,0x3c00,0x3c00,0x0000,0x0000,0x0000,0x0000, // u25a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x7e00,0x7e00,0x7e00,0x0000,0x0000, // u25ac 0x0000,0x0000,0x7e00,0x7e00,0x7e00,0x7e00,0x7e00,0x7e00,0x7e00,0x7e00,0x7e00,0x7e00,0x0000,0x0000, // u25ae 0x0000,0x0000,0x0000,0x1000,0x1000,0x3800,0x3800,0x7c00,0x7c00,0xfe00,0xfe00,0x0000,0x0000,0x0000, // u25b2 0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xfc00,0xf000,0xc000,0x0000,0x0000,0x0000,0x0000, // u25b6 0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xfc00,0xf000,0xc000,0x0000,0x0000,0x0000,0x0000, // u25ba 0x0000,0x0000,0x0000,0xfe00,0xfe00,0x7c00,0x7c00,0x3800,0x3800,0x1000,0x1000,0x0000,0x0000,0x0000, // u25bc 0x0000,0x0000,0x0000,0x0300,0x0f00,0x3f00,0xff00,0x3f00,0x0f00,0x0300,0x0000,0x0000,0x0000,0x0000, // u25c0 0x0000,0x0000,0x0000,0x0300,0x0f00,0x3f00,0xff00,0x3f00,0x0f00,0x0300,0x0000,0x0000,0x0000,0x0000, // u25c4 0x0000,0x0000,0x0000,0x0000,0x1000,0x3800,0x7c00,0xfe00,0x7c00,0x3800,0x1000,0x0000,0x0000,0x0000, // u25c6 0x0000,0x0000,0x0000,0x0000,0x1000,0x2800,0x4400,0x8200,0x4400,0x2800,0x1000,0x0000,0x0000,0x0000, // u25ca 0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x2400,0x2400,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000, // u25cb 0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x3c00,0x3c00,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000, // u25cf 0xff00,0xff00,0xff00,0xff00,0xff00,0xe700,0xc300,0xc300,0xe700,0xff00,0xff00,0xff00,0xff00,0xff00, // u25d8 0xff00,0xff00,0xff00,0xff00,0xff00,0xe700,0xdb00,0xdb00,0xe700,0xff00,0xff00,0xff00,0xff00,0xff00, // u25d9 0x0000,0x0000,0x7c00,0x8200,0xaa00,0x8200,0x8200,0xba00,0x9200,0x8200,0x8200,0x7c00,0x0000,0x0000, // u263a 0x0000,0x0000,0x7c00,0xfe00,0xd600,0xfe00,0xfe00,0xc600,0xee00,0xfe00,0xfe00,0x7c00,0x0000,0x0000, // u263b 0x0000,0x0000,0x0000,0x1000,0x9200,0x5400,0x3800,0xee00,0x3800,0x5400,0x9200,0x1000,0x0000,0x0000, // u263c 0x0000,0x0000,0x3800,0x4400,0x4400,0x4400,0x4400,0x3800,0x1000,0x7c00,0x1000,0x1000,0x0000,0x0000, // u2640 0x0000,0x0000,0x1e00,0x0600,0x0a00,0x1200,0x3800,0x4400,0x4400,0x4400,0x4400,0x3800,0x0000,0x0000, // u2642 0x0000,0x0000,0x1000,0x1000,0x3800,0x7c00,0xfe00,0xfe00,0x7c00,0x1000,0x1000,0x3800,0x0000,0x0000, // u2660 0x0000,0x0000,0x1000,0x3800,0x3800,0x1000,0x5400,0xfe00,0xfe00,0x5400,0x1000,0x3800,0x0000,0x0000, // u2663 0x0000,0x0000,0x0000,0x6c00,0xfe00,0xfe00,0xfe00,0xfe00,0x7c00,0x3800,0x1000,0x0000,0x0000,0x0000, // u2665 0x0000,0x0000,0x0000,0x0000,0x1000,0x3800,0x7c00,0xfe00,0x7c00,0x3800,0x1000,0x0000,0x0000,0x0000, // u2666 0x0000,0x0000,0x3e00,0x2200,0x3e00,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0xc000,0x0000,0x0000, // u266a 0x0000,0x0000,0x7e00,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4400,0x8000,0x0000, // u266b 0x0000,0x0000,0x0200,0x0200,0x0400,0x0400,0x8800,0x8800,0x5000,0x5000,0x2000,0x2000,0x0000,0x0000, // u2713 0x0000,0x0000,0x0300,0x0300,0x0600,0x0600,0xcc00,0xcc00,0x7800,0x7800,0x3000,0x3000,0x0000,0x0000, // u2714 0x0000,0x0000,0x0400,0x4400,0x2800,0x1800,0x1800,0x1400,0x2200,0x2000,0x4000,0x4000,0x0000,0x0000, // u2717 0x0000,0x0000,0x0c00,0xcc00,0x7800,0x3800,0x3800,0x3c00,0x6600,0x6000,0xc000,0xc000,0x0000,0x0000, // u2718 0x0000,0x0000,0x0800,0x0800,0x1000,0x1000,0x2000,0x2000,0x1000,0x1000,0x0800,0x0800,0x0000,0x0000, // u27e8 0x0000,0x0000,0x2000,0x2000,0x1000,0x1000,0x0800,0x0800,0x1000,0x1000,0x2000,0x2000,0x0000,0x0000, // u27e9 0x0000,0x0000,0x1200,0x1200,0x2400,0x2400,0x4800,0x4800,0x2400,0x2400,0x1200,0x1200,0x0000,0x0000, // u27ea 0x0000,0x0000,0x4800,0x4800,0x2400,0x2400,0x1200,0x1200,0x2400,0x2400,0x4800,0x4800,0x0000,0x0000, // u27eb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2800 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2801 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2802 0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2803 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u2804 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u2805 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u2806 0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u2807 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2808 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2809 0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280a 0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280b 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u280c 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u280d 0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u280e 0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u280f 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2810 0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2811 0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2812 0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2813 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u2814 0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u2815 0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u2816 0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u2817 0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2818 0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2819 0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281a 0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281b 0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u281c 0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u281d 0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u281e 0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u281f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000, // u2820 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000, // u2821 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000, // u2822 0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000, // u2823 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000, // u2824 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000, // u2825 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000, // u2826 0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000, // u2827 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000, // u2828 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000, // u2829 0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000, // u282a 0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000, // u282b 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000, // u282c 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000, // u282d 0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000, // u282e 0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000, // u282f 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000, // u2830 0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000, // u2831 0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000, // u2832 0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000, // u2833 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000, // u2834 0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000, // u2835 0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000, // u2836 0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000, // u2837 0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000, // u2838 0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000, // u2839 0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000, // u283a 0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000, // u283b 0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000, // u283c 0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000, // u283d 0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000, // u283e 0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000, // u283f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2840 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2841 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2842 0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2843 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u2844 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u2845 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u2846 0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u2847 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2848 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2849 0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u284a 0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u284b 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u284c 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u284d 0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u284e 0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u284f 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2850 0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2851 0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2852 0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2853 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u2854 0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u2855 0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u2856 0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u2857 0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2858 0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2859 0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u285a 0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u285b 0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u285c 0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u285d 0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u285e 0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000, // u285f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000, // u2860 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000, // u2861 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000, // u2862 0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000, // u2863 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000, // u2864 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000, // u2865 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000, // u2866 0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000, // u2867 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000, // u2868 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000, // u2869 0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000, // u286a 0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000, // u286b 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000, // u286c 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000, // u286d 0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000, // u286e 0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000, // u286f 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000, // u2870 0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000, // u2871 0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000, // u2872 0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000, // u2873 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000, // u2874 0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000, // u2875 0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000, // u2876 0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000, // u2877 0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000, // u2878 0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000, // u2879 0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000, // u287a 0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000, // u287b 0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000, // u287c 0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000, // u287d 0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000, // u287e 0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000, // u287f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2880 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2881 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2882 0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2883 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000, // u2884 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000, // u2885 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000, // u2886 0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000, // u2887 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2888 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2889 0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u288a 0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u288b 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000, // u288c 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000, // u288d 0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000, // u288e 0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000, // u288f 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2890 0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2891 0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2892 0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2893 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000, // u2894 0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000, // u2895 0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000, // u2896 0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000, // u2897 0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2898 0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2899 0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u289a 0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u289b 0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000, // u289c 0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000, // u289d 0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000, // u289e 0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000, // u289f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000, // u28a0 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000, // u28a1 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000, // u28a2 0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000, // u28a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000, // u28a4 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000, // u28a5 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000, // u28a6 0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000, // u28a7 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000, // u28a8 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000, // u28a9 0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000, // u28aa 0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000, // u28ab 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000, // u28ac 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000, // u28ad 0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000, // u28ae 0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000, // u28af 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000, // u28b0 0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000, // u28b1 0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000, // u28b2 0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000, // u28b3 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000, // u28b4 0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000, // u28b5 0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000, // u28b6 0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000, // u28b7 0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000, // u28b8 0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000, // u28b9 0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000, // u28ba 0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000, // u28bb 0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000, // u28bc 0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000, // u28bd 0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000, // u28be 0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000, // u28bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28c0 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28c1 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28c2 0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000, // u28c4 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000, // u28c5 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000, // u28c6 0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000, // u28c7 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28c8 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28c9 0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28ca 0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28cb 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000, // u28cc 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000, // u28cd 0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000, // u28ce 0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000, // u28cf 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28d0 0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28d1 0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28d2 0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28d3 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000, // u28d4 0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000, // u28d5 0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000, // u28d6 0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000, // u28d7 0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28d8 0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28d9 0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28da 0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28db 0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000, // u28dc 0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000, // u28dd 0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000, // u28de 0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000, // u28df 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000, // u28e0 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000, // u28e1 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000, // u28e2 0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000, // u28e3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000, // u28e4 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000, // u28e5 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000, // u28e6 0x0000,0x4000,0x4000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000, // u28e7 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000, // u28e8 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000, // u28e9 0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000, // u28ea 0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000, // u28eb 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000, // u28ec 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000, // u28ed 0x0000,0x0400,0x0400,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000, // u28ee 0x0000,0x4400,0x4400,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000, // u28ef 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000, // u28f0 0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000, // u28f1 0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000, // u28f2 0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000, // u28f3 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000, // u28f4 0x0000,0x4000,0x4000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000, // u28f5 0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000, // u28f6 0x0000,0x4000,0x4000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000, // u28f7 0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000, // u28f8 0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000, // u28f9 0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000, // u28fa 0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000, // u28fb 0x0000,0x0400,0x0400,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000, // u28fc 0x0000,0x4400,0x4400,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000, // u28fd 0x0000,0x0400,0x0400,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000, // u28fe 0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x4400,0x4400,0x0000, // u28ff 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x0000,0x0000,0x0000,0x4200,0x4200,0x0000,0x0000, // u2e2c 0x8000,0x8800,0x9c00,0xaa00,0x8800,0x8800,0x8800,0x1000,0x2000,0x4000,0x8000,0x8000,0x8000,0x8000, // ue0a0 0x8000,0x8000,0x8000,0x8000,0x8000,0xf800,0x0000,0x1100,0x1900,0x1500,0x1300,0x1100,0x1100,0x0000, // ue0a1 0x3800,0x4400,0x4400,0x4400,0x4400,0xfe00,0xfe00,0xee00,0xc600,0xee00,0xfe00,0xfe00,0xfe00,0x0000, // ue0a2 0x8000,0xc000,0xe000,0xf000,0xf800,0xfc00,0xfe00,0xfe00,0xfc00,0xf800,0xf000,0xe000,0xc000,0x8000, // ue0b0 0x8000,0x4000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000, // ue0b1 0x0100,0x0300,0x0700,0x0f00,0x1f00,0x3f00,0x7f00,0x7f00,0x3f00,0x1f00,0x0f00,0x0700,0x0300,0x0100, // ue0b2 0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0100, // ue0b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x4400,0x4400,0x3800, // uf6be 0x0000,0x0000,0x7e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x7e00,0x0000,0x0000 // ufffd }; // codepoints array constexpr std::array fixedfont_codepoints = { 0x0000,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e, 0x002f,0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e, 0x003f,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e, 0x004f,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e, 0x005f,0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e, 0x006f,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e, 0x00a0,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af, 0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf, 0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf, 0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df, 0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef, 0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff, 0x0100,0x0101,0x0102,0x0103,0x0104,0x0105,0x0106,0x0107,0x0108,0x0109,0x010a,0x010b,0x010c,0x010d,0x010e,0x010f, 0x0110,0x0111,0x0112,0x0113,0x0114,0x0115,0x0116,0x0117,0x0118,0x0119,0x011a,0x011b,0x011c,0x011d,0x011e,0x011f, 0x0120,0x0121,0x0122,0x0123,0x0124,0x0125,0x0126,0x0127,0x0128,0x0129,0x012a,0x012b,0x012c,0x012d,0x012e,0x012f, 0x0130,0x0131,0x0132,0x0133,0x0134,0x0135,0x0136,0x0137,0x0138,0x0139,0x013a,0x013b,0x013c,0x013d,0x013e,0x013f, 0x0140,0x0141,0x0142,0x0143,0x0144,0x0145,0x0146,0x0147,0x0148,0x0149,0x014a,0x014b,0x014c,0x014d,0x014e,0x014f, 0x0150,0x0151,0x0152,0x0153,0x0154,0x0155,0x0156,0x0157,0x0158,0x0159,0x015a,0x015b,0x015c,0x015d,0x015e,0x015f, 0x0160,0x0161,0x0162,0x0163,0x0164,0x0165,0x0166,0x0167,0x0168,0x0169,0x016a,0x016b,0x016c,0x016d,0x016e,0x016f, 0x0170,0x0171,0x0172,0x0173,0x0174,0x0175,0x0176,0x0177,0x0178,0x0179,0x017a,0x017b,0x017c,0x017d,0x017e,0x017f, 0x0186,0x018e,0x018f,0x0190,0x0192,0x019d,0x019e,0x01b5,0x01b6,0x01b7,0x01cd,0x01ce,0x01cf,0x01d0,0x01d1,0x01d2, 0x01d3,0x01d4,0x01e2,0x01e3,0x01e4,0x01e5,0x01e6,0x01e7,0x01e8,0x01e9,0x01ea,0x01eb,0x01ec,0x01ed,0x01ee,0x01ef, 0x01f0,0x01f4,0x01f5,0x01fc,0x01fd,0x01fe,0x01ff,0x0218,0x0219,0x021a,0x021b,0x0232,0x0233,0x0237,0x0254,0x0258, 0x0259,0x025b,0x0272,0x0292,0x02bb,0x02bc,0x02bd,0x02c6,0x02c7,0x02d8,0x02d9,0x02db,0x02dc,0x02dd,0x0300,0x0301, 0x0302,0x0303,0x0304,0x0305,0x0306,0x0307,0x0308,0x030a,0x030b,0x030c,0x0329,0x0384,0x0385,0x0386,0x0387,0x0388, 0x0389,0x038a,0x038c,0x038e,0x038f,0x0390,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039a, 0x039b,0x039c,0x039d,0x039e,0x039f,0x03a0,0x03a1,0x03a3,0x03a4,0x03a5,0x03a6,0x03a7,0x03a8,0x03a9,0x03aa,0x03ab, 0x03ac,0x03ad,0x03ae,0x03af,0x03b0,0x03b1,0x03b2,0x03b3,0x03b4,0x03b5,0x03b6,0x03b7,0x03b8,0x03b9,0x03ba,0x03bb, 0x03bc,0x03bd,0x03be,0x03bf,0x03c0,0x03c1,0x03c2,0x03c3,0x03c4,0x03c5,0x03c6,0x03c7,0x03c8,0x03c9,0x03ca,0x03cb, 0x03cc,0x03cd,0x03ce,0x03d1,0x03d5,0x03f0,0x03f1,0x03f2,0x03f3,0x03f4,0x03f5,0x03f6,0x0400,0x0401,0x0402,0x0403, 0x0404,0x0405,0x0406,0x0407,0x0408,0x0409,0x040a,0x040b,0x040c,0x040d,0x040e,0x040f,0x0410,0x0411,0x0412,0x0413, 0x0414,0x0415,0x0416,0x0417,0x0418,0x0419,0x041a,0x041b,0x041c,0x041d,0x041e,0x041f,0x0420,0x0421,0x0422,0x0423, 0x0424,0x0425,0x0426,0x0427,0x0428,0x0429,0x042a,0x042b,0x042c,0x042d,0x042e,0x042f,0x0430,0x0431,0x0432,0x0433, 0x0434,0x0435,0x0436,0x0437,0x0438,0x0439,0x043a,0x043b,0x043c,0x043d,0x043e,0x043f,0x0440,0x0441,0x0442,0x0443, 0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,0x044a,0x044b,0x044c,0x044d,0x044e,0x044f,0x0450,0x0451,0x0452,0x0453, 0x0454,0x0455,0x0456,0x0457,0x0458,0x0459,0x045a,0x045b,0x045c,0x045d,0x045e,0x045f,0x0462,0x0463,0x046a,0x046b, 0x0490,0x0491,0x0492,0x0493,0x0494,0x0495,0x0496,0x0497,0x0498,0x0499,0x049a,0x049b,0x049c,0x049d,0x04a0,0x04a1, 0x04a2,0x04a3,0x04a4,0x04a5,0x04aa,0x04ab,0x04ae,0x04af,0x04b0,0x04b1,0x04b2,0x04b3,0x04b6,0x04b7,0x04b8,0x04b9, 0x04ba,0x04bb,0x04c0,0x04c1,0x04c2,0x04cf,0x04d0,0x04d1,0x04d2,0x04d3,0x04d4,0x04d5,0x04d6,0x04d7,0x04d8,0x04d9, 0x04da,0x04db,0x04dc,0x04dd,0x04de,0x04df,0x04e2,0x04e3,0x04e4,0x04e5,0x04e6,0x04e7,0x04e8,0x04e9,0x04ea,0x04eb, 0x04ec,0x04ed,0x04ee,0x04ef,0x04f0,0x04f1,0x04f2,0x04f3,0x04f4,0x04f5,0x04f8,0x04f9,0x05d0,0x05d1,0x05d2,0x05d3, 0x05d4,0x05d5,0x05d6,0x05d7,0x05d8,0x05d9,0x05da,0x05db,0x05dc,0x05dd,0x05de,0x05df,0x05e0,0x05e1,0x05e2,0x05e3, 0x05e4,0x05e5,0x05e6,0x05e7,0x05e8,0x05e9,0x05ea,0x1e0c,0x1e0d,0x1e34,0x1e35,0x1e36,0x1e37,0x1e40,0x1e41,0x1e42, 0x1e43,0x1e44,0x1e45,0x1e46,0x1e47,0x1e6c,0x1e6d,0x1eb8,0x1eb9,0x1ebc,0x1ebd,0x1eca,0x1ecb,0x1ecc,0x1ecd,0x1ee4, 0x1ee5,0x1ef8,0x1ef9,0x2000,0x2001,0x2002,0x2003,0x2004,0x2005,0x2006,0x2007,0x2008,0x2009,0x200a,0x200b,0x200c, 0x200d,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x2015,0x2016,0x2017,0x2018,0x2019,0x201a,0x201b,0x201c, 0x201d,0x201e,0x201f,0x2020,0x2021,0x2022,0x2026,0x2030,0x2032,0x2033,0x2039,0x203a,0x203c,0x203e,0x2070,0x2071, 0x2074,0x2075,0x2076,0x2077,0x2078,0x2079,0x207a,0x207b,0x207c,0x207d,0x207e,0x207f,0x2080,0x2081,0x2082,0x2083, 0x2084,0x2085,0x2086,0x2087,0x2088,0x2089,0x208a,0x208b,0x208c,0x208d,0x208e,0x2090,0x2091,0x2092,0x2093,0x2094, 0x2095,0x2096,0x2097,0x2098,0x209a,0x20a7,0x20aa,0x20ac,0x20ae,0x2102,0x210e,0x210f,0x2115,0x2116,0x211a,0x211d, 0x2122,0x2124,0x2126,0x2135,0x2190,0x2191,0x2192,0x2193,0x2194,0x2195,0x21a4,0x21a6,0x21a8,0x21b5,0x21bb,0x21cb, 0x21cc,0x21d0,0x21d1,0x21d2,0x21d3,0x21d4,0x21d5,0x2200,0x2203,0x2204,0x2205,0x2206,0x2207,0x2208,0x2209,0x220a, 0x220b,0x220c,0x220d,0x2212,0x2213,0x2214,0x2215,0x2216,0x2219,0x221a,0x221e,0x221f,0x2225,0x2227,0x2228,0x2229, 0x222a,0x2248,0x2260,0x2261,0x2264,0x2265,0x226a,0x226b,0x2282,0x2283,0x2286,0x2287,0x22a5,0x22c2,0x22c3,0x2300, 0x2302,0x2308,0x2309,0x230a,0x230b,0x2310,0x2319,0x2320,0x2321,0x239b,0x239c,0x239d,0x239e,0x239f,0x23a0,0x23a1, 0x23a2,0x23a3,0x23a4,0x23a5,0x23a6,0x23a7,0x23a8,0x23a9,0x23ab,0x23ac,0x23ad,0x23ae,0x23af,0x23ba,0x23bb,0x23bc, 0x23bd,0x23d0,0x2409,0x240a,0x240b,0x240c,0x240d,0x2424,0x2500,0x2501,0x2502,0x2503,0x2508,0x2509,0x250a,0x250b, 0x250c,0x250d,0x250e,0x250f,0x2510,0x2511,0x2512,0x2513,0x2514,0x2515,0x2516,0x2517,0x2518,0x2519,0x251a,0x251b, 0x251c,0x251d,0x251e,0x251f,0x2520,0x2521,0x2522,0x2523,0x2524,0x2525,0x2526,0x2527,0x2528,0x2529,0x252a,0x252b, 0x252c,0x252d,0x252e,0x252f,0x2530,0x2531,0x2532,0x2533,0x2534,0x2535,0x2536,0x2537,0x2538,0x2539,0x253a,0x253b, 0x253c,0x253d,0x253e,0x253f,0x2540,0x2541,0x2542,0x2543,0x2544,0x2545,0x2546,0x2547,0x2548,0x2549,0x254a,0x254b, 0x2550,0x2551,0x2552,0x2553,0x2554,0x2555,0x2556,0x2557,0x2558,0x2559,0x255a,0x255b,0x255c,0x255d,0x255e,0x255f, 0x2560,0x2561,0x2562,0x2563,0x2564,0x2565,0x2566,0x2567,0x2568,0x2569,0x256a,0x256b,0x256c,0x256d,0x256e,0x256f, 0x2570,0x2571,0x2572,0x2573,0x2574,0x2575,0x2576,0x2577,0x2578,0x2579,0x257a,0x257b,0x257c,0x257d,0x257e,0x257f, 0x2580,0x2581,0x2582,0x2583,0x2584,0x2585,0x2586,0x2587,0x2588,0x2589,0x258a,0x258b,0x258c,0x258d,0x258e,0x258f, 0x2590,0x2591,0x2592,0x2593,0x2596,0x2597,0x2598,0x2599,0x259a,0x259b,0x259c,0x259d,0x259e,0x259f,0x25a0,0x25ac, 0x25ae,0x25b2,0x25b6,0x25ba,0x25bc,0x25c0,0x25c4,0x25c6,0x25ca,0x25cb,0x25cf,0x25d8,0x25d9,0x263a,0x263b,0x263c, 0x2640,0x2642,0x2660,0x2663,0x2665,0x2666,0x266a,0x266b,0x2713,0x2714,0x2717,0x2718,0x27e8,0x27e9,0x27ea,0x27eb, 0x2800,0x2801,0x2802,0x2803,0x2804,0x2805,0x2806,0x2807,0x2808,0x2809,0x280a,0x280b,0x280c,0x280d,0x280e,0x280f, 0x2810,0x2811,0x2812,0x2813,0x2814,0x2815,0x2816,0x2817,0x2818,0x2819,0x281a,0x281b,0x281c,0x281d,0x281e,0x281f, 0x2820,0x2821,0x2822,0x2823,0x2824,0x2825,0x2826,0x2827,0x2828,0x2829,0x282a,0x282b,0x282c,0x282d,0x282e,0x282f, 0x2830,0x2831,0x2832,0x2833,0x2834,0x2835,0x2836,0x2837,0x2838,0x2839,0x283a,0x283b,0x283c,0x283d,0x283e,0x283f, 0x2840,0x2841,0x2842,0x2843,0x2844,0x2845,0x2846,0x2847,0x2848,0x2849,0x284a,0x284b,0x284c,0x284d,0x284e,0x284f, 0x2850,0x2851,0x2852,0x2853,0x2854,0x2855,0x2856,0x2857,0x2858,0x2859,0x285a,0x285b,0x285c,0x285d,0x285e,0x285f, 0x2860,0x2861,0x2862,0x2863,0x2864,0x2865,0x2866,0x2867,0x2868,0x2869,0x286a,0x286b,0x286c,0x286d,0x286e,0x286f, 0x2870,0x2871,0x2872,0x2873,0x2874,0x2875,0x2876,0x2877,0x2878,0x2879,0x287a,0x287b,0x287c,0x287d,0x287e,0x287f, 0x2880,0x2881,0x2882,0x2883,0x2884,0x2885,0x2886,0x2887,0x2888,0x2889,0x288a,0x288b,0x288c,0x288d,0x288e,0x288f, 0x2890,0x2891,0x2892,0x2893,0x2894,0x2895,0x2896,0x2897,0x2898,0x2899,0x289a,0x289b,0x289c,0x289d,0x289e,0x289f, 0x28a0,0x28a1,0x28a2,0x28a3,0x28a4,0x28a5,0x28a6,0x28a7,0x28a8,0x28a9,0x28aa,0x28ab,0x28ac,0x28ad,0x28ae,0x28af, 0x28b0,0x28b1,0x28b2,0x28b3,0x28b4,0x28b5,0x28b6,0x28b7,0x28b8,0x28b9,0x28ba,0x28bb,0x28bc,0x28bd,0x28be,0x28bf, 0x28c0,0x28c1,0x28c2,0x28c3,0x28c4,0x28c5,0x28c6,0x28c7,0x28c8,0x28c9,0x28ca,0x28cb,0x28cc,0x28cd,0x28ce,0x28cf, 0x28d0,0x28d1,0x28d2,0x28d3,0x28d4,0x28d5,0x28d6,0x28d7,0x28d8,0x28d9,0x28da,0x28db,0x28dc,0x28dd,0x28de,0x28df, 0x28e0,0x28e1,0x28e2,0x28e3,0x28e4,0x28e5,0x28e6,0x28e7,0x28e8,0x28e9,0x28ea,0x28eb,0x28ec,0x28ed,0x28ee,0x28ef, 0x28f0,0x28f1,0x28f2,0x28f3,0x28f4,0x28f5,0x28f6,0x28f7,0x28f8,0x28f9,0x28fa,0x28fb,0x28fc,0x28fd,0x28fe,0x28ff, 0x2e2c,0xe0a0,0xe0a1,0xe0a2,0xe0b0,0xe0b1,0xe0b2,0xe0b3,0xf6be,0xfffd }; } // namespace // -- end of autogenerated text --- namespace fixed_font_14b { // -- start of autogenerated text --- // definition section for font: ter-u14b.bdf constexpr int CHARCOUNT = 1354; constexpr int WIDTH = 8; constexpr int HEIGHT = 14; constexpr int OFFSET_X = 0; constexpr int OFFSET_Y = 0; constexpr FixedFont_info_t fixedfont_info = { "Terminus", // font name "ter-u14b.bdf", // font name internal CHARCOUNT, // num of chars WIDTH, HEIGHT, OFFSET_X, OFFSET_Y, true // bold }; // font bitmap definitions constexpr std::array fixedfont_bitmap = { 0x0000,0x0000,0xee00,0xc600,0x0000,0xc600,0xc600,0xc600,0x0000,0xc600,0xc600,0xee00,0x0000,0x0000, // u0000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0020 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x1800,0x1800,0x0000,0x0000, // u0021 0x0000,0x6600,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0022 0x0000,0x0000,0x6c00,0x6c00,0x6c00,0xfe00,0x6c00,0x6c00,0xfe00,0x6c00,0x6c00,0x6c00,0x0000,0x0000, // u0023 0x0000,0x1000,0x1000,0x7c00,0xd600,0xd000,0xd000,0x7c00,0x1600,0x1600,0xd600,0x7c00,0x1000,0x1000, // u0024 0x0000,0x0000,0x6600,0xd600,0x6c00,0x0c00,0x1800,0x1800,0x3000,0x3600,0x6b00,0x6600,0x0000,0x0000, // u0025 0x0000,0x0000,0x3800,0x6c00,0x6c00,0x3800,0x7600,0xdc00,0xcc00,0xcc00,0xdc00,0x7600,0x0000,0x0000, // u0026 0x0000,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0027 0x0000,0x0000,0x0c00,0x1800,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x1800,0x0c00,0x0000,0x0000, // u0028 0x0000,0x0000,0x3000,0x1800,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1800,0x3000,0x0000,0x0000, // u0029 0x0000,0x0000,0x0000,0x0000,0x0000,0x6c00,0x3800,0xfe00,0x3800,0x6c00,0x0000,0x0000,0x0000,0x0000, // u002a 0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x7e00,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u002b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x3000,0x0000, // u002c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x0000,0x0000, // u002e 0x0000,0x0000,0x0600,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x3000,0x3000,0x6000,0x6000,0x0000,0x0000, // u002f 0x0000,0x0000,0x7c00,0xc600,0xc600,0xce00,0xde00,0xf600,0xe600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u0030 0x0000,0x0000,0x1800,0x3800,0x7800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x7e00,0x0000,0x0000, // u0031 0x0000,0x0000,0x7c00,0xc600,0xc600,0x0600,0x0c00,0x1800,0x3000,0x6000,0xc000,0xfe00,0x0000,0x0000, // u0032 0x0000,0x0000,0x7c00,0xc600,0xc600,0x0600,0x3c00,0x0600,0x0600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u0033 0x0000,0x0000,0x0600,0x0e00,0x1e00,0x3600,0x6600,0xc600,0xfe00,0x0600,0x0600,0x0600,0x0000,0x0000, // u0034 0x0000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xfc00,0x0600,0x0600,0x0600,0xc600,0x7c00,0x0000,0x0000, // u0035 0x0000,0x0000,0x3c00,0x6000,0xc000,0xc000,0xfc00,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u0036 0x0000,0x0000,0xfe00,0x0600,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x3000,0x3000,0x3000,0x0000,0x0000, // u0037 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0x7c00,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u0038 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x0c00,0x7800,0x0000,0x0000, // u0039 0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x0000,0x0000,0x0000,0x1800,0x1800,0x0000,0x0000, // u003a 0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x0000,0x0000,0x0000,0x1800,0x1800,0x3000,0x0000, // u003b 0x0000,0x0000,0x0000,0x0600,0x0c00,0x1800,0x3000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0000,0x0000, // u003c 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0000,0x0000,0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000, // u003d 0x0000,0x0000,0x0000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0c00,0x1800,0x3000,0x6000,0x0000,0x0000, // u003e 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0x0c00,0x1800,0x1800,0x0000,0x1800,0x1800,0x0000,0x0000, // u003f 0x0000,0x0000,0x7c00,0xc600,0xce00,0xd600,0xd600,0xd600,0xd600,0xce00,0xc000,0x7e00,0x0000,0x0000, // u0040 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u0041 0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xfc00,0xc600,0xc600,0xc600,0xc600,0xfc00,0x0000,0x0000, // u0042 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc000,0xc000,0xc000,0xc000,0xc600,0xc600,0x7c00,0x0000,0x0000, // u0043 0x0000,0x0000,0xf800,0xcc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xcc00,0xf800,0x0000,0x0000, // u0044 0x0000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000, // u0045 0x0000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xc000,0xc000,0x0000,0x0000, // u0046 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc000,0xc000,0xde00,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u0047 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u0048 0x0000,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u0049 0x0000,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xcc00,0xcc00,0x7800,0x0000,0x0000, // u004a 0x0000,0x0000,0xc600,0xc600,0xcc00,0xd800,0xf000,0xf000,0xd800,0xcc00,0xc600,0xc600,0x0000,0x0000, // u004b 0x0000,0x0000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000, // u004c 0x0000,0x0000,0x8200,0xc600,0xee00,0xfe00,0xd600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u004d 0x0000,0x0000,0xc600,0xc600,0xc600,0xe600,0xf600,0xde00,0xce00,0xc600,0xc600,0xc600,0x0000,0x0000, // u004e 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u004f 0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xfc00,0xc000,0xc000,0xc000,0xc000,0x0000,0x0000, // u0050 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xde00,0x7c00,0x0600,0x0000, // u0051 0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xfc00,0xf000,0xd800,0xcc00,0xc600,0x0000,0x0000, // u0052 0x0000,0x0000,0x7c00,0xc600,0xc000,0xc000,0x7c00,0x0600,0x0600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u0053 0x0000,0x0000,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u0054 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u0055 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0x6c00,0x6c00,0x6c00,0x3800,0x3800,0x0000,0x0000, // u0056 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xd600,0xfe00,0xee00,0xc600,0x8200,0x0000,0x0000, // u0057 0x0000,0x0000,0xc600,0xc600,0x6c00,0x6c00,0x3800,0x3800,0x6c00,0x6c00,0xc600,0xc600,0x0000,0x0000, // u0058 0x0000,0x0000,0xc300,0xc300,0x6600,0x6600,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u0059 0x0000,0x0000,0xfe00,0x0600,0x0600,0x0c00,0x1800,0x3000,0x6000,0xc000,0xc000,0xfe00,0x0000,0x0000, // u005a 0x0000,0x0000,0x3c00,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3c00,0x0000,0x0000, // u005b 0x0000,0x0000,0x6000,0x6000,0x3000,0x3000,0x1800,0x1800,0x0c00,0x0c00,0x0600,0x0600,0x0000,0x0000, // u005c 0x0000,0x0000,0x3c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x3c00,0x0000,0x0000, // u005d 0x0000,0x1800,0x3c00,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0000, // u005f 0x3000,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0060 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0600,0x7e00,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u0061 0x0000,0x0000,0xc000,0xc000,0xc000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xfc00,0x0000,0x0000, // u0062 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc000,0xc000,0xc000,0xc600,0x7c00,0x0000,0x0000, // u0063 0x0000,0x0000,0x0600,0x0600,0x0600,0x7e00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u0064 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x0000, // u0065 0x0000,0x0000,0x1e00,0x3000,0x3000,0xfc00,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u0066 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x7c00, // u0067 0x0000,0x0000,0xc000,0xc000,0xc000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u0068 0x0000,0x0000,0x1800,0x1800,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u0069 0x0000,0x0000,0x0600,0x0600,0x0000,0x0e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x6600,0x6600,0x3c00, // u006a 0x0000,0x0000,0xc000,0xc000,0xc000,0xc600,0xcc00,0xd800,0xf000,0xd800,0xcc00,0xc600,0x0000,0x0000, // u006b 0x0000,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u006c 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0x0000,0x0000, // u006d 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u006e 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u006f 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xfc00,0xc000,0xc000, // u0070 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600, // u0071 0x0000,0x0000,0x0000,0x0000,0x0000,0xde00,0xf000,0xe000,0xc000,0xc000,0xc000,0xc000,0x0000,0x0000, // u0072 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0xc000,0xc000,0x7c00,0x0600,0x0600,0xfc00,0x0000,0x0000, // u0073 0x0000,0x0000,0x3000,0x3000,0x3000,0xfc00,0x3000,0x3000,0x3000,0x3000,0x3000,0x1e00,0x0000,0x0000, // u0074 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u0075 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0x6c00,0x6c00,0x3800,0x3800,0x0000,0x0000, // u0076 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xd600,0xd600,0xd600,0xd600,0x7c00,0x0000,0x0000, // u0077 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0x6c00,0x3800,0x6c00,0xc600,0xc600,0x0000,0x0000, // u0078 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x7c00, // u0079 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0c00,0x1800,0x3000,0x6000,0xc000,0xfe00,0x0000,0x0000, // u007a 0x0000,0x0000,0x1c00,0x3000,0x3000,0x3000,0x6000,0x3000,0x3000,0x3000,0x3000,0x1c00,0x0000,0x0000, // u007b 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u007c 0x0000,0x0000,0x7000,0x1800,0x1800,0x1800,0x0c00,0x1800,0x1800,0x1800,0x1800,0x7000,0x0000,0x0000, // u007d 0x0000,0x7300,0xdb00,0xce00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a0 0x0000,0x0000,0x1800,0x1800,0x0000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u00a1 0x0000,0x0000,0x0000,0x1000,0x1000,0x7c00,0xd600,0xd000,0xd000,0xd000,0xd600,0x7c00,0x1000,0x1000, // u00a2 0x0000,0x0000,0x3800,0x6c00,0x6000,0x6000,0xf800,0x6000,0x6000,0x6000,0x6600,0xfe00,0x0000,0x0000, // u00a3 0x0000,0x0000,0x0000,0x0000,0x6600,0x3c00,0x6600,0x6600,0x6600,0x3c00,0x6600,0x0000,0x0000,0x0000, // u00a4 0x0000,0x0000,0xc300,0xc300,0x6600,0x3c00,0x1800,0x7e00,0x1800,0x7e00,0x1800,0x1800,0x0000,0x0000, // u00a5 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u00a6 0x0000,0x3c00,0x6600,0x6000,0x3800,0x6c00,0x6600,0x6600,0x3600,0x1c00,0x0600,0x6600,0x3c00,0x0000, // u00a7 0x6c00,0x6c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a8 0x0000,0x0000,0x0000,0x7e00,0x8100,0x9900,0xa500,0xa100,0xa500,0x9900,0x8100,0x7e00,0x0000,0x0000, // u00a9 0x0000,0x3c00,0x0600,0x3e00,0x6600,0x3e00,0x0000,0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x1b00,0x3600,0x6c00,0xd800,0x6c00,0x3600,0x1b00,0x0000,0x0000, // u00ab 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ac 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ad 0x0000,0x0000,0x0000,0x7e00,0x8100,0xb900,0xa500,0xb900,0xa900,0xa500,0x8100,0x7e00,0x0000,0x0000, // u00ae 0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00af 0x0000,0x3800,0x6c00,0x6c00,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x7e00,0x1800,0x1800,0x0000,0x7e00,0x0000,0x0000, // u00b1 0x0000,0x3800,0x6c00,0x0c00,0x1800,0x3000,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b2 0x0000,0x7800,0x0c00,0x3800,0x0c00,0x0c00,0x7800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b3 0x1800,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b4 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xce00,0xf600,0xc000,0xc000, // u00b5 0x0000,0x0000,0x7e00,0xd600,0xd600,0xd600,0xd600,0x7600,0x1600,0x1600,0x1600,0x1600,0x0000,0x0000, // u00b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x6000, // u00b8 0x0000,0x1800,0x3800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b9 0x0000,0x3c00,0x6600,0x6600,0x6600,0x3c00,0x0000,0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ba 0x0000,0x0000,0x0000,0x0000,0x0000,0xd800,0x6c00,0x3600,0x1b00,0x3600,0x6c00,0xd800,0x0000,0x0000, // u00bb 0x6000,0xe000,0x6200,0x6600,0x6c00,0x1800,0x3000,0x6600,0xce00,0x9a00,0x3e00,0x0600,0x0600,0x0000, // u00bc 0x6000,0xe000,0x6200,0x6600,0x6c00,0x1800,0x3000,0x6000,0xdc00,0xb600,0x0c00,0x1800,0x3e00,0x0000, // u00bd 0xe000,0x3000,0x6200,0x3600,0xec00,0x1800,0x3000,0x6600,0xce00,0x9a00,0x3e00,0x0600,0x0600,0x0000, // u00be 0x0000,0x0000,0x3000,0x3000,0x0000,0x3000,0x3000,0x6000,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u00bf 0x3000,0x1800,0x0000,0x7c00,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u00c0 0x1800,0x3000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u00c1 0x3800,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u00c2 0x7600,0xdc00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u00c3 0x6c00,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u00c4 0x3800,0x6c00,0x3800,0x7c00,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u00c5 0x0000,0x0000,0x7e00,0xd800,0xd800,0xd800,0xfe00,0xd800,0xd800,0xd800,0xd800,0xde00,0x0000,0x0000, // u00c6 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc000,0xc000,0xc000,0xc000,0xc600,0xc600,0x7c00,0x3000,0x6000, // u00c7 0x3000,0x1800,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000, // u00c8 0x1800,0x3000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000, // u00c9 0x3800,0x6c00,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000, // u00ca 0x6c00,0x6c00,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000, // u00cb 0x3000,0x1800,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u00cc 0x0c00,0x1800,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u00cd 0x3800,0x6c00,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u00ce 0x6600,0x6600,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u00cf 0x0000,0x0000,0x7800,0x6c00,0x6600,0x6600,0xf600,0x6600,0x6600,0x6600,0x6c00,0x7800,0x0000,0x0000, // u00d0 0x7600,0xdc00,0x0000,0xc600,0xc600,0xe600,0xf600,0xde00,0xce00,0xc600,0xc600,0xc600,0x0000,0x0000, // u00d1 0x3000,0x1800,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u00d2 0x1800,0x3000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u00d3 0x3800,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u00d4 0x7600,0xdc00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u00d5 0x6c00,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u00d6 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0x6c00,0x3800,0x3800,0x6c00,0xc600,0x0000,0x0000,0x0000, // u00d7 0x0000,0x0000,0x7c00,0xc700,0xc600,0xce00,0xde00,0xf600,0xe600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u00d8 0x3000,0x1800,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u00d9 0x1800,0x3000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u00da 0x3800,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u00db 0x6c00,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u00dc 0x0c00,0x1800,0xc300,0xc300,0x6600,0x6600,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u00dd 0x0000,0x0000,0xc000,0xc000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xfc00,0xc000,0xc000,0x0000,0x0000, // u00de 0x0000,0x0000,0x7800,0xcc00,0xcc00,0xc800,0xfc00,0xc600,0xc600,0xc600,0xe600,0xdc00,0x0000,0x0000, // u00df 0x0000,0x0000,0x3000,0x1800,0x0000,0x7c00,0x0600,0x7e00,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u00e0 0x0000,0x0000,0x1800,0x3000,0x0000,0x7c00,0x0600,0x7e00,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u00e1 0x0000,0x0000,0x3800,0x6c00,0x0000,0x7c00,0x0600,0x7e00,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u00e2 0x0000,0x0000,0x7600,0xdc00,0x0000,0x7c00,0x0600,0x7e00,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u00e3 0x0000,0x0000,0x6c00,0x6c00,0x0000,0x7c00,0x0600,0x7e00,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u00e4 0x0000,0x0000,0x3800,0x6c00,0x3800,0x7c00,0x0600,0x7e00,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u00e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x6c00,0x1600,0x1600,0x7e00,0xd000,0xd000,0x6c00,0x0000,0x0000, // u00e6 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc000,0xc000,0xc000,0xc600,0x7c00,0x3000,0x6000, // u00e7 0x0000,0x0000,0x3000,0x1800,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x0000, // u00e8 0x0000,0x0000,0x1800,0x3000,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x0000, // u00e9 0x0000,0x0000,0x3800,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x0000, // u00ea 0x0000,0x0000,0x6c00,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x0000, // u00eb 0x0000,0x0000,0x3000,0x1800,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u00ec 0x0000,0x0000,0x0c00,0x1800,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u00ed 0x0000,0x0000,0x3800,0x6c00,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u00ee 0x0000,0x0000,0x6c00,0x6c00,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u00ef 0x0000,0x0000,0x6800,0x3000,0x5800,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u00f0 0x0000,0x0000,0x7600,0xdc00,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u00f1 0x0000,0x0000,0x3000,0x1800,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u00f2 0x0000,0x0000,0x1800,0x3000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u00f3 0x0000,0x0000,0x3800,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u00f4 0x0000,0x0000,0x7600,0xdc00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u00f5 0x0000,0x0000,0x6c00,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u00f6 0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x0000,0x7e00,0x0000,0x1800,0x1800,0x0000,0x0000,0x0000, // u00f7 0x0000,0x0000,0x0000,0x0000,0x0000,0x3d00,0x6700,0x6e00,0x7e00,0x7600,0xe600,0xbc00,0x0000,0x0000, // u00f8 0x0000,0x0000,0x3000,0x1800,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u00f9 0x0000,0x0000,0x1800,0x3000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u00fa 0x0000,0x0000,0x3800,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u00fb 0x0000,0x0000,0x6c00,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u00fc 0x0000,0x0000,0x1800,0x3000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x7c00, // u00fd 0x0000,0x0000,0xc000,0xc000,0xc000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xfc00,0xc000,0xc000, // u00fe 0x0000,0x0000,0x6c00,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x7c00, // u00ff 0x7c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u0100 0x0000,0x0000,0x0000,0x7c00,0x0000,0x7c00,0x0600,0x7e00,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u0101 0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u0102 0x0000,0x0000,0x6c00,0x3800,0x0000,0x7c00,0x0600,0x7e00,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u0103 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0c00,0x0700, // u0104 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0600,0x7e00,0xc600,0xc600,0xc600,0x7e00,0x0c00,0x0700, // u0105 0x1800,0x3000,0x0000,0x7c00,0xc600,0xc600,0xc000,0xc000,0xc000,0xc600,0xc600,0x7c00,0x0000,0x0000, // u0106 0x0000,0x0000,0x1800,0x3000,0x0000,0x7c00,0xc600,0xc000,0xc000,0xc000,0xc600,0x7c00,0x0000,0x0000, // u0107 0x3800,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xc000,0xc000,0xc000,0xc600,0xc600,0x7c00,0x0000,0x0000, // u0108 0x0000,0x0000,0x3800,0x6c00,0x0000,0x7c00,0xc600,0xc000,0xc000,0xc000,0xc600,0x7c00,0x0000,0x0000, // u0109 0x1800,0x1800,0x0000,0x7c00,0xc600,0xc600,0xc000,0xc000,0xc000,0xc600,0xc600,0x7c00,0x0000,0x0000, // u010a 0x0000,0x0000,0x1800,0x1800,0x0000,0x7c00,0xc600,0xc000,0xc000,0xc000,0xc600,0x7c00,0x0000,0x0000, // u010b 0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc600,0xc000,0xc000,0xc000,0xc600,0xc600,0x7c00,0x0000,0x0000, // u010c 0x0000,0x0000,0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc000,0xc000,0xc000,0xc600,0x7c00,0x0000,0x0000, // u010d 0x6c00,0x3800,0x0000,0xf800,0xcc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xcc00,0xf800,0x0000,0x0000, // u010e 0x6c00,0x3800,0x0600,0x0600,0x0600,0x7e00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u010f 0x0000,0x0000,0x7800,0x6c00,0x6600,0x6600,0xf600,0x6600,0x6600,0x6600,0x6c00,0x7800,0x0000,0x0000, // u0110 0x0000,0x0000,0x0600,0x1f00,0x0600,0x7e00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u0111 0x7c00,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000, // u0112 0x0000,0x0000,0x0000,0x7c00,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x0000, // u0113 0x6c00,0x3800,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000, // u0114 0x0000,0x0000,0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x0000, // u0115 0x1800,0x1800,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000, // u0116 0x0000,0x0000,0x1800,0x1800,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x0000, // u0117 0x0000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xc000,0xfe00,0x0c00,0x0700, // u0118 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x1800,0x0e00, // u0119 0x6c00,0x3800,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000, // u011a 0x0000,0x0000,0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x0000, // u011b 0x3800,0x6c00,0x0000,0x7c00,0xc600,0xc000,0xc000,0xde00,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u011c 0x0000,0x0000,0x3800,0x6c00,0x0000,0x7e00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x7c00, // u011d 0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc000,0xc000,0xde00,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u011e 0x0000,0x0000,0x6c00,0x3800,0x0000,0x7e00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x7c00, // u011f 0x1800,0x1800,0x0000,0x7c00,0xc600,0xc000,0xc000,0xde00,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u0120 0x0000,0x0000,0x1800,0x1800,0x0000,0x7e00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x7c00, // u0121 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc000,0xc000,0xde00,0xc600,0xc600,0xc600,0x7c00,0x3000,0x6000, // u0122 0x0000,0x0c00,0x1800,0x1800,0x0000,0x7e00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x7c00, // u0123 0x3800,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u0124 0x1c00,0x3600,0xc000,0xc000,0xc000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u0125 0x0000,0x0000,0x6600,0xff00,0x6600,0x6600,0x7e00,0x6600,0x6600,0x6600,0x6600,0x6600,0x0000,0x0000, // u0126 0x0000,0x0000,0x6000,0xf800,0x6000,0x7c00,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x0000,0x0000, // u0127 0x7600,0xdc00,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u0128 0x0000,0x0000,0x7600,0xdc00,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u0129 0x7e00,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u012a 0x0000,0x0000,0x0000,0x7c00,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u012b 0x6c00,0x3800,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u012c 0x0000,0x0000,0x6c00,0x3800,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u012d 0x0000,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x1800,0x0e00, // u012e 0x0000,0x0000,0x1800,0x1800,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x1800,0x0e00, // u012f 0x1800,0x1800,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u0130 0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u0131 0x0000,0x0000,0xcf00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xf600,0xf600,0xdc00,0x0000,0x0000, // u0132 0x0000,0x0000,0xc600,0xc600,0x0000,0xce00,0xc600,0xc600,0xc600,0xc600,0xc600,0xf600,0x3600,0x1c00, // u0133 0x1c00,0x3600,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xcc00,0xcc00,0x7800,0x0000,0x0000, // u0134 0x0000,0x0000,0x0e00,0x1b00,0x0000,0x0e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x6600,0x6600,0x3c00, // u0135 0x0000,0x0000,0xc600,0xc600,0xcc00,0xd800,0xf000,0xf000,0xd800,0xcc00,0xc600,0xf600,0x3000,0x6000, // u0136 0x0000,0x0000,0xc000,0xc000,0xc000,0xc600,0xcc00,0xd800,0xf000,0xd800,0xcc00,0xf600,0x3000,0x6000, // u0137 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xcc00,0xd800,0xf000,0xd800,0xcc00,0xc600,0x0000,0x0000, // u0138 0x6000,0xc000,0x0000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000, // u0139 0x0c00,0x1800,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u013a 0x0000,0x0000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xfe00,0x3000,0x6000, // u013b 0x0000,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x1800,0x3000, // u013c 0x6c00,0x3800,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000, // u013d 0x6c00,0x3800,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u013e 0x0000,0x0000,0xc000,0xc000,0xc000,0xc000,0xcc00,0xcc00,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000, // u013f 0x0000,0x0000,0x3800,0x1800,0x1800,0x1800,0x1b00,0x1b00,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u0140 0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x7000,0xe000,0x6000,0x6000,0x6000,0x7f00,0x0000,0x0000, // u0141 0x0000,0x0000,0x3800,0x1800,0x1800,0x1800,0x1c00,0x3800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u0142 0x1800,0x3000,0xc600,0xc600,0xc600,0xe600,0xf600,0xde00,0xce00,0xc600,0xc600,0xc600,0x0000,0x0000, // u0143 0x0000,0x0000,0x1800,0x3000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u0144 0x0000,0x0000,0xc600,0xc600,0xc600,0xe600,0xf600,0xde00,0xce00,0xc600,0xc600,0xf600,0x3000,0x6000, // u0145 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xf600,0x3000,0x6000, // u0146 0x6c00,0x3800,0xc600,0xc600,0xc600,0xe600,0xf600,0xde00,0xce00,0xc600,0xc600,0xc600,0x0000,0x0000, // u0147 0x0000,0x0000,0x6c00,0x3800,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u0148 0x0000,0x6000,0x6000,0xc000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u0149 0x0000,0x0000,0xc600,0xc600,0xc600,0xe600,0xf600,0xde00,0xce00,0xc600,0xc600,0xc600,0x0600,0x1c00, // u014a 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0600,0x1c00, // u014b 0x7c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u014c 0x0000,0x0000,0x0000,0x7c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u014d 0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u014e 0x0000,0x0000,0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u014f 0x3600,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u0150 0x0000,0x0000,0x3600,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u0151 0x0000,0x0000,0x7e00,0xd800,0xd800,0xd800,0xde00,0xd800,0xd800,0xd800,0xd800,0x7e00,0x0000,0x0000, // u0152 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xd600,0xd600,0xde00,0xd000,0xd000,0x7c00,0x0000,0x0000, // u0153 0x1800,0x3000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xfc00,0xf000,0xd800,0xcc00,0xc600,0x0000,0x0000, // u0154 0x0000,0x0000,0x1800,0x3000,0x0000,0xde00,0xf000,0xe000,0xc000,0xc000,0xc000,0xc000,0x0000,0x0000, // u0155 0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xfc00,0xf000,0xd800,0xcc00,0xf600,0x3000,0x6000, // u0156 0x0000,0x0000,0x0000,0x0000,0x0000,0xde00,0xf000,0xe000,0xc000,0xc000,0xc000,0xe000,0x6000,0xc000, // u0157 0x6c00,0x3800,0x0000,0xfc00,0xc600,0xc600,0xc600,0xfc00,0xf000,0xd800,0xcc00,0xc600,0x0000,0x0000, // u0158 0x0000,0x0000,0x6c00,0x3800,0x0000,0xde00,0xf000,0xe000,0xc000,0xc000,0xc000,0xc000,0x0000,0x0000, // u0159 0x1800,0x3000,0x0000,0x7c00,0xc600,0xc000,0xc000,0x7c00,0x0600,0x0600,0xc600,0x7c00,0x0000,0x0000, // u015a 0x0000,0x0000,0x0c00,0x1800,0x0000,0x7e00,0xc000,0xc000,0x7c00,0x0600,0x0600,0xfc00,0x0000,0x0000, // u015b 0x3800,0x6c00,0x0000,0x7c00,0xc600,0xc000,0xc000,0x7c00,0x0600,0x0600,0xc600,0x7c00,0x0000,0x0000, // u015c 0x0000,0x0000,0x3800,0x6c00,0x0000,0x7e00,0xc000,0xc000,0x7c00,0x0600,0x0600,0xfc00,0x0000,0x0000, // u015d 0x0000,0x0000,0x7c00,0xc600,0xc000,0xc000,0x7c00,0x0600,0x0600,0xc600,0xc600,0x7c00,0x3000,0x6000, // u015e 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0xc000,0xc000,0x7c00,0x0600,0x0600,0xfc00,0x3000,0x6000, // u015f 0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc000,0xc000,0x7c00,0x0600,0x0600,0xc600,0x7c00,0x0000,0x0000, // u0160 0x0000,0x0000,0x6c00,0x3800,0x0000,0x7e00,0xc000,0xc000,0x7c00,0x0600,0x0600,0xfc00,0x0000,0x0000, // u0161 0x0000,0x0000,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1c00,0x0c00,0x1800, // u0162 0x0000,0x0000,0x3000,0x3000,0x3000,0xfc00,0x3000,0x3000,0x3000,0x3000,0x3000,0x1e00,0x0c00,0x1800, // u0163 0x6c00,0x3800,0x0000,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u0164 0x6c00,0x3800,0x0000,0x3000,0x3000,0xfc00,0x3000,0x3000,0x3000,0x3000,0x3000,0x1e00,0x0000,0x0000, // u0165 0x0000,0x0000,0xff00,0x1800,0x1800,0x1800,0x7e00,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u0166 0x0000,0x0000,0x3000,0x3000,0x3000,0xfc00,0x3000,0x7800,0x3000,0x3000,0x3000,0x1e00,0x0000,0x0000, // u0167 0x7600,0xdc00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u0168 0x0000,0x0000,0x7600,0xdc00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u0169 0x7c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u016a 0x0000,0x0000,0x0000,0x7c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u016b 0x6c00,0x3800,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u016c 0x0000,0x0000,0x6c00,0x3800,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u016d 0x3800,0x6c00,0x3800,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u016e 0x0000,0x0000,0x3800,0x6c00,0x3800,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u016f 0x3600,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u0170 0x0000,0x0000,0x3600,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u0171 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x1800,0x0e00, // u0172 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0c00,0x0700, // u0173 0x3800,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xd600,0xfe00,0xee00,0xc600,0x8200,0x0000,0x0000, // u0174 0x0000,0x0000,0x3800,0x6c00,0x0000,0xc600,0xc600,0xd600,0xd600,0xd600,0xd600,0x7c00,0x0000,0x0000, // u0175 0x3800,0x6c00,0x0000,0xc300,0xc300,0x6600,0x6600,0x3c00,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u0176 0x0000,0x0000,0x3800,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x7c00, // u0177 0x6600,0x6600,0x0000,0xc300,0xc300,0x6600,0x6600,0x3c00,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u0178 0x1800,0x3000,0x0000,0xfe00,0x0600,0x0c00,0x1800,0x3000,0x6000,0xc000,0xc000,0xfe00,0x0000,0x0000, // u0179 0x0000,0x0000,0x1800,0x3000,0x0000,0xfe00,0x0c00,0x1800,0x3000,0x6000,0xc000,0xfe00,0x0000,0x0000, // u017a 0x1800,0x1800,0x0000,0xfe00,0x0600,0x0c00,0x1800,0x3000,0x6000,0xc000,0xc000,0xfe00,0x0000,0x0000, // u017b 0x0000,0x0000,0x1800,0x1800,0x0000,0xfe00,0x0c00,0x1800,0x3000,0x6000,0xc000,0xfe00,0x0000,0x0000, // u017c 0x6c00,0x3800,0x0000,0xfe00,0x0600,0x0c00,0x1800,0x3000,0x6000,0xc000,0xc000,0xfe00,0x0000,0x0000, // u017d 0x0000,0x0000,0x6c00,0x3800,0x0000,0xfe00,0x0c00,0x1800,0x3000,0x6000,0xc000,0xfe00,0x0000,0x0000, // u017e 0x0000,0x0000,0x1e00,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u017f 0x0000,0x0000,0x7c00,0xc600,0xc600,0x0600,0x0600,0x0600,0x0600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u0186 0x0000,0x0000,0xfe00,0x0600,0x0600,0x0600,0x3e00,0x0600,0x0600,0x0600,0x0600,0xfe00,0x0000,0x0000, // u018e 0x0000,0x0000,0x7c00,0xc600,0x0600,0x0600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u018f 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc000,0x7800,0xc000,0xc000,0xc600,0xc600,0x7c00,0x0000,0x0000, // u0190 0x0000,0x0000,0x0e00,0x1b00,0x1800,0x1800,0x7e00,0x1800,0x1800,0x1800,0x1800,0x1800,0xd800,0x7000, // u0192 0x0000,0x0000,0x6600,0x6600,0x6600,0x7600,0x7e00,0x6e00,0x6600,0x6600,0x6600,0x6600,0x6000,0xc000, // u019d 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0600,0x0600, // u019e 0x0000,0x0000,0xfe00,0x0600,0x0c00,0x1800,0xfe00,0x3000,0x6000,0xc000,0xc000,0xfe00,0x0000,0x0000, // u01b5 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0c00,0x1800,0xfc00,0x3000,0x6000,0xfe00,0x0000,0x0000, // u01b6 0x0000,0x0000,0xfe00,0x0600,0x0c00,0x1800,0x3c00,0x0600,0x0600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u01b7 0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u01cd 0x0000,0x0000,0x6c00,0x3800,0x0000,0x7c00,0x0600,0x7e00,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u01ce 0x6c00,0x3800,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u01cf 0x0000,0x0000,0x6c00,0x3800,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u01d0 0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u01d1 0x0000,0x0000,0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u01d2 0x6c00,0x3800,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u01d3 0x0000,0x0000,0x6c00,0x3800,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u01d4 0x7c00,0x0000,0x7e00,0xd800,0xd800,0xd800,0xfe00,0xd800,0xd800,0xd800,0xd800,0xde00,0x0000,0x0000, // u01e2 0x0000,0x0000,0x0000,0x7c00,0x0000,0x6c00,0x1600,0x1600,0x7e00,0xd000,0xd000,0x6c00,0x0000,0x0000, // u01e3 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc000,0xc000,0xde00,0xc600,0xdf00,0xc600,0x7c00,0x0000,0x0000, // u01e4 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0xc600,0xc600,0xdf00,0xc600,0xc600,0x7e00,0x0600,0x7c00, // u01e5 0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc000,0xc000,0xde00,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u01e6 0x0000,0x0000,0x6c00,0x3800,0x0000,0x7e00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x7c00, // u01e7 0x6c00,0x3800,0xc600,0xc600,0xcc00,0xd800,0xf000,0xf000,0xd800,0xcc00,0xc600,0xc600,0x0000,0x0000, // u01e8 0x6c00,0x3800,0xc000,0xc000,0xc000,0xc600,0xcc00,0xd800,0xf000,0xd800,0xcc00,0xc600,0x0000,0x0000, // u01e9 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x1800,0x0e00, // u01ea 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x1800,0x0e00, // u01eb 0x7c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x1800,0x0e00, // u01ec 0x0000,0x0000,0x0000,0x7c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x1800,0x0e00, // u01ed 0x6c00,0x3800,0x0000,0xfe00,0x0c00,0x1800,0x3c00,0x0600,0x0600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u01ee 0x0000,0x0000,0x6c00,0x3800,0x0000,0xfe00,0x0600,0x0c00,0x1800,0x3c00,0x0600,0x0600,0xc600,0x7c00, // u01ef 0x0000,0x0000,0x1b00,0x0e00,0x0000,0x0e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x6600,0x6600,0x3c00, // u01f0 0x1800,0x3000,0x0000,0x7c00,0xc600,0xc000,0xc000,0xde00,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u01f4 0x0000,0x0000,0x0c00,0x1800,0x0000,0x7e00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x7c00, // u01f5 0x0c00,0x1800,0x0000,0x7e00,0xd800,0xd800,0xd800,0xfe00,0xd800,0xd800,0xd800,0xde00,0x0000,0x0000, // u01fc 0x0000,0x0000,0x0c00,0x1800,0x0000,0x6c00,0x1600,0x1600,0x7e00,0xd000,0xd000,0x6c00,0x0000,0x0000, // u01fd 0x1800,0x3000,0x0000,0x7c00,0xc700,0xc600,0xce00,0xde00,0xf600,0xe600,0xc600,0x7c00,0x0000,0x0000, // u01fe 0x0000,0x0000,0x1800,0x3000,0x0000,0x3d00,0x6700,0x6e00,0x7e00,0x7600,0xe600,0xbc00,0x0000,0x0000, // u01ff 0x0000,0x0000,0x7c00,0xc600,0xc000,0xc000,0x7c00,0x0600,0x0600,0xc600,0xc600,0x7c00,0x3000,0x6000, // u0218 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0xc000,0xc000,0x7c00,0x0600,0x0600,0xfc00,0x3000,0x6000, // u0219 0x0000,0x0000,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1c00,0x0c00,0x1800, // u021a 0x0000,0x0000,0x3000,0x3000,0x3000,0xfc00,0x3000,0x3000,0x3000,0x3000,0x3000,0x1e00,0x0600,0x0c00, // u021b 0x7e00,0x0000,0xc300,0xc300,0x6600,0x6600,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u0232 0x0000,0x0000,0x0000,0x7c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x7c00, // u0233 0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x6600,0x6600,0x3c00, // u0237 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0x0600,0x0600,0x0600,0xc600,0x7c00,0x0000,0x0000, // u0254 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc600,0xfe00,0x0600,0x0600,0x7c00,0x0000,0x0000, // u0258 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0600,0x0600,0xfe00,0xc600,0xc600,0x7c00,0x0000,0x0000, // u0259 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc000,0x7800,0xc000,0xc600,0x7c00,0x0000,0x0000, // u025b 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x6000,0xc000, // u0272 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0600,0x0c00,0x1800,0x3c00,0x0600,0x0600,0xc600,0x7c00, // u0292 0x1800,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bb 0x1800,0x1800,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bc 0x3000,0x3000,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bd 0x3800,0x6c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02c6 0x6c00,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02c7 0x6c00,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02d8 0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02d9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x1800,0x0e00, // u02db 0x7600,0xdc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02dc 0x3600,0x6c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02dd 0x3000,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0300 0x1800,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0301 0x3800,0x6c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0302 0x7600,0xdc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0303 0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0304 0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0305 0x6c00,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0306 0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0307 0x6c00,0x6c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0308 0x3800,0x6c00,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030a 0x3600,0x6c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030b 0x6c00,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800, // u0329 0x6000,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0384 0x1800,0x3000,0x0000,0x6c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0385 0x6000,0xc000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u0386 0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0387 0x6000,0xc000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000, // u0388 0x6000,0xc000,0x0000,0xc600,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u0389 0x6000,0xc000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u038a 0x6000,0xc000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u038c 0x6000,0xc000,0x0000,0xc300,0xc300,0x6600,0x6600,0x3c00,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u038e 0x6000,0xc000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x6c00,0x6c00,0xee00,0x0000,0x0000, // u038f 0x1800,0x3000,0xd800,0xd800,0x0000,0x7000,0x3000,0x3000,0x3000,0x3000,0x3000,0x1c00,0x0000,0x0000, // u0390 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u0391 0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xfc00,0xc600,0xc600,0xc600,0xc600,0xfc00,0x0000,0x0000, // u0392 0x0000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0x0000,0x0000, // u0393 0x0000,0x0000,0x1000,0x1000,0x3800,0x3800,0x6c00,0x6c00,0x6c00,0xc600,0xc600,0xfe00,0x0000,0x0000, // u0394 0x0000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000, // u0395 0x0000,0x0000,0xfe00,0x0600,0x0600,0x0c00,0x1800,0x3000,0x6000,0xc000,0xc000,0xfe00,0x0000,0x0000, // u0396 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u0397 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xd600,0xd600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u0398 0x0000,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u0399 0x0000,0x0000,0xc600,0xc600,0xcc00,0xd800,0xf000,0xf000,0xd800,0xcc00,0xc600,0xc600,0x0000,0x0000, // u039a 0x0000,0x0000,0x1000,0x1000,0x3800,0x3800,0x6c00,0x6c00,0x6c00,0xc600,0xc600,0xc600,0x0000,0x0000, // u039b 0x0000,0x0000,0x8200,0xc600,0xee00,0xfe00,0xd600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u039c 0x0000,0x0000,0xc600,0xc600,0xc600,0xe600,0xf600,0xde00,0xce00,0xc600,0xc600,0xc600,0x0000,0x0000, // u039d 0x0000,0x0000,0xfe00,0x0000,0x0000,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0000,0x0000, // u039e 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u039f 0x0000,0x0000,0xfe00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u03a0 0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xfc00,0xc000,0xc000,0xc000,0xc000,0x0000,0x0000, // u03a1 0x0000,0x0000,0xfe00,0xc000,0x6000,0x3000,0x1800,0x1800,0x3000,0x6000,0xc000,0xfe00,0x0000,0x0000, // u03a3 0x0000,0x0000,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u03a4 0x0000,0x0000,0xc300,0xc300,0x6600,0x6600,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u03a5 0x0000,0x0000,0x1000,0x7c00,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0x7c00,0x1000,0x0000,0x0000, // u03a6 0x0000,0x0000,0xc600,0xc600,0x6c00,0x6c00,0x3800,0x3800,0x6c00,0x6c00,0xc600,0xc600,0x0000,0x0000, // u03a7 0x0000,0x0000,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0x7c00,0x1000,0x1000,0x0000,0x0000, // u03a8 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x6c00,0x6c00,0xee00,0x0000,0x0000, // u03a9 0x6600,0x6600,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u03aa 0x6600,0x6600,0x0000,0xc300,0xc300,0x6600,0x6600,0x3c00,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u03ab 0x0000,0x0000,0x1800,0x3000,0x0000,0x7a00,0xce00,0xcc00,0xcc00,0xcc00,0xce00,0x7a00,0x0000,0x0000, // u03ac 0x0000,0x0000,0x1800,0x3000,0x0000,0x7c00,0xc600,0xc000,0x7800,0xc000,0xc600,0x7c00,0x0000,0x0000, // u03ad 0x0000,0x0000,0x1800,0x3000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0600,0x0600, // u03ae 0x0000,0x0000,0x1800,0x3000,0x0000,0x7000,0x3000,0x3000,0x3000,0x3000,0x3000,0x1c00,0x0000,0x0000, // u03af 0x1800,0x3000,0x0000,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u03b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x7a00,0xce00,0xcc00,0xcc00,0xcc00,0xce00,0x7a00,0x0000,0x0000, // u03b1 0x0000,0x0000,0x7800,0xcc00,0xcc00,0xc800,0xfc00,0xc600,0xc600,0xc600,0xc600,0xfc00,0xc000,0xc000, // u03b2 0x0000,0x0000,0x0000,0x0000,0x0000,0xc300,0xc300,0x6600,0x6600,0x3c00,0x3c00,0x1800,0x1800,0x1800, // u03b3 0x0000,0x0000,0x7e00,0x3000,0x1800,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u03b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc000,0x7800,0xc000,0xc600,0x7c00,0x0000,0x0000, // u03b5 0x0000,0x0000,0xfe00,0x0c00,0x1800,0x3000,0x6000,0xc000,0xc000,0xc000,0xc000,0x7c00,0x0600,0x0c00, // u03b6 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0600,0x0600, // u03b7 0x0000,0x0000,0x3c00,0x6600,0x6600,0x6600,0x7e00,0x6600,0x6600,0x6600,0x6600,0x3c00,0x0000,0x0000, // u03b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x3000,0x3000,0x3000,0x3000,0x3000,0x1c00,0x0000,0x0000, // u03b9 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xcc00,0xd800,0xf000,0xd800,0xcc00,0xc600,0x0000,0x0000, // u03ba 0x0000,0x0000,0x3000,0x3000,0x1800,0x1800,0x3c00,0x3c00,0x6600,0x6600,0xc300,0xc300,0x0000,0x0000, // u03bb 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xce00,0xf600,0xc000,0xc000, // u03bc 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0x6c00,0x6c00,0x3800,0x3800,0x0000,0x0000, // u03bd 0x0000,0x0000,0x7e00,0xc000,0xc000,0xc000,0x7c00,0xc000,0xc000,0xc000,0xc000,0x7c00,0x0600,0x0c00, // u03be 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u03bf 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u03c0 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xfc00,0xc000,0xc000, // u03c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc000,0xc000,0xc000,0xc000,0x7c00,0x0600,0x0c00, // u03c2 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6600,0x6600,0x6600,0x6600,0x6600,0x3c00,0x0000,0x0000, // u03c3 0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x0e00,0x0000,0x0000, // u03c4 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u03c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x4c00,0xd600,0xd600,0xd600,0xd600,0xd600,0x7c00,0x1000,0x1000, // u03c6 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0x6c00,0x6c00,0x3800,0x6c00,0x6c00,0xc600,0xc600, // u03c7 0x0000,0x0000,0x0000,0x0000,0x0000,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0x7c00,0x1000,0x1000, // u03c8 0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0xc600,0xd600,0xd600,0xd600,0xfe00,0x6c00,0x0000,0x0000, // u03c9 0x0000,0x0000,0xd800,0xd800,0x0000,0x7000,0x3000,0x3000,0x3000,0x3000,0x3000,0x1c00,0x0000,0x0000, // u03ca 0x0000,0x0000,0x6c00,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u03cb 0x0000,0x0000,0x1800,0x3000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u03cc 0x0000,0x0000,0x1800,0x3000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u03cd 0x0000,0x0000,0x1800,0x3000,0x0000,0x4400,0xc600,0xd600,0xd600,0xd600,0xfe00,0x6c00,0x0000,0x0000, // u03ce 0x0000,0x0000,0x3c00,0x6600,0x6600,0x6600,0x3f00,0x0600,0xe600,0x6600,0x6600,0x3c00,0x0000,0x0000, // u03d1 0x0000,0x0000,0x0000,0x0000,0x1000,0x7c00,0xd600,0xd600,0xd600,0xd600,0xd600,0x7c00,0x1000,0x0000, // u03d5 0x0000,0x0000,0x0000,0x0000,0x0000,0xe300,0x3600,0x1c00,0x1800,0x3800,0x6c00,0xc700,0x0000,0x0000, // u03f0 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xfc00,0xc000,0x7c00, // u03f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc000,0xc000,0xc000,0xc600,0x7c00,0x0000,0x0000, // u03f2 0x0000,0x0000,0x0600,0x0600,0x0000,0x0e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x6600,0x6600,0x3c00, // u03f3 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u03f4 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x6000,0xc000,0xfc00,0xc000,0x6000,0x3e00,0x0000,0x0000, // u03f5 0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0x0c00,0x0600,0x7e00,0x0600,0x0c00,0xf800,0x0000,0x0000, // u03f6 0x3000,0x1800,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000, // u0400 0x6c00,0x6c00,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000, // u0401 0x0000,0x0000,0xf000,0x6000,0x6000,0x7c00,0x6600,0x6600,0x6600,0x6600,0x6600,0x6c00,0x0000,0x0000, // u0402 0x1800,0x3000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0x0000,0x0000, // u0403 0x0000,0x0000,0x7c00,0xc600,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xc600,0x7c00,0x0000,0x0000, // u0404 0x0000,0x0000,0x7c00,0xc600,0xc000,0xc000,0x7c00,0x0600,0x0600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u0405 0x0000,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u0406 0x6600,0x6600,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u0407 0x0000,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xcc00,0xcc00,0x7800,0x0000,0x0000, // u0408 0x0000,0x0000,0x3000,0x7000,0xd000,0xdc00,0xd600,0xd600,0xd600,0xd600,0xd600,0x9c00,0x0000,0x0000, // u0409 0x0000,0x0000,0xd000,0xd000,0xd000,0xdc00,0xf600,0xd600,0xd600,0xd600,0xd600,0xdc00,0x0000,0x0000, // u040a 0x0000,0x0000,0xf000,0x6000,0x6000,0x7c00,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x0000,0x0000, // u040b 0x1800,0x3000,0xc600,0xc600,0xcc00,0xd800,0xf000,0xf000,0xd800,0xcc00,0xc600,0xc600,0x0000,0x0000, // u040c 0x3000,0x1800,0xc600,0xc600,0xc600,0xce00,0xde00,0xf600,0xe600,0xc600,0xc600,0xc600,0x0000,0x0000, // u040d 0x6c00,0x3800,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x0600,0x7c00,0x0000,0x0000, // u040e 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xfe00,0x3800,0x3800, // u040f 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u0410 0x0000,0x0000,0xfc00,0xc000,0xc000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xfc00,0x0000,0x0000, // u0411 0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xfc00,0xc600,0xc600,0xc600,0xc600,0xfc00,0x0000,0x0000, // u0412 0x0000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0x0000,0x0000, // u0413 0x0000,0x0000,0x3e00,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0xff00,0xc300,0x0000, // u0414 0x0000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000, // u0415 0x0000,0x0000,0xd600,0xd600,0xd600,0x7c00,0x3800,0x7c00,0xd600,0xd600,0xd600,0xd600,0x0000,0x0000, // u0416 0x0000,0x0000,0x7c00,0xc600,0xc600,0x0600,0x3c00,0x0600,0x0600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u0417 0x0000,0x0000,0xc600,0xc600,0xc600,0xce00,0xde00,0xf600,0xe600,0xc600,0xc600,0xc600,0x0000,0x0000, // u0418 0x6c00,0x3800,0xc600,0xc600,0xc600,0xce00,0xde00,0xf600,0xe600,0xc600,0xc600,0xc600,0x0000,0x0000, // u0419 0x0000,0x0000,0xc600,0xc600,0xcc00,0xd800,0xf000,0xf000,0xd800,0xcc00,0xc600,0xc600,0x0000,0x0000, // u041a 0x0000,0x0000,0x1e00,0x3600,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0xc600,0x0000,0x0000, // u041b 0x0000,0x0000,0x8200,0xc600,0xee00,0xfe00,0xd600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u041c 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u041d 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u041e 0x0000,0x0000,0xfe00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u041f 0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xfc00,0xc000,0xc000,0xc000,0xc000,0x0000,0x0000, // u0420 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc000,0xc000,0xc000,0xc000,0xc600,0xc600,0x7c00,0x0000,0x0000, // u0421 0x0000,0x0000,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u0422 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x0600,0x7c00,0x0000,0x0000, // u0423 0x0000,0x1000,0x7c00,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0x7c00,0x1000,0x0000, // u0424 0x0000,0x0000,0xc600,0xc600,0x6c00,0x6c00,0x3800,0x3800,0x6c00,0x6c00,0xc600,0xc600,0x0000,0x0000, // u0425 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7f00,0x0300,0x0300, // u0426 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x0600,0x0600,0x0000,0x0000, // u0427 0x0000,0x0000,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0x7e00,0x0000,0x0000, // u0428 0x0000,0x0000,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0x7f00,0x0300,0x0300, // u0429 0x0000,0x0000,0xe000,0x6000,0x6000,0x7c00,0x6600,0x6600,0x6600,0x6600,0x6600,0x7c00,0x0000,0x0000, // u042a 0x0000,0x0000,0xc600,0xc600,0xc600,0xe600,0xd600,0xd600,0xd600,0xd600,0xd600,0xe600,0x0000,0x0000, // u042b 0x0000,0x0000,0x6000,0x6000,0x6000,0x7c00,0x6600,0x6600,0x6600,0x6600,0x6600,0x7c00,0x0000,0x0000, // u042c 0x0000,0x0000,0x7c00,0xc600,0x0600,0x0600,0x3e00,0x0600,0x0600,0x0600,0xc600,0x7c00,0x0000,0x0000, // u042d 0x0000,0x0000,0xcc00,0xd600,0xd600,0xd600,0xd600,0xf600,0xd600,0xd600,0xd600,0xcc00,0x0000,0x0000, // u042e 0x0000,0x0000,0x7e00,0xc600,0xc600,0xc600,0xc600,0x7e00,0x1e00,0x3600,0x6600,0xc600,0x0000,0x0000, // u042f 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0600,0x7e00,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u0430 0x0000,0x0000,0x7c00,0xc000,0xc000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xfc00,0x0000,0x0000, // u0431 0x0000,0x0000,0x7800,0xcc00,0xcc00,0xc800,0xfc00,0xc600,0xc600,0xc600,0xc600,0xfc00,0x0000,0x0000, // u0432 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0x0000,0x0000, // u0433 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x7c00, // u0434 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x0000, // u0435 0x0000,0x0000,0x0000,0x0000,0x0000,0xd600,0xd600,0x7c00,0x3800,0x7c00,0xd600,0xd600,0x0000,0x0000, // u0436 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0x0600,0x3c00,0x0600,0xc600,0x7c00,0x0000,0x0000, // u0437 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u0438 0x0000,0x0000,0x6c00,0x3800,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u0439 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xcc00,0xd800,0xf000,0xd800,0xcc00,0xc600,0x0000,0x0000, // u043a 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x6600,0x6600,0x6600,0x6600,0x6600,0xc600,0x0000,0x0000, // u043b 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xee00,0xfe00,0xd600,0xc600,0xc600,0xc600,0x0000,0x0000, // u043c 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0x0000,0x0000, // u043d 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u043e 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u043f 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xfc00,0xc000,0xc000, // u0440 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc000,0xc000,0xc000,0xc600,0x7c00,0x0000,0x0000, // u0441 0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u0442 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x7c00, // u0443 0x0000,0x0000,0x0000,0x0000,0x1000,0x7c00,0xd600,0xd600,0xd600,0xd600,0xd600,0x7c00,0x1000,0x0000, // u0444 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0x6c00,0x3800,0x6c00,0xc600,0xc600,0x0000,0x0000, // u0445 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7f00,0x0300,0x0300, // u0446 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x0600,0x0000,0x0000, // u0447 0x0000,0x0000,0x0000,0x0000,0x0000,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0x7e00,0x0000,0x0000, // u0448 0x0000,0x0000,0x0000,0x0000,0x0000,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0x7f00,0x0300,0x0300, // u0449 0x0000,0x0000,0x0000,0x0000,0x0000,0xe000,0x6000,0x7c00,0x6600,0x6600,0x6600,0x7c00,0x0000,0x0000, // u044a 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xe600,0xd600,0xd600,0xd600,0xe600,0x0000,0x0000, // u044b 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x7c00,0x6600,0x6600,0x6600,0x7c00,0x0000,0x0000, // u044c 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0x0600,0x3e00,0x0600,0xc600,0x7c00,0x0000,0x0000, // u044d 0x0000,0x0000,0x0000,0x0000,0x0000,0xcc00,0xd600,0xd600,0xf600,0xd600,0xd600,0xcc00,0x0000,0x0000, // u044e 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0xc600,0xc600,0x7e00,0x3600,0x6600,0xc600,0x0000,0x0000, // u044f 0x0000,0x0000,0x3000,0x1800,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x0000, // u0450 0x0000,0x0000,0x6c00,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x0000, // u0451 0x0000,0x0000,0x6000,0xf800,0x6000,0x7c00,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x0600,0x1c00, // u0452 0x0000,0x0000,0x1800,0x3000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0x0000,0x0000, // u0453 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc000,0xf800,0xc000,0xc600,0x7c00,0x0000,0x0000, // u0454 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0xc000,0xc000,0x7c00,0x0600,0x0600,0xfc00,0x0000,0x0000, // u0455 0x0000,0x0000,0x1800,0x1800,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u0456 0x0000,0x0000,0x6c00,0x6c00,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u0457 0x0000,0x0000,0x0600,0x0600,0x0000,0x0e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x6600,0x6600,0x3c00, // u0458 0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0xd000,0xdc00,0xd600,0xd600,0xd600,0x9c00,0x0000,0x0000, // u0459 0x0000,0x0000,0x0000,0x0000,0x0000,0xd000,0xd000,0xdc00,0xf600,0xd600,0xd600,0xdc00,0x0000,0x0000, // u045a 0x0000,0x0000,0x6000,0xf800,0x6000,0x7c00,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x0000,0x0000, // u045b 0x0000,0x0000,0x1800,0x3000,0x0000,0xc600,0xcc00,0xd800,0xf000,0xd800,0xcc00,0xc600,0x0000,0x0000, // u045c 0x0000,0x0000,0x3000,0x1800,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u045d 0x0000,0x0000,0x6c00,0x3800,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x7c00, // u045e 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xfe00,0x3800,0x3800, // u045f 0x0000,0x0000,0x6000,0xf800,0x6000,0x7c00,0x6600,0x6600,0x6600,0x6600,0x6600,0x7c00,0x0000,0x0000, // u0462 0x0000,0x0000,0x6000,0x6000,0xf800,0x6000,0x6000,0x7c00,0x6600,0x6600,0x6600,0x7c00,0x0000,0x0000, // u0463 0x0000,0x0000,0xfe00,0xc600,0x6c00,0x6c00,0x3800,0x7c00,0xd600,0xd600,0xd600,0xd600,0x0000,0x0000, // u046a 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x6c00,0x2800,0x3800,0x7c00,0xd600,0xd600,0x0000,0x0000, // u046b 0x0600,0x0600,0xfe00,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0x0000,0x0000, // u0490 0x0000,0x0000,0x0000,0x0600,0x0600,0xfe00,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0x0000,0x0000, // u0491 0x0000,0x0000,0x7f00,0x6000,0x6000,0x6000,0xfc00,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000, // u0492 0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6000,0x6000,0xfc00,0x6000,0x6000,0x6000,0x0000,0x0000, // u0493 0x0000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xc000,0xfc00,0xc600,0xc600,0xc600,0xc600,0x0600,0x0c00, // u0494 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xc000,0xc000,0xf800,0xcc00,0xcc00,0xcc00,0x0c00,0x1800, // u0495 0x0000,0x0000,0xd600,0xd600,0xd600,0x7c00,0x3800,0x7c00,0xd600,0xd600,0xd600,0xd700,0x0300,0x0300, // u0496 0x0000,0x0000,0x0000,0x0000,0x0000,0xd600,0xd600,0x7c00,0x3800,0x7c00,0xd600,0xd700,0x0300,0x0300, // u0497 0x0000,0x0000,0x7c00,0xc600,0xc600,0x0600,0x3c00,0x0600,0x0600,0xc600,0xc600,0x7c00,0x3000,0x3000, // u0498 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0x0600,0x3c00,0x0600,0xc600,0x7c00,0x3000,0x3000, // u0499 0x0000,0x0000,0xc600,0xc600,0xcc00,0xd800,0xf000,0xf000,0xd800,0xcc00,0xc600,0xc700,0x0300,0x0300, // u049a 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xcc00,0xd800,0xf000,0xd800,0xcc00,0xc700,0x0300,0x0300, // u049b 0x0000,0x0000,0xc600,0xc600,0xd600,0xdc00,0xf800,0xf800,0xdc00,0xd600,0xc600,0xc600,0x0000,0x0000, // u049c 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xd600,0xdc00,0xf800,0xdc00,0xd600,0xc600,0x0000,0x0000, // u049d 0x0000,0x0000,0xe300,0xe300,0x6600,0x6c00,0x7800,0x7800,0x6c00,0x6600,0x6300,0x6300,0x0000,0x0000, // u04a0 0x0000,0x0000,0x0000,0x0000,0x0000,0xe300,0x6600,0x6c00,0x7800,0x6c00,0x6600,0x6300,0x0000,0x0000, // u04a1 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0xc700,0x0300,0x0300, // u04a2 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc700,0x0300,0x0300, // u04a3 0x0000,0x0000,0xcf00,0xcc00,0xcc00,0xcc00,0xfc00,0xcc00,0xcc00,0xcc00,0xcc00,0xcc00,0x0000,0x0000, // u04a4 0x0000,0x0000,0x0000,0x0000,0x0000,0xcf00,0xcc00,0xcc00,0xfc00,0xcc00,0xcc00,0xcc00,0x0000,0x0000, // u04a5 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc000,0xc000,0xc000,0xc000,0xc600,0xc600,0x7c00,0x3000,0x3000, // u04aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc000,0xc000,0xc000,0xc600,0x7c00,0x3000,0x3000, // u04ab 0x0000,0x0000,0xc300,0xc300,0x6600,0x6600,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u04ae 0x0000,0x0000,0x0000,0x0000,0x0000,0xc300,0xc300,0x6600,0x6600,0x3c00,0x3c00,0x1800,0x1800,0x1800, // u04af 0x0000,0x0000,0xc300,0xc300,0x6600,0x6600,0x3c00,0x1800,0x7e00,0x1800,0x1800,0x1800,0x0000,0x0000, // u04b0 0x0000,0x0000,0x0000,0x0000,0x0000,0xc300,0xc300,0x6600,0x6600,0x3c00,0x3c00,0x1800,0x7e00,0x1800, // u04b1 0x0000,0x0000,0xc600,0xc600,0x6c00,0x6c00,0x3800,0x3800,0x6c00,0x6c00,0xc600,0xc700,0x0300,0x0300, // u04b2 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0x6c00,0x3800,0x6c00,0xc600,0xc700,0x0300,0x0300, // u04b3 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x0600,0x0700,0x0300,0x0300, // u04b6 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x0700,0x0300,0x0300, // u04b7 0x0000,0x0000,0xc600,0xc600,0xc600,0xd600,0xd600,0x7e00,0x1600,0x1600,0x0600,0x0600,0x0000,0x0000, // u04b8 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xd600,0xd600,0x7e00,0x1600,0x0600,0x0600,0x0000,0x0000, // u04b9 0x0000,0x0000,0xc000,0xc000,0xc000,0xc000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u04ba 0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0xc000,0xfc00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u04bb 0x0000,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u04c0 0x6c00,0x3800,0x0000,0xd600,0xd600,0xd600,0x7c00,0x3800,0x7c00,0xd600,0xd600,0xd600,0x0000,0x0000, // u04c1 0x0000,0x0000,0x6c00,0x3800,0x0000,0xd600,0xd600,0x7c00,0x3800,0x7c00,0xd600,0xd600,0x0000,0x0000, // u04c2 0x0000,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u04cf 0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u04d0 0x0000,0x0000,0x6c00,0x3800,0x0000,0x7c00,0x0600,0x7e00,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u04d1 0x6c00,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u04d2 0x0000,0x0000,0x6c00,0x6c00,0x0000,0x7c00,0x0600,0x7e00,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u04d3 0x0000,0x0000,0x7e00,0xd800,0xd800,0xd800,0xfe00,0xd800,0xd800,0xd800,0xd800,0xde00,0x0000,0x0000, // u04d4 0x0000,0x0000,0x0000,0x0000,0x0000,0x6c00,0x1600,0x1600,0x7e00,0xd000,0xd000,0x6c00,0x0000,0x0000, // u04d5 0x6c00,0x3800,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000, // u04d6 0x0000,0x0000,0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x0000, // u04d7 0x0000,0x0000,0x7c00,0xc600,0x0600,0x0600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u04d8 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0600,0x0600,0xfe00,0xc600,0xc600,0x7c00,0x0000,0x0000, // u04d9 0x6c00,0x6c00,0x0000,0x7c00,0xc600,0x0600,0x0600,0xfe00,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u04da 0x0000,0x0000,0x6c00,0x6c00,0x0000,0x7c00,0x0600,0x0600,0xfe00,0xc600,0xc600,0x7c00,0x0000,0x0000, // u04db 0x6c00,0x6c00,0x0000,0xd600,0xd600,0xd600,0x7c00,0x3800,0x7c00,0xd600,0xd600,0xd600,0x0000,0x0000, // u04dc 0x0000,0x0000,0x6c00,0x6c00,0x0000,0xd600,0xd600,0x7c00,0x3800,0x7c00,0xd600,0xd600,0x0000,0x0000, // u04dd 0x6c00,0x6c00,0x0000,0x7c00,0xc600,0xc600,0x0600,0x3c00,0x0600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u04de 0x0000,0x0000,0x6c00,0x6c00,0x0000,0x7c00,0xc600,0x0600,0x3c00,0x0600,0xc600,0x7c00,0x0000,0x0000, // u04df 0x7c00,0x0000,0xc600,0xc600,0xc600,0xce00,0xde00,0xf600,0xe600,0xc600,0xc600,0xc600,0x0000,0x0000, // u04e2 0x0000,0x0000,0x0000,0x7c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u04e3 0x6c00,0x6c00,0x0000,0xc600,0xc600,0xc600,0xce00,0xde00,0xf600,0xe600,0xc600,0xc600,0x0000,0x0000, // u04e4 0x0000,0x0000,0x6c00,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000, // u04e5 0x6c00,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u04e6 0x0000,0x0000,0x6c00,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u04e7 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u04e8 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc600,0xc600,0x7c00,0x0000,0x0000, // u04e9 0x6c00,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u04ea 0x0000,0x0000,0x6c00,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc600,0xc600,0x7c00,0x0000,0x0000, // u04eb 0x6c00,0x6c00,0x0000,0x7c00,0xc600,0x0600,0x0600,0x3e00,0x0600,0x0600,0xc600,0x7c00,0x0000,0x0000, // u04ec 0x0000,0x0000,0x6c00,0x6c00,0x0000,0x7c00,0xc600,0x0600,0x3e00,0x0600,0xc600,0x7c00,0x0000,0x0000, // u04ed 0x7c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x0600,0x7c00,0x0000,0x0000, // u04ee 0x0000,0x0000,0x0000,0x7c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x7c00, // u04ef 0x6c00,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x0600,0x7c00,0x0000,0x0000, // u04f0 0x0000,0x0000,0x6c00,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x7c00, // u04f1 0x3600,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x0600,0x7c00,0x0000,0x0000, // u04f2 0x0000,0x0000,0x3600,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x7c00, // u04f3 0x6c00,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x0600,0x0600,0x0000,0x0000, // u04f4 0x0000,0x0000,0x6c00,0x6c00,0x0000,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x0600,0x0000,0x0000, // u04f5 0x6c00,0x6c00,0x0000,0xc600,0xc600,0xc600,0xe600,0xd600,0xd600,0xd600,0xd600,0xe600,0x0000,0x0000, // u04f8 0x0000,0x0000,0x6c00,0x6c00,0x0000,0xc600,0xc600,0xe600,0xd600,0xd600,0xd600,0xe600,0x0000,0x0000, // u04f9 0x0000,0x0000,0xc600,0xc600,0x6600,0x6600,0x3c00,0x7800,0xcc00,0xcc00,0xc600,0xc600,0x0000,0x0000, // u05d0 0x0000,0x0000,0xfc00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xff00,0x0000,0x0000, // u05d1 0x0000,0x0000,0x7800,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x3600,0x6300,0xc300,0x0000,0x0000, // u05d2 0x0000,0x0000,0xff00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000,0x0000, // u05d3 0x0000,0x0000,0xfc00,0x0600,0x0600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u05d4 0x0000,0x0000,0x7000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u05d5 0x0000,0x0000,0x7e00,0x0c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u05d6 0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u05d7 0x0000,0x0000,0xcc00,0xce00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u05d8 0x0000,0x0000,0x7000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d9 0x0000,0x0000,0xfc00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u05da 0x0000,0x0000,0xfc00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfc00,0x0000,0x0000, // u05db 0xc000,0xc000,0xfe00,0x0600,0x0600,0x0600,0x0600,0x0c00,0x1800,0x3000,0x3000,0x3000,0x0000,0x0000, // u05dc 0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xfe00,0x0000,0x0000, // u05dd 0x0000,0x0000,0xdc00,0x7600,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x6e00,0x0000,0x0000, // u05de 0x0000,0x0000,0xf000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u05df 0x0000,0x0000,0x7800,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x7c00,0x0000,0x0000, // u05e0 0x0000,0x0000,0xfc00,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x3c00,0x0000,0x0000, // u05e1 0x0000,0x0000,0xc600,0xc600,0xc600,0x6600,0x6600,0x3600,0x3600,0x1c00,0x3800,0xe000,0x0000,0x0000, // u05e2 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0x6600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u05e3 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0x6600,0x0600,0x0600,0x0600,0x0600,0xfc00,0x0000,0x0000, // u05e4 0x0000,0x0000,0xc600,0xc600,0x6600,0x6c00,0x3800,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, // u05e5 0x0000,0x0000,0xc600,0xc600,0x6600,0x6c00,0x3800,0x3000,0x1800,0x1800,0x0c00,0xfc00,0x0000,0x0000, // u05e6 0x0000,0x0000,0xfe00,0x0600,0x0600,0xc600,0xc600,0xcc00,0xd800,0xd800,0xd800,0xd800,0xc000,0xc000, // u05e7 0x0000,0x0000,0xfc00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000,0x0000, // u05e8 0x0000,0x0000,0xd600,0xd600,0xd600,0xd600,0xd600,0xe600,0xc600,0xc600,0xcc00,0xf800,0x0000,0x0000, // u05e9 0x0000,0x0000,0xfc00,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0xc600,0x0000,0x0000, // u05ea 0x0000,0x0000,0xf800,0xcc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xcc00,0xf800,0x3000,0x3000, // u1e0c 0x0000,0x0000,0x0600,0x0600,0x0600,0x7e00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x1800,0x1800, // u1e0d 0x0000,0x0000,0xc600,0xc600,0xcc00,0xd800,0xf000,0xf000,0xd800,0xcc00,0xc600,0xc600,0x0000,0x7c00, // u1e34 0x0000,0x0000,0xc000,0xc000,0xc000,0xc600,0xcc00,0xd800,0xf000,0xd800,0xcc00,0xc600,0x0000,0x7c00, // u1e35 0x0000,0x0000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xfe00,0x1800,0x1800, // u1e36 0x0000,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x1800,0x1800, // u1e37 0x1800,0x1800,0x8200,0xc600,0xee00,0xfe00,0xd600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u1e40 0x0000,0x0000,0x3000,0x3000,0x0000,0xfc00,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0x0000,0x0000, // u1e41 0x0000,0x0000,0x8200,0xc600,0xee00,0xfe00,0xd600,0xc600,0xc600,0xc600,0xc600,0xc600,0x1800,0x1800, // u1e42 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0x1800,0x1800, // u1e43 0x1800,0x1800,0xc600,0xc600,0xc600,0xe600,0xf600,0xde00,0xce00,0xc600,0xc600,0xc600,0x0000,0x0000, // u1e44 0x0000,0x0000,0x3000,0x3000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u1e45 0x0000,0x0000,0xc600,0xc600,0xc600,0xe600,0xf600,0xde00,0xce00,0xc600,0xc600,0xc600,0x1800,0x1800, // u1e46 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x1800,0x1800, // u1e47 0x0000,0x0000,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0c00,0x0c00, // u1e6c 0x0000,0x0000,0x3000,0x3000,0x3000,0xfc00,0x3000,0x3000,0x3000,0x3000,0x3000,0x1e00,0x0c00,0x0c00, // u1e6d 0x0000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xc000,0xfe00,0x1800,0x1800, // u1eb8 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x1800,0x1800, // u1eb9 0x7600,0xdc00,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000, // u1ebc 0x0000,0x0000,0x7600,0xdc00,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x0000, // u1ebd 0x0000,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x1800,0x1800, // u1eca 0x0000,0x0000,0x1800,0x1800,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x1800,0x1800, // u1ecb 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x1800,0x1800, // u1ecc 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x1800,0x1800, // u1ecd 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x1800,0x1800, // u1ee4 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x1800,0x1800, // u1ee5 0x7600,0xdc00,0x0000,0xc300,0xc300,0x6600,0x6600,0x3c00,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u1ef8 0x0000,0x0000,0x7600,0xdc00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x7c00, // u1ef9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2001 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2002 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2003 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2004 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2005 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2006 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2007 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2008 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2009 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2010 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2011 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2012 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2013 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2014 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2015 0x0000,0x0000,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x0000,0x0000, // u2016 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0000,0xfe00, // u2017 0x0000,0x1800,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2018 0x0000,0x1800,0x1800,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2019 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x3000,0x0000, // u201a 0x0000,0x3000,0x3000,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201b 0x0000,0x6600,0xcc00,0xcc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201c 0x0000,0x3300,0x3300,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0xcc00,0x0000, // u201e 0x0000,0xcc00,0xcc00,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201f 0x0000,0x0000,0x1800,0x1800,0x7e00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2020 0x0000,0x0000,0x1800,0x1800,0x7e00,0x1800,0x1800,0x1800,0x1800,0x7e00,0x1800,0x1800,0x0000,0x0000, // u2021 0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x3c00,0x3c00,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000, // u2022 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xdb00,0xdb00,0x0000,0x0000, // u2026 0x0000,0x0000,0xec00,0xac00,0xf800,0x1800,0x3000,0x3000,0x6000,0x7f00,0xd500,0xdf00,0x0000,0x0000, // u2030 0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2032 0x0000,0x6600,0x6600,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2033 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x1800,0x3000,0x6000,0x3000,0x1800,0x0c00,0x0000,0x0000, // u2039 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x3000,0x1800,0x0c00,0x1800,0x3000,0x6000,0x0000,0x0000, // u203a 0x0000,0x0000,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000,0x0000, // u203c 0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u203e 0x0000,0x3800,0x6c00,0x6c00,0x6c00,0x6c00,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2070 0x1800,0x0000,0x3800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2071 0x0000,0x0c00,0x1c00,0x3400,0x7e00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2074 0x0000,0x7800,0x6000,0x7800,0x0c00,0x0c00,0x7800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2075 0x0000,0x3800,0x6000,0x7800,0x6c00,0x6c00,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2076 0x0000,0x7c00,0x0c00,0x1800,0x1800,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2077 0x0000,0x3800,0x6c00,0x3800,0x6c00,0x6c00,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2078 0x0000,0x3800,0x6c00,0x6c00,0x3c00,0x0c00,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2079 0x0000,0x0000,0x1800,0x1800,0x7e00,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207a 0x0000,0x0000,0x0000,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207b 0x0000,0x0000,0x0000,0x7c00,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207c 0x0000,0x1800,0x3000,0x3000,0x3000,0x3000,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207d 0x0000,0x3000,0x1800,0x1800,0x1800,0x1800,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207e 0x0000,0x0000,0x7800,0x6c00,0x6c00,0x6c00,0x6c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x6c00,0x6c00,0x6c00,0x6c00,0x3800,0x0000,0x0000, // u2080 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x3800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u2081 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x6c00,0x0c00,0x1800,0x3000,0x7c00,0x0000,0x0000, // u2082 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7800,0x0c00,0x3800,0x0c00,0x0c00,0x7800,0x0000,0x0000, // u2083 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x1c00,0x3400,0x7e00,0x0c00,0x0c00,0x0000,0x0000, // u2084 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7800,0x6000,0x7800,0x0c00,0x0c00,0x7800,0x0000,0x0000, // u2085 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x6000,0x7800,0x6c00,0x6c00,0x3800,0x0000,0x0000, // u2086 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0c00,0x1800,0x1800,0x3000,0x3000,0x0000,0x0000, // u2087 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x6c00,0x3800,0x6c00,0x6c00,0x3800,0x0000,0x0000, // u2088 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x6c00,0x6c00,0x3c00,0x0c00,0x3800,0x0000,0x0000, // u2089 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x7e00,0x1800,0x1800,0x0000,0x0000, // u208a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000, // u208b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0000,0x7c00,0x0000,0x0000,0x0000, // u208c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x3000,0x3000,0x3000,0x3000,0x1800,0x0000,0x0000, // u208d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x1800,0x1800,0x1800,0x1800,0x3000,0x0000,0x0000, // u208e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x0c00,0x3c00,0x6c00,0x3c00,0x0000,0x0000, // u2090 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x6c00,0x7c00,0x6000,0x3c00,0x0000,0x0000, // u2091 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x6c00,0x6c00,0x6c00,0x3800,0x0000,0x0000, // u2092 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x3c00,0x1800,0x3c00,0x6600,0x0000,0x0000, // u2093 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7800,0x0c00,0x7c00,0x6c00,0x3800,0x0000,0x0000, // u2094 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x7800,0x6c00,0x6c00,0x6c00,0x6c00,0x0000,0x0000, // u2095 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6600,0x6c00,0x7800,0x6c00,0x6600,0x0000,0x0000, // u2096 0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000, // u2097 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xd600,0xd600,0xd600,0xd600,0x0000,0x0000, // u2098 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7800,0x6c00,0x6c00,0x6c00,0x7800,0x6000,0x6000, // u209a 0x0000,0x0000,0xf800,0xcc00,0xcc00,0xcc00,0xfa00,0xc600,0xcf00,0xc600,0xc600,0xc300,0x0000,0x0000, // u20a7 0x0000,0x0000,0xf200,0x8a00,0x8a00,0xaa00,0xaa00,0xaa00,0xaa00,0xa200,0xa200,0xbc00,0x0000,0x0000, // u20aa 0x0000,0x0000,0x0000,0x1e00,0x3300,0x6000,0xfc00,0x6000,0xfc00,0x6000,0x3300,0x1e00,0x0000,0x0000, // u20ac 0x0000,0x0000,0xff00,0x1800,0x1800,0x1e00,0x7800,0x1e00,0x7800,0x1800,0x1800,0x1800,0x0000,0x0000, // u20ae 0x0000,0x0000,0x3c00,0x5200,0x5200,0x5000,0x5000,0x5000,0x5000,0x5200,0x5200,0x3c00,0x0000,0x0000, // u2102 0x0000,0x0000,0xc000,0xc000,0xc000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u210e 0x0000,0x0000,0x6000,0xf800,0x6000,0x7c00,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x0000,0x0000, // u210f 0x0000,0x0000,0x4200,0x4200,0x6200,0x5200,0x6a00,0x5600,0x4a00,0x4600,0x4200,0x4200,0x0000,0x0000, // u2115 0x0000,0x0000,0x9600,0x9600,0x9600,0xd000,0xf000,0xf000,0xb000,0x9600,0x9000,0x9600,0x0000,0x0000, // u2116 0x0000,0x0000,0x3c00,0x5200,0x5200,0x5200,0x5200,0x5200,0x5200,0x5200,0x5a00,0x3c00,0x0600,0x0000, // u211a 0x0000,0x0000,0xf800,0xa400,0xa400,0xa400,0xa400,0xb800,0xa800,0xb400,0xaa00,0xe600,0x0000,0x0000, // u211d 0x0000,0x0000,0xfb00,0x5500,0x5500,0x5100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2122 0x0000,0x0000,0x7e00,0x0200,0x0600,0x0a00,0x1400,0x2800,0x5000,0x6000,0x4000,0x7e00,0x0000,0x0000, // u2124 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x6c00,0x6c00,0xee00,0x0000,0x0000, // u2126 0x0000,0x0000,0x6600,0x6600,0x3300,0x3300,0x3e00,0x7c00,0xcc00,0xcc00,0xc600,0x6600,0x0000,0x0000, // u2135 0x0000,0x0000,0x0000,0x0000,0x2000,0x6000,0xfe00,0xfe00,0x6000,0x2000,0x0000,0x0000,0x0000,0x0000, // u2190 0x0000,0x0000,0x1800,0x3c00,0x7e00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2191 0x0000,0x0000,0x0000,0x0000,0x0800,0x0c00,0xfe00,0xfe00,0x0c00,0x0800,0x0000,0x0000,0x0000,0x0000, // u2192 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x7e00,0x3c00,0x1800,0x0000,0x0000, // u2193 0x0000,0x0000,0x0000,0x0000,0x2400,0x6600,0xff00,0xff00,0x6600,0x2400,0x0000,0x0000,0x0000,0x0000, // u2194 0x0000,0x0000,0x1800,0x3c00,0x7e00,0x1800,0x1800,0x1800,0x1800,0x7e00,0x3c00,0x1800,0x0000,0x0000, // u2195 0x0000,0x0000,0x0000,0x0000,0x2200,0x6200,0xfe00,0xfe00,0x6200,0x2200,0x0000,0x0000,0x0000,0x0000, // u21a4 0x0000,0x0000,0x0000,0x0000,0x8800,0x8c00,0xfe00,0xfe00,0x8c00,0x8800,0x0000,0x0000,0x0000,0x0000, // u21a6 0x0000,0x0000,0x1800,0x3c00,0x7e00,0x1800,0x1800,0x1800,0x7e00,0x3c00,0x1800,0x7e00,0x0000,0x0000, // u21a8 0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x2600,0x6600,0xfe00,0xfe00,0x6000,0x2000,0x0000,0x0000, // u21b5 0x0000,0x0000,0x0000,0xf800,0x3800,0x6800,0xcb00,0xc300,0xc300,0x6600,0x3c00,0x0000,0x0000,0x0000, // u21bb 0x0000,0x0000,0x2000,0x6000,0xfe00,0xfe00,0x0000,0xfe00,0xfe00,0x0c00,0x0800,0x0000,0x0000,0x0000, // u21cb 0x0000,0x0000,0x0800,0x0c00,0xfe00,0xfe00,0x0000,0xfe00,0xfe00,0x6000,0x2000,0x0000,0x0000,0x0000, // u21cc 0x0000,0x0000,0x0000,0x1000,0x3e00,0x7e00,0xe000,0x7e00,0x3e00,0x1000,0x0000,0x0000,0x0000,0x0000, // u21d0 0x0000,0x0000,0x1000,0x3800,0x7c00,0xee00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x0000,0x0000, // u21d1 0x0000,0x0000,0x0000,0x1000,0xf800,0xfc00,0x0e00,0xfc00,0xf800,0x1000,0x0000,0x0000,0x0000,0x0000, // u21d2 0x0000,0x0000,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0xee00,0x7c00,0x3800,0x1000,0x0000,0x0000, // u21d3 0x0000,0x0000,0x0000,0x2400,0x7e00,0xff00,0xc300,0xff00,0x7e00,0x2400,0x0000,0x0000,0x0000,0x0000, // u21d4 0x0000,0x0000,0x1000,0x3800,0x7c00,0xee00,0x6c00,0x6c00,0xee00,0x7c00,0x3800,0x1000,0x0000,0x0000, // u21d5 0x0000,0x0000,0xc600,0xc600,0xc600,0xfe00,0x6c00,0x6c00,0x6c00,0x3800,0x3800,0x3800,0x0000,0x0000, // u2200 0x0000,0x0000,0x0000,0xfe00,0x0600,0x0600,0x0600,0xfe00,0x0600,0x0600,0x0600,0xfe00,0x0000,0x0000, // u2203 0x0000,0x0000,0x0c00,0xfe00,0x1e00,0x1600,0x3600,0xfe00,0x3600,0x6600,0x6600,0xfe00,0xc000,0x0000, // u2204 0x0000,0x0000,0x0600,0x0c00,0x7c00,0xce00,0xde00,0xf600,0xe600,0x7c00,0x6000,0xc000,0x0000,0x0000, // u2205 0x0000,0x0000,0x1000,0x1000,0x3800,0x3800,0x6c00,0x6c00,0x6c00,0xc600,0xc600,0xfe00,0x0000,0x0000, // u2206 0x0000,0x0000,0xfe00,0xc600,0xc600,0x6c00,0x6c00,0x6c00,0x3800,0x3800,0x1000,0x1000,0x0000,0x0000, // u2207 0x0000,0x0000,0x0000,0x3e00,0x6000,0xc000,0xc000,0xfe00,0xc000,0xc000,0x6000,0x3e00,0x0000,0x0000, // u2208 0x0000,0x0000,0x0600,0x3e00,0x6c00,0xcc00,0xd800,0xfe00,0xd800,0xf000,0x7000,0x7e00,0x6000,0x0000, // u2209 0x0000,0x0000,0x0000,0x0000,0x3e00,0x6000,0xc000,0xfe00,0xc000,0x6000,0x3e00,0x0000,0x0000,0x0000, // u220a 0x0000,0x0000,0x0000,0xf800,0x0c00,0x0600,0x0600,0xfe00,0x0600,0x0600,0x0c00,0xf800,0x0000,0x0000, // u220b 0x0000,0x0000,0xc000,0xf800,0x6c00,0x6600,0x3600,0xfe00,0x3600,0x1e00,0x1c00,0xfc00,0x0c00,0x0000, // u220c 0x0000,0x0000,0x0000,0x0000,0xf800,0x0c00,0x0600,0xfe00,0x0600,0x0c00,0xf800,0x0000,0x0000,0x0000, // u220d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2212 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0000,0x1800,0x1800,0x7e00,0x1800,0x1800,0x0000,0x0000, // u2213 0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x0000,0x1800,0x1800,0x7e00,0x1800,0x1800,0x0000,0x0000, // u2214 0x0000,0x0000,0x0000,0x0000,0x0200,0x0600,0x0c00,0x1800,0x3000,0x6000,0xc000,0x8000,0x0000,0x0000, // u2215 0x0000,0x0000,0x0000,0x0000,0x8000,0xc000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0200,0x0000,0x0000, // u2216 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000, // u2219 0x0000,0x0e00,0x0c00,0x0c00,0x0c00,0x0c00,0xcc00,0xcc00,0xcc00,0x6c00,0x3c00,0x1c00,0x0000,0x0000, // u221a 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xd600,0xd600,0xd600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u221e 0x0000,0x0000,0x0000,0x0000,0xc000,0xc000,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u221f 0x0000,0x0000,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x0000,0x0000, // u2225 0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x3c00,0x3c00,0x6600,0x6600,0xc300,0xc300,0x0000,0x0000, // u2227 0x0000,0x0000,0x0000,0x0000,0xc300,0xc300,0x6600,0x6600,0x3c00,0x3c00,0x1800,0x1800,0x0000,0x0000, // u2228 0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u2229 0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u222a 0x0000,0x0000,0x0000,0x0000,0x0000,0x7600,0xdc00,0x0000,0x7600,0xdc00,0x0000,0x0000,0x0000,0x0000, // u2248 0x0000,0x0000,0x0000,0x0000,0x0600,0xfe00,0x1800,0x3000,0xfe00,0xc000,0x0000,0x0000,0x0000,0x0000, // u2260 0x0000,0x0000,0x0000,0x0000,0xfe00,0x0000,0x0000,0xfe00,0x0000,0x0000,0xfe00,0x0000,0x0000,0x0000, // u2261 0x0000,0x0000,0x0000,0x0c00,0x1800,0x3000,0x6000,0x3000,0x1800,0x0c00,0x0000,0x7e00,0x0000,0x0000, // u2264 0x0000,0x0000,0x0000,0x3000,0x1800,0x0c00,0x0600,0x0c00,0x1800,0x3000,0x0000,0x7e00,0x0000,0x0000, // u2265 0x0000,0x0000,0x0000,0x0900,0x1b00,0x3600,0x6c00,0xd800,0x6c00,0x3600,0x1b00,0x0900,0x0000,0x0000, // u226a 0x0000,0x0000,0x0000,0x9000,0xd800,0x6c00,0x3600,0x1b00,0x3600,0x6c00,0xd800,0x9000,0x0000,0x0000, // u226b 0x0000,0x0000,0x0000,0x0000,0x7e00,0xc000,0xc000,0xc000,0xc000,0xc000,0x7e00,0x0000,0x0000,0x0000, // u2282 0x0000,0x0000,0x0000,0x0000,0xfc00,0x0600,0x0600,0x0600,0x0600,0x0600,0xfc00,0x0000,0x0000,0x0000, // u2283 0x0000,0x0000,0x0000,0x7e00,0xc000,0xc000,0xc000,0xc000,0xc000,0x7e00,0x0000,0xfe00,0x0000,0x0000, // u2286 0x0000,0x0000,0x0000,0xfc00,0x0600,0x0600,0x0600,0x0600,0x0600,0xfc00,0x0000,0xfe00,0x0000,0x0000, // u2287 0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0x0000,0x0000, // u22a5 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000, // u22c2 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000, // u22c3 0x0000,0x0000,0x0600,0x0c00,0x7c00,0xce00,0xde00,0xf600,0xe600,0x7c00,0x6000,0xc000,0x0000,0x0000, // u2300 0x0000,0x0000,0x0000,0x0000,0x1000,0x3800,0x6c00,0xc600,0xc600,0xc600,0xc600,0xfe00,0x0000,0x0000, // u2302 0x0000,0x0000,0x3c00,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2308 0x0000,0x0000,0x3c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0000, // u2309 0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3c00,0x0000,0x0000, // u230a 0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x3c00,0x0000,0x0000, // u230b 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xc000,0xc000,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2310 0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2319 0x0000,0x0000,0x0e00,0x1b00,0x1b00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2320 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xd800,0xd800,0x7000,0x0000,0x0000, // u2321 0x0600,0x0c00,0x1800,0x1800,0x3000,0x3000,0x3000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, // u239b 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, // u239c 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x3000,0x3000,0x3000,0x1800,0x1800,0x0c00,0x0600, // u239d 0x6000,0x3000,0x1800,0x1800,0x0c00,0x0c00,0x0c00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u239e 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u239f 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0c00,0x0c00,0x0c00,0x1800,0x1800,0x3000,0x6000, // u23a0 0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, // u23a1 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, // u23a2 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7e00, // u23a3 0x7e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u23a4 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u23a5 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x7e00, // u23a6 0x0f00,0x1800,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, // u23a7 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0xe000,0xe000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, // u23a8 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x1800,0x0f00, // u23a9 0xf000,0x1800,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u23ab 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0700,0x0700,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u23ac 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1800,0xf000, // u23ad 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u23ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23af 0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23ba 0x0000,0x0000,0x0000,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x0000,0x0000,0x0000, // u23bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00, // u23bd 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u23d0 0xcc00,0xcc00,0xfc00,0xcc00,0xcc00,0xcc00,0x0000,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, // u2409 0xc000,0xc000,0xc000,0xc000,0xc000,0xf800,0x0000,0x3f00,0x3000,0x3c00,0x3000,0x3000,0x3000,0x0000, // u240a 0xcc00,0xcc00,0xcc00,0xcc00,0x7800,0x3000,0x0000,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, // u240b 0xfc00,0xc000,0xf000,0xc000,0xc000,0xc000,0x0000,0x3f00,0x3000,0x3c00,0x3000,0x3000,0x3000,0x0000, // u240c 0x7800,0xcc00,0xc000,0xc000,0xcc00,0x7800,0x0000,0x3e00,0x3300,0x3300,0x3e00,0x3600,0x3300,0x0000, // u240d 0xcc00,0xec00,0xfc00,0xdc00,0xcc00,0xcc00,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3f00,0x0000, // u2424 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2500 0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2501 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2502 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2503 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xaa00,0xaa00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2508 0x0000,0x0000,0x0000,0x0000,0x0000,0xaa00,0xaa00,0xaa00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2509 0x1800,0x1800,0x1800,0x0000,0x1800,0x1800,0x0000,0x1800,0x1800,0x1800,0x0000,0x1800,0x1800,0x0000, // u250a 0x3800,0x3800,0x3800,0x0000,0x3800,0x3800,0x0000,0x3800,0x3800,0x3800,0x0000,0x3800,0x3800,0x0000, // u250b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u250c 0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x1f00,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u250d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x3f00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u250e 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x3f00,0x3f00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u250f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2510 0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2511 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2512 0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0xf800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2513 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1f00,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2514 0x1800,0x1800,0x1800,0x1800,0x1800,0x1f00,0x1f00,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2515 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3f00,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2516 0x3800,0x3800,0x3800,0x3800,0x3800,0x3f00,0x3f00,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2517 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2518 0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0xf800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2519 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0xf800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u251a 0x3800,0x3800,0x3800,0x3800,0x3800,0xf800,0xf800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u251b 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1f00,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u251c 0x1800,0x1800,0x1800,0x1800,0x1800,0x1f00,0x1f00,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u251d 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3f00,0x3f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u251e 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3f00,0x3f00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u251f 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3f00,0x3f00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2520 0x3800,0x3800,0x3800,0x3800,0x3800,0x3f00,0x3f00,0x3f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2521 0x1800,0x1800,0x1800,0x1800,0x1800,0x3f00,0x3f00,0x3f00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2522 0x3800,0x3800,0x3800,0x3800,0x3800,0x3f00,0x3f00,0x3f00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2523 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2524 0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0xf800,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2525 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0xf800,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2526 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0xf800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2527 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0xf800,0xf800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2528 0x3800,0x3800,0x3800,0x3800,0x3800,0xf800,0xf800,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2529 0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0xf800,0xf800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u252a 0x3800,0x3800,0x3800,0x3800,0x3800,0xf800,0xf800,0xf800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u252b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u252c 0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u252d 0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u252e 0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u252f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2530 0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xff00,0xff00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2531 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0xff00,0xff00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2532 0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2533 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2534 0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2535 0x1800,0x1800,0x1800,0x1800,0x1800,0x1f00,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2536 0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2537 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2538 0x3800,0x3800,0x3800,0x3800,0x3800,0xf800,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2539 0x3800,0x3800,0x3800,0x3800,0x3800,0x3f00,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u253a 0x3800,0x3800,0x3800,0x3800,0x3800,0xff00,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u253b 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u253c 0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u253d 0x1800,0x1800,0x1800,0x1800,0x1800,0x1f00,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u253e 0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u253f 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2540 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0xff00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2541 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0xff00,0xff00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2542 0x3800,0x3800,0x3800,0x3800,0x3800,0xf800,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2543 0x3800,0x3800,0x3800,0x3800,0x3800,0x3f00,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2544 0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0xff00,0xff00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2545 0x1800,0x1800,0x1800,0x1800,0x1800,0x1f00,0xff00,0xff00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2546 0x3800,0x3800,0x3800,0x3800,0x3800,0xff00,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2547 0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0xff00,0xff00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2548 0x3800,0x3800,0x3800,0x3800,0x3800,0xf800,0xff00,0xff00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2549 0x3800,0x3800,0x3800,0x3800,0x3800,0x3f00,0xff00,0xff00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u254a 0x3800,0x3800,0x3800,0x3800,0x3800,0xff00,0xff00,0xff00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u254b 0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x0000,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2550 0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, // u2551 0x0000,0x0000,0x0000,0x0000,0x1f00,0x1f00,0x1800,0x1f00,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800, // u2552 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x7f00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, // u2553 0x0000,0x0000,0x0000,0x0000,0x7f00,0x7f00,0x6000,0x6f00,0x6f00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, // u2554 0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0x1800,0xf800,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2555 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, // u2556 0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0x0c00,0xec00,0xec00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, // u2557 0x1800,0x1800,0x1800,0x1800,0x1f00,0x1f00,0x1800,0x1f00,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2558 0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x7f00,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2559 0x6c00,0x6c00,0x6c00,0x6c00,0x6f00,0x6f00,0x6000,0x7f00,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u255a 0x1800,0x1800,0x1800,0x1800,0xf800,0xf800,0x1800,0xf800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000, // u255b 0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255c 0x6c00,0x6c00,0x6c00,0x6c00,0xec00,0xec00,0x0c00,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000, // u255d 0x1800,0x1800,0x1800,0x1800,0x1f00,0x1f00,0x1800,0x1f00,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800, // u255e 0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6f00,0x6f00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, // u255f 0x6c00,0x6c00,0x6c00,0x6c00,0x6f00,0x6f00,0x6000,0x6f00,0x6f00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, // u2560 0x1800,0x1800,0x1800,0x1800,0xf800,0xf800,0x1800,0xf800,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2561 0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0xec00,0xec00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, // u2562 0x6c00,0x6c00,0x6c00,0x6c00,0xec00,0xec00,0x0c00,0xec00,0xec00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, // u2563 0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x0000,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800, // u2564 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, // u2565 0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x0000,0xef00,0xef00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, // u2566 0x1800,0x1800,0x1800,0x1800,0xff00,0xff00,0x0000,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2567 0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2568 0x6c00,0x6c00,0x6c00,0x6c00,0xef00,0xef00,0x0000,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2569 0x1800,0x1800,0x1800,0x1800,0xff00,0xff00,0x1800,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800, // u256a 0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0xff00,0xff00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, // u256b 0x6c00,0x6c00,0x6c00,0x6c00,0xef00,0xef00,0x0000,0xef00,0xef00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, // u256c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0f00,0x1c00,0x1800,0x1800,0x1800,0x1800,0x1800, // u256d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xe000,0xf000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800, // u256e 0x1800,0x1800,0x1800,0x1800,0x1800,0x3800,0xf000,0xe000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u256f 0x1800,0x1800,0x1800,0x1800,0x1800,0x1c00,0x0f00,0x0700,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2570 0x0100,0x0300,0x0200,0x0600,0x0400,0x0c00,0x0800,0x1800,0x1000,0x3000,0x2000,0x6000,0x4000,0xc000, // u2571 0xc000,0x4000,0x6000,0x2000,0x3000,0x1000,0x1800,0x0800,0x0c00,0x0400,0x0600,0x0200,0x0300,0x0100, // u2572 0xc100,0x4300,0x6200,0x2600,0x3400,0x1c00,0x1800,0x1800,0x1c00,0x3400,0x2600,0x6200,0x4300,0xc100, // u2573 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2574 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2575 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2576 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2577 0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2578 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2579 0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x1f00,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u257b 0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257c 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u257d 0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257e 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u257f 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2580 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00, // u2581 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0xff00, // u2582 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0xff00,0xff00, // u2583 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u2584 0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u2585 0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u2586 0x0000,0x0000,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u2587 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u2588 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, // u2589 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, // u258a 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, // u258b 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, // u258c 0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000, // u258d 0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000, // u258e 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, // u258f 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u2590 0x8800,0x2200,0x8800,0x2200,0x8800,0x2200,0x8800,0x2200,0x8800,0x2200,0x8800,0x2200,0x8800,0x2200, // u2591 0xaa00,0x5500,0xaa00,0x5500,0xaa00,0x5500,0xaa00,0x5500,0xaa00,0x5500,0xaa00,0x5500,0xaa00,0x5500, // u2592 0xee00,0xbb00,0xee00,0xbb00,0xee00,0xbb00,0xee00,0xbb00,0xee00,0xbb00,0xee00,0xbb00,0xee00,0xbb00, // u2593 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, // u2596 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u2597 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2598 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u2599 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u259a 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, // u259b 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u259c 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u259d 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, // u259e 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u259f 0x0000,0x0000,0x0000,0x0000,0x7c00,0x7c00,0x7c00,0x7c00,0x7c00,0x7c00,0x0000,0x0000,0x0000,0x0000, // u25a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xfe00,0xfe00,0xfe00,0x0000,0x0000, // u25ac 0x0000,0x0000,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0x0000,0x0000, // u25ae 0x0000,0x0000,0x0000,0x1800,0x1800,0x3c00,0x3c00,0x7e00,0x7e00,0xff00,0xff00,0x0000,0x0000,0x0000, // u25b2 0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xff00,0xfc00,0xf000,0xc000,0x0000,0x0000,0x0000, // u25b6 0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xff00,0xfc00,0xf000,0xc000,0x0000,0x0000,0x0000, // u25ba 0x0000,0x0000,0x0000,0xff00,0xff00,0x7e00,0x7e00,0x3c00,0x3c00,0x1800,0x1800,0x0000,0x0000,0x0000, // u25bc 0x0000,0x0000,0x0000,0x0300,0x0f00,0x3f00,0xff00,0xff00,0x3f00,0x0f00,0x0300,0x0000,0x0000,0x0000, // u25c0 0x0000,0x0000,0x0000,0x0300,0x0f00,0x3f00,0xff00,0xff00,0x3f00,0x0f00,0x0300,0x0000,0x0000,0x0000, // u25c4 0x0000,0x0000,0x0000,0x0000,0x1800,0x3c00,0x7e00,0xff00,0x7e00,0x3c00,0x1800,0x0000,0x0000,0x0000, // u25c6 0x0000,0x0000,0x0000,0x0000,0x1800,0x3c00,0x6600,0xc300,0x6600,0x3c00,0x1800,0x0000,0x0000,0x0000, // u25ca 0x0000,0x0000,0x0000,0x0000,0x3c00,0x6600,0x4200,0x4200,0x6600,0x3c00,0x0000,0x0000,0x0000,0x0000, // u25cb 0x0000,0x0000,0x0000,0x0000,0x3c00,0x7e00,0x7e00,0x7e00,0x7e00,0x3c00,0x0000,0x0000,0x0000,0x0000, // u25cf 0xff00,0xff00,0xff00,0xff00,0xff00,0xe700,0xc300,0xc300,0xe700,0xff00,0xff00,0xff00,0xff00,0xff00, // u25d8 0xff00,0xff00,0xff00,0xff00,0xc300,0x9900,0xbd00,0xbd00,0x9900,0xc300,0xff00,0xff00,0xff00,0xff00, // u25d9 0x0000,0x0000,0x7c00,0x8200,0xaa00,0x8200,0x8200,0xba00,0x9200,0x8200,0x8200,0x7c00,0x0000,0x0000, // u263a 0x0000,0x0000,0x7c00,0xfe00,0xd600,0xfe00,0xfe00,0xc600,0xee00,0xfe00,0xfe00,0x7c00,0x0000,0x0000, // u263b 0x0000,0x0000,0x0000,0x1800,0xdb00,0x7e00,0x3c00,0xe700,0x3c00,0x7e00,0xdb00,0x1800,0x0000,0x0000, // u263c 0x0000,0x0000,0x3c00,0x6600,0x6600,0x6600,0x6600,0x3c00,0x1800,0x7e00,0x1800,0x1800,0x0000,0x0000, // u2640 0x0000,0x0000,0x3e00,0x0e00,0x1a00,0x3200,0x7800,0xcc00,0xcc00,0xcc00,0xcc00,0x7800,0x0000,0x0000, // u2642 0x0000,0x0000,0x1800,0x1800,0x3c00,0x7e00,0xff00,0xff00,0x7e00,0x1800,0x1800,0x3c00,0x0000,0x0000, // u2660 0x0000,0x0000,0x1800,0x3c00,0x3c00,0x1800,0x5a00,0xff00,0xff00,0x5a00,0x1800,0x3c00,0x0000,0x0000, // u2663 0x0000,0x0000,0x0000,0x6c00,0xfe00,0xfe00,0xfe00,0xfe00,0x7c00,0x3800,0x1000,0x0000,0x0000,0x0000, // u2665 0x0000,0x0000,0x0000,0x0000,0x1800,0x3c00,0x7e00,0xff00,0x7e00,0x3c00,0x1800,0x0000,0x0000,0x0000, // u2666 0x0000,0x0000,0x7e00,0x6600,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0xe000,0xc000,0x0000,0x0000, // u266a 0x0000,0x0000,0x7e00,0x6600,0x7e00,0x6600,0x6600,0x6600,0x6600,0x6600,0x6e00,0xec00,0xc000,0x0000, // u266b 0x0000,0x0000,0x0300,0x0300,0x0600,0x0600,0xcc00,0xcc00,0x7800,0x7800,0x3000,0x3000,0x0000,0x0000, // u2713 0x0000,0x0000,0x0700,0x0700,0x0e00,0x0e00,0xdc00,0xfc00,0x7800,0x7800,0x3000,0x3000,0x0000,0x0000, // u2714 0x0000,0x0000,0x0c00,0xcc00,0x7800,0x3800,0x3800,0x3c00,0x6600,0x6000,0xc000,0xc000,0x0000,0x0000, // u2717 0x0000,0x0000,0x0e00,0xee00,0x7c00,0x3c00,0x3c00,0x3e00,0x7700,0x7300,0xe000,0xe000,0x0000,0x0000, // u2718 0x0000,0x0000,0x0c00,0x0c00,0x1800,0x1800,0x3000,0x3000,0x1800,0x1800,0x0c00,0x0c00,0x0000,0x0000, // u27e8 0x0000,0x0000,0x3000,0x3000,0x1800,0x1800,0x0c00,0x0c00,0x1800,0x1800,0x3000,0x3000,0x0000,0x0000, // u27e9 0x0000,0x0000,0x3600,0x3600,0x6c00,0x6c00,0xd800,0xd800,0x6c00,0x6c00,0x3600,0x3600,0x0000,0x0000, // u27ea 0x0000,0x0000,0xd800,0xd800,0x6c00,0x6c00,0x3600,0x3600,0x6c00,0x6c00,0xd800,0xd800,0x0000,0x0000, // u27eb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2800 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2801 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2802 0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2803 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, // u2804 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, // u2805 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, // u2806 0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, // u2807 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2808 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2809 0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280a 0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280b 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, // u280c 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, // u280d 0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, // u280e 0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, // u280f 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2810 0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2811 0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2812 0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2813 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, // u2814 0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, // u2815 0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, // u2816 0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, // u2817 0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2818 0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2819 0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281a 0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281b 0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, // u281c 0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, // u281d 0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, // u281e 0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, // u281f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u2820 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u2821 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u2822 0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u2823 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000, // u2824 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000, // u2825 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000, // u2826 0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000, // u2827 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u2828 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u2829 0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u282a 0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u282b 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000, // u282c 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000, // u282d 0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000, // u282e 0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000, // u282f 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u2830 0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u2831 0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u2832 0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u2833 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000, // u2834 0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000, // u2835 0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000, // u2836 0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000, // u2837 0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u2838 0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u2839 0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u283a 0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u283b 0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000, // u283c 0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000, // u283d 0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000, // u283e 0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000, // u283f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2840 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2841 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2842 0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2843 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000, // u2844 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000, // u2845 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000, // u2846 0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000, // u2847 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2848 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2849 0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u284a 0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u284b 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000, // u284c 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000, // u284d 0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000, // u284e 0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000, // u284f 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2850 0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2851 0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2852 0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2853 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000, // u2854 0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000, // u2855 0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000, // u2856 0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000, // u2857 0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2858 0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2859 0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u285a 0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u285b 0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000, // u285c 0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000, // u285d 0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000, // u285e 0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000, // u285f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000, // u2860 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000, // u2861 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000, // u2862 0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000, // u2863 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000, // u2864 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000, // u2865 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000, // u2866 0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000, // u2867 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000, // u2868 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000, // u2869 0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000, // u286a 0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000, // u286b 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000, // u286c 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000, // u286d 0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000, // u286e 0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000, // u286f 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000, // u2870 0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000, // u2871 0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000, // u2872 0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000, // u2873 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000, // u2874 0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000, // u2875 0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000, // u2876 0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000, // u2877 0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000, // u2878 0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000, // u2879 0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000, // u287a 0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000, // u287b 0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000, // u287c 0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000, // u287d 0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000, // u287e 0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000, // u287f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2880 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2881 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2882 0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2883 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000, // u2884 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000, // u2885 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000, // u2886 0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000, // u2887 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2888 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2889 0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u288a 0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u288b 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000, // u288c 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000, // u288d 0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000, // u288e 0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000, // u288f 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2890 0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2891 0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2892 0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2893 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000, // u2894 0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000, // u2895 0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000, // u2896 0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000, // u2897 0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2898 0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2899 0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u289a 0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u289b 0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000, // u289c 0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000, // u289d 0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000, // u289e 0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000, // u289f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000, // u28a0 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000, // u28a1 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000, // u28a2 0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000, // u28a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000, // u28a4 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000, // u28a5 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000, // u28a6 0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000, // u28a7 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000, // u28a8 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000, // u28a9 0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000, // u28aa 0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000, // u28ab 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000, // u28ac 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000, // u28ad 0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000, // u28ae 0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000, // u28af 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000, // u28b0 0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000, // u28b1 0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000, // u28b2 0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000, // u28b3 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000, // u28b4 0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000, // u28b5 0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000, // u28b6 0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000, // u28b7 0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000, // u28b8 0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000, // u28b9 0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000, // u28ba 0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000, // u28bb 0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000, // u28bc 0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000, // u28bd 0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000, // u28be 0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000, // u28bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28c0 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28c1 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28c2 0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000, // u28c4 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000, // u28c5 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000, // u28c6 0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000, // u28c7 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28c8 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28c9 0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28ca 0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28cb 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000, // u28cc 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000, // u28cd 0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000, // u28ce 0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000, // u28cf 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28d0 0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28d1 0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28d2 0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28d3 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000, // u28d4 0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000, // u28d5 0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000, // u28d6 0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000, // u28d7 0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28d8 0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28d9 0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28da 0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28db 0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000, // u28dc 0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000, // u28dd 0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000, // u28de 0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000, // u28df 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000, // u28e0 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000, // u28e1 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000, // u28e2 0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000, // u28e3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000, // u28e4 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000, // u28e5 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000, // u28e6 0x0000,0x6000,0x6000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000, // u28e7 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000, // u28e8 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000, // u28e9 0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000, // u28ea 0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000, // u28eb 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000, // u28ec 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000, // u28ed 0x0000,0x0600,0x0600,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000, // u28ee 0x0000,0x6600,0x6600,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000, // u28ef 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000, // u28f0 0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000, // u28f1 0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000, // u28f2 0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000, // u28f3 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000, // u28f4 0x0000,0x6000,0x6000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000, // u28f5 0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000, // u28f6 0x0000,0x6000,0x6000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000, // u28f7 0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000, // u28f8 0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000, // u28f9 0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000, // u28fa 0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000, // u28fb 0x0000,0x0600,0x0600,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000, // u28fc 0x0000,0x6600,0x6600,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000, // u28fd 0x0000,0x0600,0x0600,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000, // u28fe 0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000, // u28ff 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0x0000,0x0000,0x0000,0xc600,0xc600,0x0000,0x0000, // u2e2c 0xc000,0xcc00,0xde00,0xff00,0xcc00,0xcc00,0xcc00,0x9800,0x3000,0x6000,0xc000,0xc000,0xc000,0xc000, // ue0a0 0xc000,0xc000,0xc000,0xc000,0xc000,0xfc00,0x0000,0x3300,0x3b00,0x3f00,0x3700,0x3300,0x3300,0x0000, // ue0a1 0x3c00,0x6600,0x6600,0x6600,0x6600,0xff00,0xff00,0xe700,0xc300,0xe700,0xff00,0xff00,0xff00,0x0000, // ue0a2 0x8000,0xc000,0xe000,0xf000,0xf800,0xfc00,0xfe00,0xfe00,0xfc00,0xf800,0xf000,0xe000,0xc000,0x8000, // ue0b0 0x8000,0xc000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0600,0x0c00,0x1800,0x3000,0x6000,0xc000,0x8000, // ue0b1 0x0100,0x0300,0x0700,0x0f00,0x1f00,0x3f00,0x7f00,0x7f00,0x3f00,0x1f00,0x0f00,0x0700,0x0300,0x0100, // ue0b2 0x0100,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0100, // ue0b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x6600,0x6600,0x3c00, // uf6be 0x0000,0x0000,0xfe00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xfe00,0x0000,0x0000 // ufffd }; // codepoints array constexpr std::array fixedfont_codepoints = { 0x0000,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e, 0x002f,0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e, 0x003f,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e, 0x004f,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e, 0x005f,0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e, 0x006f,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e, 0x00a0,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af, 0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf, 0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf, 0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df, 0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef, 0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff, 0x0100,0x0101,0x0102,0x0103,0x0104,0x0105,0x0106,0x0107,0x0108,0x0109,0x010a,0x010b,0x010c,0x010d,0x010e,0x010f, 0x0110,0x0111,0x0112,0x0113,0x0114,0x0115,0x0116,0x0117,0x0118,0x0119,0x011a,0x011b,0x011c,0x011d,0x011e,0x011f, 0x0120,0x0121,0x0122,0x0123,0x0124,0x0125,0x0126,0x0127,0x0128,0x0129,0x012a,0x012b,0x012c,0x012d,0x012e,0x012f, 0x0130,0x0131,0x0132,0x0133,0x0134,0x0135,0x0136,0x0137,0x0138,0x0139,0x013a,0x013b,0x013c,0x013d,0x013e,0x013f, 0x0140,0x0141,0x0142,0x0143,0x0144,0x0145,0x0146,0x0147,0x0148,0x0149,0x014a,0x014b,0x014c,0x014d,0x014e,0x014f, 0x0150,0x0151,0x0152,0x0153,0x0154,0x0155,0x0156,0x0157,0x0158,0x0159,0x015a,0x015b,0x015c,0x015d,0x015e,0x015f, 0x0160,0x0161,0x0162,0x0163,0x0164,0x0165,0x0166,0x0167,0x0168,0x0169,0x016a,0x016b,0x016c,0x016d,0x016e,0x016f, 0x0170,0x0171,0x0172,0x0173,0x0174,0x0175,0x0176,0x0177,0x0178,0x0179,0x017a,0x017b,0x017c,0x017d,0x017e,0x017f, 0x0186,0x018e,0x018f,0x0190,0x0192,0x019d,0x019e,0x01b5,0x01b6,0x01b7,0x01cd,0x01ce,0x01cf,0x01d0,0x01d1,0x01d2, 0x01d3,0x01d4,0x01e2,0x01e3,0x01e4,0x01e5,0x01e6,0x01e7,0x01e8,0x01e9,0x01ea,0x01eb,0x01ec,0x01ed,0x01ee,0x01ef, 0x01f0,0x01f4,0x01f5,0x01fc,0x01fd,0x01fe,0x01ff,0x0218,0x0219,0x021a,0x021b,0x0232,0x0233,0x0237,0x0254,0x0258, 0x0259,0x025b,0x0272,0x0292,0x02bb,0x02bc,0x02bd,0x02c6,0x02c7,0x02d8,0x02d9,0x02db,0x02dc,0x02dd,0x0300,0x0301, 0x0302,0x0303,0x0304,0x0305,0x0306,0x0307,0x0308,0x030a,0x030b,0x030c,0x0329,0x0384,0x0385,0x0386,0x0387,0x0388, 0x0389,0x038a,0x038c,0x038e,0x038f,0x0390,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039a, 0x039b,0x039c,0x039d,0x039e,0x039f,0x03a0,0x03a1,0x03a3,0x03a4,0x03a5,0x03a6,0x03a7,0x03a8,0x03a9,0x03aa,0x03ab, 0x03ac,0x03ad,0x03ae,0x03af,0x03b0,0x03b1,0x03b2,0x03b3,0x03b4,0x03b5,0x03b6,0x03b7,0x03b8,0x03b9,0x03ba,0x03bb, 0x03bc,0x03bd,0x03be,0x03bf,0x03c0,0x03c1,0x03c2,0x03c3,0x03c4,0x03c5,0x03c6,0x03c7,0x03c8,0x03c9,0x03ca,0x03cb, 0x03cc,0x03cd,0x03ce,0x03d1,0x03d5,0x03f0,0x03f1,0x03f2,0x03f3,0x03f4,0x03f5,0x03f6,0x0400,0x0401,0x0402,0x0403, 0x0404,0x0405,0x0406,0x0407,0x0408,0x0409,0x040a,0x040b,0x040c,0x040d,0x040e,0x040f,0x0410,0x0411,0x0412,0x0413, 0x0414,0x0415,0x0416,0x0417,0x0418,0x0419,0x041a,0x041b,0x041c,0x041d,0x041e,0x041f,0x0420,0x0421,0x0422,0x0423, 0x0424,0x0425,0x0426,0x0427,0x0428,0x0429,0x042a,0x042b,0x042c,0x042d,0x042e,0x042f,0x0430,0x0431,0x0432,0x0433, 0x0434,0x0435,0x0436,0x0437,0x0438,0x0439,0x043a,0x043b,0x043c,0x043d,0x043e,0x043f,0x0440,0x0441,0x0442,0x0443, 0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,0x044a,0x044b,0x044c,0x044d,0x044e,0x044f,0x0450,0x0451,0x0452,0x0453, 0x0454,0x0455,0x0456,0x0457,0x0458,0x0459,0x045a,0x045b,0x045c,0x045d,0x045e,0x045f,0x0462,0x0463,0x046a,0x046b, 0x0490,0x0491,0x0492,0x0493,0x0494,0x0495,0x0496,0x0497,0x0498,0x0499,0x049a,0x049b,0x049c,0x049d,0x04a0,0x04a1, 0x04a2,0x04a3,0x04a4,0x04a5,0x04aa,0x04ab,0x04ae,0x04af,0x04b0,0x04b1,0x04b2,0x04b3,0x04b6,0x04b7,0x04b8,0x04b9, 0x04ba,0x04bb,0x04c0,0x04c1,0x04c2,0x04cf,0x04d0,0x04d1,0x04d2,0x04d3,0x04d4,0x04d5,0x04d6,0x04d7,0x04d8,0x04d9, 0x04da,0x04db,0x04dc,0x04dd,0x04de,0x04df,0x04e2,0x04e3,0x04e4,0x04e5,0x04e6,0x04e7,0x04e8,0x04e9,0x04ea,0x04eb, 0x04ec,0x04ed,0x04ee,0x04ef,0x04f0,0x04f1,0x04f2,0x04f3,0x04f4,0x04f5,0x04f8,0x04f9,0x05d0,0x05d1,0x05d2,0x05d3, 0x05d4,0x05d5,0x05d6,0x05d7,0x05d8,0x05d9,0x05da,0x05db,0x05dc,0x05dd,0x05de,0x05df,0x05e0,0x05e1,0x05e2,0x05e3, 0x05e4,0x05e5,0x05e6,0x05e7,0x05e8,0x05e9,0x05ea,0x1e0c,0x1e0d,0x1e34,0x1e35,0x1e36,0x1e37,0x1e40,0x1e41,0x1e42, 0x1e43,0x1e44,0x1e45,0x1e46,0x1e47,0x1e6c,0x1e6d,0x1eb8,0x1eb9,0x1ebc,0x1ebd,0x1eca,0x1ecb,0x1ecc,0x1ecd,0x1ee4, 0x1ee5,0x1ef8,0x1ef9,0x2000,0x2001,0x2002,0x2003,0x2004,0x2005,0x2006,0x2007,0x2008,0x2009,0x200a,0x200b,0x200c, 0x200d,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x2015,0x2016,0x2017,0x2018,0x2019,0x201a,0x201b,0x201c, 0x201d,0x201e,0x201f,0x2020,0x2021,0x2022,0x2026,0x2030,0x2032,0x2033,0x2039,0x203a,0x203c,0x203e,0x2070,0x2071, 0x2074,0x2075,0x2076,0x2077,0x2078,0x2079,0x207a,0x207b,0x207c,0x207d,0x207e,0x207f,0x2080,0x2081,0x2082,0x2083, 0x2084,0x2085,0x2086,0x2087,0x2088,0x2089,0x208a,0x208b,0x208c,0x208d,0x208e,0x2090,0x2091,0x2092,0x2093,0x2094, 0x2095,0x2096,0x2097,0x2098,0x209a,0x20a7,0x20aa,0x20ac,0x20ae,0x2102,0x210e,0x210f,0x2115,0x2116,0x211a,0x211d, 0x2122,0x2124,0x2126,0x2135,0x2190,0x2191,0x2192,0x2193,0x2194,0x2195,0x21a4,0x21a6,0x21a8,0x21b5,0x21bb,0x21cb, 0x21cc,0x21d0,0x21d1,0x21d2,0x21d3,0x21d4,0x21d5,0x2200,0x2203,0x2204,0x2205,0x2206,0x2207,0x2208,0x2209,0x220a, 0x220b,0x220c,0x220d,0x2212,0x2213,0x2214,0x2215,0x2216,0x2219,0x221a,0x221e,0x221f,0x2225,0x2227,0x2228,0x2229, 0x222a,0x2248,0x2260,0x2261,0x2264,0x2265,0x226a,0x226b,0x2282,0x2283,0x2286,0x2287,0x22a5,0x22c2,0x22c3,0x2300, 0x2302,0x2308,0x2309,0x230a,0x230b,0x2310,0x2319,0x2320,0x2321,0x239b,0x239c,0x239d,0x239e,0x239f,0x23a0,0x23a1, 0x23a2,0x23a3,0x23a4,0x23a5,0x23a6,0x23a7,0x23a8,0x23a9,0x23ab,0x23ac,0x23ad,0x23ae,0x23af,0x23ba,0x23bb,0x23bc, 0x23bd,0x23d0,0x2409,0x240a,0x240b,0x240c,0x240d,0x2424,0x2500,0x2501,0x2502,0x2503,0x2508,0x2509,0x250a,0x250b, 0x250c,0x250d,0x250e,0x250f,0x2510,0x2511,0x2512,0x2513,0x2514,0x2515,0x2516,0x2517,0x2518,0x2519,0x251a,0x251b, 0x251c,0x251d,0x251e,0x251f,0x2520,0x2521,0x2522,0x2523,0x2524,0x2525,0x2526,0x2527,0x2528,0x2529,0x252a,0x252b, 0x252c,0x252d,0x252e,0x252f,0x2530,0x2531,0x2532,0x2533,0x2534,0x2535,0x2536,0x2537,0x2538,0x2539,0x253a,0x253b, 0x253c,0x253d,0x253e,0x253f,0x2540,0x2541,0x2542,0x2543,0x2544,0x2545,0x2546,0x2547,0x2548,0x2549,0x254a,0x254b, 0x2550,0x2551,0x2552,0x2553,0x2554,0x2555,0x2556,0x2557,0x2558,0x2559,0x255a,0x255b,0x255c,0x255d,0x255e,0x255f, 0x2560,0x2561,0x2562,0x2563,0x2564,0x2565,0x2566,0x2567,0x2568,0x2569,0x256a,0x256b,0x256c,0x256d,0x256e,0x256f, 0x2570,0x2571,0x2572,0x2573,0x2574,0x2575,0x2576,0x2577,0x2578,0x2579,0x257a,0x257b,0x257c,0x257d,0x257e,0x257f, 0x2580,0x2581,0x2582,0x2583,0x2584,0x2585,0x2586,0x2587,0x2588,0x2589,0x258a,0x258b,0x258c,0x258d,0x258e,0x258f, 0x2590,0x2591,0x2592,0x2593,0x2596,0x2597,0x2598,0x2599,0x259a,0x259b,0x259c,0x259d,0x259e,0x259f,0x25a0,0x25ac, 0x25ae,0x25b2,0x25b6,0x25ba,0x25bc,0x25c0,0x25c4,0x25c6,0x25ca,0x25cb,0x25cf,0x25d8,0x25d9,0x263a,0x263b,0x263c, 0x2640,0x2642,0x2660,0x2663,0x2665,0x2666,0x266a,0x266b,0x2713,0x2714,0x2717,0x2718,0x27e8,0x27e9,0x27ea,0x27eb, 0x2800,0x2801,0x2802,0x2803,0x2804,0x2805,0x2806,0x2807,0x2808,0x2809,0x280a,0x280b,0x280c,0x280d,0x280e,0x280f, 0x2810,0x2811,0x2812,0x2813,0x2814,0x2815,0x2816,0x2817,0x2818,0x2819,0x281a,0x281b,0x281c,0x281d,0x281e,0x281f, 0x2820,0x2821,0x2822,0x2823,0x2824,0x2825,0x2826,0x2827,0x2828,0x2829,0x282a,0x282b,0x282c,0x282d,0x282e,0x282f, 0x2830,0x2831,0x2832,0x2833,0x2834,0x2835,0x2836,0x2837,0x2838,0x2839,0x283a,0x283b,0x283c,0x283d,0x283e,0x283f, 0x2840,0x2841,0x2842,0x2843,0x2844,0x2845,0x2846,0x2847,0x2848,0x2849,0x284a,0x284b,0x284c,0x284d,0x284e,0x284f, 0x2850,0x2851,0x2852,0x2853,0x2854,0x2855,0x2856,0x2857,0x2858,0x2859,0x285a,0x285b,0x285c,0x285d,0x285e,0x285f, 0x2860,0x2861,0x2862,0x2863,0x2864,0x2865,0x2866,0x2867,0x2868,0x2869,0x286a,0x286b,0x286c,0x286d,0x286e,0x286f, 0x2870,0x2871,0x2872,0x2873,0x2874,0x2875,0x2876,0x2877,0x2878,0x2879,0x287a,0x287b,0x287c,0x287d,0x287e,0x287f, 0x2880,0x2881,0x2882,0x2883,0x2884,0x2885,0x2886,0x2887,0x2888,0x2889,0x288a,0x288b,0x288c,0x288d,0x288e,0x288f, 0x2890,0x2891,0x2892,0x2893,0x2894,0x2895,0x2896,0x2897,0x2898,0x2899,0x289a,0x289b,0x289c,0x289d,0x289e,0x289f, 0x28a0,0x28a1,0x28a2,0x28a3,0x28a4,0x28a5,0x28a6,0x28a7,0x28a8,0x28a9,0x28aa,0x28ab,0x28ac,0x28ad,0x28ae,0x28af, 0x28b0,0x28b1,0x28b2,0x28b3,0x28b4,0x28b5,0x28b6,0x28b7,0x28b8,0x28b9,0x28ba,0x28bb,0x28bc,0x28bd,0x28be,0x28bf, 0x28c0,0x28c1,0x28c2,0x28c3,0x28c4,0x28c5,0x28c6,0x28c7,0x28c8,0x28c9,0x28ca,0x28cb,0x28cc,0x28cd,0x28ce,0x28cf, 0x28d0,0x28d1,0x28d2,0x28d3,0x28d4,0x28d5,0x28d6,0x28d7,0x28d8,0x28d9,0x28da,0x28db,0x28dc,0x28dd,0x28de,0x28df, 0x28e0,0x28e1,0x28e2,0x28e3,0x28e4,0x28e5,0x28e6,0x28e7,0x28e8,0x28e9,0x28ea,0x28eb,0x28ec,0x28ed,0x28ee,0x28ef, 0x28f0,0x28f1,0x28f2,0x28f3,0x28f4,0x28f5,0x28f6,0x28f7,0x28f8,0x28f9,0x28fa,0x28fb,0x28fc,0x28fd,0x28fe,0x28ff, 0x2e2c,0xe0a0,0xe0a1,0xe0a2,0xe0b0,0xe0b1,0xe0b2,0xe0b3,0xf6be,0xfffd }; } // namespace // -- end of autogenerated text --- namespace fixed_font_16n { // -- start of autogenerated text --- // definition section for font: ter-u16n.bdf constexpr int CHARCOUNT = 1354; constexpr int WIDTH = 8; constexpr int HEIGHT = 16; constexpr int OFFSET_X = 0; constexpr int OFFSET_Y = 0; constexpr FixedFont_info_t fixedfont_info = { "Terminus", // font name "ter-u16n.bdf", // font name internal CHARCOUNT, // num of chars WIDTH, HEIGHT, OFFSET_X, OFFSET_Y, false // bold }; // font bitmap definitions constexpr std::array fixedfont_bitmap = { 0x0000,0x0000,0x6600,0x4200,0x0000,0x4200,0x4200,0x4200,0x0000,0x4200,0x4200,0x6600,0x0000,0x0000,0x0000,0x0000, // u0000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0020 0x0000,0x0000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u0021 0x0000,0x2400,0x2400,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0022 0x0000,0x0000,0x2400,0x2400,0x2400,0x7e00,0x2400,0x2400,0x7e00,0x2400,0x2400,0x2400,0x0000,0x0000,0x0000,0x0000, // u0023 0x0000,0x1000,0x1000,0x7c00,0x9200,0x9000,0x9000,0x7c00,0x1200,0x1200,0x9200,0x7c00,0x1000,0x1000,0x0000,0x0000, // u0024 0x0000,0x0000,0x6400,0x9400,0x6800,0x0800,0x1000,0x1000,0x2000,0x2c00,0x5200,0x4c00,0x0000,0x0000,0x0000,0x0000, // u0025 0x0000,0x0000,0x1800,0x2400,0x2400,0x1800,0x3000,0x4a00,0x4400,0x4400,0x4400,0x3a00,0x0000,0x0000,0x0000,0x0000, // u0026 0x0000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0027 0x0000,0x0000,0x0800,0x1000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x1000,0x0800,0x0000,0x0000,0x0000,0x0000, // u0028 0x0000,0x0000,0x2000,0x1000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1000,0x2000,0x0000,0x0000,0x0000,0x0000, // u0029 0x0000,0x0000,0x0000,0x0000,0x0000,0x2400,0x1800,0x7e00,0x1800,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002a 0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x2000,0x0000,0x0000,0x0000, // u002c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u002e 0x0000,0x0000,0x0400,0x0400,0x0800,0x0800,0x1000,0x1000,0x2000,0x2000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u002f 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4600,0x4a00,0x5200,0x6200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0030 0x0000,0x0000,0x0800,0x1800,0x2800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x3e00,0x0000,0x0000,0x0000,0x0000, // u0031 0x0000,0x0000,0x3c00,0x4200,0x4200,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0032 0x0000,0x0000,0x3c00,0x4200,0x4200,0x0200,0x1c00,0x0200,0x0200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0033 0x0000,0x0000,0x0200,0x0600,0x0a00,0x1200,0x2200,0x4200,0x7e00,0x0200,0x0200,0x0200,0x0000,0x0000,0x0000,0x0000, // u0034 0x0000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7c00,0x0200,0x0200,0x0200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0035 0x0000,0x0000,0x1c00,0x2000,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0036 0x0000,0x0000,0x7e00,0x0200,0x0200,0x0400,0x0400,0x0800,0x0800,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u0037 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x3c00,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0038 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x0400,0x3800,0x0000,0x0000,0x0000,0x0000, // u0039 0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x0000,0x0000,0x0000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u003a 0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x0000,0x0000,0x0000,0x1000,0x1000,0x2000,0x0000,0x0000,0x0000, // u003b 0x0000,0x0000,0x0000,0x0400,0x0800,0x1000,0x2000,0x4000,0x2000,0x1000,0x0800,0x0400,0x0000,0x0000,0x0000,0x0000, // u003c 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0000,0x0000,0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003d 0x0000,0x0000,0x0000,0x4000,0x2000,0x1000,0x0800,0x0400,0x0800,0x1000,0x2000,0x4000,0x0000,0x0000,0x0000,0x0000, // u003e 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x0400,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000, // u003f 0x0000,0x0000,0x7c00,0x8200,0x9e00,0xa200,0xa200,0xa200,0xa600,0x9a00,0x8000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0040 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u0041 0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x7c00,0x4200,0x4200,0x4200,0x4200,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0042 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4000,0x4000,0x4000,0x4000,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0043 0x0000,0x0000,0x7800,0x4400,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4400,0x7800,0x0000,0x0000,0x0000,0x0000, // u0044 0x0000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0045 0x0000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u0046 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4000,0x4000,0x4e00,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0047 0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u0048 0x0000,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u0049 0x0000,0x0000,0x0e00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x4400,0x4400,0x3800,0x0000,0x0000,0x0000,0x0000, // u004a 0x0000,0x0000,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x0000,0x0000,0x0000,0x0000, // u004b 0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u004c 0x0000,0x0000,0x8200,0xc600,0xaa00,0x9200,0x9200,0x8200,0x8200,0x8200,0x8200,0x8200,0x0000,0x0000,0x0000,0x0000, // u004d 0x0000,0x0000,0x4200,0x4200,0x4200,0x6200,0x5200,0x4a00,0x4600,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u004e 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u004f 0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x7c00,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u0050 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4a00,0x3c00,0x0200,0x0000,0x0000,0x0000, // u0051 0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x7c00,0x5000,0x4800,0x4400,0x4200,0x0000,0x0000,0x0000,0x0000, // u0052 0x0000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x3c00,0x0200,0x0200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0053 0x0000,0x0000,0xfe00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u0054 0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0055 0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x2400,0x2400,0x2400,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u0056 0x0000,0x0000,0x8200,0x8200,0x8200,0x8200,0x8200,0x9200,0x9200,0xaa00,0xc600,0x8200,0x0000,0x0000,0x0000,0x0000, // u0057 0x0000,0x0000,0x4200,0x4200,0x2400,0x2400,0x1800,0x1800,0x2400,0x2400,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u0058 0x0000,0x0000,0x8200,0x8200,0x4400,0x4400,0x2800,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u0059 0x0000,0x0000,0x7e00,0x0200,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u005a 0x0000,0x0000,0x3800,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x3800,0x0000,0x0000,0x0000,0x0000, // u005b 0x0000,0x0000,0x4000,0x4000,0x2000,0x2000,0x1000,0x1000,0x0800,0x0800,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000, // u005c 0x0000,0x0000,0x3800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x3800,0x0000,0x0000,0x0000,0x0000, // u005d 0x0000,0x1000,0x2800,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0000,0x0000, // u005f 0x1000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0060 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u0061 0x0000,0x0000,0x4000,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0062 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4000,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0063 0x0000,0x0000,0x0200,0x0200,0x0200,0x3e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u0064 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0065 0x0000,0x0000,0x0e00,0x1000,0x1000,0x7c00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u0066 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x3c00,0x0000, // u0067 0x0000,0x0000,0x4000,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u0068 0x0000,0x0000,0x1000,0x1000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u0069 0x0000,0x0000,0x0400,0x0400,0x0000,0x0c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x4400,0x4400,0x3800,0x0000, // u006a 0x0000,0x0000,0x4000,0x4000,0x4000,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x0000,0x0000,0x0000,0x0000, // u006b 0x0000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u006c 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x0000,0x0000,0x0000,0x0000, // u006d 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u006e 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u006f 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x7c00,0x4000,0x4000,0x4000,0x0000, // u0070 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x0200,0x0000, // u0071 0x0000,0x0000,0x0000,0x0000,0x0000,0x5e00,0x6000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u0072 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4000,0x4000,0x3c00,0x0200,0x0200,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0073 0x0000,0x0000,0x1000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x1000,0x1000,0x1000,0x0e00,0x0000,0x0000,0x0000,0x0000, // u0074 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u0075 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x2400,0x2400,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u0076 0x0000,0x0000,0x0000,0x0000,0x0000,0x8200,0x8200,0x9200,0x9200,0x9200,0x9200,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0077 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x2400,0x1800,0x2400,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u0078 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x3c00,0x0000, // u0079 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0400,0x0800,0x1000,0x2000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u007a 0x0000,0x0000,0x0c00,0x1000,0x1000,0x1000,0x2000,0x1000,0x1000,0x1000,0x1000,0x0c00,0x0000,0x0000,0x0000,0x0000, // u007b 0x0000,0x0000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u007c 0x0000,0x0000,0x3000,0x0800,0x0800,0x0800,0x0400,0x0800,0x0800,0x0800,0x0800,0x3000,0x0000,0x0000,0x0000,0x0000, // u007d 0x0000,0x6200,0x9200,0x8c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a0 0x0000,0x0000,0x1000,0x1000,0x0000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u00a1 0x0000,0x0000,0x0000,0x1000,0x1000,0x7c00,0x9200,0x9000,0x9000,0x9000,0x9200,0x7c00,0x1000,0x1000,0x0000,0x0000, // u00a2 0x0000,0x0000,0x1800,0x2400,0x2000,0x2000,0x7800,0x2000,0x2000,0x2000,0x2200,0x7e00,0x0000,0x0000,0x0000,0x0000, // u00a3 0x0000,0x0000,0x0000,0x0000,0x4400,0x3800,0x4400,0x4400,0x4400,0x3800,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a4 0x0000,0x0000,0x8200,0x8200,0x4400,0x2800,0x1000,0x7c00,0x1000,0x7c00,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u00a5 0x0000,0x0000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u00a6 0x0000,0x3800,0x4400,0x4000,0x3000,0x4800,0x4400,0x4400,0x2400,0x1800,0x0400,0x4400,0x3800,0x0000,0x0000,0x0000, // u00a7 0x2400,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a8 0x0000,0x0000,0x0000,0x7e00,0x8100,0x9900,0xa500,0xa100,0xa500,0x9900,0x8100,0x7e00,0x0000,0x0000,0x0000,0x0000, // u00a9 0x0000,0x3800,0x0400,0x3c00,0x4400,0x3c00,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x1200,0x2400,0x4800,0x9000,0x4800,0x2400,0x1200,0x0000,0x0000,0x0000,0x0000, // u00ab 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0200,0x0200,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ac 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ad 0x0000,0x0000,0x0000,0x7e00,0x8100,0xb900,0xa500,0xb900,0xa900,0xa500,0x8100,0x7e00,0x0000,0x0000,0x0000,0x0000, // u00ae 0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00af 0x0000,0x1800,0x2400,0x2400,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000, // u00b1 0x0000,0x1800,0x2400,0x0400,0x0800,0x1000,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b2 0x0000,0x3800,0x0400,0x1800,0x0400,0x0400,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b3 0x0800,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4600,0x7a00,0x4000,0x4000,0x4000,0x0000, // u00b5 0x0000,0x0000,0x7e00,0x9200,0x9200,0x9200,0x9200,0x7200,0x1200,0x1200,0x1200,0x1200,0x0000,0x0000,0x0000,0x0000, // u00b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x2000,0x0000, // u00b8 0x0000,0x1000,0x3000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b9 0x0000,0x3800,0x4400,0x4400,0x4400,0x3800,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x9000,0x4800,0x2400,0x1200,0x2400,0x4800,0x9000,0x0000,0x0000,0x0000,0x0000, // u00bb 0x0000,0x2000,0x6000,0x2000,0x2200,0x2400,0x0800,0x1000,0x2200,0x4600,0x8a00,0x1e00,0x0200,0x0200,0x0000,0x0000, // u00bc 0x0000,0x2000,0x6000,0x2000,0x2200,0x2400,0x0800,0x1000,0x2000,0x4c00,0x9200,0x0400,0x0800,0x1e00,0x0000,0x0000, // u00bd 0x0000,0xe000,0x1000,0x6000,0x1200,0xe400,0x0800,0x1000,0x2200,0x4600,0x8a00,0x1e00,0x0200,0x0200,0x0000,0x0000, // u00be 0x0000,0x0000,0x1000,0x1000,0x0000,0x1000,0x1000,0x2000,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00bf 0x1000,0x0800,0x0000,0x3c00,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u00c0 0x0800,0x1000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u00c1 0x1800,0x2400,0x0000,0x3c00,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u00c2 0x3200,0x4c00,0x0000,0x3c00,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u00c3 0x2400,0x2400,0x0000,0x3c00,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u00c4 0x1800,0x2400,0x1800,0x3c00,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u00c5 0x0000,0x0000,0x7e00,0x9000,0x9000,0x9000,0xfc00,0x9000,0x9000,0x9000,0x9000,0x9e00,0x0000,0x0000,0x0000,0x0000, // u00c6 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4000,0x4000,0x4000,0x4000,0x4200,0x4200,0x3c00,0x1000,0x1000,0x2000,0x0000, // u00c7 0x1000,0x0800,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u00c8 0x0800,0x1000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u00c9 0x1800,0x2400,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u00ca 0x2400,0x2400,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u00cb 0x2000,0x1000,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u00cc 0x0800,0x1000,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u00cd 0x1800,0x2400,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u00ce 0x4400,0x4400,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u00cf 0x0000,0x0000,0x7800,0x4400,0x4200,0x4200,0xf200,0x4200,0x4200,0x4200,0x4400,0x7800,0x0000,0x0000,0x0000,0x0000, // u00d0 0x3200,0x4c00,0x0000,0x4200,0x4200,0x6200,0x5200,0x4a00,0x4600,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u00d1 0x1000,0x0800,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00d2 0x0800,0x1000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00d3 0x1800,0x2400,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00d4 0x3200,0x4c00,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00d5 0x2400,0x2400,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00d6 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x2400,0x1800,0x1800,0x2400,0x4200,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d7 0x0000,0x0000,0x3c00,0x4300,0x4200,0x4600,0x4a00,0x5200,0x6200,0x4200,0xc200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00d8 0x1000,0x0800,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00d9 0x0800,0x1000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00da 0x1800,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00db 0x2400,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00dc 0x0800,0x1000,0x8200,0x8200,0x4400,0x4400,0x2800,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u00dd 0x0000,0x0000,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x7c00,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u00de 0x0000,0x0000,0x3800,0x4400,0x4400,0x4800,0x7c00,0x4200,0x4200,0x4200,0x6200,0x5c00,0x0000,0x0000,0x0000,0x0000, // u00df 0x0000,0x0000,0x1000,0x0800,0x0000,0x3c00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u00e0 0x0000,0x0000,0x0800,0x1000,0x0000,0x3c00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u00e1 0x0000,0x0000,0x1800,0x2400,0x0000,0x3c00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u00e2 0x0000,0x0000,0x3200,0x4c00,0x0000,0x3c00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u00e3 0x0000,0x0000,0x2400,0x2400,0x0000,0x3c00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u00e4 0x0000,0x0000,0x1800,0x2400,0x1800,0x3c00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u00e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x6c00,0x1200,0x7200,0x9e00,0x9000,0x9000,0x6c00,0x0000,0x0000,0x0000,0x0000, // u00e6 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4000,0x4200,0x3c00,0x1000,0x1000,0x2000,0x0000, // u00e7 0x0000,0x0000,0x1000,0x0800,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00e8 0x0000,0x0000,0x0800,0x1000,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00e9 0x0000,0x0000,0x1800,0x2400,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00ea 0x0000,0x0000,0x2400,0x2400,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00eb 0x0000,0x0000,0x2000,0x1000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u00ec 0x0000,0x0000,0x0800,0x1000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u00ed 0x0000,0x0000,0x3000,0x4800,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u00ee 0x0000,0x0000,0x4800,0x4800,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u00ef 0x0000,0x0000,0x2800,0x1000,0x2800,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00f0 0x0000,0x0000,0x3200,0x4c00,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u00f1 0x0000,0x0000,0x1000,0x0800,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00f2 0x0000,0x0000,0x0800,0x1000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00f3 0x0000,0x0000,0x1800,0x2400,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00f4 0x0000,0x0000,0x3200,0x4c00,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00f5 0x0000,0x0000,0x2400,0x2400,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00f6 0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x0000,0x7c00,0x0000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f7 0x0000,0x0000,0x0000,0x0000,0x0200,0x3c00,0x4600,0x4a00,0x5200,0x6200,0x4200,0xbc00,0x0000,0x0000,0x0000,0x0000, // u00f8 0x0000,0x0000,0x1000,0x0800,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u00f9 0x0000,0x0000,0x0800,0x1000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u00fa 0x0000,0x0000,0x1800,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u00fb 0x0000,0x0000,0x2400,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u00fc 0x0000,0x0000,0x0800,0x1000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x3c00,0x0000, // u00fd 0x0000,0x0000,0x4000,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x7c00,0x4000,0x4000,0x4000,0x0000, // u00fe 0x0000,0x0000,0x2400,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x3c00,0x0000, // u00ff 0x3c00,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u0100 0x0000,0x0000,0x0000,0x3c00,0x0000,0x3c00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u0101 0x2400,0x1800,0x0000,0x3c00,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u0102 0x0000,0x0000,0x2400,0x1800,0x0000,0x3c00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u0103 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0200,0x0400,0x0300,0x0000, // u0104 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0400,0x0300,0x0000, // u0105 0x0800,0x1000,0x0000,0x3c00,0x4200,0x4200,0x4000,0x4000,0x4000,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0106 0x0000,0x0000,0x0800,0x1000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4000,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0107 0x1800,0x2400,0x0000,0x3c00,0x4200,0x4200,0x4000,0x4000,0x4000,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0108 0x0000,0x0000,0x1800,0x2400,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4000,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0109 0x1000,0x1000,0x0000,0x3c00,0x4200,0x4200,0x4000,0x4000,0x4000,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u010a 0x0000,0x0000,0x1000,0x1000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4000,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u010b 0x2400,0x1800,0x0000,0x3c00,0x4200,0x4200,0x4000,0x4000,0x4000,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u010c 0x0000,0x0000,0x2400,0x1800,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4000,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u010d 0x2400,0x1800,0x0000,0x7800,0x4400,0x4200,0x4200,0x4200,0x4200,0x4200,0x4400,0x7800,0x0000,0x0000,0x0000,0x0000, // u010e 0x2400,0x1800,0x0200,0x0200,0x0200,0x3e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u010f 0x0000,0x0000,0x7800,0x4400,0x4200,0x4200,0xf200,0x4200,0x4200,0x4200,0x4400,0x7800,0x0000,0x0000,0x0000,0x0000, // u0110 0x0000,0x0000,0x0200,0x0f00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u0111 0x3c00,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0112 0x0000,0x0000,0x0000,0x3c00,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0113 0x2400,0x1800,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0114 0x0000,0x0000,0x2400,0x1800,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0115 0x1000,0x1000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0116 0x0000,0x0000,0x1000,0x1000,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0117 0x0000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x4000,0x7e00,0x0200,0x0400,0x0300,0x0000, // u0118 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0800,0x1000,0x0c00,0x0000, // u0119 0x2400,0x1800,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u011a 0x0000,0x0000,0x2400,0x1800,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x0000,0x0000,0x0000, // u011b 0x1800,0x2400,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4e00,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u011c 0x0000,0x0000,0x1800,0x2400,0x0000,0x3e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x3c00,0x0000, // u011d 0x2400,0x1800,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4e00,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u011e 0x0000,0x0000,0x2400,0x1800,0x0000,0x3e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x3c00,0x0000, // u011f 0x1000,0x1000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4e00,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0120 0x0000,0x0000,0x0800,0x0800,0x0000,0x3e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x3c00,0x0000, // u0121 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4000,0x4000,0x4e00,0x4200,0x4200,0x4200,0x3c00,0x0000,0x1000,0x1000,0x2000, // u0122 0x0000,0x0400,0x0800,0x0800,0x0000,0x3e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x3c00,0x0000, // u0123 0x1800,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u0124 0x0c00,0x1200,0x4000,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u0125 0x0000,0x0000,0x4200,0xff00,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u0126 0x0000,0x0000,0x4000,0xf000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u0127 0x3200,0x4c00,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u0128 0x0000,0x0000,0x3400,0x5800,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u0129 0x7c00,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u012a 0x0000,0x0000,0x0000,0x7800,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u012b 0x2400,0x1800,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u012c 0x0000,0x0000,0x4800,0x3000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u012d 0x0000,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x1000,0x2000,0x1800,0x0000, // u012e 0x0000,0x0000,0x1000,0x1000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x1000,0x2000,0x1800,0x0000, // u012f 0x1000,0x1000,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u0130 0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u0131 0x0000,0x0000,0xe700,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x5200,0x5200,0xec00,0x0000,0x0000,0x0000,0x0000, // u0132 0x0000,0x0000,0x4200,0x4200,0x0000,0xc600,0x4200,0x4200,0x4200,0x4200,0x4200,0xe200,0x1200,0x1200,0x0c00,0x0000, // u0133 0x0c00,0x1200,0x0000,0x0e00,0x0400,0x0400,0x0400,0x0400,0x0400,0x4400,0x4400,0x3800,0x0000,0x0000,0x0000,0x0000, // u0134 0x0000,0x0000,0x0c00,0x1200,0x0000,0x0c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x4400,0x4400,0x3800,0x0000, // u0135 0x0000,0x0000,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x0000,0x1000,0x1000,0x2000, // u0136 0x0000,0x0000,0x4000,0x4000,0x4000,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x0000,0x1000,0x1000,0x2000, // u0137 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x0000,0x0000,0x0000,0x0000, // u0138 0x2000,0x4000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0139 0x0800,0x1000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u013a 0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x0000,0x1000,0x1000,0x2000, // u013b 0x0000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x1000,0x1000,0x2000, // u013c 0x2400,0x1800,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u013d 0x4800,0x3000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u013e 0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4400,0x4400,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u013f 0x0000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1100,0x1100,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u0140 0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x6000,0xc000,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0141 0x0000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1800,0x3000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u0142 0x0800,0x1000,0x4200,0x4200,0x4200,0x6200,0x5200,0x4a00,0x4600,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u0143 0x0000,0x0000,0x0800,0x1000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u0144 0x0000,0x0000,0x4200,0x4200,0x4200,0x6200,0x5200,0x4a00,0x4600,0x4200,0x4200,0x4200,0x0000,0x1000,0x1000,0x2000, // u0145 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x1000,0x1000,0x2000, // u0146 0x2400,0x1800,0x4200,0x4200,0x4200,0x6200,0x5200,0x4a00,0x4600,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u0147 0x0000,0x0000,0x2400,0x1800,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u0148 0x0000,0x4000,0x4000,0x8000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u0149 0x0000,0x0000,0x4200,0x4200,0x4200,0x6200,0x5200,0x4a00,0x4600,0x4200,0x4200,0x4200,0x0200,0x0200,0x0c00,0x0000, // u014a 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0200,0x0200,0x0c00,0x0000, // u014b 0x3c00,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u014c 0x0000,0x0000,0x0000,0x3c00,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u014d 0x2400,0x1800,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u014e 0x0000,0x0000,0x2400,0x1800,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u014f 0x1200,0x2400,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0150 0x0000,0x0000,0x1200,0x2400,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0151 0x0000,0x0000,0x7e00,0x9000,0x9000,0x9000,0x9c00,0x9000,0x9000,0x9000,0x9000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0152 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x9200,0x9200,0x9e00,0x9000,0x9000,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0153 0x0800,0x1000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x7c00,0x5000,0x4800,0x4400,0x4200,0x0000,0x0000,0x0000,0x0000, // u0154 0x0000,0x0000,0x0800,0x1000,0x0000,0x5e00,0x6000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u0155 0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x7c00,0x5000,0x4800,0x4400,0x4200,0x0000,0x1000,0x1000,0x2000, // u0156 0x0000,0x0000,0x0000,0x0000,0x0000,0x5e00,0x6000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x4000,0x4000,0x8000, // u0157 0x2400,0x1800,0x0000,0x7c00,0x4200,0x4200,0x4200,0x7c00,0x5000,0x4800,0x4400,0x4200,0x0000,0x0000,0x0000,0x0000, // u0158 0x0000,0x0000,0x2400,0x1800,0x0000,0x5e00,0x6000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u0159 0x0800,0x1000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x3c00,0x0200,0x0200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u015a 0x0000,0x0000,0x0400,0x0800,0x0000,0x3e00,0x4000,0x4000,0x3c00,0x0200,0x0200,0x7c00,0x0000,0x0000,0x0000,0x0000, // u015b 0x1800,0x2400,0x0000,0x3c00,0x4200,0x4000,0x4000,0x3c00,0x0200,0x0200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u015c 0x0000,0x0000,0x1800,0x2400,0x0000,0x3e00,0x4000,0x4000,0x3c00,0x0200,0x0200,0x7c00,0x0000,0x0000,0x0000,0x0000, // u015d 0x0000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x3c00,0x0200,0x0200,0x4200,0x4200,0x3c00,0x1000,0x1000,0x2000,0x0000, // u015e 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4000,0x4000,0x3c00,0x0200,0x0200,0x7c00,0x1000,0x1000,0x2000,0x0000, // u015f 0x2400,0x1800,0x0000,0x3c00,0x4200,0x4000,0x4000,0x3c00,0x0200,0x0200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0160 0x0000,0x0000,0x2400,0x1800,0x0000,0x3e00,0x4000,0x4000,0x3c00,0x0200,0x0200,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0161 0x0000,0x0000,0xfe00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0800,0x0800,0x1000,0x0000, // u0162 0x0000,0x0000,0x1000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x1000,0x1000,0x1000,0x0e00,0x0400,0x0400,0x0800,0x0000, // u0163 0x2400,0x1800,0x0000,0xfe00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u0164 0x2400,0x1800,0x0000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x1000,0x1000,0x1000,0x0e00,0x0000,0x0000,0x0000,0x0000, // u0165 0x0000,0x0000,0xfe00,0x1000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u0166 0x0000,0x0000,0x1000,0x1000,0x1000,0x7c00,0x1000,0x3800,0x1000,0x1000,0x1000,0x0e00,0x0000,0x0000,0x0000,0x0000, // u0167 0x3200,0x4c00,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0168 0x0000,0x0000,0x3200,0x4c00,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u0169 0x3c00,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u016a 0x0000,0x0000,0x0000,0x3c00,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u016b 0x2400,0x1800,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u016c 0x0000,0x0000,0x2400,0x1800,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u016d 0x1800,0x2400,0x1800,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u016e 0x0000,0x0000,0x1800,0x2400,0x1800,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u016f 0x1200,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0170 0x0000,0x0000,0x1200,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u0171 0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0800,0x1000,0x0c00,0x0000, // u0172 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0400,0x0300,0x0000, // u0173 0x1800,0x2400,0x0000,0x8200,0x8200,0x8200,0x8200,0x9200,0x9200,0xaa00,0xc600,0x8200,0x0000,0x0000,0x0000,0x0000, // u0174 0x0000,0x0000,0x1800,0x2400,0x0000,0x8200,0x8200,0x9200,0x9200,0x9200,0x9200,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0175 0x1800,0x2400,0x0000,0x8200,0x8200,0x4400,0x4400,0x2800,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u0176 0x0000,0x0000,0x1800,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x3c00,0x0000, // u0177 0x4400,0x4400,0x0000,0x8200,0x8200,0x4400,0x4400,0x2800,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u0178 0x0800,0x1000,0x0000,0x7e00,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0179 0x0000,0x0000,0x0800,0x1000,0x0000,0x7e00,0x0400,0x0800,0x1000,0x2000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u017a 0x1000,0x1000,0x0000,0x7e00,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u017b 0x0000,0x0000,0x1000,0x1000,0x0000,0x7e00,0x0400,0x0800,0x1000,0x2000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u017c 0x2400,0x1800,0x0000,0x7e00,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u017d 0x0000,0x0000,0x2400,0x1800,0x0000,0x7e00,0x0400,0x0800,0x1000,0x2000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u017e 0x0000,0x0000,0x0e00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u017f 0x0000,0x0000,0x3c00,0x4200,0x4200,0x0200,0x0200,0x0200,0x0200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0186 0x0000,0x0000,0x7e00,0x0200,0x0200,0x0200,0x1e00,0x0200,0x0200,0x0200,0x0200,0x7e00,0x0000,0x0000,0x0000,0x0000, // u018e 0x0000,0x0000,0x3c00,0x4200,0x0200,0x0200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u018f 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4000,0x3800,0x4000,0x4000,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0190 0x0000,0x0000,0x0c00,0x1200,0x1000,0x1000,0x7c00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x9000,0x6000,0x0000, // u0192 0x0000,0x0000,0x4200,0x4200,0x4200,0x6200,0x5200,0x4a00,0x4600,0x4200,0x4200,0x4200,0x4000,0x4000,0x8000,0x0000, // u019d 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0200,0x0200,0x0200,0x0000, // u019e 0x0000,0x0000,0x7e00,0x0200,0x0400,0x0800,0x7e00,0x1000,0x2000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u01b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0400,0x0800,0x7c00,0x1000,0x2000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u01b6 0x0000,0x0000,0x7e00,0x0200,0x0400,0x0800,0x1c00,0x0200,0x0200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u01b7 0x2400,0x1800,0x0000,0x3c00,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u01cd 0x0000,0x0000,0x2400,0x1800,0x0000,0x3c00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u01ce 0x2400,0x1800,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u01cf 0x0000,0x0000,0x4800,0x3000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u01d0 0x2400,0x1800,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u01d1 0x0000,0x0000,0x2400,0x1800,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u01d2 0x2400,0x1800,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u01d3 0x0000,0x0000,0x2400,0x1800,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u01d4 0x7c00,0x0000,0x7e00,0x9000,0x9000,0x9000,0xfc00,0x9000,0x9000,0x9000,0x9000,0x9e00,0x0000,0x0000,0x0000,0x0000, // u01e2 0x0000,0x0000,0x0000,0x7c00,0x0000,0x6c00,0x1200,0x7200,0x9e00,0x9000,0x9000,0x6c00,0x0000,0x0000,0x0000,0x0000, // u01e3 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4000,0x4000,0x4e00,0x4200,0x4f00,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u01e4 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4200,0x4200,0x4f00,0x4200,0x4200,0x3e00,0x0200,0x0200,0x3c00,0x0000, // u01e5 0x2400,0x1800,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4e00,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u01e6 0x0000,0x0000,0x2400,0x1800,0x0000,0x3e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x3c00,0x0000, // u01e7 0x2400,0x1800,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x0000,0x0000,0x0000,0x0000, // u01e8 0x2400,0x1800,0x4000,0x4000,0x4000,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x0000,0x0000,0x0000,0x0000, // u01e9 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0800,0x1000,0x0c00,0x0000, // u01ea 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0800,0x1000,0x0c00,0x0000, // u01eb 0x3c00,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0800,0x1000,0x0c00,0x0000, // u01ec 0x0000,0x0000,0x0000,0x3c00,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0800,0x1000,0x0c00,0x0000, // u01ed 0x2400,0x1800,0x0000,0x7e00,0x0400,0x0800,0x1c00,0x0200,0x0200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u01ee 0x0000,0x0000,0x2400,0x1800,0x0000,0x7e00,0x0200,0x0400,0x0800,0x1c00,0x0200,0x0200,0x4200,0x4200,0x3c00,0x0000, // u01ef 0x0000,0x0000,0x1200,0x0c00,0x0000,0x0c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x4400,0x4400,0x3800,0x0000, // u01f0 0x0800,0x1000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4e00,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u01f4 0x0000,0x0000,0x0400,0x0800,0x0000,0x3e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x3c00,0x0000, // u01f5 0x0800,0x1000,0x0000,0x7e00,0x9000,0x9000,0x9000,0xfc00,0x9000,0x9000,0x9000,0x9e00,0x0000,0x0000,0x0000,0x0000, // u01fc 0x0000,0x0000,0x0800,0x1000,0x0000,0x6c00,0x1200,0x7200,0x9e00,0x9000,0x9000,0x6c00,0x0000,0x0000,0x0000,0x0000, // u01fd 0x0800,0x1000,0x0000,0x3d00,0x4200,0x4600,0x4a00,0x5200,0x6200,0x4200,0xc200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u01fe 0x0000,0x0000,0x0800,0x1000,0x0200,0x3c00,0x4600,0x4a00,0x5200,0x6200,0x4200,0xbc00,0x0000,0x0000,0x0000,0x0000, // u01ff 0x0000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x3c00,0x0200,0x0200,0x4200,0x4200,0x3c00,0x0000,0x1000,0x1000,0x2000, // u0218 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4000,0x4000,0x3c00,0x0200,0x0200,0x7c00,0x0000,0x1000,0x1000,0x2000, // u0219 0x0000,0x0000,0xfe00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x1000,0x1000,0x2000, // u021a 0x0000,0x0000,0x1000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x1000,0x1000,0x1000,0x0e00,0x0000,0x0400,0x0400,0x0800, // u021b 0x7c00,0x0000,0x8200,0x8200,0x4400,0x4400,0x2800,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u0232 0x0000,0x0000,0x0000,0x3c00,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x3c00,0x0000, // u0233 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x4400,0x4400,0x3800,0x0000, // u0237 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x0200,0x0200,0x0200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0254 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x0200,0x0200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0258 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x0200,0x0200,0x7e00,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0259 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4000,0x3800,0x4000,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u025b 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4000,0x4000,0x8000,0x0000, // u0272 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0200,0x0400,0x0800,0x1c00,0x0200,0x0200,0x4200,0x4200,0x3c00,0x0000, // u0292 0x0800,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bb 0x0800,0x0800,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bc 0x1000,0x1000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bd 0x1800,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02c6 0x2400,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02c7 0x2400,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02d8 0x1000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02d9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1000,0x0c00,0x0000, // u02db 0x3200,0x4c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02dc 0x1200,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02dd 0x1000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0300 0x0800,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0301 0x1800,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0302 0x3200,0x4c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0303 0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0304 0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0305 0x2400,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0306 0x1000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0307 0x2400,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0308 0x1800,0x2400,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030a 0x1200,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030b 0x2400,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x0000, // u0329 0x4000,0x8000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0384 0x0800,0x1000,0x0000,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0385 0x4000,0x8000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u0386 0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0387 0x4000,0x8000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0388 0x4000,0x8000,0x4200,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u0389 0x4000,0x8000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u038a 0x4000,0x8000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u038c 0x4000,0x8000,0x0000,0x8200,0x8200,0x4400,0x4400,0x2800,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u038e 0x4000,0x8000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x2400,0x2400,0x6600,0x0000,0x0000,0x0000,0x0000, // u038f 0x0800,0x1000,0x4800,0x4800,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0c00,0x0000,0x0000,0x0000,0x0000, // u0390 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u0391 0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x7c00,0x4200,0x4200,0x4200,0x4200,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0392 0x0000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u0393 0x0000,0x0000,0x1000,0x1000,0x2800,0x2800,0x4400,0x4400,0x4400,0x8200,0x8200,0xfe00,0x0000,0x0000,0x0000,0x0000, // u0394 0x0000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0395 0x0000,0x0000,0x7e00,0x0200,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0396 0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u0397 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x5a00,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0398 0x0000,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u0399 0x0000,0x0000,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x0000,0x0000,0x0000,0x0000, // u039a 0x0000,0x0000,0x1000,0x1000,0x2800,0x2800,0x4400,0x4400,0x4400,0x8200,0x8200,0x8200,0x0000,0x0000,0x0000,0x0000, // u039b 0x0000,0x0000,0x8200,0xc600,0xaa00,0x9200,0x9200,0x8200,0x8200,0x8200,0x8200,0x8200,0x0000,0x0000,0x0000,0x0000, // u039c 0x0000,0x0000,0x4200,0x4200,0x4200,0x6200,0x5200,0x4a00,0x4600,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u039d 0x0000,0x0000,0x7e00,0x0000,0x0000,0x0000,0x3c00,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u039e 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u039f 0x0000,0x0000,0x7e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u03a0 0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x7c00,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u03a1 0x0000,0x0000,0x7e00,0x4000,0x2000,0x1000,0x0800,0x0800,0x1000,0x2000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u03a3 0x0000,0x0000,0xfe00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u03a4 0x0000,0x0000,0x8200,0x8200,0x4400,0x4400,0x2800,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u03a5 0x0000,0x0000,0x1000,0x7c00,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x7c00,0x1000,0x0000,0x0000,0x0000,0x0000, // u03a6 0x0000,0x0000,0x4200,0x4200,0x2400,0x2400,0x1800,0x1800,0x2400,0x2400,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u03a7 0x0000,0x0000,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x7c00,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u03a8 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x2400,0x2400,0x6600,0x0000,0x0000,0x0000,0x0000, // u03a9 0x4400,0x4400,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u03aa 0x4400,0x4400,0x0000,0x8200,0x8200,0x4400,0x4400,0x2800,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u03ab 0x0000,0x0000,0x0800,0x1000,0x0000,0x3a00,0x4600,0x4400,0x4400,0x4400,0x4600,0x3a00,0x0000,0x0000,0x0000,0x0000, // u03ac 0x0000,0x0000,0x0800,0x1000,0x0000,0x3c00,0x4200,0x4000,0x3800,0x4000,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u03ad 0x0000,0x0000,0x0800,0x1000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0200,0x0200,0x0200,0x0000, // u03ae 0x0000,0x0000,0x0800,0x1000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0c00,0x0000,0x0000,0x0000,0x0000, // u03af 0x0800,0x1000,0x0000,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u03b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x3a00,0x4600,0x4400,0x4400,0x4400,0x4600,0x3a00,0x0000,0x0000,0x0000,0x0000, // u03b1 0x0000,0x0000,0x3800,0x4400,0x4400,0x4800,0x7c00,0x4200,0x4200,0x4200,0x4200,0x7c00,0x4000,0x4000,0x4000,0x0000, // u03b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x8200,0x8200,0x4400,0x4400,0x2800,0x2800,0x1000,0x1000,0x1000,0x1000,0x0000, // u03b3 0x0000,0x0000,0x3e00,0x1000,0x0800,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u03b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4000,0x3800,0x4000,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u03b5 0x0000,0x0000,0x7e00,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x4000,0x4000,0x3c00,0x0200,0x0200,0x0400,0x0000, // u03b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0200,0x0200,0x0200,0x0000, // u03b7 0x0000,0x0000,0x3800,0x4400,0x4400,0x4400,0x7c00,0x4400,0x4400,0x4400,0x4400,0x3800,0x0000,0x0000,0x0000,0x0000, // u03b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0c00,0x0000,0x0000,0x0000,0x0000, // u03b9 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x0000,0x0000,0x0000,0x0000, // u03ba 0x0000,0x0000,0x2000,0x2000,0x1000,0x1000,0x2800,0x2800,0x4400,0x4400,0x8200,0x8200,0x0000,0x0000,0x0000,0x0000, // u03bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4600,0x7a00,0x4000,0x4000,0x4000,0x0000, // u03bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x2400,0x2400,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u03bd 0x0000,0x0000,0x3e00,0x4000,0x4000,0x4000,0x3c00,0x4000,0x4000,0x4000,0x4000,0x3c00,0x0200,0x0200,0x0400,0x0000, // u03be 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u03bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u03c0 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x7c00,0x4000,0x4000,0x4000,0x0000, // u03c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4000,0x4000,0x3c00,0x0200,0x0200,0x0400,0x0000, // u03c2 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4400,0x4400,0x4400,0x4400,0x4400,0x3800,0x0000,0x0000,0x0000,0x0000, // u03c3 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x1000,0x1000,0x1000,0x1000,0x1000,0x0c00,0x0000,0x0000,0x0000,0x0000, // u03c4 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u03c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x4c00,0x9200,0x9200,0x9200,0x9200,0x9200,0x7c00,0x1000,0x1000,0x1000,0x0000, // u03c6 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x2400,0x2400,0x1800,0x1800,0x2400,0x2400,0x4200,0x4200,0x0000, // u03c7 0x0000,0x0000,0x0000,0x0000,0x0000,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x7c00,0x1000,0x1000,0x1000,0x0000, // u03c8 0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x8200,0x9200,0x9200,0x9200,0x9200,0x6c00,0x0000,0x0000,0x0000,0x0000, // u03c9 0x0000,0x0000,0x4800,0x4800,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0c00,0x0000,0x0000,0x0000,0x0000, // u03ca 0x0000,0x0000,0x2400,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u03cb 0x0000,0x0000,0x0800,0x1000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u03cc 0x0000,0x0000,0x0800,0x1000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u03cd 0x0000,0x0000,0x0800,0x1000,0x0000,0x4400,0x8200,0x9200,0x9200,0x9200,0x9200,0x6c00,0x0000,0x0000,0x0000,0x0000, // u03ce 0x0000,0x0000,0x3800,0x4400,0x4400,0x4400,0x3e00,0x0400,0xc400,0x4400,0x4400,0x3800,0x0000,0x0000,0x0000,0x0000, // u03d1 0x0000,0x0000,0x0000,0x0000,0x1000,0x7c00,0x9200,0x9200,0x9200,0x9200,0x9200,0x7c00,0x1000,0x0000,0x0000,0x0000, // u03d5 0x0000,0x0000,0x0000,0x0000,0x0000,0xc200,0x2400,0x1800,0x1000,0x3000,0x4800,0x8600,0x0000,0x0000,0x0000,0x0000, // u03f0 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x7c00,0x4000,0x4000,0x3c00,0x0000, // u03f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4000,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u03f2 0x0000,0x0000,0x0400,0x0400,0x0000,0x0c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x4400,0x4400,0x3800,0x0000, // u03f3 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u03f4 0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2000,0x4000,0x7c00,0x4000,0x2000,0x1e00,0x0000,0x0000,0x0000,0x0000, // u03f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x7800,0x0400,0x0200,0x3e00,0x0200,0x0400,0x7800,0x0000,0x0000,0x0000,0x0000, // u03f6 0x1000,0x0800,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0400 0x2400,0x2400,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0401 0x0000,0x0000,0xf800,0x2000,0x2000,0x3c00,0x2200,0x2200,0x2200,0x2200,0x2200,0x2400,0x0000,0x0000,0x0000,0x0000, // u0402 0x0800,0x1000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u0403 0x0000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0404 0x0000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x3c00,0x0200,0x0200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0405 0x0000,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u0406 0x4400,0x4400,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u0407 0x0000,0x0000,0x0e00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x4400,0x4400,0x3800,0x0000,0x0000,0x0000,0x0000, // u0408 0x0000,0x0000,0x3000,0x5000,0x9000,0x9c00,0x9200,0x9200,0x9200,0x9200,0x9200,0x9c00,0x0000,0x0000,0x0000,0x0000, // u0409 0x0000,0x0000,0x9000,0x9000,0x9000,0x9c00,0xf200,0x9200,0x9200,0x9200,0x9200,0x9c00,0x0000,0x0000,0x0000,0x0000, // u040a 0x0000,0x0000,0xf800,0x2000,0x2000,0x3c00,0x2200,0x2200,0x2200,0x2200,0x2200,0x2200,0x0000,0x0000,0x0000,0x0000, // u040b 0x0800,0x1000,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x0000,0x0000,0x0000,0x0000, // u040c 0x1000,0x0800,0x4200,0x4200,0x4200,0x4600,0x4a00,0x5200,0x6200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u040d 0x2400,0x1800,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x0200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u040e 0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x7e00,0x1800,0x1800,0x0000,0x0000, // u040f 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u0410 0x0000,0x0000,0x7c00,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0411 0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x7c00,0x4200,0x4200,0x4200,0x4200,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0412 0x0000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u0413 0x0000,0x0000,0x3c00,0x4400,0x4400,0x4400,0x4400,0x4400,0x4400,0x4400,0x4400,0xfe00,0x8200,0x0000,0x0000,0x0000, // u0414 0x0000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0415 0x0000,0x0000,0x9200,0x9200,0x9200,0x5400,0x3800,0x5400,0x9200,0x9200,0x9200,0x9200,0x0000,0x0000,0x0000,0x0000, // u0416 0x0000,0x0000,0x3c00,0x4200,0x4200,0x0200,0x1c00,0x0200,0x0200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0417 0x0000,0x0000,0x4200,0x4200,0x4200,0x4600,0x4a00,0x5200,0x6200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u0418 0x2400,0x1800,0x4200,0x4200,0x4200,0x4600,0x4a00,0x5200,0x6200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u0419 0x0000,0x0000,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x0000,0x0000,0x0000,0x0000, // u041a 0x0000,0x0000,0x0e00,0x1200,0x2200,0x2200,0x2200,0x2200,0x2200,0x2200,0x2200,0x4200,0x0000,0x0000,0x0000,0x0000, // u041b 0x0000,0x0000,0x8200,0xc600,0xaa00,0x9200,0x9200,0x8200,0x8200,0x8200,0x8200,0x8200,0x0000,0x0000,0x0000,0x0000, // u041c 0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u041d 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u041e 0x0000,0x0000,0x7e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u041f 0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x7c00,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u0420 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4000,0x4000,0x4000,0x4000,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0421 0x0000,0x0000,0xfe00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u0422 0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x0200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0423 0x0000,0x1000,0x7c00,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x7c00,0x1000,0x0000,0x0000,0x0000, // u0424 0x0000,0x0000,0x4200,0x4200,0x2400,0x2400,0x1800,0x1800,0x2400,0x2400,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u0425 0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3f00,0x0100,0x0100,0x0000,0x0000, // u0426 0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x0200,0x0200,0x0000,0x0000,0x0000,0x0000, // u0427 0x0000,0x0000,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0428 0x0000,0x0000,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x7f00,0x0100,0x0100,0x0000,0x0000, // u0429 0x0000,0x0000,0xc000,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x7c00,0x0000,0x0000,0x0000,0x0000, // u042a 0x0000,0x0000,0x8200,0x8200,0x8200,0xf200,0x8a00,0x8a00,0x8a00,0x8a00,0x8a00,0xf200,0x0000,0x0000,0x0000,0x0000, // u042b 0x0000,0x0000,0x4000,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x7c00,0x0000,0x0000,0x0000,0x0000, // u042c 0x0000,0x0000,0x3c00,0x4200,0x0200,0x0200,0x1e00,0x0200,0x0200,0x0200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u042d 0x0000,0x0000,0x8c00,0x9200,0x9200,0x9200,0x9200,0xf200,0x9200,0x9200,0x9200,0x8c00,0x0000,0x0000,0x0000,0x0000, // u042e 0x0000,0x0000,0x3e00,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0a00,0x1200,0x2200,0x4200,0x0000,0x0000,0x0000,0x0000, // u042f 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u0430 0x0000,0x0000,0x3c00,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0431 0x0000,0x0000,0x3800,0x4400,0x4400,0x4800,0x7c00,0x4200,0x4200,0x4200,0x4200,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0432 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u0433 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x3c00,0x0000, // u0434 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0435 0x0000,0x0000,0x0000,0x0000,0x0000,0x9200,0x9200,0x5400,0x3800,0x5400,0x9200,0x9200,0x0000,0x0000,0x0000,0x0000, // u0436 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x0200,0x1c00,0x0200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0437 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u0438 0x0000,0x0000,0x2400,0x1800,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u0439 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x0000,0x0000,0x0000,0x0000, // u043a 0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2200,0x2200,0x2200,0x2200,0x2200,0x4200,0x0000,0x0000,0x0000,0x0000, // u043b 0x0000,0x0000,0x0000,0x0000,0x0000,0x8200,0xc600,0xaa00,0x9200,0x8200,0x8200,0x8200,0x0000,0x0000,0x0000,0x0000, // u043c 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u043d 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u043e 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u043f 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x7c00,0x4000,0x4000,0x4000,0x0000, // u0440 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4000,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0441 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u0442 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x3c00,0x0000, // u0443 0x0000,0x0000,0x0000,0x0000,0x1000,0x7c00,0x9200,0x9200,0x9200,0x9200,0x9200,0x7c00,0x1000,0x0000,0x0000,0x0000, // u0444 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x2400,0x1800,0x2400,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u0445 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3f00,0x0100,0x0100,0x0000,0x0000, // u0446 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x0200,0x0000,0x0000,0x0000,0x0000, // u0447 0x0000,0x0000,0x0000,0x0000,0x0000,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0448 0x0000,0x0000,0x0000,0x0000,0x0000,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x7f00,0x0100,0x0100,0x0000,0x0000, // u0449 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x2000,0x3c00,0x2200,0x2200,0x2200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u044a 0x0000,0x0000,0x0000,0x0000,0x0000,0x8200,0x8200,0xf200,0x8a00,0x8a00,0x8a00,0xf200,0x0000,0x0000,0x0000,0x0000, // u044b 0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x7800,0x4400,0x4400,0x4400,0x7800,0x0000,0x0000,0x0000,0x0000, // u044c 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x0200,0x1e00,0x0200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u044d 0x0000,0x0000,0x0000,0x0000,0x0000,0x8c00,0x9200,0x9200,0xf200,0x9200,0x9200,0x8c00,0x0000,0x0000,0x0000,0x0000, // u044e 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4200,0x4200,0x3e00,0x1200,0x2200,0x4200,0x0000,0x0000,0x0000,0x0000, // u044f 0x0000,0x0000,0x1000,0x0800,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0450 0x0000,0x0000,0x2400,0x2400,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0451 0x0000,0x0000,0x4000,0xf000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0200,0x0200,0x0c00,0x0000, // u0452 0x0000,0x0000,0x0800,0x1000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u0453 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4000,0x7800,0x4000,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0454 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4000,0x4000,0x3c00,0x0200,0x0200,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0455 0x0000,0x0000,0x1000,0x1000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u0456 0x0000,0x0000,0x4800,0x4800,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u0457 0x0000,0x0000,0x0400,0x0400,0x0000,0x0c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x4400,0x4400,0x3800,0x0000, // u0458 0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x9000,0x9c00,0x9200,0x9200,0x9200,0x9c00,0x0000,0x0000,0x0000,0x0000, // u0459 0x0000,0x0000,0x0000,0x0000,0x0000,0x9000,0x9000,0x9c00,0xf200,0x9200,0x9200,0x9c00,0x0000,0x0000,0x0000,0x0000, // u045a 0x0000,0x0000,0x4000,0xf000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u045b 0x0000,0x0000,0x0800,0x1000,0x0000,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x0000,0x0000,0x0000,0x0000, // u045c 0x0000,0x0000,0x1000,0x0800,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u045d 0x0000,0x0000,0x2400,0x1800,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x3c00,0x0000, // u045e 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x7e00,0x1800,0x1800,0x0000,0x0000, // u045f 0x0000,0x0000,0x4000,0xf000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0462 0x0000,0x0000,0x2000,0x2000,0x7800,0x2000,0x2000,0x3c00,0x2200,0x2200,0x2200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0463 0x0000,0x0000,0xfe00,0x8200,0x4400,0x2800,0x3800,0x5400,0x9200,0x9200,0x9200,0x9200,0x0000,0x0000,0x0000,0x0000, // u046a 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x4400,0x2800,0x3800,0x5400,0x9200,0x9200,0x0000,0x0000,0x0000,0x0000, // u046b 0x0200,0x0200,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u0490 0x0000,0x0000,0x0000,0x0200,0x0200,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u0491 0x0000,0x0000,0x7e00,0x4000,0x4000,0x4000,0xf800,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u0492 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4000,0x4000,0xf800,0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u0493 0x0000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x0200,0x0400,0x0000,0x0000, // u0494 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4000,0x4000,0x7800,0x4400,0x4400,0x4400,0x0400,0x0800,0x0000,0x0000, // u0495 0x0000,0x0000,0x9200,0x9200,0x9200,0x5400,0x3800,0x5400,0x9200,0x9200,0x9200,0x9300,0x0100,0x0100,0x0000,0x0000, // u0496 0x0000,0x0000,0x0000,0x0000,0x0000,0x9200,0x9200,0x5400,0x3800,0x5400,0x9200,0x9300,0x0100,0x0100,0x0000,0x0000, // u0497 0x0000,0x0000,0x3c00,0x4200,0x4200,0x0200,0x1c00,0x0200,0x0200,0x4200,0x4200,0x3c00,0x1000,0x1000,0x1000,0x0000, // u0498 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x0200,0x1c00,0x0200,0x4200,0x3c00,0x1000,0x1000,0x1000,0x0000, // u0499 0x0000,0x0000,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4300,0x0100,0x0100,0x0000,0x0000, // u049a 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4300,0x0100,0x0100,0x0000,0x0000, // u049b 0x0000,0x0000,0x4200,0x4200,0x5400,0x5800,0x7000,0x7000,0x5800,0x5400,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u049c 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x5400,0x5800,0x7000,0x5800,0x5400,0x4200,0x0000,0x0000,0x0000,0x0000, // u049d 0x0000,0x0000,0xc200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x0000,0x0000,0x0000,0x0000, // u04a0 0x0000,0x0000,0x0000,0x0000,0x0000,0xc200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x0000,0x0000,0x0000,0x0000, // u04a1 0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x4300,0x0100,0x0100,0x0000,0x0000, // u04a2 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4300,0x0100,0x0100,0x0000,0x0000, // u04a3 0x0000,0x0000,0x4700,0x4400,0x4400,0x4400,0x7c00,0x4400,0x4400,0x4400,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000, // u04a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x4700,0x4400,0x4400,0x7c00,0x4400,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000, // u04a5 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4000,0x4000,0x4000,0x4000,0x4200,0x4200,0x3c00,0x1000,0x1000,0x1000,0x0000, // u04aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4000,0x4000,0x4000,0x4200,0x3c00,0x1000,0x1000,0x1000,0x0000, // u04ab 0x0000,0x0000,0x8200,0x8200,0x4400,0x4400,0x2800,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u04ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x8200,0x8200,0x4400,0x4400,0x2800,0x2800,0x1000,0x1000,0x1000,0x1000,0x0000, // u04af 0x0000,0x0000,0x8200,0x8200,0x4400,0x4400,0x2800,0x1000,0x7c00,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u04b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x8200,0x8200,0x4400,0x4400,0x2800,0x2800,0x1000,0x7c00,0x1000,0x1000,0x0000, // u04b1 0x0000,0x0000,0x4200,0x4200,0x2400,0x2400,0x1800,0x1800,0x2400,0x2400,0x4200,0x4300,0x0100,0x0100,0x0000,0x0000, // u04b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x2400,0x1800,0x2400,0x4200,0x4300,0x0100,0x0100,0x0000,0x0000, // u04b3 0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x0200,0x0300,0x0100,0x0100,0x0000,0x0000, // u04b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x0300,0x0100,0x0100,0x0000,0x0000, // u04b7 0x0000,0x0000,0x4200,0x4200,0x4200,0x4a00,0x4a00,0x3e00,0x0a00,0x0a00,0x0200,0x0200,0x0000,0x0000,0x0000,0x0000, // u04b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4a00,0x4a00,0x3e00,0x0a00,0x0200,0x0200,0x0000,0x0000,0x0000,0x0000, // u04b9 0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u04ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u04bb 0x0000,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u04c0 0x2400,0x1800,0x0000,0x9200,0x9200,0x9200,0x5400,0x3800,0x5400,0x9200,0x9200,0x9200,0x0000,0x0000,0x0000,0x0000, // u04c1 0x0000,0x0000,0x2400,0x1800,0x0000,0x9200,0x9200,0x5400,0x3800,0x5400,0x9200,0x9200,0x0000,0x0000,0x0000,0x0000, // u04c2 0x0000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u04cf 0x2400,0x1800,0x0000,0x3c00,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u04d0 0x0000,0x0000,0x2400,0x1800,0x0000,0x3c00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u04d1 0x2400,0x2400,0x0000,0x3c00,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u04d2 0x0000,0x0000,0x2400,0x2400,0x0000,0x3c00,0x0200,0x3e00,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u04d3 0x0000,0x0000,0x7e00,0x9000,0x9000,0x9000,0xfc00,0x9000,0x9000,0x9000,0x9000,0x9e00,0x0000,0x0000,0x0000,0x0000, // u04d4 0x0000,0x0000,0x0000,0x0000,0x0000,0x6c00,0x1200,0x7200,0x9e00,0x9000,0x9000,0x6c00,0x0000,0x0000,0x0000,0x0000, // u04d5 0x2400,0x1800,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u04d6 0x0000,0x0000,0x2400,0x1800,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x0000,0x0000,0x0000, // u04d7 0x0000,0x0000,0x3c00,0x4200,0x0200,0x0200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u04d8 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x0200,0x0200,0x7e00,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u04d9 0x2400,0x2400,0x0000,0x3c00,0x4200,0x0200,0x0200,0x7e00,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u04da 0x0000,0x0000,0x2400,0x2400,0x0000,0x3c00,0x0200,0x0200,0x7e00,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u04db 0x4400,0x4400,0x0000,0x9200,0x9200,0x9200,0x5400,0x3800,0x5400,0x9200,0x9200,0x9200,0x0000,0x0000,0x0000,0x0000, // u04dc 0x0000,0x0000,0x4400,0x4400,0x0000,0x9200,0x9200,0x5400,0x3800,0x5400,0x9200,0x9200,0x0000,0x0000,0x0000,0x0000, // u04dd 0x2400,0x2400,0x0000,0x3c00,0x4200,0x4200,0x0200,0x1c00,0x0200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u04de 0x0000,0x0000,0x2400,0x2400,0x0000,0x3c00,0x4200,0x0200,0x1c00,0x0200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u04df 0x3c00,0x0000,0x4200,0x4200,0x4200,0x4600,0x4a00,0x5200,0x6200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u04e2 0x0000,0x0000,0x0000,0x3c00,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u04e3 0x2400,0x2400,0x0000,0x4200,0x4200,0x4200,0x4600,0x4a00,0x5200,0x6200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u04e4 0x0000,0x0000,0x2400,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0000,0x0000,0x0000, // u04e5 0x2400,0x2400,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u04e6 0x0000,0x0000,0x2400,0x2400,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u04e7 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u04e8 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u04e9 0x2400,0x2400,0x0000,0x3c00,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u04ea 0x0000,0x0000,0x2400,0x2400,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u04eb 0x2400,0x2400,0x0000,0x3c00,0x4200,0x0200,0x0200,0x1e00,0x0200,0x0200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u04ec 0x0000,0x0000,0x2400,0x2400,0x0000,0x3c00,0x4200,0x0200,0x1e00,0x0200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u04ed 0x3c00,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x0200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u04ee 0x0000,0x0000,0x0000,0x3c00,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x3c00,0x0000, // u04ef 0x2400,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x0200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u04f0 0x0000,0x0000,0x2400,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x3c00,0x0000, // u04f1 0x1200,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x0200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u04f2 0x0000,0x0000,0x1200,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x3c00,0x0000, // u04f3 0x2400,0x2400,0x0000,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x0200,0x0200,0x0000,0x0000,0x0000,0x0000, // u04f4 0x0000,0x0000,0x2400,0x2400,0x0000,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x0200,0x0000,0x0000,0x0000,0x0000, // u04f5 0x4800,0x4800,0x0000,0x8200,0x8200,0x8200,0xf200,0x8a00,0x8a00,0x8a00,0x8a00,0xf200,0x0000,0x0000,0x0000,0x0000, // u04f8 0x0000,0x0000,0x4800,0x4800,0x0000,0x8200,0x8200,0xf200,0x8a00,0x8a00,0x8a00,0xf200,0x0000,0x0000,0x0000,0x0000, // u04f9 0x0000,0x0000,0x4200,0x4200,0x2200,0x2200,0x1400,0x2800,0x4400,0x4400,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u05d0 0x0000,0x0000,0x7c00,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x7f00,0x0000,0x0000,0x0000,0x0000, // u05d1 0x0000,0x0000,0x7000,0x0800,0x0800,0x0800,0x0800,0x0800,0x1400,0x2400,0x4200,0x8200,0x0000,0x0000,0x0000,0x0000, // u05d2 0x0000,0x0000,0x7f00,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0000,0x0000,0x0000,0x0000, // u05d3 0x0000,0x0000,0x7c00,0x0200,0x0200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u05d4 0x0000,0x0000,0x3000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000, // u05d5 0x0000,0x0000,0x7c00,0x0800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u05d6 0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u05d7 0x0000,0x0000,0x4c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u05d8 0x0000,0x0000,0x3000,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d9 0x0000,0x0000,0x7c00,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0000, // u05da 0x0000,0x0000,0x7c00,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x7c00,0x0000,0x0000,0x0000,0x0000, // u05db 0x4000,0x4000,0x7e00,0x0200,0x0200,0x0200,0x0200,0x0400,0x0800,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u05dc 0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x7e00,0x0000,0x0000,0x0000,0x0000, // u05dd 0x0000,0x0000,0xdc00,0x6200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4e00,0x0000,0x0000,0x0000,0x0000, // u05de 0x0000,0x0000,0x7000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000, // u05df 0x0000,0x0000,0x3800,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x3c00,0x0000,0x0000,0x0000,0x0000, // u05e0 0x0000,0x0000,0xfc00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u05e1 0x0000,0x0000,0x4200,0x4200,0x4200,0x2200,0x2200,0x2200,0x1400,0x1400,0x1800,0x6000,0x0000,0x0000,0x0000,0x0000, // u05e2 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x3200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0000, // u05e3 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x3200,0x0200,0x0200,0x0200,0x0200,0x7c00,0x0000,0x0000,0x0000,0x0000, // u05e4 0x0000,0x0000,0x4200,0x4200,0x2200,0x2400,0x1800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000, // u05e5 0x0000,0x0000,0x4200,0x4200,0x2200,0x2400,0x1800,0x1000,0x0800,0x0800,0x0400,0x7c00,0x0000,0x0000,0x0000,0x0000, // u05e6 0x0000,0x0000,0x7e00,0x0200,0x0200,0x4200,0x4200,0x4400,0x4800,0x4800,0x4800,0x4800,0x4000,0x4000,0x4000,0x0000, // u05e7 0x0000,0x0000,0x7c00,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0000,0x0000,0x0000,0x0000, // u05e8 0x0000,0x0000,0x9200,0x9200,0x9200,0x9200,0x9200,0xa200,0xc200,0x8200,0x8400,0xf800,0x0000,0x0000,0x0000,0x0000, // u05e9 0x0000,0x0000,0xfc00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x8200,0x0000,0x0000,0x0000,0x0000, // u05ea 0x0000,0x0000,0x7800,0x4400,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4400,0x7800,0x0000,0x1000,0x1000,0x0000, // u1e0c 0x0000,0x0000,0x0200,0x0200,0x0200,0x3e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0800,0x0800,0x0000, // u1e0d 0x0000,0x0000,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x0000,0x3c00,0x0000,0x0000, // u1e34 0x0000,0x0000,0x4000,0x4000,0x4000,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x0000,0x3c00,0x0000,0x0000, // u1e35 0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x0000,0x1000,0x1000,0x0000, // u1e36 0x0000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x1000,0x1000,0x0000, // u1e37 0x1000,0x1000,0x8200,0xc600,0xaa00,0x9200,0x9200,0x8200,0x8200,0x8200,0x8200,0x8200,0x0000,0x0000,0x0000,0x0000, // u1e40 0x0000,0x0000,0x1000,0x1000,0x0000,0xfc00,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x0000,0x0000,0x0000,0x0000, // u1e41 0x0000,0x0000,0x8200,0xc600,0xaa00,0x9200,0x9200,0x8200,0x8200,0x8200,0x8200,0x8200,0x0000,0x1000,0x1000,0x0000, // u1e42 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0x9200,0x9200,0x9200,0x9200,0x9200,0x9200,0x0000,0x1000,0x1000,0x0000, // u1e43 0x1000,0x1000,0x4200,0x4200,0x4200,0x6200,0x5200,0x4a00,0x4600,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u1e44 0x0000,0x0000,0x1000,0x1000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u1e45 0x0000,0x0000,0x4200,0x4200,0x4200,0x6200,0x5200,0x4a00,0x4600,0x4200,0x4200,0x4200,0x0000,0x1000,0x1000,0x0000, // u1e46 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x1000,0x1000,0x0000, // u1e47 0x0000,0x0000,0xfe00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x1000,0x1000,0x0000, // u1e6c 0x0000,0x0000,0x1000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x1000,0x1000,0x1000,0x0e00,0x0000,0x0400,0x0400,0x0000, // u1e6d 0x0000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x4000,0x7e00,0x0000,0x1000,0x1000,0x0000, // u1eb8 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x1000,0x1000,0x0000, // u1eb9 0x3200,0x4c00,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7800,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u1ebc 0x0000,0x0000,0x3200,0x4c00,0x0000,0x3c00,0x4200,0x4200,0x7e00,0x4000,0x4000,0x3c00,0x0000,0x0000,0x0000,0x0000, // u1ebd 0x0000,0x0000,0x3800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x1000,0x1000,0x0000, // u1eca 0x0000,0x0000,0x1000,0x1000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x1000,0x1000,0x0000, // u1ecb 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x1000,0x1000,0x0000, // u1ecc 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x1000,0x1000,0x0000, // u1ecd 0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x1000,0x1000,0x0000, // u1ee4 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0000,0x0800,0x0800,0x0000, // u1ee5 0x6400,0x9800,0x0000,0x8200,0x8200,0x4400,0x4400,0x2800,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u1ef8 0x0000,0x0000,0x3200,0x4c00,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3e00,0x0200,0x0200,0x3c00,0x0000, // u1ef9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2001 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2002 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2003 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2004 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2005 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2006 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2007 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2008 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2009 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2010 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2011 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2012 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2013 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2014 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2015 0x0000,0x0000,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x0000,0x0000,0x0000,0x0000, // u2016 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0000,0x7e00, // u2017 0x0000,0x0800,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2018 0x0000,0x0800,0x0800,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2019 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x1000,0x0000,0x0000,0x0000, // u201a 0x0000,0x1000,0x1000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201b 0x0000,0x1200,0x2400,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201c 0x0000,0x1200,0x1200,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2400,0x2400,0x4800,0x0000,0x0000,0x0000, // u201e 0x0000,0x4800,0x4800,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201f 0x0000,0x0000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u2020 0x0000,0x0000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u2021 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x3c00,0x3c00,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2022 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9200,0x9200,0x0000,0x0000,0x0000,0x0000, // u2026 0x0000,0x0000,0x4800,0xa800,0x5000,0x1000,0x2000,0x2000,0x4000,0x5400,0xaa00,0x9400,0x0000,0x0000,0x0000,0x0000, // u2030 0x0000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2032 0x0000,0x2400,0x2400,0x2400,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2033 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0800,0x1000,0x2000,0x1000,0x0800,0x0400,0x0000,0x0000,0x0000,0x0000, // u2039 0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x1000,0x0800,0x0400,0x0800,0x1000,0x2000,0x0000,0x0000,0x0000,0x0000, // u203a 0x0000,0x0000,0x2400,0x2400,0x2400,0x2400,0x2400,0x2400,0x2400,0x0000,0x2400,0x2400,0x0000,0x0000,0x0000,0x0000, // u203c 0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u203e 0x0000,0x1800,0x2400,0x2400,0x2400,0x2400,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2070 0x1000,0x0000,0x3000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2071 0x0000,0x0400,0x0c00,0x1400,0x3e00,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2074 0x0000,0x3800,0x2000,0x3800,0x0400,0x0400,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2075 0x0000,0x1800,0x2000,0x3800,0x2400,0x2400,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2076 0x0000,0x3c00,0x0400,0x0800,0x0800,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2077 0x0000,0x1800,0x2400,0x1800,0x2400,0x2400,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2078 0x0000,0x1800,0x2400,0x2400,0x1c00,0x0400,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2079 0x0000,0x0000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207a 0x0000,0x0000,0x0000,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207b 0x0000,0x0000,0x0000,0x7c00,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207c 0x0000,0x0800,0x1000,0x1000,0x1000,0x1000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207d 0x0000,0x1000,0x0800,0x0800,0x0800,0x0800,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207e 0x0000,0x0000,0x3800,0x2400,0x2400,0x2400,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x2400,0x2400,0x2400,0x2400,0x1800,0x0000,0x0000,0x0000, // u2080 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x3000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000, // u2081 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x2400,0x0400,0x0800,0x1000,0x3c00,0x0000,0x0000,0x0000, // u2082 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x0400,0x1800,0x0400,0x0400,0x3800,0x0000,0x0000,0x0000, // u2083 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0c00,0x1400,0x3e00,0x0400,0x0400,0x0000,0x0000,0x0000, // u2084 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x2000,0x3800,0x0400,0x0400,0x3800,0x0000,0x0000,0x0000, // u2085 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x2000,0x3800,0x2400,0x2400,0x1800,0x0000,0x0000,0x0000, // u2086 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x0400,0x0800,0x0800,0x1000,0x1000,0x0000,0x0000,0x0000, // u2087 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x2400,0x1800,0x2400,0x2400,0x1800,0x0000,0x0000,0x0000, // u2088 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x2400,0x2400,0x1c00,0x0400,0x1800,0x0000,0x0000,0x0000, // u2089 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x0000,0x0000,0x0000, // u208a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u208b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000, // u208c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1000,0x1000,0x1000,0x1000,0x0800,0x0000,0x0000,0x0000, // u208d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x0800,0x0800,0x0800,0x0800,0x1000,0x0000,0x0000,0x0000, // u208e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x0400,0x1c00,0x2400,0x1c00,0x0000,0x0000,0x0000, // u2090 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x2400,0x3c00,0x2000,0x1c00,0x0000,0x0000,0x0000, // u2091 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x2400,0x2400,0x2400,0x1800,0x0000,0x0000,0x0000, // u2092 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x2800,0x1000,0x2800,0x4400,0x0000,0x0000,0x0000, // u2093 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x0400,0x3c00,0x2400,0x1800,0x0000,0x0000,0x0000, // u2094 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x3800,0x2400,0x2400,0x2400,0x2400,0x0000,0x0000,0x0000, // u2095 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2400,0x2800,0x3000,0x2800,0x2400,0x0000,0x0000,0x0000, // u2096 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x1000,0x1000,0x1000,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000, // u2097 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7800,0x5400,0x5400,0x5400,0x5400,0x0000,0x0000,0x0000, // u2098 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x2400,0x2400,0x2400,0x3800,0x2000,0x2000,0x0000, // u209a 0x0000,0x0000,0xf000,0x8800,0x8800,0x8800,0xf400,0x8400,0x8e00,0x8400,0x8400,0x8200,0x0000,0x0000,0x0000,0x0000, // u20a7 0x0000,0x0000,0xf200,0x8a00,0x8a00,0xaa00,0xaa00,0xaa00,0xaa00,0xa200,0xa200,0xbc00,0x0000,0x0000,0x0000,0x0000, // u20aa 0x0000,0x0000,0x0000,0x1c00,0x2200,0x4000,0xf800,0x4000,0xf800,0x4000,0x2200,0x1c00,0x0000,0x0000,0x0000,0x0000, // u20ac 0x0000,0x0000,0xfe00,0x1000,0x1000,0x1c00,0x7000,0x1c00,0x7000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u20ae 0x0000,0x0000,0x3c00,0x5200,0x5200,0x5000,0x5000,0x5000,0x5000,0x5200,0x5200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u2102 0x0000,0x0000,0x4000,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u210e 0x0000,0x0000,0x4000,0xf000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u210f 0x0000,0x0000,0x4200,0x4200,0x6200,0x5200,0x6a00,0x5600,0x4a00,0x4600,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u2115 0x0000,0x0000,0x9600,0x9600,0x9600,0xd000,0xf000,0xf000,0xb000,0x9600,0x9000,0x9600,0x0000,0x0000,0x0000,0x0000, // u2116 0x0000,0x0000,0x3c00,0x5200,0x5200,0x5200,0x5200,0x5200,0x5200,0x5200,0x5a00,0x3c00,0x0600,0x0000,0x0000,0x0000, // u211a 0x0000,0x0000,0xf800,0xa400,0xa400,0xa400,0xa400,0xb800,0xa800,0xb400,0xaa00,0xe600,0x0000,0x0000,0x0000,0x0000, // u211d 0x0000,0x0000,0xfb00,0x5500,0x5500,0x5100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2122 0x0000,0x0000,0x7e00,0x0200,0x0600,0x0a00,0x1400,0x2800,0x5000,0x6000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u2124 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x2400,0x2400,0x6600,0x0000,0x0000,0x0000,0x0000, // u2126 0x0000,0x0000,0x4400,0x4400,0x2200,0x2200,0x3400,0x5800,0x8800,0x8800,0x8400,0x4400,0x0000,0x0000,0x0000,0x0000, // u2135 0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x4000,0xfe00,0x4000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2190 0x0000,0x0000,0x1000,0x3800,0x5400,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u2191 0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0400,0xfe00,0x0400,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2192 0x0000,0x0000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x5400,0x3800,0x1000,0x0000,0x0000,0x0000,0x0000, // u2193 0x0000,0x0000,0x0000,0x0000,0x0000,0x2400,0x4200,0xff00,0x4200,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2194 0x0000,0x0000,0x1000,0x3800,0x5400,0x1000,0x1000,0x1000,0x1000,0x5400,0x3800,0x1000,0x0000,0x0000,0x0000,0x0000, // u2195 0x0000,0x0000,0x0000,0x0000,0x0000,0x2200,0x4200,0xfe00,0x4200,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x8800,0x8400,0xfe00,0x8400,0x8800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a6 0x0000,0x0000,0x1000,0x3800,0x5400,0x1000,0x1000,0x1000,0x5400,0x3800,0x1000,0x7c00,0x0000,0x0000,0x0000,0x0000, // u21a8 0x0000,0x0000,0x0200,0x0200,0x0200,0x0200,0x0200,0x2200,0x4200,0xfe00,0x4000,0x2000,0x0000,0x0000,0x0000,0x0000, // u21b5 0x0000,0x0000,0x0000,0xf000,0x3000,0x5000,0x9200,0x8200,0x8200,0x4400,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000, // u21bb 0x0000,0x0000,0x0000,0x0000,0x2000,0x4000,0xfe00,0x0000,0xfe00,0x0400,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000, // u21cb 0x0000,0x0000,0x0000,0x0000,0x0800,0x0400,0xfe00,0x0000,0xfe00,0x4000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21cc 0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x7e00,0xc000,0x7e00,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d0 0x0000,0x0000,0x1000,0x3800,0x6c00,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x0000,0x0000,0x0000,0x0000, // u21d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0xfc00,0x0600,0xfc00,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d2 0x0000,0x0000,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x6c00,0x3800,0x1000,0x0000,0x0000,0x0000,0x0000, // u21d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x2400,0x7e00,0xc300,0x7e00,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d4 0x0000,0x0000,0x1000,0x3800,0x6c00,0x2800,0x2800,0x2800,0x2800,0x6c00,0x3800,0x1000,0x0000,0x0000,0x0000,0x0000, // u21d5 0x0000,0x0000,0x8200,0x8200,0x8200,0x7c00,0x4400,0x4400,0x2800,0x2800,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u2200 0x0000,0x0000,0x0000,0x7e00,0x0200,0x0200,0x0200,0x7e00,0x0200,0x0200,0x0200,0x7e00,0x0000,0x0000,0x0000,0x0000, // u2203 0x0000,0x0000,0x0400,0x7e00,0x0a00,0x0a00,0x1200,0x7e00,0x1200,0x2200,0x2200,0x7e00,0x4000,0x0000,0x0000,0x0000, // u2204 0x0000,0x0000,0x0200,0x0400,0x7c00,0x8a00,0x9200,0x9200,0xa200,0x7c00,0x4000,0x8000,0x0000,0x0000,0x0000,0x0000, // u2205 0x0000,0x0000,0x1000,0x1000,0x2800,0x2800,0x4400,0x4400,0x4400,0x8200,0x8200,0xfe00,0x0000,0x0000,0x0000,0x0000, // u2206 0x0000,0x0000,0xfe00,0x8200,0x8200,0x4400,0x4400,0x4400,0x2800,0x2800,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u2207 0x0000,0x0000,0x0000,0x1e00,0x2000,0x4000,0x4000,0x7e00,0x4000,0x4000,0x2000,0x1e00,0x0000,0x0000,0x0000,0x0000, // u2208 0x0000,0x0000,0x0200,0x1e00,0x2400,0x4400,0x4800,0x7e00,0x4800,0x5000,0x3000,0x3e00,0x2000,0x0000,0x0000,0x0000, // u2209 0x0000,0x0000,0x0000,0x0000,0x1e00,0x2000,0x4000,0x7e00,0x4000,0x2000,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u220a 0x0000,0x0000,0x0000,0x7800,0x0400,0x0200,0x0200,0x7e00,0x0200,0x0200,0x0400,0x7800,0x0000,0x0000,0x0000,0x0000, // u220b 0x0000,0x0000,0x4000,0x7800,0x2400,0x2200,0x1200,0x7e00,0x1200,0x0a00,0x0c00,0x7c00,0x0400,0x0000,0x0000,0x0000, // u220c 0x0000,0x0000,0x0000,0x0000,0x7800,0x0400,0x0200,0x7e00,0x0200,0x0400,0x7800,0x0000,0x0000,0x0000,0x0000,0x0000, // u220d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2212 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u2213 0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x0000,0x1000,0x1000,0x7c00,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u2214 0x0000,0x0000,0x0000,0x0000,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2215 0x0000,0x0000,0x0000,0x0000,0x8000,0x4000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000, // u2216 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2219 0x0000,0x0600,0x0400,0x0400,0x0400,0x0400,0x4400,0x4400,0x4400,0x2400,0x1400,0x0c00,0x0000,0x0000,0x0000,0x0000, // u221a 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x9200,0x9200,0x9200,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u221e 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u221f 0x0000,0x0000,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x0000,0x0000,0x0000,0x0000, // u2225 0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x2800,0x2800,0x4400,0x4400,0x8200,0x8200,0x0000,0x0000,0x0000,0x0000, // u2227 0x0000,0x0000,0x0000,0x0000,0x8200,0x8200,0x4400,0x4400,0x2800,0x2800,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u2228 0x0000,0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u2229 0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u222a 0x0000,0x0000,0x0000,0x0000,0x0000,0x3200,0x4c00,0x0000,0x3200,0x4c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2248 0x0000,0x0000,0x0000,0x0000,0x0200,0x7e00,0x0800,0x1000,0x7e00,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2260 0x0000,0x0000,0x0000,0x0000,0x7e00,0x0000,0x0000,0x7e00,0x0000,0x0000,0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2261 0x0000,0x0000,0x0000,0x0400,0x0800,0x1000,0x2000,0x1000,0x0800,0x0400,0x0000,0x3e00,0x0000,0x0000,0x0000,0x0000, // u2264 0x0000,0x0000,0x0000,0x2000,0x1000,0x0800,0x0400,0x0800,0x1000,0x2000,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000, // u2265 0x0000,0x0000,0x0000,0x0900,0x1200,0x2400,0x4800,0x9000,0x4800,0x2400,0x1200,0x0900,0x0000,0x0000,0x0000,0x0000, // u226a 0x0000,0x0000,0x0000,0x9000,0x4800,0x2400,0x1200,0x0900,0x1200,0x2400,0x4800,0x9000,0x0000,0x0000,0x0000,0x0000, // u226b 0x0000,0x0000,0x0000,0x0000,0x3e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2282 0x0000,0x0000,0x0000,0x0000,0x7c00,0x0200,0x0200,0x0200,0x0200,0x0200,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2283 0x0000,0x0000,0x0000,0x3e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x3e00,0x0000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u2286 0x0000,0x0000,0x0000,0x7c00,0x0200,0x0200,0x0200,0x0200,0x0200,0x7c00,0x0000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u2287 0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u22a5 0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u22c2 0x0000,0x0000,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u22c3 0x0000,0x0000,0x0200,0x0400,0x7c00,0x8a00,0x9200,0x9200,0xa200,0x7c00,0x4000,0x8000,0x0000,0x0000,0x0000,0x0000, // u2300 0x0000,0x0000,0x0000,0x0000,0x1000,0x2800,0x4400,0x8200,0x8200,0x8200,0x8200,0xfe00,0x0000,0x0000,0x0000,0x0000, // u2302 0x0000,0x0000,0x3800,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000, // u2308 0x0000,0x0000,0x3800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000, // u2309 0x0000,0x0000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x3800,0x0000,0x0000,0x0000,0x0000, // u230a 0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x3800,0x0000,0x0000,0x0000,0x0000, // u230b 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2310 0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2319 0x0000,0x0000,0x0c00,0x1200,0x1200,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2320 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x9000,0x9000,0x6000,0x0000,0x0000,0x0000,0x0000, // u2321 0x0400,0x0800,0x1000,0x1000,0x2000,0x2000,0x2000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, // u239b 0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, // u239c 0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x2000,0x2000,0x2000,0x1000,0x1000,0x0800,0x0400, // u239d 0x4000,0x2000,0x1000,0x1000,0x0800,0x0800,0x0800,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u239e 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u239f 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0800,0x0800,0x0800,0x1000,0x1000,0x2000,0x4000, // u23a0 0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, // u23a1 0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, // u23a2 0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7c00, // u23a3 0x7c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u23a4 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u23a5 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x7c00, // u23a6 0x0e00,0x1000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u23a7 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0xc000,0xc000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u23a8 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x1000,0x0e00, // u23a9 0xe000,0x1000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, // u23ab 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0600,0x0600,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, // u23ac 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1000,0xe000, // u23ad 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u23ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23af 0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23ba 0x0000,0x0000,0x0000,0x0000,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x0000,0x0000,0x0000,0x0000, // u23bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00, // u23bd 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u23d0 0x0000,0x8800,0x8800,0xf800,0x8800,0x8800,0x8800,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0000,0x0000, // u2409 0x0000,0x8000,0x8000,0x8000,0x8000,0x8000,0xf800,0x0000,0x1f00,0x1000,0x1c00,0x1000,0x1000,0x1000,0x0000,0x0000, // u240a 0x0000,0x8800,0x8800,0x5000,0x5000,0x2000,0x2000,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0000,0x0000, // u240b 0x0000,0xf800,0x8000,0xe000,0x8000,0x8000,0x8000,0x0000,0x1f00,0x1000,0x1c00,0x1000,0x1000,0x1000,0x0000,0x0000, // u240c 0x0000,0x7000,0x8800,0x8000,0x8000,0x8800,0x7000,0x0000,0x1e00,0x1100,0x1100,0x1e00,0x1200,0x1100,0x0000,0x0000, // u240d 0x0000,0x8800,0xc800,0xa800,0x9800,0x8800,0x8800,0x0000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1f00,0x0000,0x0000, // u2424 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2500 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2501 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2502 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2503 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xaa00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2508 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xaa00,0xaa00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2509 0x1000,0x1000,0x1000,0x0000,0x1000,0x1000,0x1000,0x0000,0x1000,0x1000,0x1000,0x0000,0x1000,0x1000,0x1000,0x0000, // u250a 0x1800,0x1800,0x1800,0x0000,0x1800,0x1800,0x1800,0x0000,0x1800,0x1800,0x1800,0x0000,0x1800,0x1800,0x1800,0x0000, // u250b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u250c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x1f00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u250d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u250e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u250f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2510 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf000,0xf000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2511 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2512 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2513 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2514 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1f00,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2515 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2516 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1f00,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2517 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xf000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2518 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xf000,0xf000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2519 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u251a 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u251b 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1f00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u251c 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1f00,0x1f00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u251d 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1f00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u251e 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u251f 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2520 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1f00,0x1f00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2521 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1f00,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2522 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1f00,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2523 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xf000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2524 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xf000,0xf000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2525 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2526 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2527 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2528 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0xf800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2529 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xf800,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u252a 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u252b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u252c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xf000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u252d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x1f00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u252e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u252f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2530 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2531 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2532 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2533 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2534 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xff00,0xf000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2535 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xff00,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2536 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2537 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2538 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2539 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u253a 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u253b 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xff00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u253c 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xff00,0xf000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u253d 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xff00,0x1f00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u253e 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xff00,0xff00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u253f 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2540 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2541 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2542 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0xf000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2543 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0x1f00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2544 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xff00,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2545 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xff00,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2546 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0xff00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2547 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2548 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2549 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u254a 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u254b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x0000,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2550 0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800, // u2551 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x1000,0x1f00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2552 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800, // u2553 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x2000,0x2f00,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800, // u2554 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf000,0x1000,0xf000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2555 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800, // u2556 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0x0800,0xe800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800, // u2557 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1f00,0x1000,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2558 0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2559 0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2f00,0x2000,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255a 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xf000,0x1000,0xf000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255b 0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255c 0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0xe800,0x0800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255d 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1f00,0x1000,0x1f00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u255e 0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2f00,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800, // u255f 0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2f00,0x2000,0x2f00,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800, // u2560 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xf000,0x1000,0xf000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2561 0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0xe800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800, // u2562 0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0xe800,0x0800,0xe800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800, // u2563 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x0000,0xff00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2564 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800, // u2565 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x0000,0xef00,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800, // u2566 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xff00,0x0000,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2567 0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2568 0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0xef00,0x0000,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2569 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xff00,0x1000,0xff00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u256a 0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0xff00,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800, // u256b 0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0xef00,0x0000,0xef00,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800,0x2800, // u256c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u256d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0x2000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u256e 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x2000,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u256f 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0800,0x0700,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2570 0x0100,0x0100,0x0200,0x0200,0x0400,0x0400,0x0800,0x0800,0x1000,0x1000,0x2000,0x2000,0x4000,0x4000,0x8000,0x8000, // u2571 0x8000,0x8000,0x4000,0x4000,0x2000,0x2000,0x1000,0x1000,0x0800,0x0800,0x0400,0x0400,0x0200,0x0200,0x0100,0x0100, // u2572 0x8100,0x8100,0x4200,0x4200,0x2400,0x2400,0x1800,0x1800,0x1800,0x1800,0x2400,0x2400,0x4200,0x4200,0x8100,0x8100, // u2573 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2574 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2575 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2576 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u2577 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf000,0xf000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2578 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2579 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u257b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257c 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u257d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xf000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257e 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, // u257f 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2580 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00, // u2581 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0xff00, // u2582 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u2583 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u2584 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u2585 0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u2586 0x0000,0x0000,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u2587 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u2588 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, // u2589 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, // u258a 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, // u258b 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, // u258c 0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000, // u258d 0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000, // u258e 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, // u258f 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u2590 0x8800,0x2200,0x8800,0x2200,0x8800,0x2200,0x8800,0x2200,0x8800,0x2200,0x8800,0x2200,0x8800,0x2200,0x8800,0x2200, // u2591 0xaa00,0x5500,0xaa00,0x5500,0xaa00,0x5500,0xaa00,0x5500,0xaa00,0x5500,0xaa00,0x5500,0xaa00,0x5500,0xaa00,0x5500, // u2592 0xee00,0xbb00,0xee00,0xbb00,0xee00,0xbb00,0xee00,0xbb00,0xee00,0xbb00,0xee00,0xbb00,0xee00,0xbb00,0xee00,0xbb00, // u2593 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, // u2596 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u2597 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2598 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u2599 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u259a 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, // u259b 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u259c 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u259d 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, // u259e 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u259f 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x3c00,0x3c00,0x3c00,0x3c00,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u25a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x7e00,0x7e00,0x7e00,0x0000,0x0000,0x0000,0x0000, // u25ac 0x0000,0x0000,0x7e00,0x7e00,0x7e00,0x7e00,0x7e00,0x7e00,0x7e00,0x7e00,0x7e00,0x7e00,0x0000,0x0000,0x0000,0x0000, // u25ae 0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x3800,0x3800,0x7c00,0x7c00,0xfe00,0xfe00,0x0000,0x0000,0x0000,0x0000, // u25b2 0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xfc00,0xf000,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25b6 0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xfc00,0xf000,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ba 0x0000,0x0000,0x0000,0x0000,0xfe00,0xfe00,0x7c00,0x7c00,0x3800,0x3800,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u25bc 0x0000,0x0000,0x0000,0x0000,0x0300,0x0f00,0x3f00,0xff00,0x3f00,0x0f00,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000, // u25c0 0x0000,0x0000,0x0000,0x0000,0x0300,0x0f00,0x3f00,0xff00,0x3f00,0x0f00,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000, // u25c4 0x0000,0x0000,0x0000,0x0000,0x1000,0x3800,0x7c00,0xfe00,0x7c00,0x3800,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25c6 0x0000,0x0000,0x0000,0x0000,0x1000,0x2800,0x4400,0x8200,0x4400,0x2800,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ca 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x2400,0x2400,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25cb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x3c00,0x3c00,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25cf 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xe700,0xc300,0xc300,0xe700,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u25d8 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xe700,0xdb00,0xdb00,0xe700,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u25d9 0x0000,0x0000,0x7c00,0x8200,0xaa00,0x8200,0x8200,0xba00,0x9200,0x8200,0x8200,0x7c00,0x0000,0x0000,0x0000,0x0000, // u263a 0x0000,0x0000,0x7c00,0xfe00,0xd600,0xfe00,0xfe00,0xc600,0xee00,0xfe00,0xfe00,0x7c00,0x0000,0x0000,0x0000,0x0000, // u263b 0x0000,0x0000,0x0000,0x1000,0x9200,0x5400,0x3800,0xee00,0x3800,0x5400,0x9200,0x1000,0x0000,0x0000,0x0000,0x0000, // u263c 0x0000,0x0000,0x3800,0x4400,0x4400,0x4400,0x4400,0x3800,0x1000,0x7c00,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u2640 0x0000,0x0000,0x1e00,0x0600,0x0a00,0x1200,0x3800,0x4400,0x4400,0x4400,0x4400,0x3800,0x0000,0x0000,0x0000,0x0000, // u2642 0x0000,0x0000,0x1000,0x1000,0x3800,0x7c00,0xfe00,0xfe00,0x7c00,0x1000,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u2660 0x0000,0x0000,0x1000,0x3800,0x3800,0x1000,0x5400,0xfe00,0xfe00,0x5400,0x1000,0x3800,0x0000,0x0000,0x0000,0x0000, // u2663 0x0000,0x0000,0x0000,0x0000,0x6c00,0xfe00,0xfe00,0xfe00,0xfe00,0x7c00,0x3800,0x1000,0x0000,0x0000,0x0000,0x0000, // u2665 0x0000,0x0000,0x0000,0x0000,0x1000,0x3800,0x7c00,0xfe00,0x7c00,0x3800,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2666 0x0000,0x0000,0x3e00,0x2200,0x3e00,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0xc000,0x0000,0x0000,0x0000,0x0000, // u266a 0x0000,0x0000,0x7e00,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4400,0x8000,0x0000,0x0000,0x0000, // u266b 0x0000,0x0000,0x0200,0x0200,0x0400,0x0400,0x8800,0x8800,0x5000,0x5000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000, // u2713 0x0000,0x0000,0x0300,0x0300,0x0600,0x0600,0xcc00,0xcc00,0x7800,0x7800,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, // u2714 0x0000,0x0000,0x0400,0x4400,0x2800,0x1800,0x1800,0x1400,0x2200,0x2000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, // u2717 0x0000,0x0000,0x0c00,0xcc00,0x7800,0x3800,0x3800,0x3c00,0x6600,0x6000,0xc000,0xc000,0x0000,0x0000,0x0000,0x0000, // u2718 0x0000,0x0000,0x0800,0x0800,0x1000,0x1000,0x2000,0x2000,0x1000,0x1000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000, // u27e8 0x0000,0x0000,0x2000,0x2000,0x1000,0x1000,0x0800,0x0800,0x1000,0x1000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000, // u27e9 0x0000,0x0000,0x1200,0x1200,0x2400,0x2400,0x4800,0x4800,0x2400,0x2400,0x1200,0x1200,0x0000,0x0000,0x0000,0x0000, // u27ea 0x0000,0x0000,0x4800,0x4800,0x2400,0x2400,0x1200,0x1200,0x2400,0x2400,0x4800,0x4800,0x0000,0x0000,0x0000,0x0000, // u27eb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2800 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2801 0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2802 0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2803 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2804 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2805 0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2806 0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2807 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2808 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2809 0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280a 0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280b 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280c 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280d 0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280e 0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2810 0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2811 0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2812 0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2813 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2814 0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2815 0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2816 0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2817 0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2818 0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2819 0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281a 0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281b 0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281c 0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281d 0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281e 0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2820 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2821 0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2822 0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2823 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2824 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2825 0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2826 0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2827 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2828 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2829 0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u282a 0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u282b 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000, // u282c 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000, // u282d 0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000, // u282e 0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000, // u282f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2830 0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2831 0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2832 0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2833 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2834 0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2835 0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2836 0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2837 0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2838 0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2839 0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u283a 0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u283b 0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000, // u283c 0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000, // u283d 0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000, // u283e 0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000, // u283f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2840 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2841 0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2842 0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2843 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2844 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2845 0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2846 0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2847 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2848 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2849 0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u284a 0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u284b 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000, // u284c 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000, // u284d 0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000, // u284e 0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000, // u284f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2850 0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2851 0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2852 0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2853 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2854 0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2855 0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2856 0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2857 0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2858 0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u2859 0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u285a 0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000, // u285b 0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000, // u285c 0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000, // u285d 0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000, // u285e 0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000, // u285f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000, // u2860 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000, // u2861 0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000, // u2862 0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000, // u2863 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000, // u2864 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000, // u2865 0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000, // u2866 0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000, // u2867 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000, // u2868 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000, // u2869 0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000, // u286a 0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000, // u286b 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000, // u286c 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000, // u286d 0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000, // u286e 0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000, // u286f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000, // u2870 0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000, // u2871 0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000, // u2872 0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000, // u2873 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000, // u2874 0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000, // u2875 0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000, // u2876 0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000, // u2877 0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000, // u2878 0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000, // u2879 0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000, // u287a 0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000, // u287b 0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000, // u287c 0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000, // u287d 0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000, // u287e 0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000, // u287f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2880 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2881 0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2882 0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2883 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2884 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2885 0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2886 0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2887 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2888 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2889 0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u288a 0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u288b 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000, // u288c 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000, // u288d 0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000, // u288e 0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000, // u288f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2890 0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2891 0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2892 0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2893 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2894 0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2895 0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2896 0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2897 0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2898 0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u2899 0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u289a 0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000, // u289b 0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000, // u289c 0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000, // u289d 0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000, // u289e 0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000, // u289f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28a0 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28a1 0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28a2 0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28a4 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28a5 0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28a6 0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28a7 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28a8 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28a9 0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28aa 0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28ab 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28ac 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28ad 0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28ae 0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28af 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28b0 0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28b1 0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28b2 0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28b4 0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28b6 0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28b7 0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28b8 0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28b9 0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28ba 0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28bb 0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28bc 0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28bd 0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28be 0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000, // u28bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28c0 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28c2 0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28c4 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28c6 0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28c7 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28c8 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28c9 0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28ca 0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28cb 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28cc 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28cd 0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28ce 0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28cf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28d0 0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28d2 0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28d4 0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28d6 0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28d7 0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28d8 0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28d9 0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28da 0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28db 0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28dc 0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28dd 0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28de 0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000, // u28df 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28e0 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28e1 0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28e2 0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28e3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28e4 0x0000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28e6 0x0000,0x4000,0x4000,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28e7 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28e8 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28e9 0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28ea 0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28eb 0x0000,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28ec 0x0000,0x4400,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28ed 0x0000,0x0400,0x0400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28ee 0x0000,0x4400,0x4400,0x0000,0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28ef 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28f0 0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28f2 0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28f3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28f4 0x0000,0x4000,0x4000,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28f6 0x0000,0x4000,0x4000,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28f7 0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28f8 0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28f9 0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28fa 0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28fb 0x0000,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28fc 0x0000,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28fd 0x0000,0x0400,0x0400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28fe 0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000,0x0000,0x4400,0x4400,0x0000, // u28ff 0x0000,0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x0000,0x0000,0x0000,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u2e2c 0x8000,0x8000,0x8800,0x9c00,0xaa00,0x8800,0x8800,0x8800,0x1000,0x2000,0x4000,0x8000,0x8000,0x8000,0x8000,0x8000, // ue0a0 0x0000,0x8000,0x8000,0x8000,0x8000,0x8000,0xf800,0x0000,0x1100,0x1900,0x1500,0x1300,0x1100,0x1100,0x0000,0x0000, // ue0a1 0x0000,0x3800,0x4400,0x4400,0x4400,0x4400,0xfe00,0xfe00,0xee00,0xc600,0xee00,0xfe00,0xfe00,0xfe00,0x0000,0x0000, // ue0a2 0x8000,0xc000,0xe000,0xf000,0xf800,0xfc00,0xfe00,0xff00,0xff00,0xfe00,0xfc00,0xf800,0xf000,0xe000,0xc000,0x8000, // ue0b0 0x8000,0x4000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0100,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000, // ue0b1 0x0100,0x0300,0x0700,0x0f00,0x1f00,0x3f00,0x7f00,0xff00,0xff00,0x7f00,0x3f00,0x1f00,0x0f00,0x0700,0x0300,0x0100, // ue0b2 0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000,0x8000,0x4000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0100, // ue0b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x4400,0x4400,0x3800,0x0000, // uf6be 0x0000,0x0000,0x7e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x7e00,0x0000,0x0000,0x0000,0x0000 // ufffd }; // codepoints array constexpr std::array fixedfont_codepoints = { 0x0000,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e, 0x002f,0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e, 0x003f,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e, 0x004f,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e, 0x005f,0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e, 0x006f,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e, 0x00a0,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af, 0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf, 0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf, 0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df, 0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef, 0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff, 0x0100,0x0101,0x0102,0x0103,0x0104,0x0105,0x0106,0x0107,0x0108,0x0109,0x010a,0x010b,0x010c,0x010d,0x010e,0x010f, 0x0110,0x0111,0x0112,0x0113,0x0114,0x0115,0x0116,0x0117,0x0118,0x0119,0x011a,0x011b,0x011c,0x011d,0x011e,0x011f, 0x0120,0x0121,0x0122,0x0123,0x0124,0x0125,0x0126,0x0127,0x0128,0x0129,0x012a,0x012b,0x012c,0x012d,0x012e,0x012f, 0x0130,0x0131,0x0132,0x0133,0x0134,0x0135,0x0136,0x0137,0x0138,0x0139,0x013a,0x013b,0x013c,0x013d,0x013e,0x013f, 0x0140,0x0141,0x0142,0x0143,0x0144,0x0145,0x0146,0x0147,0x0148,0x0149,0x014a,0x014b,0x014c,0x014d,0x014e,0x014f, 0x0150,0x0151,0x0152,0x0153,0x0154,0x0155,0x0156,0x0157,0x0158,0x0159,0x015a,0x015b,0x015c,0x015d,0x015e,0x015f, 0x0160,0x0161,0x0162,0x0163,0x0164,0x0165,0x0166,0x0167,0x0168,0x0169,0x016a,0x016b,0x016c,0x016d,0x016e,0x016f, 0x0170,0x0171,0x0172,0x0173,0x0174,0x0175,0x0176,0x0177,0x0178,0x0179,0x017a,0x017b,0x017c,0x017d,0x017e,0x017f, 0x0186,0x018e,0x018f,0x0190,0x0192,0x019d,0x019e,0x01b5,0x01b6,0x01b7,0x01cd,0x01ce,0x01cf,0x01d0,0x01d1,0x01d2, 0x01d3,0x01d4,0x01e2,0x01e3,0x01e4,0x01e5,0x01e6,0x01e7,0x01e8,0x01e9,0x01ea,0x01eb,0x01ec,0x01ed,0x01ee,0x01ef, 0x01f0,0x01f4,0x01f5,0x01fc,0x01fd,0x01fe,0x01ff,0x0218,0x0219,0x021a,0x021b,0x0232,0x0233,0x0237,0x0254,0x0258, 0x0259,0x025b,0x0272,0x0292,0x02bb,0x02bc,0x02bd,0x02c6,0x02c7,0x02d8,0x02d9,0x02db,0x02dc,0x02dd,0x0300,0x0301, 0x0302,0x0303,0x0304,0x0305,0x0306,0x0307,0x0308,0x030a,0x030b,0x030c,0x0329,0x0384,0x0385,0x0386,0x0387,0x0388, 0x0389,0x038a,0x038c,0x038e,0x038f,0x0390,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039a, 0x039b,0x039c,0x039d,0x039e,0x039f,0x03a0,0x03a1,0x03a3,0x03a4,0x03a5,0x03a6,0x03a7,0x03a8,0x03a9,0x03aa,0x03ab, 0x03ac,0x03ad,0x03ae,0x03af,0x03b0,0x03b1,0x03b2,0x03b3,0x03b4,0x03b5,0x03b6,0x03b7,0x03b8,0x03b9,0x03ba,0x03bb, 0x03bc,0x03bd,0x03be,0x03bf,0x03c0,0x03c1,0x03c2,0x03c3,0x03c4,0x03c5,0x03c6,0x03c7,0x03c8,0x03c9,0x03ca,0x03cb, 0x03cc,0x03cd,0x03ce,0x03d1,0x03d5,0x03f0,0x03f1,0x03f2,0x03f3,0x03f4,0x03f5,0x03f6,0x0400,0x0401,0x0402,0x0403, 0x0404,0x0405,0x0406,0x0407,0x0408,0x0409,0x040a,0x040b,0x040c,0x040d,0x040e,0x040f,0x0410,0x0411,0x0412,0x0413, 0x0414,0x0415,0x0416,0x0417,0x0418,0x0419,0x041a,0x041b,0x041c,0x041d,0x041e,0x041f,0x0420,0x0421,0x0422,0x0423, 0x0424,0x0425,0x0426,0x0427,0x0428,0x0429,0x042a,0x042b,0x042c,0x042d,0x042e,0x042f,0x0430,0x0431,0x0432,0x0433, 0x0434,0x0435,0x0436,0x0437,0x0438,0x0439,0x043a,0x043b,0x043c,0x043d,0x043e,0x043f,0x0440,0x0441,0x0442,0x0443, 0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,0x044a,0x044b,0x044c,0x044d,0x044e,0x044f,0x0450,0x0451,0x0452,0x0453, 0x0454,0x0455,0x0456,0x0457,0x0458,0x0459,0x045a,0x045b,0x045c,0x045d,0x045e,0x045f,0x0462,0x0463,0x046a,0x046b, 0x0490,0x0491,0x0492,0x0493,0x0494,0x0495,0x0496,0x0497,0x0498,0x0499,0x049a,0x049b,0x049c,0x049d,0x04a0,0x04a1, 0x04a2,0x04a3,0x04a4,0x04a5,0x04aa,0x04ab,0x04ae,0x04af,0x04b0,0x04b1,0x04b2,0x04b3,0x04b6,0x04b7,0x04b8,0x04b9, 0x04ba,0x04bb,0x04c0,0x04c1,0x04c2,0x04cf,0x04d0,0x04d1,0x04d2,0x04d3,0x04d4,0x04d5,0x04d6,0x04d7,0x04d8,0x04d9, 0x04da,0x04db,0x04dc,0x04dd,0x04de,0x04df,0x04e2,0x04e3,0x04e4,0x04e5,0x04e6,0x04e7,0x04e8,0x04e9,0x04ea,0x04eb, 0x04ec,0x04ed,0x04ee,0x04ef,0x04f0,0x04f1,0x04f2,0x04f3,0x04f4,0x04f5,0x04f8,0x04f9,0x05d0,0x05d1,0x05d2,0x05d3, 0x05d4,0x05d5,0x05d6,0x05d7,0x05d8,0x05d9,0x05da,0x05db,0x05dc,0x05dd,0x05de,0x05df,0x05e0,0x05e1,0x05e2,0x05e3, 0x05e4,0x05e5,0x05e6,0x05e7,0x05e8,0x05e9,0x05ea,0x1e0c,0x1e0d,0x1e34,0x1e35,0x1e36,0x1e37,0x1e40,0x1e41,0x1e42, 0x1e43,0x1e44,0x1e45,0x1e46,0x1e47,0x1e6c,0x1e6d,0x1eb8,0x1eb9,0x1ebc,0x1ebd,0x1eca,0x1ecb,0x1ecc,0x1ecd,0x1ee4, 0x1ee5,0x1ef8,0x1ef9,0x2000,0x2001,0x2002,0x2003,0x2004,0x2005,0x2006,0x2007,0x2008,0x2009,0x200a,0x200b,0x200c, 0x200d,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x2015,0x2016,0x2017,0x2018,0x2019,0x201a,0x201b,0x201c, 0x201d,0x201e,0x201f,0x2020,0x2021,0x2022,0x2026,0x2030,0x2032,0x2033,0x2039,0x203a,0x203c,0x203e,0x2070,0x2071, 0x2074,0x2075,0x2076,0x2077,0x2078,0x2079,0x207a,0x207b,0x207c,0x207d,0x207e,0x207f,0x2080,0x2081,0x2082,0x2083, 0x2084,0x2085,0x2086,0x2087,0x2088,0x2089,0x208a,0x208b,0x208c,0x208d,0x208e,0x2090,0x2091,0x2092,0x2093,0x2094, 0x2095,0x2096,0x2097,0x2098,0x209a,0x20a7,0x20aa,0x20ac,0x20ae,0x2102,0x210e,0x210f,0x2115,0x2116,0x211a,0x211d, 0x2122,0x2124,0x2126,0x2135,0x2190,0x2191,0x2192,0x2193,0x2194,0x2195,0x21a4,0x21a6,0x21a8,0x21b5,0x21bb,0x21cb, 0x21cc,0x21d0,0x21d1,0x21d2,0x21d3,0x21d4,0x21d5,0x2200,0x2203,0x2204,0x2205,0x2206,0x2207,0x2208,0x2209,0x220a, 0x220b,0x220c,0x220d,0x2212,0x2213,0x2214,0x2215,0x2216,0x2219,0x221a,0x221e,0x221f,0x2225,0x2227,0x2228,0x2229, 0x222a,0x2248,0x2260,0x2261,0x2264,0x2265,0x226a,0x226b,0x2282,0x2283,0x2286,0x2287,0x22a5,0x22c2,0x22c3,0x2300, 0x2302,0x2308,0x2309,0x230a,0x230b,0x2310,0x2319,0x2320,0x2321,0x239b,0x239c,0x239d,0x239e,0x239f,0x23a0,0x23a1, 0x23a2,0x23a3,0x23a4,0x23a5,0x23a6,0x23a7,0x23a8,0x23a9,0x23ab,0x23ac,0x23ad,0x23ae,0x23af,0x23ba,0x23bb,0x23bc, 0x23bd,0x23d0,0x2409,0x240a,0x240b,0x240c,0x240d,0x2424,0x2500,0x2501,0x2502,0x2503,0x2508,0x2509,0x250a,0x250b, 0x250c,0x250d,0x250e,0x250f,0x2510,0x2511,0x2512,0x2513,0x2514,0x2515,0x2516,0x2517,0x2518,0x2519,0x251a,0x251b, 0x251c,0x251d,0x251e,0x251f,0x2520,0x2521,0x2522,0x2523,0x2524,0x2525,0x2526,0x2527,0x2528,0x2529,0x252a,0x252b, 0x252c,0x252d,0x252e,0x252f,0x2530,0x2531,0x2532,0x2533,0x2534,0x2535,0x2536,0x2537,0x2538,0x2539,0x253a,0x253b, 0x253c,0x253d,0x253e,0x253f,0x2540,0x2541,0x2542,0x2543,0x2544,0x2545,0x2546,0x2547,0x2548,0x2549,0x254a,0x254b, 0x2550,0x2551,0x2552,0x2553,0x2554,0x2555,0x2556,0x2557,0x2558,0x2559,0x255a,0x255b,0x255c,0x255d,0x255e,0x255f, 0x2560,0x2561,0x2562,0x2563,0x2564,0x2565,0x2566,0x2567,0x2568,0x2569,0x256a,0x256b,0x256c,0x256d,0x256e,0x256f, 0x2570,0x2571,0x2572,0x2573,0x2574,0x2575,0x2576,0x2577,0x2578,0x2579,0x257a,0x257b,0x257c,0x257d,0x257e,0x257f, 0x2580,0x2581,0x2582,0x2583,0x2584,0x2585,0x2586,0x2587,0x2588,0x2589,0x258a,0x258b,0x258c,0x258d,0x258e,0x258f, 0x2590,0x2591,0x2592,0x2593,0x2596,0x2597,0x2598,0x2599,0x259a,0x259b,0x259c,0x259d,0x259e,0x259f,0x25a0,0x25ac, 0x25ae,0x25b2,0x25b6,0x25ba,0x25bc,0x25c0,0x25c4,0x25c6,0x25ca,0x25cb,0x25cf,0x25d8,0x25d9,0x263a,0x263b,0x263c, 0x2640,0x2642,0x2660,0x2663,0x2665,0x2666,0x266a,0x266b,0x2713,0x2714,0x2717,0x2718,0x27e8,0x27e9,0x27ea,0x27eb, 0x2800,0x2801,0x2802,0x2803,0x2804,0x2805,0x2806,0x2807,0x2808,0x2809,0x280a,0x280b,0x280c,0x280d,0x280e,0x280f, 0x2810,0x2811,0x2812,0x2813,0x2814,0x2815,0x2816,0x2817,0x2818,0x2819,0x281a,0x281b,0x281c,0x281d,0x281e,0x281f, 0x2820,0x2821,0x2822,0x2823,0x2824,0x2825,0x2826,0x2827,0x2828,0x2829,0x282a,0x282b,0x282c,0x282d,0x282e,0x282f, 0x2830,0x2831,0x2832,0x2833,0x2834,0x2835,0x2836,0x2837,0x2838,0x2839,0x283a,0x283b,0x283c,0x283d,0x283e,0x283f, 0x2840,0x2841,0x2842,0x2843,0x2844,0x2845,0x2846,0x2847,0x2848,0x2849,0x284a,0x284b,0x284c,0x284d,0x284e,0x284f, 0x2850,0x2851,0x2852,0x2853,0x2854,0x2855,0x2856,0x2857,0x2858,0x2859,0x285a,0x285b,0x285c,0x285d,0x285e,0x285f, 0x2860,0x2861,0x2862,0x2863,0x2864,0x2865,0x2866,0x2867,0x2868,0x2869,0x286a,0x286b,0x286c,0x286d,0x286e,0x286f, 0x2870,0x2871,0x2872,0x2873,0x2874,0x2875,0x2876,0x2877,0x2878,0x2879,0x287a,0x287b,0x287c,0x287d,0x287e,0x287f, 0x2880,0x2881,0x2882,0x2883,0x2884,0x2885,0x2886,0x2887,0x2888,0x2889,0x288a,0x288b,0x288c,0x288d,0x288e,0x288f, 0x2890,0x2891,0x2892,0x2893,0x2894,0x2895,0x2896,0x2897,0x2898,0x2899,0x289a,0x289b,0x289c,0x289d,0x289e,0x289f, 0x28a0,0x28a1,0x28a2,0x28a3,0x28a4,0x28a5,0x28a6,0x28a7,0x28a8,0x28a9,0x28aa,0x28ab,0x28ac,0x28ad,0x28ae,0x28af, 0x28b0,0x28b1,0x28b2,0x28b3,0x28b4,0x28b5,0x28b6,0x28b7,0x28b8,0x28b9,0x28ba,0x28bb,0x28bc,0x28bd,0x28be,0x28bf, 0x28c0,0x28c1,0x28c2,0x28c3,0x28c4,0x28c5,0x28c6,0x28c7,0x28c8,0x28c9,0x28ca,0x28cb,0x28cc,0x28cd,0x28ce,0x28cf, 0x28d0,0x28d1,0x28d2,0x28d3,0x28d4,0x28d5,0x28d6,0x28d7,0x28d8,0x28d9,0x28da,0x28db,0x28dc,0x28dd,0x28de,0x28df, 0x28e0,0x28e1,0x28e2,0x28e3,0x28e4,0x28e5,0x28e6,0x28e7,0x28e8,0x28e9,0x28ea,0x28eb,0x28ec,0x28ed,0x28ee,0x28ef, 0x28f0,0x28f1,0x28f2,0x28f3,0x28f4,0x28f5,0x28f6,0x28f7,0x28f8,0x28f9,0x28fa,0x28fb,0x28fc,0x28fd,0x28fe,0x28ff, 0x2e2c,0xe0a0,0xe0a1,0xe0a2,0xe0b0,0xe0b1,0xe0b2,0xe0b3,0xf6be,0xfffd }; } // namespace // -- end of autogenerated text --- namespace fixed_font_16b { // -- start of autogenerated text --- // definition section for font: ter-u16b.bdf constexpr int CHARCOUNT = 1354; constexpr int WIDTH = 8; constexpr int HEIGHT = 16; constexpr int OFFSET_X = 0; constexpr int OFFSET_Y = 0; constexpr FixedFont_info_t fixedfont_info = { "Terminus", // font name "ter-u16b.bdf", // font name internal CHARCOUNT, // num of chars WIDTH, HEIGHT, OFFSET_X, OFFSET_Y, true // bold }; // font bitmap definitions constexpr std::array fixedfont_bitmap = { 0x0000,0x0000,0xee00,0xc600,0x0000,0xc600,0xc600,0xc600,0x0000,0xc600,0xc600,0xee00,0x0000,0x0000,0x0000,0x0000, // u0000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0020 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u0021 0x0000,0x6600,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0022 0x0000,0x0000,0x6c00,0x6c00,0x6c00,0xfe00,0x6c00,0x6c00,0xfe00,0x6c00,0x6c00,0x6c00,0x0000,0x0000,0x0000,0x0000, // u0023 0x0000,0x1000,0x1000,0x7c00,0xd600,0xd000,0xd000,0x7c00,0x1600,0x1600,0xd600,0x7c00,0x1000,0x1000,0x0000,0x0000, // u0024 0x0000,0x0000,0x6600,0xd600,0x6c00,0x0c00,0x1800,0x1800,0x3000,0x3600,0x6b00,0x6600,0x0000,0x0000,0x0000,0x0000, // u0025 0x0000,0x0000,0x3800,0x6c00,0x6c00,0x3800,0x7600,0xdc00,0xcc00,0xcc00,0xdc00,0x7600,0x0000,0x0000,0x0000,0x0000, // u0026 0x0000,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0027 0x0000,0x0000,0x0c00,0x1800,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x1800,0x0c00,0x0000,0x0000,0x0000,0x0000, // u0028 0x0000,0x0000,0x3000,0x1800,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1800,0x3000,0x0000,0x0000,0x0000,0x0000, // u0029 0x0000,0x0000,0x0000,0x0000,0x0000,0x6c00,0x3800,0xfe00,0x3800,0x6c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002a 0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x7e00,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x3000,0x0000,0x0000,0x0000, // u002c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u002e 0x0000,0x0000,0x0600,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x3000,0x3000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, // u002f 0x0000,0x0000,0x7c00,0xc600,0xc600,0xce00,0xde00,0xf600,0xe600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0030 0x0000,0x0000,0x1800,0x3800,0x7800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0031 0x0000,0x0000,0x7c00,0xc600,0xc600,0x0600,0x0c00,0x1800,0x3000,0x6000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u0032 0x0000,0x0000,0x7c00,0xc600,0xc600,0x0600,0x3c00,0x0600,0x0600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0033 0x0000,0x0000,0x0600,0x0e00,0x1e00,0x3600,0x6600,0xc600,0xfe00,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u0034 0x0000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xfc00,0x0600,0x0600,0x0600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0035 0x0000,0x0000,0x3c00,0x6000,0xc000,0xc000,0xfc00,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0036 0x0000,0x0000,0xfe00,0x0600,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, // u0037 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0x7c00,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0038 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x0c00,0x7800,0x0000,0x0000,0x0000,0x0000, // u0039 0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x0000,0x0000,0x0000,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u003a 0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x0000,0x0000,0x0000,0x1800,0x1800,0x3000,0x0000,0x0000,0x0000, // u003b 0x0000,0x0000,0x0000,0x0600,0x0c00,0x1800,0x3000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0000,0x0000,0x0000,0x0000, // u003c 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0000,0x0000,0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003d 0x0000,0x0000,0x0000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0c00,0x1800,0x3000,0x6000,0x0000,0x0000,0x0000,0x0000, // u003e 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0x0c00,0x1800,0x1800,0x0000,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u003f 0x0000,0x0000,0x7c00,0xc600,0xce00,0xd600,0xd600,0xd600,0xd600,0xce00,0xc000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0040 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u0041 0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xfc00,0xc600,0xc600,0xc600,0xc600,0xfc00,0x0000,0x0000,0x0000,0x0000, // u0042 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc000,0xc000,0xc000,0xc000,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0043 0x0000,0x0000,0xf800,0xcc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xcc00,0xf800,0x0000,0x0000,0x0000,0x0000, // u0044 0x0000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u0045 0x0000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xc000,0xc000,0x0000,0x0000,0x0000,0x0000, // u0046 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc000,0xc000,0xde00,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0047 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u0048 0x0000,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0049 0x0000,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xcc00,0xcc00,0x7800,0x0000,0x0000,0x0000,0x0000, // u004a 0x0000,0x0000,0xc600,0xc600,0xcc00,0xd800,0xf000,0xf000,0xd800,0xcc00,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u004b 0x0000,0x0000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u004c 0x0000,0x0000,0x8200,0xc600,0xee00,0xfe00,0xd600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u004d 0x0000,0x0000,0xc600,0xc600,0xc600,0xe600,0xf600,0xde00,0xce00,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u004e 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u004f 0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xfc00,0xc000,0xc000,0xc000,0xc000,0x0000,0x0000,0x0000,0x0000, // u0050 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xde00,0x7c00,0x0600,0x0000,0x0000,0x0000, // u0051 0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xfc00,0xf000,0xd800,0xcc00,0xc600,0x0000,0x0000,0x0000,0x0000, // u0052 0x0000,0x0000,0x7c00,0xc600,0xc000,0xc000,0x7c00,0x0600,0x0600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0053 0x0000,0x0000,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u0054 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0055 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0x6c00,0x6c00,0x6c00,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000, // u0056 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xd600,0xfe00,0xee00,0xc600,0x8200,0x0000,0x0000,0x0000,0x0000, // u0057 0x0000,0x0000,0xc600,0xc600,0x6c00,0x6c00,0x3800,0x3800,0x6c00,0x6c00,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u0058 0x0000,0x0000,0xc300,0xc300,0x6600,0x6600,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u0059 0x0000,0x0000,0xfe00,0x0600,0x0600,0x0c00,0x1800,0x3000,0x6000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u005a 0x0000,0x0000,0x3c00,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3c00,0x0000,0x0000,0x0000,0x0000, // u005b 0x0000,0x0000,0x6000,0x6000,0x3000,0x3000,0x1800,0x1800,0x0c00,0x0c00,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u005c 0x0000,0x0000,0x3c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x3c00,0x0000,0x0000,0x0000,0x0000, // u005d 0x0000,0x1800,0x3c00,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0000,0x0000, // u005f 0x3000,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0060 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0600,0x7e00,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0061 0x0000,0x0000,0xc000,0xc000,0xc000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xfc00,0x0000,0x0000,0x0000,0x0000, // u0062 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc000,0xc000,0xc000,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0063 0x0000,0x0000,0x0600,0x0600,0x0600,0x7e00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0064 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0065 0x0000,0x0000,0x1e00,0x3000,0x3000,0xfc00,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, // u0066 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x7c00,0x0000, // u0067 0x0000,0x0000,0xc000,0xc000,0xc000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u0068 0x0000,0x0000,0x1800,0x1800,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0069 0x0000,0x0000,0x0600,0x0600,0x0000,0x0e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x6600,0x6600,0x3c00,0x0000, // u006a 0x0000,0x0000,0xc000,0xc000,0xc000,0xc600,0xcc00,0xd800,0xf000,0xd800,0xcc00,0xc600,0x0000,0x0000,0x0000,0x0000, // u006b 0x0000,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u006c 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0x0000,0x0000,0x0000,0x0000, // u006d 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u006e 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u006f 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xfc00,0xc000,0xc000,0xc000,0x0000, // u0070 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x0600,0x0000, // u0071 0x0000,0x0000,0x0000,0x0000,0x0000,0xde00,0xf000,0xe000,0xc000,0xc000,0xc000,0xc000,0x0000,0x0000,0x0000,0x0000, // u0072 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0xc000,0xc000,0x7c00,0x0600,0x0600,0xfc00,0x0000,0x0000,0x0000,0x0000, // u0073 0x0000,0x0000,0x3000,0x3000,0x3000,0xfc00,0x3000,0x3000,0x3000,0x3000,0x3000,0x1e00,0x0000,0x0000,0x0000,0x0000, // u0074 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0075 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0x6c00,0x6c00,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000, // u0076 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xd600,0xd600,0xd600,0xd600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0077 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0x6c00,0x3800,0x6c00,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u0078 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x7c00,0x0000, // u0079 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0c00,0x1800,0x3000,0x6000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u007a 0x0000,0x0000,0x1c00,0x3000,0x3000,0x3000,0x6000,0x3000,0x3000,0x3000,0x3000,0x1c00,0x0000,0x0000,0x0000,0x0000, // u007b 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u007c 0x0000,0x0000,0x7000,0x1800,0x1800,0x1800,0x0c00,0x1800,0x1800,0x1800,0x1800,0x7000,0x0000,0x0000,0x0000,0x0000, // u007d 0x0000,0x7300,0xdb00,0xce00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a0 0x0000,0x0000,0x1800,0x1800,0x0000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u00a1 0x0000,0x0000,0x0000,0x1000,0x1000,0x7c00,0xd600,0xd000,0xd000,0xd000,0xd600,0x7c00,0x1000,0x1000,0x0000,0x0000, // u00a2 0x0000,0x0000,0x3800,0x6c00,0x6000,0x6000,0xf800,0x6000,0x6000,0x6000,0x6600,0xfe00,0x0000,0x0000,0x0000,0x0000, // u00a3 0x0000,0x0000,0x0000,0x0000,0x6600,0x3c00,0x6600,0x6600,0x6600,0x3c00,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a4 0x0000,0x0000,0xc300,0xc300,0x6600,0x3c00,0x1800,0x7e00,0x1800,0x7e00,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u00a5 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u00a6 0x0000,0x3c00,0x6600,0x6000,0x3800,0x6c00,0x6600,0x6600,0x3600,0x1c00,0x0600,0x6600,0x3c00,0x0000,0x0000,0x0000, // u00a7 0x6c00,0x6c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a8 0x0000,0x0000,0x0000,0x7e00,0x8100,0x9900,0xa500,0xa100,0xa500,0x9900,0x8100,0x7e00,0x0000,0x0000,0x0000,0x0000, // u00a9 0x0000,0x3c00,0x0600,0x3e00,0x6600,0x3e00,0x0000,0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x1b00,0x3600,0x6c00,0xd800,0x6c00,0x3600,0x1b00,0x0000,0x0000,0x0000,0x0000, // u00ab 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ac 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ad 0x0000,0x0000,0x0000,0x7e00,0x8100,0xb900,0xa500,0xb900,0xa900,0xa500,0x8100,0x7e00,0x0000,0x0000,0x0000,0x0000, // u00ae 0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00af 0x0000,0x3800,0x6c00,0x6c00,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x7e00,0x1800,0x1800,0x0000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u00b1 0x0000,0x3800,0x6c00,0x0c00,0x1800,0x3000,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b2 0x0000,0x7800,0x0c00,0x3800,0x0c00,0x0c00,0x7800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b3 0x1800,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b4 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xce00,0xf600,0xc000,0xc000,0xc000,0x0000, // u00b5 0x0000,0x0000,0x7e00,0xd600,0xd600,0xd600,0xd600,0x7600,0x1600,0x1600,0x1600,0x1600,0x0000,0x0000,0x0000,0x0000, // u00b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x6000,0x0000, // u00b8 0x0000,0x1800,0x3800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b9 0x0000,0x3c00,0x6600,0x6600,0x6600,0x3c00,0x0000,0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ba 0x0000,0x0000,0x0000,0x0000,0x0000,0xd800,0x6c00,0x3600,0x1b00,0x3600,0x6c00,0xd800,0x0000,0x0000,0x0000,0x0000, // u00bb 0x0000,0x6000,0xe000,0x6200,0x6600,0x6c00,0x1800,0x3000,0x6600,0xce00,0x9a00,0x3e00,0x0600,0x0600,0x0000,0x0000, // u00bc 0x0000,0x6000,0xe000,0x6200,0x6600,0x6c00,0x1800,0x3000,0x6000,0xdc00,0xb600,0x0c00,0x1800,0x3e00,0x0000,0x0000, // u00bd 0x0000,0xe000,0x3000,0x6200,0x3600,0xec00,0x1800,0x3000,0x6600,0xce00,0x9a00,0x3e00,0x0600,0x0600,0x0000,0x0000, // u00be 0x0000,0x0000,0x3000,0x3000,0x0000,0x3000,0x3000,0x6000,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u00bf 0x3000,0x1800,0x0000,0x7c00,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u00c0 0x1800,0x3000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u00c1 0x3800,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u00c2 0x7600,0xdc00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u00c3 0x6c00,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u00c4 0x3800,0x6c00,0x3800,0x7c00,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u00c5 0x0000,0x0000,0x7e00,0xd800,0xd800,0xd800,0xfe00,0xd800,0xd800,0xd800,0xd800,0xde00,0x0000,0x0000,0x0000,0x0000, // u00c6 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc000,0xc000,0xc000,0xc000,0xc600,0xc600,0x7c00,0x3000,0x3000,0x6000,0x0000, // u00c7 0x3000,0x1800,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u00c8 0x1800,0x3000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u00c9 0x3800,0x6c00,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u00ca 0x6c00,0x6c00,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u00cb 0x3000,0x1800,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00cc 0x0c00,0x1800,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00cd 0x3800,0x6c00,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00ce 0x6600,0x6600,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00cf 0x0000,0x0000,0x7800,0x6c00,0x6600,0x6600,0xf600,0x6600,0x6600,0x6600,0x6c00,0x7800,0x0000,0x0000,0x0000,0x0000, // u00d0 0x7600,0xdc00,0x0000,0xc600,0xc600,0xe600,0xf600,0xde00,0xce00,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u00d1 0x3000,0x1800,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u00d2 0x1800,0x3000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u00d3 0x3800,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u00d4 0x7600,0xdc00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u00d5 0x6c00,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u00d6 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0x6c00,0x3800,0x3800,0x6c00,0xc600,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d7 0x0000,0x0000,0x7c00,0xc700,0xc600,0xce00,0xde00,0xf600,0xe600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u00d8 0x3000,0x1800,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u00d9 0x1800,0x3000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u00da 0x3800,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u00db 0x6c00,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u00dc 0x0c00,0x1800,0xc300,0xc300,0x6600,0x6600,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u00dd 0x0000,0x0000,0xc000,0xc000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xfc00,0xc000,0xc000,0x0000,0x0000,0x0000,0x0000, // u00de 0x0000,0x0000,0x7800,0xcc00,0xcc00,0xc800,0xfc00,0xc600,0xc600,0xc600,0xe600,0xdc00,0x0000,0x0000,0x0000,0x0000, // u00df 0x0000,0x0000,0x3000,0x1800,0x0000,0x7c00,0x0600,0x7e00,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u00e0 0x0000,0x0000,0x1800,0x3000,0x0000,0x7c00,0x0600,0x7e00,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u00e1 0x0000,0x0000,0x3800,0x6c00,0x0000,0x7c00,0x0600,0x7e00,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u00e2 0x0000,0x0000,0x7600,0xdc00,0x0000,0x7c00,0x0600,0x7e00,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u00e3 0x0000,0x0000,0x6c00,0x6c00,0x0000,0x7c00,0x0600,0x7e00,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u00e4 0x0000,0x0000,0x3800,0x6c00,0x3800,0x7c00,0x0600,0x7e00,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u00e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x6c00,0x1600,0x1600,0x7e00,0xd000,0xd000,0x6c00,0x0000,0x0000,0x0000,0x0000, // u00e6 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc000,0xc000,0xc000,0xc600,0x7c00,0x3000,0x3000,0x6000,0x0000, // u00e7 0x0000,0x0000,0x3000,0x1800,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x0000,0x0000,0x0000, // u00e8 0x0000,0x0000,0x1800,0x3000,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x0000,0x0000,0x0000, // u00e9 0x0000,0x0000,0x3800,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x0000,0x0000,0x0000, // u00ea 0x0000,0x0000,0x6c00,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x0000,0x0000,0x0000, // u00eb 0x0000,0x0000,0x3000,0x1800,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00ec 0x0000,0x0000,0x0c00,0x1800,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00ed 0x0000,0x0000,0x3800,0x6c00,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00ee 0x0000,0x0000,0x6c00,0x6c00,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u00ef 0x0000,0x0000,0x6800,0x3000,0x5800,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u00f0 0x0000,0x0000,0x7600,0xdc00,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u00f1 0x0000,0x0000,0x3000,0x1800,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u00f2 0x0000,0x0000,0x1800,0x3000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u00f3 0x0000,0x0000,0x3800,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u00f4 0x0000,0x0000,0x7600,0xdc00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u00f5 0x0000,0x0000,0x6c00,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u00f6 0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x0000,0x7e00,0x0000,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f7 0x0000,0x0000,0x0000,0x0000,0x0000,0x3d00,0x6700,0x6e00,0x7e00,0x7600,0xe600,0xbc00,0x0000,0x0000,0x0000,0x0000, // u00f8 0x0000,0x0000,0x3000,0x1800,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u00f9 0x0000,0x0000,0x1800,0x3000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u00fa 0x0000,0x0000,0x3800,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u00fb 0x0000,0x0000,0x6c00,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u00fc 0x0000,0x0000,0x1800,0x3000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x7c00,0x0000, // u00fd 0x0000,0x0000,0xc000,0xc000,0xc000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xfc00,0xc000,0xc000,0xc000,0x0000, // u00fe 0x0000,0x0000,0x6c00,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x7c00,0x0000, // u00ff 0x7c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u0100 0x0000,0x0000,0x0000,0x7c00,0x0000,0x7c00,0x0600,0x7e00,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0101 0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u0102 0x0000,0x0000,0x6c00,0x3800,0x0000,0x7c00,0x0600,0x7e00,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0103 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0600,0x0c00,0x0700,0x0000, // u0104 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0600,0x7e00,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0c00,0x0700,0x0000, // u0105 0x1800,0x3000,0x0000,0x7c00,0xc600,0xc600,0xc000,0xc000,0xc000,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0106 0x0000,0x0000,0x1800,0x3000,0x0000,0x7c00,0xc600,0xc000,0xc000,0xc000,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0107 0x3800,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xc000,0xc000,0xc000,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0108 0x0000,0x0000,0x3800,0x6c00,0x0000,0x7c00,0xc600,0xc000,0xc000,0xc000,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0109 0x1800,0x1800,0x0000,0x7c00,0xc600,0xc600,0xc000,0xc000,0xc000,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u010a 0x0000,0x0000,0x1800,0x1800,0x0000,0x7c00,0xc600,0xc000,0xc000,0xc000,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u010b 0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc600,0xc000,0xc000,0xc000,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u010c 0x0000,0x0000,0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc000,0xc000,0xc000,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u010d 0x6c00,0x3800,0x0000,0xf800,0xcc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xcc00,0xf800,0x0000,0x0000,0x0000,0x0000, // u010e 0x6c00,0x3800,0x0600,0x0600,0x0600,0x7e00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u010f 0x0000,0x0000,0x7800,0x6c00,0x6600,0x6600,0xf600,0x6600,0x6600,0x6600,0x6c00,0x7800,0x0000,0x0000,0x0000,0x0000, // u0110 0x0000,0x0000,0x0600,0x1f00,0x0600,0x7e00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0111 0x7c00,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u0112 0x0000,0x0000,0x0000,0x7c00,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0113 0x6c00,0x3800,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u0114 0x0000,0x0000,0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0115 0x1800,0x1800,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u0116 0x0000,0x0000,0x1800,0x1800,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0117 0x0000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xc000,0xfe00,0x0600,0x0c00,0x0700,0x0000, // u0118 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x1800,0x3000,0x1c00,0x0000, // u0119 0x6c00,0x3800,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u011a 0x0000,0x0000,0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x0000,0x0000,0x0000, // u011b 0x3800,0x6c00,0x0000,0x7c00,0xc600,0xc000,0xc000,0xde00,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u011c 0x0000,0x0000,0x3800,0x6c00,0x0000,0x7e00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x7c00,0x0000, // u011d 0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc000,0xc000,0xde00,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u011e 0x0000,0x0000,0x6c00,0x3800,0x0000,0x7e00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x7c00,0x0000, // u011f 0x1800,0x1800,0x0000,0x7c00,0xc600,0xc000,0xc000,0xde00,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0120 0x0000,0x0000,0x1800,0x1800,0x0000,0x7e00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x7c00,0x0000, // u0121 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc000,0xc000,0xde00,0xc600,0xc600,0xc600,0x7c00,0x0000,0x3000,0x3000,0x6000, // u0122 0x0000,0x0c00,0x1800,0x1800,0x0000,0x7e00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x7c00,0x0000, // u0123 0x3800,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u0124 0x1c00,0x3600,0xc000,0xc000,0xc000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u0125 0x0000,0x0000,0x6600,0xff00,0x6600,0x6600,0x7e00,0x6600,0x6600,0x6600,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000, // u0126 0x0000,0x0000,0x6000,0xf800,0x6000,0x7c00,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000, // u0127 0x7600,0xdc00,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0128 0x0000,0x0000,0x7600,0xdc00,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0129 0x7e00,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u012a 0x0000,0x0000,0x0000,0x7c00,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u012b 0x6c00,0x3800,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u012c 0x0000,0x0000,0x6c00,0x3800,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u012d 0x0000,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x1800,0x3000,0x1c00,0x0000, // u012e 0x0000,0x0000,0x1800,0x1800,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x1800,0x3000,0x1c00,0x0000, // u012f 0x1800,0x1800,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0130 0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0131 0x0000,0x0000,0xcf00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xf600,0xf600,0xdc00,0x0000,0x0000,0x0000,0x0000, // u0132 0x0000,0x0000,0xc600,0xc600,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x3600,0x3600,0x1c00,0x0000, // u0133 0x1c00,0x3600,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xcc00,0xcc00,0x7800,0x0000,0x0000,0x0000,0x0000, // u0134 0x0000,0x0000,0x0e00,0x1b00,0x0000,0x0e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x6600,0x6600,0x3c00,0x0000, // u0135 0x0000,0x0000,0xc600,0xc600,0xcc00,0xd800,0xf000,0xf000,0xd800,0xcc00,0xc600,0xc600,0x0000,0x3000,0x3000,0x6000, // u0136 0x0000,0x0000,0xc000,0xc000,0xc000,0xc600,0xcc00,0xd800,0xf000,0xd800,0xcc00,0xc600,0x0000,0x3000,0x3000,0x6000, // u0137 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xcc00,0xd800,0xf000,0xd800,0xcc00,0xc600,0x0000,0x0000,0x0000,0x0000, // u0138 0x6000,0xc000,0x0000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u0139 0x0c00,0x1800,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u013a 0x0000,0x0000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xfe00,0x0000,0x3000,0x3000,0x6000, // u013b 0x0000,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x1800,0x1800,0x3000, // u013c 0x6c00,0x3800,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u013d 0x6c00,0x3800,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u013e 0x0000,0x0000,0xc000,0xc000,0xc000,0xc000,0xcc00,0xcc00,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u013f 0x0000,0x0000,0x3800,0x1800,0x1800,0x1800,0x1b00,0x1b00,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0140 0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x7000,0xe000,0x6000,0x6000,0x6000,0x7f00,0x0000,0x0000,0x0000,0x0000, // u0141 0x0000,0x0000,0x3800,0x1800,0x1800,0x1800,0x1c00,0x3800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0142 0x1800,0x3000,0xc600,0xc600,0xc600,0xe600,0xf600,0xde00,0xce00,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u0143 0x0000,0x0000,0x1800,0x3000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u0144 0x0000,0x0000,0xc600,0xc600,0xc600,0xe600,0xf600,0xde00,0xce00,0xc600,0xc600,0xc600,0x0000,0x3000,0x3000,0x6000, // u0145 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x3000,0x3000,0x6000, // u0146 0x6c00,0x3800,0xc600,0xc600,0xc600,0xe600,0xf600,0xde00,0xce00,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u0147 0x0000,0x0000,0x6c00,0x3800,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u0148 0x0000,0x6000,0x6000,0xc000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u0149 0x0000,0x0000,0xc600,0xc600,0xc600,0xe600,0xf600,0xde00,0xce00,0xc600,0xc600,0xc600,0x0600,0x0600,0x1c00,0x0000, // u014a 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0600,0x0600,0x1c00,0x0000, // u014b 0x7c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u014c 0x0000,0x0000,0x0000,0x7c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u014d 0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u014e 0x0000,0x0000,0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u014f 0x3600,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0150 0x0000,0x0000,0x3600,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0151 0x0000,0x0000,0x7e00,0xd800,0xd800,0xd800,0xde00,0xd800,0xd800,0xd800,0xd800,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0152 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xd600,0xd600,0xde00,0xd000,0xd000,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0153 0x1800,0x3000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xfc00,0xf000,0xd800,0xcc00,0xc600,0x0000,0x0000,0x0000,0x0000, // u0154 0x0000,0x0000,0x1800,0x3000,0x0000,0xde00,0xf000,0xe000,0xc000,0xc000,0xc000,0xc000,0x0000,0x0000,0x0000,0x0000, // u0155 0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xfc00,0xf000,0xd800,0xcc00,0xc600,0x0000,0x3000,0x3000,0x6000, // u0156 0x0000,0x0000,0x0000,0x0000,0x0000,0x6f00,0x7800,0x7000,0x6000,0x6000,0x6000,0x6000,0x0000,0x6000,0x6000,0xc000, // u0157 0x6c00,0x3800,0x0000,0xfc00,0xc600,0xc600,0xc600,0xfc00,0xf000,0xd800,0xcc00,0xc600,0x0000,0x0000,0x0000,0x0000, // u0158 0x0000,0x0000,0x6c00,0x3800,0x0000,0xde00,0xf000,0xe000,0xc000,0xc000,0xc000,0xc000,0x0000,0x0000,0x0000,0x0000, // u0159 0x1800,0x3000,0x0000,0x7c00,0xc600,0xc000,0xc000,0x7c00,0x0600,0x0600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u015a 0x0000,0x0000,0x0c00,0x1800,0x0000,0x7e00,0xc000,0xc000,0x7c00,0x0600,0x0600,0xfc00,0x0000,0x0000,0x0000,0x0000, // u015b 0x3800,0x6c00,0x0000,0x7c00,0xc600,0xc000,0xc000,0x7c00,0x0600,0x0600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u015c 0x0000,0x0000,0x3800,0x6c00,0x0000,0x7e00,0xc000,0xc000,0x7c00,0x0600,0x0600,0xfc00,0x0000,0x0000,0x0000,0x0000, // u015d 0x0000,0x0000,0x7c00,0xc600,0xc000,0xc000,0x7c00,0x0600,0x0600,0xc600,0xc600,0x7c00,0x3000,0x3000,0x6000,0x0000, // u015e 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0xc000,0xc000,0x7c00,0x0600,0x0600,0xfc00,0x3000,0x3000,0x6000,0x0000, // u015f 0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc000,0xc000,0x7c00,0x0600,0x0600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0160 0x0000,0x0000,0x6c00,0x3800,0x0000,0x7e00,0xc000,0xc000,0x7c00,0x0600,0x0600,0xfc00,0x0000,0x0000,0x0000,0x0000, // u0161 0x0000,0x0000,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0c00,0x0c00,0x1800,0x0000, // u0162 0x0000,0x0000,0x3000,0x3000,0x3000,0xfc00,0x3000,0x3000,0x3000,0x3000,0x3000,0x1e00,0x0c00,0x0c00,0x1800,0x0000, // u0163 0x6c00,0x3800,0x0000,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u0164 0x6c00,0x3800,0x0000,0x3000,0x3000,0xfc00,0x3000,0x3000,0x3000,0x3000,0x3000,0x1e00,0x0000,0x0000,0x0000,0x0000, // u0165 0x0000,0x0000,0xff00,0x1800,0x1800,0x1800,0x7e00,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u0166 0x0000,0x0000,0x3000,0x3000,0x3000,0xfc00,0x3000,0x7800,0x3000,0x3000,0x3000,0x1e00,0x0000,0x0000,0x0000,0x0000, // u0167 0x7600,0xdc00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0168 0x0000,0x0000,0x7600,0xdc00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0169 0x7c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u016a 0x0000,0x0000,0x0000,0x7c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u016b 0x6c00,0x3800,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u016c 0x0000,0x0000,0x6c00,0x3800,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u016d 0x3800,0x6c00,0x3800,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u016e 0x0000,0x0000,0x3800,0x6c00,0x3800,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u016f 0x3600,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0170 0x0000,0x0000,0x3600,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0171 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x1800,0x3000,0x1c00,0x0000, // u0172 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0c00,0x0700,0x0000, // u0173 0x3800,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xd600,0xfe00,0xee00,0xc600,0x8200,0x0000,0x0000,0x0000,0x0000, // u0174 0x0000,0x0000,0x3800,0x6c00,0x0000,0xc600,0xc600,0xd600,0xd600,0xd600,0xd600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0175 0x3800,0x6c00,0x0000,0xc300,0xc300,0x6600,0x6600,0x3c00,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u0176 0x0000,0x0000,0x3800,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x7c00,0x0000, // u0177 0x6600,0x6600,0x0000,0xc300,0xc300,0x6600,0x6600,0x3c00,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u0178 0x1800,0x3000,0x0000,0xfe00,0x0600,0x0c00,0x1800,0x3000,0x6000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u0179 0x0000,0x0000,0x1800,0x3000,0x0000,0xfe00,0x0c00,0x1800,0x3000,0x6000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u017a 0x1800,0x1800,0x0000,0xfe00,0x0600,0x0c00,0x1800,0x3000,0x6000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u017b 0x0000,0x0000,0x1800,0x1800,0x0000,0xfe00,0x0c00,0x1800,0x3000,0x6000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u017c 0x6c00,0x3800,0x0000,0xfe00,0x0600,0x0c00,0x1800,0x3000,0x6000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u017d 0x0000,0x0000,0x6c00,0x3800,0x0000,0xfe00,0x0c00,0x1800,0x3000,0x6000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u017e 0x0000,0x0000,0x1e00,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, // u017f 0x0000,0x0000,0x7c00,0xc600,0xc600,0x0600,0x0600,0x0600,0x0600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0186 0x0000,0x0000,0xfe00,0x0600,0x0600,0x0600,0x3e00,0x0600,0x0600,0x0600,0x0600,0xfe00,0x0000,0x0000,0x0000,0x0000, // u018e 0x0000,0x0000,0x7c00,0xc600,0x0600,0x0600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u018f 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc000,0x7800,0xc000,0xc000,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0190 0x0000,0x0000,0x0e00,0x1b00,0x1800,0x1800,0x7e00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xd800,0x7000,0x0000, // u0192 0x0000,0x0000,0x6600,0x6600,0x6600,0x7600,0x7e00,0x6e00,0x6600,0x6600,0x6600,0x6600,0x6000,0x6000,0xc000,0x0000, // u019d 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0600,0x0600,0x0600,0x0000, // u019e 0x0000,0x0000,0xfe00,0x0600,0x0c00,0x1800,0xfe00,0x3000,0x6000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u01b5 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0c00,0x1800,0xfc00,0x3000,0x6000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u01b6 0x0000,0x0000,0xfe00,0x0600,0x0c00,0x1800,0x3c00,0x0600,0x0600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u01b7 0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u01cd 0x0000,0x0000,0x6c00,0x3800,0x0000,0x7c00,0x0600,0x7e00,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u01ce 0x6c00,0x3800,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u01cf 0x0000,0x0000,0x6c00,0x3800,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u01d0 0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u01d1 0x0000,0x0000,0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u01d2 0x6c00,0x3800,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u01d3 0x0000,0x0000,0x6c00,0x3800,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u01d4 0x7c00,0x0000,0x7e00,0xd800,0xd800,0xd800,0xfe00,0xd800,0xd800,0xd800,0xd800,0xde00,0x0000,0x0000,0x0000,0x0000, // u01e2 0x0000,0x0000,0x0000,0x7c00,0x0000,0x6c00,0x1600,0x1600,0x7e00,0xd000,0xd000,0x6c00,0x0000,0x0000,0x0000,0x0000, // u01e3 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc000,0xc000,0xde00,0xc600,0xdf00,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u01e4 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0xc600,0xc600,0xdf00,0xc600,0xc600,0x7e00,0x0600,0x0600,0x7c00,0x0000, // u01e5 0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc000,0xc000,0xde00,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u01e6 0x0000,0x0000,0x6c00,0x3800,0x0000,0x7e00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x7c00,0x0000, // u01e7 0x6c00,0x3800,0xc600,0xc600,0xcc00,0xd800,0xf000,0xf000,0xd800,0xcc00,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u01e8 0x6c00,0x3800,0xc000,0xc000,0xc000,0xc600,0xcc00,0xd800,0xf000,0xd800,0xcc00,0xc600,0x0000,0x0000,0x0000,0x0000, // u01e9 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x1800,0x3000,0x1c00,0x0000, // u01ea 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x1800,0x3000,0x1c00,0x0000, // u01eb 0x7c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x1800,0x3000,0x1c00,0x0000, // u01ec 0x0000,0x0000,0x0000,0x7c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x1800,0x3000,0x1c00,0x0000, // u01ed 0x6c00,0x3800,0x0000,0xfe00,0x0c00,0x1800,0x3c00,0x0600,0x0600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u01ee 0x0000,0x0000,0x6c00,0x3800,0x0000,0xfe00,0x0600,0x0c00,0x1800,0x3c00,0x0600,0x0600,0xc600,0xc600,0x7c00,0x0000, // u01ef 0x0000,0x0000,0x1b00,0x0e00,0x0000,0x0e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x6600,0x6600,0x3c00,0x0000, // u01f0 0x1800,0x3000,0x0000,0x7c00,0xc600,0xc000,0xc000,0xde00,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u01f4 0x0000,0x0000,0x0c00,0x1800,0x0000,0x7e00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x7c00,0x0000, // u01f5 0x0c00,0x1800,0x0000,0x7e00,0xd800,0xd800,0xd800,0xfe00,0xd800,0xd800,0xd800,0xde00,0x0000,0x0000,0x0000,0x0000, // u01fc 0x0000,0x0000,0x0c00,0x1800,0x0000,0x6c00,0x1600,0x1600,0x7e00,0xd000,0xd000,0x6c00,0x0000,0x0000,0x0000,0x0000, // u01fd 0x1800,0x3000,0x0000,0x7c00,0xc700,0xc600,0xce00,0xde00,0xf600,0xe600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u01fe 0x0000,0x0000,0x1800,0x3000,0x0000,0x3d00,0x6700,0x6e00,0x7e00,0x7600,0xe600,0xbc00,0x0000,0x0000,0x0000,0x0000, // u01ff 0x0000,0x0000,0x7c00,0xc600,0xc000,0xc000,0x7c00,0x0600,0x0600,0xc600,0xc600,0x7c00,0x0000,0x3000,0x3000,0x6000, // u0218 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0xc000,0xc000,0x7c00,0x0600,0x0600,0xfc00,0x0000,0x3000,0x3000,0x6000, // u0219 0x0000,0x0000,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x1800,0x1800,0x3000, // u021a 0x0000,0x0000,0x3000,0x3000,0x3000,0xfc00,0x3000,0x3000,0x3000,0x3000,0x3000,0x1e00,0x0000,0x0c00,0x0c00,0x1800, // u021b 0x7e00,0x0000,0xc300,0xc300,0x6600,0x6600,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u0232 0x0000,0x0000,0x0000,0x7c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x7c00,0x0000, // u0233 0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x6600,0x6600,0x3c00,0x0000, // u0237 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0x0600,0x0600,0x0600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0254 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc600,0xfe00,0x0600,0x0600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0258 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0600,0x0600,0xfe00,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0259 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc000,0x7800,0xc000,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u025b 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x6000,0x6000,0xc000,0x0000, // u0272 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0600,0x0c00,0x1800,0x3c00,0x0600,0x0600,0xc600,0xc600,0x7c00,0x0000, // u0292 0x1800,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bb 0x1800,0x1800,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bc 0x3000,0x3000,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bd 0x3800,0x6c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02c6 0x6c00,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02c7 0x6c00,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02d8 0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02d9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x3000,0x1c00,0x0000, // u02db 0x7600,0xdc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02dc 0x3600,0x6c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02dd 0x3000,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0300 0x1800,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0301 0x3800,0x6c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0302 0x7600,0xdc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0303 0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0304 0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0305 0x6c00,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0306 0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0307 0x6c00,0x6c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0308 0x3800,0x6c00,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030a 0x3600,0x6c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030b 0x6c00,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x0000, // u0329 0x6000,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0384 0x1800,0x3000,0x0000,0x6c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0385 0x6000,0xc000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u0386 0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0387 0x6000,0xc000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u0388 0x6000,0xc000,0x0000,0xc600,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u0389 0x6000,0xc000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u038a 0x6000,0xc000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u038c 0x6000,0xc000,0x0000,0xc300,0xc300,0x6600,0x6600,0x3c00,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u038e 0x6000,0xc000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x6c00,0x6c00,0xee00,0x0000,0x0000,0x0000,0x0000, // u038f 0x1800,0x3000,0xd800,0xd800,0x0000,0x7000,0x3000,0x3000,0x3000,0x3000,0x3000,0x1c00,0x0000,0x0000,0x0000,0x0000, // u0390 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u0391 0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xfc00,0xc600,0xc600,0xc600,0xc600,0xfc00,0x0000,0x0000,0x0000,0x0000, // u0392 0x0000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0x0000,0x0000,0x0000,0x0000, // u0393 0x0000,0x0000,0x1000,0x1000,0x3800,0x3800,0x6c00,0x6c00,0x6c00,0xc600,0xc600,0xfe00,0x0000,0x0000,0x0000,0x0000, // u0394 0x0000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u0395 0x0000,0x0000,0xfe00,0x0600,0x0600,0x0c00,0x1800,0x3000,0x6000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u0396 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u0397 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xd600,0xd600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0398 0x0000,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0399 0x0000,0x0000,0xc600,0xc600,0xcc00,0xd800,0xf000,0xf000,0xd800,0xcc00,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u039a 0x0000,0x0000,0x1000,0x1000,0x3800,0x3800,0x6c00,0x6c00,0x6c00,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u039b 0x0000,0x0000,0x8200,0xc600,0xee00,0xfe00,0xd600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u039c 0x0000,0x0000,0xc600,0xc600,0xc600,0xe600,0xf600,0xde00,0xce00,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u039d 0x0000,0x0000,0xfe00,0x0000,0x0000,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u039e 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u039f 0x0000,0x0000,0xfe00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u03a0 0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xfc00,0xc000,0xc000,0xc000,0xc000,0x0000,0x0000,0x0000,0x0000, // u03a1 0x0000,0x0000,0xfe00,0xc000,0x6000,0x3000,0x1800,0x1800,0x3000,0x6000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u03a3 0x0000,0x0000,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u03a4 0x0000,0x0000,0xc300,0xc300,0x6600,0x6600,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u03a5 0x0000,0x0000,0x1000,0x7c00,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0x7c00,0x1000,0x0000,0x0000,0x0000,0x0000, // u03a6 0x0000,0x0000,0xc600,0xc600,0x6c00,0x6c00,0x3800,0x3800,0x6c00,0x6c00,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u03a7 0x0000,0x0000,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0x7c00,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u03a8 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x6c00,0x6c00,0xee00,0x0000,0x0000,0x0000,0x0000, // u03a9 0x6600,0x6600,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u03aa 0x6600,0x6600,0x0000,0xc300,0xc300,0x6600,0x6600,0x3c00,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u03ab 0x0000,0x0000,0x1800,0x3000,0x0000,0x7a00,0xce00,0xcc00,0xcc00,0xcc00,0xce00,0x7a00,0x0000,0x0000,0x0000,0x0000, // u03ac 0x0000,0x0000,0x1800,0x3000,0x0000,0x7c00,0xc600,0xc000,0x7800,0xc000,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u03ad 0x0000,0x0000,0x1800,0x3000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0600,0x0600,0x0600,0x0000, // u03ae 0x0000,0x0000,0x1800,0x3000,0x0000,0x7000,0x3000,0x3000,0x3000,0x3000,0x3000,0x1c00,0x0000,0x0000,0x0000,0x0000, // u03af 0x1800,0x3000,0x0000,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u03b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x7a00,0xce00,0xcc00,0xcc00,0xcc00,0xce00,0x7a00,0x0000,0x0000,0x0000,0x0000, // u03b1 0x0000,0x0000,0x7800,0xcc00,0xcc00,0xc800,0xfc00,0xc600,0xc600,0xc600,0xc600,0xfc00,0xc000,0xc000,0xc000,0x0000, // u03b2 0x0000,0x0000,0x0000,0x0000,0x0000,0xc300,0xc300,0x6600,0x6600,0x3c00,0x3c00,0x1800,0x1800,0x1800,0x1800,0x0000, // u03b3 0x0000,0x0000,0x7e00,0x3000,0x1800,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u03b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc000,0x7800,0xc000,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u03b5 0x0000,0x0000,0xfe00,0x0c00,0x1800,0x3000,0x6000,0xc000,0xc000,0xc000,0xc000,0x7c00,0x0600,0x0600,0x0c00,0x0000, // u03b6 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0600,0x0600,0x0600,0x0000, // u03b7 0x0000,0x0000,0x3c00,0x6600,0x6600,0x6600,0x7e00,0x6600,0x6600,0x6600,0x6600,0x3c00,0x0000,0x0000,0x0000,0x0000, // u03b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x3000,0x3000,0x3000,0x3000,0x3000,0x1c00,0x0000,0x0000,0x0000,0x0000, // u03b9 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xcc00,0xd800,0xf000,0xd800,0xcc00,0xc600,0x0000,0x0000,0x0000,0x0000, // u03ba 0x0000,0x0000,0x3000,0x3000,0x1800,0x1800,0x3c00,0x3c00,0x6600,0x6600,0xc300,0xc300,0x0000,0x0000,0x0000,0x0000, // u03bb 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xce00,0xf600,0xc000,0xc000,0xc000,0x0000, // u03bc 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0x6c00,0x6c00,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000, // u03bd 0x0000,0x0000,0x7e00,0xc000,0xc000,0xc000,0x7c00,0xc000,0xc000,0xc000,0xc000,0x7c00,0x0600,0x0600,0x0c00,0x0000, // u03be 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u03bf 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u03c0 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xfc00,0xc000,0xc000,0xc000,0x0000, // u03c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc000,0xc000,0xc000,0xc000,0x7c00,0x0600,0x0600,0x0c00,0x0000, // u03c2 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6600,0x6600,0x6600,0x6600,0x6600,0x3c00,0x0000,0x0000,0x0000,0x0000, // u03c3 0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x0e00,0x0000,0x0000,0x0000,0x0000, // u03c4 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u03c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x4c00,0xd600,0xd600,0xd600,0xd600,0xd600,0x7c00,0x1000,0x1000,0x1000,0x0000, // u03c6 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0x6c00,0x6c00,0x3800,0x3800,0x6c00,0x6c00,0xc600,0xc600,0x0000, // u03c7 0x0000,0x0000,0x0000,0x0000,0x0000,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0x7c00,0x1000,0x1000,0x1000,0x0000, // u03c8 0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0xc600,0xd600,0xd600,0xd600,0xfe00,0x6c00,0x0000,0x0000,0x0000,0x0000, // u03c9 0x0000,0x0000,0xd800,0xd800,0x0000,0x7000,0x3000,0x3000,0x3000,0x3000,0x3000,0x1c00,0x0000,0x0000,0x0000,0x0000, // u03ca 0x0000,0x0000,0x6c00,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u03cb 0x0000,0x0000,0x1800,0x3000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u03cc 0x0000,0x0000,0x1800,0x3000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u03cd 0x0000,0x0000,0x1800,0x3000,0x0000,0x4400,0xc600,0xd600,0xd600,0xd600,0xfe00,0x6c00,0x0000,0x0000,0x0000,0x0000, // u03ce 0x0000,0x0000,0x3c00,0x6600,0x6600,0x6600,0x3f00,0x0600,0xe600,0x6600,0x6600,0x3c00,0x0000,0x0000,0x0000,0x0000, // u03d1 0x0000,0x0000,0x0000,0x0000,0x1000,0x7c00,0xd600,0xd600,0xd600,0xd600,0xd600,0x7c00,0x1000,0x0000,0x0000,0x0000, // u03d5 0x0000,0x0000,0x0000,0x0000,0x0000,0xe300,0x3600,0x1c00,0x1800,0x3800,0x6c00,0xc700,0x0000,0x0000,0x0000,0x0000, // u03f0 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xfc00,0xc000,0xc000,0x7c00,0x0000, // u03f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc000,0xc000,0xc000,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u03f2 0x0000,0x0000,0x0600,0x0600,0x0000,0x0e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x6600,0x6600,0x3c00,0x0000, // u03f3 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u03f4 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x6000,0xc000,0xfc00,0xc000,0x6000,0x3e00,0x0000,0x0000,0x0000,0x0000, // u03f5 0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0x0c00,0x0600,0x7e00,0x0600,0x0c00,0xf800,0x0000,0x0000,0x0000,0x0000, // u03f6 0x3000,0x1800,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u0400 0x6c00,0x6c00,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u0401 0x0000,0x0000,0xf000,0x6000,0x6000,0x7c00,0x6600,0x6600,0x6600,0x6600,0x6600,0x6c00,0x0000,0x0000,0x0000,0x0000, // u0402 0x1800,0x3000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0x0000,0x0000,0x0000,0x0000, // u0403 0x0000,0x0000,0x7c00,0xc600,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0404 0x0000,0x0000,0x7c00,0xc600,0xc000,0xc000,0x7c00,0x0600,0x0600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0405 0x0000,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0406 0x6600,0x6600,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0407 0x0000,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xcc00,0xcc00,0x7800,0x0000,0x0000,0x0000,0x0000, // u0408 0x0000,0x0000,0x3000,0x7000,0xd000,0xdc00,0xd600,0xd600,0xd600,0xd600,0xd600,0x9c00,0x0000,0x0000,0x0000,0x0000, // u0409 0x0000,0x0000,0xd000,0xd000,0xd000,0xdc00,0xf600,0xd600,0xd600,0xd600,0xd600,0xdc00,0x0000,0x0000,0x0000,0x0000, // u040a 0x0000,0x0000,0xf000,0x6000,0x6000,0x7c00,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000, // u040b 0x1800,0x3000,0xc600,0xc600,0xcc00,0xd800,0xf000,0xf000,0xd800,0xcc00,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u040c 0x3000,0x1800,0xc600,0xc600,0xc600,0xce00,0xde00,0xf600,0xe600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u040d 0x6c00,0x3800,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x0600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u040e 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xfe00,0x3800,0x3800,0x0000,0x0000, // u040f 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u0410 0x0000,0x0000,0xfc00,0xc000,0xc000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xfc00,0x0000,0x0000,0x0000,0x0000, // u0411 0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xfc00,0xc600,0xc600,0xc600,0xc600,0xfc00,0x0000,0x0000,0x0000,0x0000, // u0412 0x0000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0x0000,0x0000,0x0000,0x0000, // u0413 0x0000,0x0000,0x3e00,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0xff00,0xc300,0x0000,0x0000,0x0000, // u0414 0x0000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u0415 0x0000,0x0000,0xd600,0xd600,0xd600,0x7c00,0x3800,0x7c00,0xd600,0xd600,0xd600,0xd600,0x0000,0x0000,0x0000,0x0000, // u0416 0x0000,0x0000,0x7c00,0xc600,0xc600,0x0600,0x3c00,0x0600,0x0600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0417 0x0000,0x0000,0xc600,0xc600,0xc600,0xce00,0xde00,0xf600,0xe600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u0418 0x6c00,0x3800,0xc600,0xc600,0xc600,0xce00,0xde00,0xf600,0xe600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u0419 0x0000,0x0000,0xc600,0xc600,0xcc00,0xd800,0xf000,0xf000,0xd800,0xcc00,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u041a 0x0000,0x0000,0x1e00,0x3600,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0xc600,0x0000,0x0000,0x0000,0x0000, // u041b 0x0000,0x0000,0x8200,0xc600,0xee00,0xfe00,0xd600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u041c 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u041d 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u041e 0x0000,0x0000,0xfe00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u041f 0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xfc00,0xc000,0xc000,0xc000,0xc000,0x0000,0x0000,0x0000,0x0000, // u0420 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc000,0xc000,0xc000,0xc000,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0421 0x0000,0x0000,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u0422 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x0600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0423 0x0000,0x1000,0x7c00,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0x7c00,0x1000,0x0000,0x0000,0x0000, // u0424 0x0000,0x0000,0xc600,0xc600,0x6c00,0x6c00,0x3800,0x3800,0x6c00,0x6c00,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u0425 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7f00,0x0300,0x0300,0x0000,0x0000, // u0426 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u0427 0x0000,0x0000,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0428 0x0000,0x0000,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0x7f00,0x0300,0x0300,0x0000,0x0000, // u0429 0x0000,0x0000,0xe000,0x6000,0x6000,0x7c00,0x6600,0x6600,0x6600,0x6600,0x6600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u042a 0x0000,0x0000,0xc600,0xc600,0xc600,0xe600,0xd600,0xd600,0xd600,0xd600,0xd600,0xe600,0x0000,0x0000,0x0000,0x0000, // u042b 0x0000,0x0000,0x6000,0x6000,0x6000,0x7c00,0x6600,0x6600,0x6600,0x6600,0x6600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u042c 0x0000,0x0000,0x7c00,0xc600,0x0600,0x0600,0x3e00,0x0600,0x0600,0x0600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u042d 0x0000,0x0000,0xcc00,0xd600,0xd600,0xd600,0xd600,0xf600,0xd600,0xd600,0xd600,0xcc00,0x0000,0x0000,0x0000,0x0000, // u042e 0x0000,0x0000,0x7e00,0xc600,0xc600,0xc600,0xc600,0x7e00,0x1e00,0x3600,0x6600,0xc600,0x0000,0x0000,0x0000,0x0000, // u042f 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0600,0x7e00,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0430 0x0000,0x0000,0x7c00,0xc000,0xc000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xfc00,0x0000,0x0000,0x0000,0x0000, // u0431 0x0000,0x0000,0x7800,0xcc00,0xcc00,0xc800,0xfc00,0xc600,0xc600,0xc600,0xc600,0xfc00,0x0000,0x0000,0x0000,0x0000, // u0432 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0x0000,0x0000,0x0000,0x0000, // u0433 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x7c00,0x0000, // u0434 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0435 0x0000,0x0000,0x0000,0x0000,0x0000,0xd600,0xd600,0x7c00,0x3800,0x7c00,0xd600,0xd600,0x0000,0x0000,0x0000,0x0000, // u0436 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0x0600,0x3c00,0x0600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0437 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0438 0x0000,0x0000,0x6c00,0x3800,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0439 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xcc00,0xd800,0xf000,0xd800,0xcc00,0xc600,0x0000,0x0000,0x0000,0x0000, // u043a 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x6600,0x6600,0x6600,0x6600,0x6600,0xc600,0x0000,0x0000,0x0000,0x0000, // u043b 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xee00,0xfe00,0xd600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u043c 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u043d 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u043e 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u043f 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xfc00,0xc000,0xc000,0xc000,0x0000, // u0440 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc000,0xc000,0xc000,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0441 0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u0442 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x7c00,0x0000, // u0443 0x0000,0x0000,0x0000,0x0000,0x1000,0x7c00,0xd600,0xd600,0xd600,0xd600,0xd600,0x7c00,0x1000,0x0000,0x0000,0x0000, // u0444 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0x6c00,0x3800,0x6c00,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u0445 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7f00,0x0300,0x0300,0x0000,0x0000, // u0446 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u0447 0x0000,0x0000,0x0000,0x0000,0x0000,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u0448 0x0000,0x0000,0x0000,0x0000,0x0000,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0x7f00,0x0300,0x0300,0x0000,0x0000, // u0449 0x0000,0x0000,0x0000,0x0000,0x0000,0xe000,0x6000,0x7c00,0x6600,0x6600,0x6600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u044a 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xe600,0xd600,0xd600,0xd600,0xe600,0x0000,0x0000,0x0000,0x0000, // u044b 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x7c00,0x6600,0x6600,0x6600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u044c 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0x0600,0x3e00,0x0600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u044d 0x0000,0x0000,0x0000,0x0000,0x0000,0xcc00,0xd600,0xd600,0xf600,0xd600,0xd600,0xcc00,0x0000,0x0000,0x0000,0x0000, // u044e 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0xc600,0xc600,0x7e00,0x3600,0x6600,0xc600,0x0000,0x0000,0x0000,0x0000, // u044f 0x0000,0x0000,0x3000,0x1800,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0450 0x0000,0x0000,0x6c00,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0451 0x0000,0x0000,0x6000,0xf800,0x6000,0x7c00,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x0600,0x0600,0x1c00,0x0000, // u0452 0x0000,0x0000,0x1800,0x3000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0x0000,0x0000,0x0000,0x0000, // u0453 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc000,0xf800,0xc000,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0454 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0xc000,0xc000,0x7c00,0x0600,0x0600,0xfc00,0x0000,0x0000,0x0000,0x0000, // u0455 0x0000,0x0000,0x1800,0x1800,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0456 0x0000,0x0000,0x6c00,0x6c00,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u0457 0x0000,0x0000,0x0600,0x0600,0x0000,0x0e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x6600,0x6600,0x3c00,0x0000, // u0458 0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0xd000,0xdc00,0xd600,0xd600,0xd600,0x9c00,0x0000,0x0000,0x0000,0x0000, // u0459 0x0000,0x0000,0x0000,0x0000,0x0000,0xd000,0xd000,0xdc00,0xf600,0xd600,0xd600,0xdc00,0x0000,0x0000,0x0000,0x0000, // u045a 0x0000,0x0000,0x6000,0xf800,0x6000,0x7c00,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000, // u045b 0x0000,0x0000,0x1800,0x3000,0x0000,0xc600,0xcc00,0xd800,0xf000,0xd800,0xcc00,0xc600,0x0000,0x0000,0x0000,0x0000, // u045c 0x0000,0x0000,0x3000,0x1800,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u045d 0x0000,0x0000,0x6c00,0x3800,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x7c00,0x0000, // u045e 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xfe00,0x3800,0x3800,0x0000,0x0000, // u045f 0x0000,0x0000,0x6000,0xf800,0x6000,0x7c00,0x6600,0x6600,0x6600,0x6600,0x6600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0462 0x0000,0x0000,0x6000,0x6000,0xf800,0x6000,0x6000,0x7c00,0x6600,0x6600,0x6600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u0463 0x0000,0x0000,0xfe00,0xc600,0x6c00,0x6c00,0x3800,0x7c00,0xd600,0xd600,0xd600,0xd600,0x0000,0x0000,0x0000,0x0000, // u046a 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x6c00,0x2800,0x3800,0x7c00,0xd600,0xd600,0x0000,0x0000,0x0000,0x0000, // u046b 0x0600,0x0600,0xfe00,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0x0000,0x0000,0x0000,0x0000, // u0490 0x0000,0x0000,0x0000,0x0600,0x0600,0xfe00,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0x0000,0x0000,0x0000,0x0000, // u0491 0x0000,0x0000,0x7f00,0x6000,0x6000,0x6000,0xfc00,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, // u0492 0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6000,0x6000,0xfc00,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, // u0493 0x0000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xc000,0xfc00,0xc600,0xc600,0xc600,0xc600,0x0600,0x0c00,0x0000,0x0000, // u0494 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xc000,0xc000,0xf800,0xcc00,0xcc00,0xcc00,0x0c00,0x1800,0x0000,0x0000, // u0495 0x0000,0x0000,0xd600,0xd600,0xd600,0x7c00,0x3800,0x7c00,0xd600,0xd600,0xd600,0xd700,0x0300,0x0300,0x0000,0x0000, // u0496 0x0000,0x0000,0x0000,0x0000,0x0000,0xd600,0xd600,0x7c00,0x3800,0x7c00,0xd600,0xd700,0x0300,0x0300,0x0000,0x0000, // u0497 0x0000,0x0000,0x7c00,0xc600,0xc600,0x0600,0x3c00,0x0600,0x0600,0xc600,0xc600,0x7c00,0x3000,0x3000,0x3000,0x0000, // u0498 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0x0600,0x3c00,0x0600,0xc600,0x7c00,0x3000,0x3000,0x3000,0x0000, // u0499 0x0000,0x0000,0xc600,0xc600,0xcc00,0xd800,0xf000,0xf000,0xd800,0xcc00,0xc600,0xc700,0x0300,0x0300,0x0000,0x0000, // u049a 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xcc00,0xd800,0xf000,0xd800,0xcc00,0xc700,0x0300,0x0300,0x0000,0x0000, // u049b 0x0000,0x0000,0xc600,0xc600,0xd600,0xdc00,0xf800,0xf800,0xdc00,0xd600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u049c 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xd600,0xdc00,0xf800,0xdc00,0xd600,0xc600,0x0000,0x0000,0x0000,0x0000, // u049d 0x0000,0x0000,0xe300,0xe300,0x6600,0x6c00,0x7800,0x7800,0x6c00,0x6600,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000, // u04a0 0x0000,0x0000,0x0000,0x0000,0x0000,0xe300,0x6600,0x6c00,0x7800,0x6c00,0x6600,0x6300,0x0000,0x0000,0x0000,0x0000, // u04a1 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0xc700,0x0300,0x0300,0x0000,0x0000, // u04a2 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc700,0x0300,0x0300,0x0000,0x0000, // u04a3 0x0000,0x0000,0xcf00,0xcc00,0xcc00,0xcc00,0xfc00,0xcc00,0xcc00,0xcc00,0xcc00,0xcc00,0x0000,0x0000,0x0000,0x0000, // u04a4 0x0000,0x0000,0x0000,0x0000,0x0000,0xcf00,0xcc00,0xcc00,0xfc00,0xcc00,0xcc00,0xcc00,0x0000,0x0000,0x0000,0x0000, // u04a5 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc000,0xc000,0xc000,0xc000,0xc600,0xc600,0x7c00,0x3000,0x3000,0x3000,0x0000, // u04aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc000,0xc000,0xc000,0xc600,0x7c00,0x3000,0x3000,0x3000,0x0000, // u04ab 0x0000,0x0000,0xc300,0xc300,0x6600,0x6600,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u04ae 0x0000,0x0000,0x0000,0x0000,0x0000,0xc300,0xc300,0x6600,0x6600,0x3c00,0x3c00,0x1800,0x1800,0x1800,0x1800,0x0000, // u04af 0x0000,0x0000,0xc300,0xc300,0x6600,0x6600,0x3c00,0x1800,0x7e00,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u04b0 0x0000,0x0000,0x0000,0x0000,0x0000,0xc300,0xc300,0x6600,0x6600,0x3c00,0x3c00,0x1800,0x7e00,0x1800,0x1800,0x0000, // u04b1 0x0000,0x0000,0xc600,0xc600,0x6c00,0x6c00,0x3800,0x3800,0x6c00,0x6c00,0xc600,0xc700,0x0300,0x0300,0x0000,0x0000, // u04b2 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0x6c00,0x3800,0x6c00,0xc600,0xc700,0x0300,0x0300,0x0000,0x0000, // u04b3 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x0600,0x0700,0x0300,0x0300,0x0000,0x0000, // u04b6 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x0700,0x0300,0x0300,0x0000,0x0000, // u04b7 0x0000,0x0000,0xc600,0xc600,0xc600,0xd600,0xd600,0x7e00,0x1600,0x1600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u04b8 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xd600,0xd600,0x7e00,0x1600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u04b9 0x0000,0x0000,0xc000,0xc000,0xc000,0xc000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u04ba 0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0xc000,0xfc00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u04bb 0x0000,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u04c0 0x6c00,0x3800,0x0000,0xd600,0xd600,0xd600,0x7c00,0x3800,0x7c00,0xd600,0xd600,0xd600,0x0000,0x0000,0x0000,0x0000, // u04c1 0x0000,0x0000,0x6c00,0x3800,0x0000,0xd600,0xd600,0x7c00,0x3800,0x7c00,0xd600,0xd600,0x0000,0x0000,0x0000,0x0000, // u04c2 0x0000,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u04cf 0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u04d0 0x0000,0x0000,0x6c00,0x3800,0x0000,0x7c00,0x0600,0x7e00,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u04d1 0x6c00,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u04d2 0x0000,0x0000,0x6c00,0x6c00,0x0000,0x7c00,0x0600,0x7e00,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u04d3 0x0000,0x0000,0x7e00,0xd800,0xd800,0xd800,0xfe00,0xd800,0xd800,0xd800,0xd800,0xde00,0x0000,0x0000,0x0000,0x0000, // u04d4 0x0000,0x0000,0x0000,0x0000,0x0000,0x6c00,0x1600,0x1600,0x7e00,0xd000,0xd000,0x6c00,0x0000,0x0000,0x0000,0x0000, // u04d5 0x6c00,0x3800,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u04d6 0x0000,0x0000,0x6c00,0x3800,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x0000,0x0000,0x0000, // u04d7 0x0000,0x0000,0x7c00,0xc600,0x0600,0x0600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u04d8 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0600,0x0600,0xfe00,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u04d9 0x6c00,0x6c00,0x0000,0x7c00,0xc600,0x0600,0x0600,0xfe00,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u04da 0x0000,0x0000,0x6c00,0x6c00,0x0000,0x7c00,0x0600,0x0600,0xfe00,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u04db 0x6c00,0x6c00,0x0000,0xd600,0xd600,0xd600,0x7c00,0x3800,0x7c00,0xd600,0xd600,0xd600,0x0000,0x0000,0x0000,0x0000, // u04dc 0x0000,0x0000,0x6c00,0x6c00,0x0000,0xd600,0xd600,0x7c00,0x3800,0x7c00,0xd600,0xd600,0x0000,0x0000,0x0000,0x0000, // u04dd 0x6c00,0x6c00,0x0000,0x7c00,0xc600,0xc600,0x0600,0x3c00,0x0600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u04de 0x0000,0x0000,0x6c00,0x6c00,0x0000,0x7c00,0xc600,0x0600,0x3c00,0x0600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u04df 0x7c00,0x0000,0xc600,0xc600,0xc600,0xce00,0xde00,0xf600,0xe600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u04e2 0x0000,0x0000,0x0000,0x7c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u04e3 0x6c00,0x6c00,0x0000,0xc600,0xc600,0xc600,0xce00,0xde00,0xf600,0xe600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u04e4 0x0000,0x0000,0x6c00,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x0000,0x0000,0x0000, // u04e5 0x6c00,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u04e6 0x0000,0x0000,0x6c00,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u04e7 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u04e8 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u04e9 0x6c00,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u04ea 0x0000,0x0000,0x6c00,0x6c00,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u04eb 0x6c00,0x6c00,0x0000,0x7c00,0xc600,0x0600,0x0600,0x3e00,0x0600,0x0600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u04ec 0x0000,0x0000,0x6c00,0x6c00,0x0000,0x7c00,0xc600,0x0600,0x3e00,0x0600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u04ed 0x7c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x0600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u04ee 0x0000,0x0000,0x0000,0x7c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x7c00,0x0000, // u04ef 0x6c00,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x0600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u04f0 0x0000,0x0000,0x6c00,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x7c00,0x0000, // u04f1 0x3600,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x0600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u04f2 0x0000,0x0000,0x3600,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x7c00,0x0000, // u04f3 0x6c00,0x6c00,0x0000,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u04f4 0x0000,0x0000,0x6c00,0x6c00,0x0000,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u04f5 0x6c00,0x6c00,0x0000,0xc600,0xc600,0xc600,0xe600,0xd600,0xd600,0xd600,0xd600,0xe600,0x0000,0x0000,0x0000,0x0000, // u04f8 0x0000,0x0000,0x6c00,0x6c00,0x0000,0xc600,0xc600,0xe600,0xd600,0xd600,0xd600,0xe600,0x0000,0x0000,0x0000,0x0000, // u04f9 0x0000,0x0000,0xc600,0xc600,0x6600,0x6600,0x3c00,0x7800,0xcc00,0xcc00,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u05d0 0x0000,0x0000,0xfc00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xff00,0x0000,0x0000,0x0000,0x0000, // u05d1 0x0000,0x0000,0x7800,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x3600,0x6300,0xc300,0x0000,0x0000,0x0000,0x0000, // u05d2 0x0000,0x0000,0xff00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u05d3 0x0000,0x0000,0xfc00,0x0600,0x0600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u05d4 0x0000,0x0000,0x7000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u05d5 0x0000,0x0000,0x7e00,0x0c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u05d6 0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u05d7 0x0000,0x0000,0xcc00,0xce00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u05d8 0x0000,0x0000,0x7000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d9 0x0000,0x0000,0xfc00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000, // u05da 0x0000,0x0000,0xfc00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfc00,0x0000,0x0000,0x0000,0x0000, // u05db 0xc000,0xc000,0xfe00,0x0600,0x0600,0x0600,0x0600,0x0c00,0x1800,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, // u05dc 0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xfe00,0x0000,0x0000,0x0000,0x0000, // u05dd 0x0000,0x0000,0xdc00,0x7600,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x6e00,0x0000,0x0000,0x0000,0x0000, // u05de 0x0000,0x0000,0xf000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u05df 0x0000,0x0000,0x7800,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x7c00,0x0000,0x0000,0x0000,0x0000, // u05e0 0x0000,0x0000,0xfc00,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x3c00,0x0000,0x0000,0x0000,0x0000, // u05e1 0x0000,0x0000,0xc600,0xc600,0xc600,0x6600,0x6600,0x3600,0x3600,0x1c00,0x3800,0xe000,0x0000,0x0000,0x0000,0x0000, // u05e2 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0x6600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000, // u05e3 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0x6600,0x0600,0x0600,0x0600,0x0600,0xfc00,0x0000,0x0000,0x0000,0x0000, // u05e4 0x0000,0x0000,0x6300,0x6300,0x3300,0x3600,0x1c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000, // u05e5 0x0000,0x0000,0xc600,0xc600,0x6600,0x6c00,0x3800,0x3000,0x1800,0x1800,0x0c00,0xfc00,0x0000,0x0000,0x0000,0x0000, // u05e6 0x0000,0x0000,0xfe00,0x0600,0x0600,0xc600,0xc600,0xcc00,0xd800,0xd800,0xd800,0xd800,0xc000,0xc000,0xc000,0x0000, // u05e7 0x0000,0x0000,0xfc00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u05e8 0x0000,0x0000,0xd600,0xd600,0xd600,0xd600,0xd600,0xe600,0xc600,0xc600,0xcc00,0xf800,0x0000,0x0000,0x0000,0x0000, // u05e9 0x0000,0x0000,0xfc00,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0xc600,0x0000,0x0000,0x0000,0x0000, // u05ea 0x0000,0x0000,0xf800,0xcc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xcc00,0xf800,0x0000,0x3000,0x3000,0x0000, // u1e0c 0x0000,0x0000,0x0600,0x0600,0x0600,0x7e00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x1800,0x1800,0x0000, // u1e0d 0x0000,0x0000,0xc600,0xc600,0xcc00,0xd800,0xf000,0xf000,0xd800,0xcc00,0xc600,0xc600,0x0000,0x7c00,0x0000,0x0000, // u1e34 0x0000,0x0000,0xc000,0xc000,0xc000,0xc600,0xcc00,0xd800,0xf000,0xd800,0xcc00,0xc600,0x0000,0x7c00,0x0000,0x0000, // u1e35 0x0000,0x0000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xfe00,0x0000,0x1800,0x1800,0x0000, // u1e36 0x0000,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x1800,0x1800,0x0000, // u1e37 0x1800,0x1800,0x8200,0xc600,0xee00,0xfe00,0xd600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u1e40 0x0000,0x0000,0x3000,0x3000,0x0000,0xfc00,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0x0000,0x0000,0x0000,0x0000, // u1e41 0x0000,0x0000,0x8200,0xc600,0xee00,0xfe00,0xd600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x1800,0x1800,0x0000, // u1e42 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xd600,0xd600,0xd600,0xd600,0xd600,0xd600,0x0000,0x1800,0x1800,0x0000, // u1e43 0x1800,0x1800,0xc600,0xc600,0xc600,0xe600,0xf600,0xde00,0xce00,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u1e44 0x0000,0x0000,0x3000,0x3000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u1e45 0x0000,0x0000,0xc600,0xc600,0xc600,0xe600,0xf600,0xde00,0xce00,0xc600,0xc600,0xc600,0x0000,0x1800,0x1800,0x0000, // u1e46 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x1800,0x1800,0x0000, // u1e47 0x0000,0x0000,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x1800,0x1800,0x0000, // u1e6c 0x0000,0x0000,0x3000,0x3000,0x3000,0xfc00,0x3000,0x3000,0x3000,0x3000,0x3000,0x1e00,0x0000,0x0c00,0x0c00,0x0000, // u1e6d 0x0000,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xc000,0xfe00,0x0000,0x1800,0x1800,0x0000, // u1eb8 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x1800,0x1800,0x0000, // u1eb9 0x7600,0xdc00,0x0000,0xfe00,0xc000,0xc000,0xc000,0xf800,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u1ebc 0x0000,0x0000,0x7600,0xdc00,0x0000,0x7c00,0xc600,0xc600,0xfe00,0xc000,0xc000,0x7c00,0x0000,0x0000,0x0000,0x0000, // u1ebd 0x0000,0x0000,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x1800,0x1800,0x0000, // u1eca 0x0000,0x0000,0x1800,0x1800,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x1800,0x1800,0x0000, // u1ecb 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x1800,0x1800,0x0000, // u1ecc 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x1800,0x1800,0x0000, // u1ecd 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x1800,0x1800,0x0000, // u1ee4 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0000,0x1800,0x1800,0x0000, // u1ee5 0x7600,0xdc00,0x0000,0xc300,0xc300,0x6600,0x6600,0x3c00,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u1ef8 0x0000,0x0000,0x7600,0xdc00,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7e00,0x0600,0x0600,0x7c00,0x0000, // u1ef9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2001 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2002 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2003 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2004 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2005 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2006 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2007 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2008 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2009 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2010 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2011 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2012 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2013 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2014 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2015 0x0000,0x0000,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x0000,0x0000,0x0000,0x0000, // u2016 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0000,0xfe00, // u2017 0x0000,0x1800,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2018 0x0000,0x1800,0x1800,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2019 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x3000,0x0000,0x0000,0x0000, // u201a 0x0000,0x3000,0x3000,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201b 0x0000,0x6600,0xcc00,0xcc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201c 0x0000,0x3300,0x3300,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0xcc00,0x0000,0x0000,0x0000, // u201e 0x0000,0xcc00,0xcc00,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201f 0x0000,0x0000,0x1800,0x1800,0x7e00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u2020 0x0000,0x0000,0x1800,0x1800,0x7e00,0x1800,0x1800,0x1800,0x1800,0x7e00,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u2021 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x3c00,0x3c00,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2022 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xdb00,0xdb00,0x0000,0x0000,0x0000,0x0000, // u2026 0x0000,0x0000,0xec00,0xac00,0xf800,0x1800,0x3000,0x3000,0x6000,0x7f00,0xd500,0xdf00,0x0000,0x0000,0x0000,0x0000, // u2030 0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2032 0x0000,0x6600,0x6600,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2033 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x1800,0x3000,0x6000,0x3000,0x1800,0x0c00,0x0000,0x0000,0x0000,0x0000, // u2039 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x3000,0x1800,0x0c00,0x1800,0x3000,0x6000,0x0000,0x0000,0x0000,0x0000, // u203a 0x0000,0x0000,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000, // u203c 0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u203e 0x0000,0x3800,0x6c00,0x6c00,0x6c00,0x6c00,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2070 0x1800,0x0000,0x3800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2071 0x0000,0x0c00,0x1c00,0x3400,0x7e00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2074 0x0000,0x7800,0x6000,0x7800,0x0c00,0x0c00,0x7800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2075 0x0000,0x3800,0x6000,0x7800,0x6c00,0x6c00,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2076 0x0000,0x7c00,0x0c00,0x1800,0x1800,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2077 0x0000,0x3800,0x6c00,0x3800,0x6c00,0x6c00,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2078 0x0000,0x3800,0x6c00,0x6c00,0x3c00,0x0c00,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2079 0x0000,0x0000,0x1800,0x1800,0x7e00,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207a 0x0000,0x0000,0x0000,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207b 0x0000,0x0000,0x0000,0x7c00,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207c 0x0000,0x1800,0x3000,0x3000,0x3000,0x3000,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207d 0x0000,0x3000,0x1800,0x1800,0x1800,0x1800,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207e 0x0000,0x0000,0x7800,0x6c00,0x6c00,0x6c00,0x6c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x6c00,0x6c00,0x6c00,0x6c00,0x3800,0x0000,0x0000,0x0000, // u2080 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x3800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000, // u2081 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x6c00,0x0c00,0x1800,0x3000,0x7c00,0x0000,0x0000,0x0000, // u2082 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7800,0x0c00,0x3800,0x0c00,0x0c00,0x7800,0x0000,0x0000,0x0000, // u2083 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x1c00,0x3400,0x7e00,0x0c00,0x0c00,0x0000,0x0000,0x0000, // u2084 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7800,0x6000,0x7800,0x0c00,0x0c00,0x7800,0x0000,0x0000,0x0000, // u2085 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x6000,0x7800,0x6c00,0x6c00,0x3800,0x0000,0x0000,0x0000, // u2086 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0c00,0x1800,0x1800,0x3000,0x3000,0x0000,0x0000,0x0000, // u2087 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x6c00,0x3800,0x6c00,0x6c00,0x3800,0x0000,0x0000,0x0000, // u2088 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x6c00,0x6c00,0x3c00,0x0c00,0x3800,0x0000,0x0000,0x0000, // u2089 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x7e00,0x1800,0x1800,0x0000,0x0000,0x0000, // u208a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u208b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000, // u208c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x3000,0x3000,0x3000,0x3000,0x1800,0x0000,0x0000,0x0000, // u208d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x1800,0x1800,0x1800,0x1800,0x3000,0x0000,0x0000,0x0000, // u208e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x0c00,0x3c00,0x6c00,0x3c00,0x0000,0x0000,0x0000, // u2090 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x6c00,0x7c00,0x6000,0x3c00,0x0000,0x0000,0x0000, // u2091 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x6c00,0x6c00,0x6c00,0x3800,0x0000,0x0000,0x0000, // u2092 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x3c00,0x1800,0x3c00,0x6600,0x0000,0x0000,0x0000, // u2093 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7800,0x0c00,0x7c00,0x6c00,0x3800,0x0000,0x0000,0x0000, // u2094 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x7800,0x6c00,0x6c00,0x6c00,0x6c00,0x0000,0x0000,0x0000, // u2095 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6600,0x6c00,0x7800,0x6c00,0x6600,0x0000,0x0000,0x0000, // u2096 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000, // u2097 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xd600,0xd600,0xd600,0xd600,0x0000,0x0000,0x0000, // u2098 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7800,0x6c00,0x6c00,0x6c00,0x7800,0x6000,0x6000,0x0000, // u209a 0x0000,0x0000,0xf800,0xcc00,0xcc00,0xcc00,0xfa00,0xc600,0xcf00,0xc600,0xc600,0xc300,0x0000,0x0000,0x0000,0x0000, // u20a7 0x0000,0x0000,0xf200,0x8a00,0x8a00,0xaa00,0xaa00,0xaa00,0xaa00,0xa200,0xa200,0xbc00,0x0000,0x0000,0x0000,0x0000, // u20aa 0x0000,0x0000,0x0000,0x1e00,0x3300,0x6000,0xfc00,0x6000,0xfc00,0x6000,0x3300,0x1e00,0x0000,0x0000,0x0000,0x0000, // u20ac 0x0000,0x0000,0xff00,0x1800,0x1800,0x1e00,0x7800,0x1e00,0x7800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u20ae 0x0000,0x0000,0x3c00,0x5200,0x5200,0x5000,0x5000,0x5000,0x5000,0x5200,0x5200,0x3c00,0x0000,0x0000,0x0000,0x0000, // u2102 0x0000,0x0000,0xc000,0xc000,0xc000,0xfc00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u210e 0x0000,0x0000,0x6000,0xf800,0x6000,0x7c00,0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000, // u210f 0x0000,0x0000,0x4200,0x4200,0x6200,0x5200,0x6a00,0x5600,0x4a00,0x4600,0x4200,0x4200,0x0000,0x0000,0x0000,0x0000, // u2115 0x0000,0x0000,0x9600,0x9600,0x9600,0xd000,0xf000,0xf000,0xb000,0x9600,0x9000,0x9600,0x0000,0x0000,0x0000,0x0000, // u2116 0x0000,0x0000,0x3c00,0x5200,0x5200,0x5200,0x5200,0x5200,0x5200,0x5200,0x5a00,0x3c00,0x0600,0x0000,0x0000,0x0000, // u211a 0x0000,0x0000,0xf800,0xa400,0xa400,0xa400,0xa400,0xb800,0xa800,0xb400,0xaa00,0xe600,0x0000,0x0000,0x0000,0x0000, // u211d 0x0000,0x0000,0xfb00,0x5500,0x5500,0x5100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2122 0x0000,0x0000,0x7e00,0x0200,0x0600,0x0a00,0x1400,0x2800,0x5000,0x6000,0x4000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u2124 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x6c00,0x6c00,0xee00,0x0000,0x0000,0x0000,0x0000, // u2126 0x0000,0x0000,0x6600,0x6600,0x3300,0x3300,0x3e00,0x7c00,0xcc00,0xcc00,0xc600,0x6600,0x0000,0x0000,0x0000,0x0000, // u2135 0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x6000,0xfe00,0xfe00,0x6000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2190 0x0000,0x0000,0x1800,0x3c00,0x7e00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u2191 0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0c00,0xfe00,0xfe00,0x0c00,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000, // u2192 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x7e00,0x3c00,0x1800,0x0000,0x0000,0x0000,0x0000, // u2193 0x0000,0x0000,0x0000,0x0000,0x0000,0x2400,0x6600,0xff00,0xff00,0x6600,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2194 0x0000,0x0000,0x1800,0x3c00,0x7e00,0x1800,0x1800,0x1800,0x1800,0x7e00,0x3c00,0x1800,0x0000,0x0000,0x0000,0x0000, // u2195 0x0000,0x0000,0x0000,0x0000,0x0000,0x2200,0x6200,0xfe00,0xfe00,0x6200,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x8800,0x8c00,0xfe00,0xfe00,0x8c00,0x8800,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a6 0x0000,0x0000,0x1800,0x3c00,0x7e00,0x1800,0x1800,0x1800,0x7e00,0x3c00,0x1800,0x7e00,0x0000,0x0000,0x0000,0x0000, // u21a8 0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x2600,0x6600,0xfe00,0xfe00,0x6000,0x2000,0x0000,0x0000,0x0000,0x0000, // u21b5 0x0000,0x0000,0x0000,0xf800,0x3800,0x6800,0xcb00,0xc300,0xc300,0x6600,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u21bb 0x0000,0x0000,0x0000,0x2000,0x6000,0xfe00,0xfe00,0x0000,0xfe00,0xfe00,0x0c00,0x0800,0x0000,0x0000,0x0000,0x0000, // u21cb 0x0000,0x0000,0x0000,0x0800,0x0c00,0xfe00,0xfe00,0x0000,0xfe00,0xfe00,0x6000,0x2000,0x0000,0x0000,0x0000,0x0000, // u21cc 0x0000,0x0000,0x0000,0x0000,0x1000,0x3e00,0x7e00,0xe000,0x7e00,0x3e00,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d0 0x0000,0x0000,0x1000,0x3800,0x7c00,0xee00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x0000,0x0000,0x0000,0x0000, // u21d1 0x0000,0x0000,0x0000,0x0000,0x1000,0xf800,0xfc00,0x0e00,0xfc00,0xf800,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d2 0x0000,0x0000,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0xee00,0x7c00,0x3800,0x1000,0x0000,0x0000,0x0000,0x0000, // u21d3 0x0000,0x0000,0x0000,0x0000,0x2400,0x7e00,0xff00,0xc300,0xff00,0x7e00,0x2400,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d4 0x0000,0x0000,0x1000,0x3800,0x7c00,0xee00,0x6c00,0x6c00,0xee00,0x7c00,0x3800,0x1000,0x0000,0x0000,0x0000,0x0000, // u21d5 0x0000,0x0000,0xc600,0xc600,0xc600,0xfe00,0x6c00,0x6c00,0x6c00,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000, // u2200 0x0000,0x0000,0x0000,0xfe00,0x0600,0x0600,0x0600,0xfe00,0x0600,0x0600,0x0600,0xfe00,0x0000,0x0000,0x0000,0x0000, // u2203 0x0000,0x0000,0x0c00,0xfe00,0x1e00,0x1600,0x3600,0xfe00,0x3600,0x6600,0x6600,0xfe00,0xc000,0x0000,0x0000,0x0000, // u2204 0x0000,0x0000,0x0600,0x0c00,0x7c00,0xce00,0xde00,0xf600,0xe600,0x7c00,0x6000,0xc000,0x0000,0x0000,0x0000,0x0000, // u2205 0x0000,0x0000,0x1000,0x1000,0x3800,0x3800,0x6c00,0x6c00,0x6c00,0xc600,0xc600,0xfe00,0x0000,0x0000,0x0000,0x0000, // u2206 0x0000,0x0000,0xfe00,0xc600,0xc600,0x6c00,0x6c00,0x6c00,0x3800,0x3800,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000, // u2207 0x0000,0x0000,0x0000,0x3e00,0x6000,0xc000,0xc000,0xfe00,0xc000,0xc000,0x6000,0x3e00,0x0000,0x0000,0x0000,0x0000, // u2208 0x0000,0x0000,0x0600,0x3e00,0x6c00,0xcc00,0xd800,0xfe00,0xd800,0xf000,0x7000,0x7e00,0x6000,0x0000,0x0000,0x0000, // u2209 0x0000,0x0000,0x0000,0x0000,0x3e00,0x6000,0xc000,0xfe00,0xc000,0x6000,0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u220a 0x0000,0x0000,0x0000,0xf800,0x0c00,0x0600,0x0600,0xfe00,0x0600,0x0600,0x0c00,0xf800,0x0000,0x0000,0x0000,0x0000, // u220b 0x0000,0x0000,0xc000,0xf800,0x6c00,0x6600,0x3600,0xfe00,0x3600,0x1e00,0x1c00,0xfc00,0x0c00,0x0000,0x0000,0x0000, // u220c 0x0000,0x0000,0x0000,0x0000,0xf800,0x0c00,0x0600,0xfe00,0x0600,0x0c00,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000, // u220d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2212 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0000,0x1800,0x1800,0x7e00,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u2213 0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x0000,0x1800,0x1800,0x7e00,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u2214 0x0000,0x0000,0x0000,0x0000,0x0200,0x0600,0x0c00,0x1800,0x3000,0x6000,0xc000,0x8000,0x0000,0x0000,0x0000,0x0000, // u2215 0x0000,0x0000,0x0000,0x0000,0x8000,0xc000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0200,0x0000,0x0000,0x0000,0x0000, // u2216 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2219 0x0000,0x0e00,0x0c00,0x0c00,0x0c00,0x0c00,0xcc00,0xcc00,0xcc00,0x6c00,0x3c00,0x1c00,0x0000,0x0000,0x0000,0x0000, // u221a 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0xd600,0xd600,0xd600,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u221e 0x0000,0x0000,0x0000,0x0000,0xc000,0xc000,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u221f 0x0000,0x0000,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x0000,0x0000,0x0000,0x0000, // u2225 0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x3c00,0x3c00,0x6600,0x6600,0xc300,0xc300,0x0000,0x0000,0x0000,0x0000, // u2227 0x0000,0x0000,0x0000,0x0000,0xc300,0xc300,0x6600,0x6600,0x3c00,0x3c00,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u2228 0x0000,0x0000,0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u2229 0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u222a 0x0000,0x0000,0x0000,0x0000,0x0000,0x7600,0xdc00,0x0000,0x7600,0xdc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2248 0x0000,0x0000,0x0000,0x0000,0x0600,0xfe00,0x1800,0x3000,0xfe00,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2260 0x0000,0x0000,0x0000,0x0000,0xfe00,0x0000,0x0000,0xfe00,0x0000,0x0000,0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2261 0x0000,0x0000,0x0000,0x0c00,0x1800,0x3000,0x6000,0x3000,0x1800,0x0c00,0x0000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u2264 0x0000,0x0000,0x0000,0x3000,0x1800,0x0c00,0x0600,0x0c00,0x1800,0x3000,0x0000,0x7e00,0x0000,0x0000,0x0000,0x0000, // u2265 0x0000,0x0000,0x0000,0x0900,0x1b00,0x3600,0x6c00,0xd800,0x6c00,0x3600,0x1b00,0x0900,0x0000,0x0000,0x0000,0x0000, // u226a 0x0000,0x0000,0x0000,0x9000,0xd800,0x6c00,0x3600,0x1b00,0x3600,0x6c00,0xd800,0x9000,0x0000,0x0000,0x0000,0x0000, // u226b 0x0000,0x0000,0x0000,0x0000,0x7e00,0xc000,0xc000,0xc000,0xc000,0xc000,0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2282 0x0000,0x0000,0x0000,0x0000,0xfc00,0x0600,0x0600,0x0600,0x0600,0x0600,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2283 0x0000,0x0000,0x0000,0x7e00,0xc000,0xc000,0xc000,0xc000,0xc000,0x7e00,0x0000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u2286 0x0000,0x0000,0x0000,0xfc00,0x0600,0x0600,0x0600,0x0600,0x0600,0xfc00,0x0000,0xfe00,0x0000,0x0000,0x0000,0x0000, // u2287 0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0x0000,0x0000,0x0000,0x0000, // u22a5 0x0000,0x0000,0x7c00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u22c2 0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x7c00,0x0000,0x0000,0x0000,0x0000, // u22c3 0x0000,0x0000,0x0600,0x0c00,0x7c00,0xce00,0xde00,0xf600,0xe600,0x7c00,0x6000,0xc000,0x0000,0x0000,0x0000,0x0000, // u2300 0x0000,0x0000,0x0000,0x0000,0x1000,0x3800,0x6c00,0xc600,0xc600,0xc600,0xc600,0xfe00,0x0000,0x0000,0x0000,0x0000, // u2302 0x0000,0x0000,0x3c00,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, // u2308 0x0000,0x0000,0x3c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000, // u2309 0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3c00,0x0000,0x0000,0x0000,0x0000, // u230a 0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x3c00,0x0000,0x0000,0x0000,0x0000, // u230b 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xc000,0xc000,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2310 0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2319 0x0000,0x0000,0x0e00,0x1b00,0x1b00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2320 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xd800,0xd800,0x7000,0x0000,0x0000,0x0000,0x0000, // u2321 0x0600,0x0c00,0x1800,0x1800,0x3000,0x3000,0x3000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, // u239b 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, // u239c 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x3000,0x3000,0x3000,0x1800,0x1800,0x0c00,0x0600, // u239d 0x6000,0x3000,0x1800,0x1800,0x0c00,0x0c00,0x0c00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u239e 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u239f 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0c00,0x0c00,0x0c00,0x1800,0x1800,0x3000,0x6000, // u23a0 0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, // u23a1 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, // u23a2 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7e00, // u23a3 0x7e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u23a4 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u23a5 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x7e00, // u23a6 0x0f00,0x1800,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, // u23a7 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0xe000,0xe000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, // u23a8 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x1800,0x0f00, // u23a9 0xf000,0x1800,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u23ab 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0700,0x0700,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u23ac 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1800,0xf000, // u23ad 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u23ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23af 0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23ba 0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000, // u23bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00, // u23bd 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u23d0 0x0000,0xcc00,0xcc00,0xfc00,0xcc00,0xcc00,0xcc00,0x0000,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0000, // u2409 0x0000,0xc000,0xc000,0xc000,0xc000,0xc000,0xf800,0x0000,0x3f00,0x3000,0x3c00,0x3000,0x3000,0x3000,0x0000,0x0000, // u240a 0x0000,0xcc00,0xcc00,0xcc00,0xcc00,0x7800,0x3000,0x0000,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0000, // u240b 0x0000,0xfc00,0xc000,0xf000,0xc000,0xc000,0xc000,0x0000,0x3f00,0x3000,0x3c00,0x3000,0x3000,0x3000,0x0000,0x0000, // u240c 0x0000,0x7800,0xcc00,0xc000,0xc000,0xcc00,0x7800,0x0000,0x3e00,0x3300,0x3300,0x3e00,0x3600,0x3300,0x0000,0x0000, // u240d 0x0000,0xcc00,0xec00,0xfc00,0xdc00,0xcc00,0xcc00,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3f00,0x0000,0x0000, // u2424 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2500 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2501 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2502 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2503 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xaa00,0xaa00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2508 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xaa00,0xaa00,0xaa00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2509 0x1800,0x1800,0x1800,0x0000,0x1800,0x1800,0x1800,0x0000,0x1800,0x1800,0x1800,0x0000,0x1800,0x1800,0x1800,0x0000, // u250a 0x3800,0x3800,0x3800,0x0000,0x3800,0x3800,0x3800,0x0000,0x3800,0x3800,0x3800,0x0000,0x3800,0x3800,0x3800,0x0000, // u250b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u250c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x1f00,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u250d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x3f00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u250e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x3f00,0x3f00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u250f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2510 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2511 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2512 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0xf800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2513 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1f00,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2514 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1f00,0x1f00,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2515 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3f00,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2516 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3f00,0x3f00,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2517 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2518 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0xf800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2519 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0xf800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u251a 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0xf800,0xf800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u251b 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1f00,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u251c 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1f00,0x1f00,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u251d 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3f00,0x3f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u251e 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3f00,0x3f00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u251f 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3f00,0x3f00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2520 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3f00,0x3f00,0x3f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2521 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3f00,0x3f00,0x3f00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2522 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3f00,0x3f00,0x3f00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2523 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2524 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0xf800,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2525 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0xf800,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2526 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0xf800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2527 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0xf800,0xf800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2528 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0xf800,0xf800,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2529 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0xf800,0xf800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u252a 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0xf800,0xf800,0xf800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u252b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u252c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u252d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u252e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u252f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2530 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xff00,0xff00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2531 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0xff00,0xff00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2532 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2533 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2534 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2535 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1f00,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2536 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2537 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2538 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0xf800,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2539 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3f00,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u253a 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0xff00,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u253b 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u253c 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u253d 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1f00,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u253e 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u253f 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2540 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0xff00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2541 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0xff00,0xff00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2542 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0xf800,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2543 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3f00,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2544 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0xff00,0xff00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2545 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1f00,0xff00,0xff00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2546 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0xff00,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2547 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0xff00,0xff00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2548 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0xf800,0xff00,0xff00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u2549 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3f00,0xff00,0xff00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u254a 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0xff00,0xff00,0xff00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u254b 0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x0000,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2550 0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, // u2551 0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x1f00,0x1800,0x1f00,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2552 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x7f00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, // u2553 0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x7f00,0x6000,0x6f00,0x6f00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, // u2554 0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0x1800,0xf800,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2555 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, // u2556 0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0x0c00,0xec00,0xec00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, // u2557 0x1800,0x1800,0x1800,0x1800,0x1800,0x1f00,0x1f00,0x1800,0x1f00,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2558 0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x7f00,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2559 0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6f00,0x6f00,0x6000,0x7f00,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255a 0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0xf800,0x1800,0xf800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255b 0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255c 0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0xec00,0xec00,0x0c00,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255d 0x1800,0x1800,0x1800,0x1800,0x1800,0x1f00,0x1f00,0x1800,0x1f00,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u255e 0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6f00,0x6f00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, // u255f 0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6f00,0x6f00,0x6000,0x6f00,0x6f00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, // u2560 0x1800,0x1800,0x1800,0x1800,0x1800,0xf800,0xf800,0x1800,0xf800,0xf800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2561 0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0xec00,0xec00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, // u2562 0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0xec00,0xec00,0x0c00,0xec00,0xec00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, // u2563 0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x0000,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2564 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, // u2565 0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x0000,0xef00,0xef00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, // u2566 0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0xff00,0x0000,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2567 0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2568 0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0xef00,0xef00,0x0000,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2569 0x1800,0x1800,0x1800,0x1800,0x1800,0xff00,0xff00,0x1800,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u256a 0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0xff00,0xff00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, // u256b 0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0xef00,0xef00,0x0000,0xef00,0xef00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, // u256c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0f00,0x1c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u256d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xe000,0xf000,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u256e 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3800,0xf000,0xe000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u256f 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1c00,0x0f00,0x0700,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2570 0x0100,0x0100,0x0300,0x0200,0x0600,0x0400,0x0c00,0x0800,0x1800,0x1000,0x3000,0x2000,0x6000,0x4000,0xc000,0x8000, // u2571 0x8000,0xc000,0x4000,0x6000,0x2000,0x3000,0x1000,0x1800,0x0800,0x0c00,0x0400,0x0600,0x0200,0x0300,0x0100,0x0100, // u2572 0x8100,0xc100,0x4300,0x6200,0x2600,0x3400,0x1c00,0x1800,0x1800,0x1c00,0x3400,0x2600,0x6200,0x4300,0xc100,0x8100, // u2573 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2574 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2575 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2576 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u2577 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2578 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2579 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x1f00,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u257b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257c 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u257d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257e 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u257f 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2580 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00, // u2581 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0xff00, // u2582 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u2583 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u2584 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u2585 0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u2586 0x0000,0x0000,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u2587 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u2588 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, // u2589 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, // u258a 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, // u258b 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, // u258c 0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000, // u258d 0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000, // u258e 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, // u258f 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u2590 0x8800,0x2200,0x8800,0x2200,0x8800,0x2200,0x8800,0x2200,0x8800,0x2200,0x8800,0x2200,0x8800,0x2200,0x8800,0x2200, // u2591 0xaa00,0x5500,0xaa00,0x5500,0xaa00,0x5500,0xaa00,0x5500,0xaa00,0x5500,0xaa00,0x5500,0xaa00,0x5500,0xaa00,0x5500, // u2592 0xee00,0xbb00,0xee00,0xbb00,0xee00,0xbb00,0xee00,0xbb00,0xee00,0xbb00,0xee00,0xbb00,0xee00,0xbb00,0xee00,0xbb00, // u2593 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, // u2596 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u2597 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2598 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u2599 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u259a 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, // u259b 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u259c 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u259d 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, // u259e 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u259f 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x7c00,0x7c00,0x7c00,0x7c00,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u25a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xfe00,0xfe00,0xfe00,0x0000,0x0000,0x0000,0x0000, // u25ac 0x0000,0x0000,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0x0000,0x0000,0x0000,0x0000, // u25ae 0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x3c00,0x3c00,0x7e00,0x7e00,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000, // u25b2 0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xff00,0xfc00,0xf000,0xc000,0x0000,0x0000,0x0000,0x0000, // u25b6 0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xff00,0xfc00,0xf000,0xc000,0x0000,0x0000,0x0000,0x0000, // u25ba 0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x7e00,0x7e00,0x3c00,0x3c00,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u25bc 0x0000,0x0000,0x0000,0x0000,0x0300,0x0f00,0x3f00,0xff00,0xff00,0x3f00,0x0f00,0x0300,0x0000,0x0000,0x0000,0x0000, // u25c0 0x0000,0x0000,0x0000,0x0000,0x0300,0x0f00,0x3f00,0xff00,0xff00,0x3f00,0x0f00,0x0300,0x0000,0x0000,0x0000,0x0000, // u25c4 0x0000,0x0000,0x0000,0x0000,0x1800,0x3c00,0x7e00,0xff00,0x7e00,0x3c00,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000, // u25c6 0x0000,0x0000,0x0000,0x0000,0x1800,0x3c00,0x6600,0xc300,0x6600,0x3c00,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ca 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x6600,0x4200,0x4200,0x6600,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u25cb 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x7e00,0x7e00,0x7e00,0x7e00,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u25cf 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xe700,0xc300,0xc300,0xe700,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u25d8 0xff00,0xff00,0xff00,0xff00,0xff00,0xc300,0x9900,0xbd00,0xbd00,0x9900,0xc300,0xff00,0xff00,0xff00,0xff00,0xff00, // u25d9 0x0000,0x0000,0x7c00,0x8200,0xaa00,0x8200,0x8200,0xba00,0x9200,0x8200,0x8200,0x7c00,0x0000,0x0000,0x0000,0x0000, // u263a 0x0000,0x0000,0x7c00,0xfe00,0xd600,0xfe00,0xfe00,0xc600,0xee00,0xfe00,0xfe00,0x7c00,0x0000,0x0000,0x0000,0x0000, // u263b 0x0000,0x0000,0x0000,0x1800,0xdb00,0x7e00,0x3c00,0xe700,0x3c00,0x7e00,0xdb00,0x1800,0x0000,0x0000,0x0000,0x0000, // u263c 0x0000,0x0000,0x3c00,0x6600,0x6600,0x6600,0x6600,0x3c00,0x1800,0x7e00,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000, // u2640 0x0000,0x0000,0x3e00,0x0e00,0x1a00,0x3200,0x7800,0xcc00,0xcc00,0xcc00,0xcc00,0x7800,0x0000,0x0000,0x0000,0x0000, // u2642 0x0000,0x0000,0x1800,0x1800,0x3c00,0x7e00,0xff00,0xff00,0x7e00,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u2660 0x0000,0x0000,0x1800,0x3c00,0x3c00,0x1800,0x5a00,0xff00,0xff00,0x5a00,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000, // u2663 0x0000,0x0000,0x0000,0x0000,0x6c00,0xfe00,0xfe00,0xfe00,0xfe00,0x7c00,0x3800,0x1000,0x0000,0x0000,0x0000,0x0000, // u2665 0x0000,0x0000,0x0000,0x0000,0x1800,0x3c00,0x7e00,0xff00,0x7e00,0x3c00,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000, // u2666 0x0000,0x0000,0x7e00,0x6600,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0xe000,0xc000,0x0000,0x0000,0x0000,0x0000, // u266a 0x0000,0x0000,0x7e00,0x6600,0x7e00,0x6600,0x6600,0x6600,0x6600,0x6600,0x6e00,0xec00,0xc000,0x0000,0x0000,0x0000, // u266b 0x0000,0x0000,0x0300,0x0300,0x0600,0x0600,0xcc00,0xcc00,0x7800,0x7800,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, // u2713 0x0000,0x0000,0x0700,0x0700,0x0e00,0x0e00,0xdc00,0xfc00,0x7800,0x7800,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, // u2714 0x0000,0x0000,0x0c00,0xcc00,0x7800,0x3800,0x3800,0x3c00,0x6600,0x6000,0xc000,0xc000,0x0000,0x0000,0x0000,0x0000, // u2717 0x0000,0x0000,0x0e00,0xee00,0x7c00,0x3c00,0x3c00,0x3e00,0x7700,0x7300,0xe000,0xe000,0x0000,0x0000,0x0000,0x0000, // u2718 0x0000,0x0000,0x0c00,0x0c00,0x1800,0x1800,0x3000,0x3000,0x1800,0x1800,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000, // u27e8 0x0000,0x0000,0x3000,0x3000,0x1800,0x1800,0x0c00,0x0c00,0x1800,0x1800,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, // u27e9 0x0000,0x0000,0x3600,0x3600,0x6c00,0x6c00,0xd800,0xd800,0x6c00,0x6c00,0x3600,0x3600,0x0000,0x0000,0x0000,0x0000, // u27ea 0x0000,0x0000,0xd800,0xd800,0x6c00,0x6c00,0x3600,0x3600,0x6c00,0x6c00,0xd800,0xd800,0x0000,0x0000,0x0000,0x0000, // u27eb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2800 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2801 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2802 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2803 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2804 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2805 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2806 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2807 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2808 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2809 0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280a 0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280b 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280c 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280d 0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280e 0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2810 0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2811 0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2812 0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2813 0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2814 0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2815 0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2816 0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2817 0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2818 0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2819 0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281a 0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281b 0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281c 0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281d 0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281e 0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2820 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2821 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2822 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2823 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2824 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2825 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2826 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2827 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2828 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2829 0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u282a 0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u282b 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000, // u282c 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000, // u282d 0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000, // u282e 0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000, // u282f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2830 0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2831 0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2832 0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2833 0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2834 0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2835 0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2836 0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2837 0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2838 0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2839 0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u283a 0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u283b 0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000, // u283c 0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000, // u283d 0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000, // u283e 0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000, // u283f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2840 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2841 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2842 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2843 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2844 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2845 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2846 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2847 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2848 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2849 0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u284a 0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u284b 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000, // u284c 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000, // u284d 0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000, // u284e 0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000, // u284f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2850 0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2851 0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2852 0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2853 0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2854 0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2855 0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2856 0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2857 0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2858 0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u2859 0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u285a 0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000, // u285b 0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000, // u285c 0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000, // u285d 0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000, // u285e 0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000, // u285f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000, // u2860 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000, // u2861 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000, // u2862 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000, // u2863 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000, // u2864 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000, // u2865 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000, // u2866 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000, // u2867 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000, // u2868 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000, // u2869 0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000, // u286a 0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000, // u286b 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000, // u286c 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000, // u286d 0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000, // u286e 0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000, // u286f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000, // u2870 0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000, // u2871 0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000, // u2872 0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000, // u2873 0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000, // u2874 0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000, // u2875 0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000, // u2876 0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000, // u2877 0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000, // u2878 0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000, // u2879 0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000, // u287a 0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000, // u287b 0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000, // u287c 0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000, // u287d 0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000, // u287e 0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000, // u287f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2880 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2881 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2882 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2883 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2884 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2885 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2886 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2887 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2888 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2889 0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u288a 0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u288b 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000, // u288c 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000, // u288d 0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000, // u288e 0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000, // u288f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2890 0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2891 0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2892 0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2893 0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2894 0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2895 0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2896 0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2897 0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2898 0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u2899 0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u289a 0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000, // u289b 0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000, // u289c 0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000, // u289d 0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000, // u289e 0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000, // u289f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28a0 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28a1 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28a2 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28a4 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28a5 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28a6 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28a7 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28a8 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28a9 0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28aa 0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28ab 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28ac 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28ad 0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28ae 0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28af 0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28b0 0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28b1 0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28b2 0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28b4 0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28b6 0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28b7 0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28b8 0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28b9 0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28ba 0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28bb 0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28bc 0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28bd 0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28be 0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000, // u28bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28c0 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28c2 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28c4 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28c6 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28c7 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28c8 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28c9 0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28ca 0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28cb 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28cc 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28cd 0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28ce 0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28cf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28d0 0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28d2 0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28d4 0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28d6 0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28d7 0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28d8 0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28d9 0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28da 0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28db 0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28dc 0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28dd 0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28de 0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000, // u28df 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28e0 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28e1 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28e2 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28e3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28e4 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28e6 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28e7 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28e8 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28e9 0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28ea 0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28eb 0x0000,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28ec 0x0000,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28ed 0x0000,0x0600,0x0600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28ee 0x0000,0x6600,0x6600,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28ef 0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28f0 0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28f2 0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28f3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28f4 0x0000,0x6000,0x6000,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28f6 0x0000,0x6000,0x6000,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28f7 0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28f8 0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28f9 0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28fa 0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28fb 0x0000,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28fc 0x0000,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28fd 0x0000,0x0600,0x0600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28fe 0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000,0x0000,0x6600,0x6600,0x0000, // u28ff 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0x0000,0x0000,0x0000,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000, // u2e2c 0xc000,0xc000,0xcc00,0xde00,0xff00,0xcc00,0xcc00,0xcc00,0x9800,0x3000,0x6000,0xc000,0xc000,0xc000,0xc000,0xc000, // ue0a0 0x0000,0xc000,0xc000,0xc000,0xc000,0xc000,0xfc00,0x0000,0x3300,0x3b00,0x3f00,0x3700,0x3300,0x3300,0x0000,0x0000, // ue0a1 0x0000,0x3c00,0x6600,0x6600,0x6600,0x6600,0xff00,0xff00,0xe700,0xc300,0xe700,0xff00,0xff00,0xff00,0x0000,0x0000, // ue0a2 0x8000,0xc000,0xe000,0xf000,0xf800,0xfc00,0xfe00,0xff00,0xff00,0xfe00,0xfc00,0xf800,0xf000,0xe000,0xc000,0x8000, // ue0b0 0x8000,0xc000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0xc000,0x8000, // ue0b1 0x0100,0x0300,0x0700,0x0f00,0x1f00,0x3f00,0x7f00,0xff00,0xff00,0x7f00,0x3f00,0x1f00,0x0f00,0x0700,0x0300,0x0100, // ue0b2 0x0100,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0xc000,0xc000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0100, // ue0b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x6600,0x6600,0x3c00,0x0000, // uf6be 0x0000,0x0000,0xfe00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xfe00,0x0000,0x0000,0x0000,0x0000 // ufffd }; // codepoints array constexpr std::array fixedfont_codepoints = { 0x0000,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e, 0x002f,0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e, 0x003f,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e, 0x004f,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e, 0x005f,0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e, 0x006f,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e, 0x00a0,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af, 0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf, 0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf, 0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df, 0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef, 0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff, 0x0100,0x0101,0x0102,0x0103,0x0104,0x0105,0x0106,0x0107,0x0108,0x0109,0x010a,0x010b,0x010c,0x010d,0x010e,0x010f, 0x0110,0x0111,0x0112,0x0113,0x0114,0x0115,0x0116,0x0117,0x0118,0x0119,0x011a,0x011b,0x011c,0x011d,0x011e,0x011f, 0x0120,0x0121,0x0122,0x0123,0x0124,0x0125,0x0126,0x0127,0x0128,0x0129,0x012a,0x012b,0x012c,0x012d,0x012e,0x012f, 0x0130,0x0131,0x0132,0x0133,0x0134,0x0135,0x0136,0x0137,0x0138,0x0139,0x013a,0x013b,0x013c,0x013d,0x013e,0x013f, 0x0140,0x0141,0x0142,0x0143,0x0144,0x0145,0x0146,0x0147,0x0148,0x0149,0x014a,0x014b,0x014c,0x014d,0x014e,0x014f, 0x0150,0x0151,0x0152,0x0153,0x0154,0x0155,0x0156,0x0157,0x0158,0x0159,0x015a,0x015b,0x015c,0x015d,0x015e,0x015f, 0x0160,0x0161,0x0162,0x0163,0x0164,0x0165,0x0166,0x0167,0x0168,0x0169,0x016a,0x016b,0x016c,0x016d,0x016e,0x016f, 0x0170,0x0171,0x0172,0x0173,0x0174,0x0175,0x0176,0x0177,0x0178,0x0179,0x017a,0x017b,0x017c,0x017d,0x017e,0x017f, 0x0186,0x018e,0x018f,0x0190,0x0192,0x019d,0x019e,0x01b5,0x01b6,0x01b7,0x01cd,0x01ce,0x01cf,0x01d0,0x01d1,0x01d2, 0x01d3,0x01d4,0x01e2,0x01e3,0x01e4,0x01e5,0x01e6,0x01e7,0x01e8,0x01e9,0x01ea,0x01eb,0x01ec,0x01ed,0x01ee,0x01ef, 0x01f0,0x01f4,0x01f5,0x01fc,0x01fd,0x01fe,0x01ff,0x0218,0x0219,0x021a,0x021b,0x0232,0x0233,0x0237,0x0254,0x0258, 0x0259,0x025b,0x0272,0x0292,0x02bb,0x02bc,0x02bd,0x02c6,0x02c7,0x02d8,0x02d9,0x02db,0x02dc,0x02dd,0x0300,0x0301, 0x0302,0x0303,0x0304,0x0305,0x0306,0x0307,0x0308,0x030a,0x030b,0x030c,0x0329,0x0384,0x0385,0x0386,0x0387,0x0388, 0x0389,0x038a,0x038c,0x038e,0x038f,0x0390,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039a, 0x039b,0x039c,0x039d,0x039e,0x039f,0x03a0,0x03a1,0x03a3,0x03a4,0x03a5,0x03a6,0x03a7,0x03a8,0x03a9,0x03aa,0x03ab, 0x03ac,0x03ad,0x03ae,0x03af,0x03b0,0x03b1,0x03b2,0x03b3,0x03b4,0x03b5,0x03b6,0x03b7,0x03b8,0x03b9,0x03ba,0x03bb, 0x03bc,0x03bd,0x03be,0x03bf,0x03c0,0x03c1,0x03c2,0x03c3,0x03c4,0x03c5,0x03c6,0x03c7,0x03c8,0x03c9,0x03ca,0x03cb, 0x03cc,0x03cd,0x03ce,0x03d1,0x03d5,0x03f0,0x03f1,0x03f2,0x03f3,0x03f4,0x03f5,0x03f6,0x0400,0x0401,0x0402,0x0403, 0x0404,0x0405,0x0406,0x0407,0x0408,0x0409,0x040a,0x040b,0x040c,0x040d,0x040e,0x040f,0x0410,0x0411,0x0412,0x0413, 0x0414,0x0415,0x0416,0x0417,0x0418,0x0419,0x041a,0x041b,0x041c,0x041d,0x041e,0x041f,0x0420,0x0421,0x0422,0x0423, 0x0424,0x0425,0x0426,0x0427,0x0428,0x0429,0x042a,0x042b,0x042c,0x042d,0x042e,0x042f,0x0430,0x0431,0x0432,0x0433, 0x0434,0x0435,0x0436,0x0437,0x0438,0x0439,0x043a,0x043b,0x043c,0x043d,0x043e,0x043f,0x0440,0x0441,0x0442,0x0443, 0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,0x044a,0x044b,0x044c,0x044d,0x044e,0x044f,0x0450,0x0451,0x0452,0x0453, 0x0454,0x0455,0x0456,0x0457,0x0458,0x0459,0x045a,0x045b,0x045c,0x045d,0x045e,0x045f,0x0462,0x0463,0x046a,0x046b, 0x0490,0x0491,0x0492,0x0493,0x0494,0x0495,0x0496,0x0497,0x0498,0x0499,0x049a,0x049b,0x049c,0x049d,0x04a0,0x04a1, 0x04a2,0x04a3,0x04a4,0x04a5,0x04aa,0x04ab,0x04ae,0x04af,0x04b0,0x04b1,0x04b2,0x04b3,0x04b6,0x04b7,0x04b8,0x04b9, 0x04ba,0x04bb,0x04c0,0x04c1,0x04c2,0x04cf,0x04d0,0x04d1,0x04d2,0x04d3,0x04d4,0x04d5,0x04d6,0x04d7,0x04d8,0x04d9, 0x04da,0x04db,0x04dc,0x04dd,0x04de,0x04df,0x04e2,0x04e3,0x04e4,0x04e5,0x04e6,0x04e7,0x04e8,0x04e9,0x04ea,0x04eb, 0x04ec,0x04ed,0x04ee,0x04ef,0x04f0,0x04f1,0x04f2,0x04f3,0x04f4,0x04f5,0x04f8,0x04f9,0x05d0,0x05d1,0x05d2,0x05d3, 0x05d4,0x05d5,0x05d6,0x05d7,0x05d8,0x05d9,0x05da,0x05db,0x05dc,0x05dd,0x05de,0x05df,0x05e0,0x05e1,0x05e2,0x05e3, 0x05e4,0x05e5,0x05e6,0x05e7,0x05e8,0x05e9,0x05ea,0x1e0c,0x1e0d,0x1e34,0x1e35,0x1e36,0x1e37,0x1e40,0x1e41,0x1e42, 0x1e43,0x1e44,0x1e45,0x1e46,0x1e47,0x1e6c,0x1e6d,0x1eb8,0x1eb9,0x1ebc,0x1ebd,0x1eca,0x1ecb,0x1ecc,0x1ecd,0x1ee4, 0x1ee5,0x1ef8,0x1ef9,0x2000,0x2001,0x2002,0x2003,0x2004,0x2005,0x2006,0x2007,0x2008,0x2009,0x200a,0x200b,0x200c, 0x200d,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x2015,0x2016,0x2017,0x2018,0x2019,0x201a,0x201b,0x201c, 0x201d,0x201e,0x201f,0x2020,0x2021,0x2022,0x2026,0x2030,0x2032,0x2033,0x2039,0x203a,0x203c,0x203e,0x2070,0x2071, 0x2074,0x2075,0x2076,0x2077,0x2078,0x2079,0x207a,0x207b,0x207c,0x207d,0x207e,0x207f,0x2080,0x2081,0x2082,0x2083, 0x2084,0x2085,0x2086,0x2087,0x2088,0x2089,0x208a,0x208b,0x208c,0x208d,0x208e,0x2090,0x2091,0x2092,0x2093,0x2094, 0x2095,0x2096,0x2097,0x2098,0x209a,0x20a7,0x20aa,0x20ac,0x20ae,0x2102,0x210e,0x210f,0x2115,0x2116,0x211a,0x211d, 0x2122,0x2124,0x2126,0x2135,0x2190,0x2191,0x2192,0x2193,0x2194,0x2195,0x21a4,0x21a6,0x21a8,0x21b5,0x21bb,0x21cb, 0x21cc,0x21d0,0x21d1,0x21d2,0x21d3,0x21d4,0x21d5,0x2200,0x2203,0x2204,0x2205,0x2206,0x2207,0x2208,0x2209,0x220a, 0x220b,0x220c,0x220d,0x2212,0x2213,0x2214,0x2215,0x2216,0x2219,0x221a,0x221e,0x221f,0x2225,0x2227,0x2228,0x2229, 0x222a,0x2248,0x2260,0x2261,0x2264,0x2265,0x226a,0x226b,0x2282,0x2283,0x2286,0x2287,0x22a5,0x22c2,0x22c3,0x2300, 0x2302,0x2308,0x2309,0x230a,0x230b,0x2310,0x2319,0x2320,0x2321,0x239b,0x239c,0x239d,0x239e,0x239f,0x23a0,0x23a1, 0x23a2,0x23a3,0x23a4,0x23a5,0x23a6,0x23a7,0x23a8,0x23a9,0x23ab,0x23ac,0x23ad,0x23ae,0x23af,0x23ba,0x23bb,0x23bc, 0x23bd,0x23d0,0x2409,0x240a,0x240b,0x240c,0x240d,0x2424,0x2500,0x2501,0x2502,0x2503,0x2508,0x2509,0x250a,0x250b, 0x250c,0x250d,0x250e,0x250f,0x2510,0x2511,0x2512,0x2513,0x2514,0x2515,0x2516,0x2517,0x2518,0x2519,0x251a,0x251b, 0x251c,0x251d,0x251e,0x251f,0x2520,0x2521,0x2522,0x2523,0x2524,0x2525,0x2526,0x2527,0x2528,0x2529,0x252a,0x252b, 0x252c,0x252d,0x252e,0x252f,0x2530,0x2531,0x2532,0x2533,0x2534,0x2535,0x2536,0x2537,0x2538,0x2539,0x253a,0x253b, 0x253c,0x253d,0x253e,0x253f,0x2540,0x2541,0x2542,0x2543,0x2544,0x2545,0x2546,0x2547,0x2548,0x2549,0x254a,0x254b, 0x2550,0x2551,0x2552,0x2553,0x2554,0x2555,0x2556,0x2557,0x2558,0x2559,0x255a,0x255b,0x255c,0x255d,0x255e,0x255f, 0x2560,0x2561,0x2562,0x2563,0x2564,0x2565,0x2566,0x2567,0x2568,0x2569,0x256a,0x256b,0x256c,0x256d,0x256e,0x256f, 0x2570,0x2571,0x2572,0x2573,0x2574,0x2575,0x2576,0x2577,0x2578,0x2579,0x257a,0x257b,0x257c,0x257d,0x257e,0x257f, 0x2580,0x2581,0x2582,0x2583,0x2584,0x2585,0x2586,0x2587,0x2588,0x2589,0x258a,0x258b,0x258c,0x258d,0x258e,0x258f, 0x2590,0x2591,0x2592,0x2593,0x2596,0x2597,0x2598,0x2599,0x259a,0x259b,0x259c,0x259d,0x259e,0x259f,0x25a0,0x25ac, 0x25ae,0x25b2,0x25b6,0x25ba,0x25bc,0x25c0,0x25c4,0x25c6,0x25ca,0x25cb,0x25cf,0x25d8,0x25d9,0x263a,0x263b,0x263c, 0x2640,0x2642,0x2660,0x2663,0x2665,0x2666,0x266a,0x266b,0x2713,0x2714,0x2717,0x2718,0x27e8,0x27e9,0x27ea,0x27eb, 0x2800,0x2801,0x2802,0x2803,0x2804,0x2805,0x2806,0x2807,0x2808,0x2809,0x280a,0x280b,0x280c,0x280d,0x280e,0x280f, 0x2810,0x2811,0x2812,0x2813,0x2814,0x2815,0x2816,0x2817,0x2818,0x2819,0x281a,0x281b,0x281c,0x281d,0x281e,0x281f, 0x2820,0x2821,0x2822,0x2823,0x2824,0x2825,0x2826,0x2827,0x2828,0x2829,0x282a,0x282b,0x282c,0x282d,0x282e,0x282f, 0x2830,0x2831,0x2832,0x2833,0x2834,0x2835,0x2836,0x2837,0x2838,0x2839,0x283a,0x283b,0x283c,0x283d,0x283e,0x283f, 0x2840,0x2841,0x2842,0x2843,0x2844,0x2845,0x2846,0x2847,0x2848,0x2849,0x284a,0x284b,0x284c,0x284d,0x284e,0x284f, 0x2850,0x2851,0x2852,0x2853,0x2854,0x2855,0x2856,0x2857,0x2858,0x2859,0x285a,0x285b,0x285c,0x285d,0x285e,0x285f, 0x2860,0x2861,0x2862,0x2863,0x2864,0x2865,0x2866,0x2867,0x2868,0x2869,0x286a,0x286b,0x286c,0x286d,0x286e,0x286f, 0x2870,0x2871,0x2872,0x2873,0x2874,0x2875,0x2876,0x2877,0x2878,0x2879,0x287a,0x287b,0x287c,0x287d,0x287e,0x287f, 0x2880,0x2881,0x2882,0x2883,0x2884,0x2885,0x2886,0x2887,0x2888,0x2889,0x288a,0x288b,0x288c,0x288d,0x288e,0x288f, 0x2890,0x2891,0x2892,0x2893,0x2894,0x2895,0x2896,0x2897,0x2898,0x2899,0x289a,0x289b,0x289c,0x289d,0x289e,0x289f, 0x28a0,0x28a1,0x28a2,0x28a3,0x28a4,0x28a5,0x28a6,0x28a7,0x28a8,0x28a9,0x28aa,0x28ab,0x28ac,0x28ad,0x28ae,0x28af, 0x28b0,0x28b1,0x28b2,0x28b3,0x28b4,0x28b5,0x28b6,0x28b7,0x28b8,0x28b9,0x28ba,0x28bb,0x28bc,0x28bd,0x28be,0x28bf, 0x28c0,0x28c1,0x28c2,0x28c3,0x28c4,0x28c5,0x28c6,0x28c7,0x28c8,0x28c9,0x28ca,0x28cb,0x28cc,0x28cd,0x28ce,0x28cf, 0x28d0,0x28d1,0x28d2,0x28d3,0x28d4,0x28d5,0x28d6,0x28d7,0x28d8,0x28d9,0x28da,0x28db,0x28dc,0x28dd,0x28de,0x28df, 0x28e0,0x28e1,0x28e2,0x28e3,0x28e4,0x28e5,0x28e6,0x28e7,0x28e8,0x28e9,0x28ea,0x28eb,0x28ec,0x28ed,0x28ee,0x28ef, 0x28f0,0x28f1,0x28f2,0x28f3,0x28f4,0x28f5,0x28f6,0x28f7,0x28f8,0x28f9,0x28fa,0x28fb,0x28fc,0x28fd,0x28fe,0x28ff, 0x2e2c,0xe0a0,0xe0a1,0xe0a2,0xe0b0,0xe0b1,0xe0b2,0xe0b3,0xf6be,0xfffd }; } // namespace // -- end of autogenerated text --- namespace fixed_font_18n { // -- start of autogenerated text --- // definition section for font: ter-u18n.bdf constexpr int CHARCOUNT = 1354; constexpr int WIDTH = 10; constexpr int HEIGHT = 18; constexpr int OFFSET_X = 0; constexpr int OFFSET_Y = 0; constexpr FixedFont_info_t fixedfont_info = { "Terminus", // font name "ter-u18n.bdf", // font name internal CHARCOUNT, // num of chars WIDTH, HEIGHT, OFFSET_X, OFFSET_Y, false // bold }; // font bitmap definitions constexpr std::array fixedfont_bitmap = { 0x0000,0x0000,0x0000,0x7700,0x4100,0x4100,0x0000,0x4100,0x4100,0x4100,0x4100,0x0000,0x4100,0x4100,0x7700,0x0000, 0x0000,0x0000, // u0000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0020 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000,0x0800,0x0800,0x0000, 0x0000,0x0000, // u0021 0x0000,0x2200,0x2200,0x2200,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0022 0x0000,0x0000,0x0000,0x2200,0x2200,0x2200,0x7f00,0x2200,0x2200,0x2200,0x2200,0x7f00,0x2200,0x2200,0x2200,0x0000, 0x0000,0x0000, // u0023 0x0000,0x0000,0x0800,0x0800,0x3e00,0x4900,0x4800,0x4800,0x4800,0x3e00,0x0900,0x0900,0x0900,0x4900,0x3e00,0x0800, 0x0800,0x0000, // u0024 0x0000,0x0000,0x0000,0x7100,0x5100,0x7200,0x0200,0x0400,0x0400,0x0800,0x0800,0x1000,0x1380,0x2280,0x2380,0x0000, 0x0000,0x0000, // u0025 0x0000,0x0000,0x0000,0x1c00,0x2200,0x2200,0x2200,0x1400,0x1880,0x2480,0x4300,0x4100,0x4100,0x2280,0x1c80,0x0000, 0x0000,0x0000, // u0026 0x0000,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0027 0x0000,0x0000,0x0000,0x0400,0x0800,0x0800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0800,0x0800,0x0400,0x0000, 0x0000,0x0000, // u0028 0x0000,0x0000,0x0000,0x1000,0x0800,0x0800,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0800,0x0800,0x1000,0x0000, 0x0000,0x0000, // u0029 0x0000,0x0000,0x0000,0x0000,0x0000,0x2200,0x1400,0x0800,0x7f00,0x0800,0x1400,0x2200,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u002a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x7f00,0x0800,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u002b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x1000, 0x0000,0x0000, // u002c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u002d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000, 0x0000,0x0000, // u002e 0x0000,0x0000,0x0000,0x0100,0x0100,0x0200,0x0200,0x0400,0x0400,0x0800,0x0800,0x1000,0x1000,0x2000,0x2000,0x0000, 0x0000,0x0000, // u002f 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4300,0x4500,0x4900,0x5100,0x6100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0030 0x0000,0x0000,0x0000,0x0800,0x1800,0x2800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x3e00,0x0000, 0x0000,0x0000, // u0031 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u0032 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x0100,0x0100,0x1e00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0033 0x0000,0x0000,0x0000,0x0100,0x0300,0x0500,0x0900,0x1100,0x2100,0x4100,0x4100,0x7f00,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0000, // u0034 0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x7e00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0035 0x0000,0x0000,0x0000,0x1e00,0x2000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0036 0x0000,0x0000,0x0000,0x7f00,0x4100,0x4100,0x0100,0x0200,0x0200,0x0400,0x0400,0x0800,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u0037 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0038 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100,0x0100,0x0100,0x0200,0x3c00,0x0000, 0x0000,0x0000, // u0039 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000, 0x0000,0x0000, // u003a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x1000, 0x0000,0x0000, // u003b 0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0100,0x0000, 0x0000,0x0000, // u003c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0000,0x0000,0x0000,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u003d 0x0000,0x0000,0x0000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0100,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x0000, 0x0000,0x0000, // u003e 0x0000,0x0000,0x0000,0x1c00,0x2200,0x4100,0x4100,0x0100,0x0200,0x0400,0x0800,0x0800,0x0000,0x0800,0x0800,0x0000, 0x0000,0x0000, // u003f 0x0000,0x0000,0x0000,0x3f00,0x4080,0x4080,0x4780,0x4880,0x4880,0x4880,0x4980,0x4680,0x4000,0x4000,0x3f80,0x0000, 0x0000,0x0000, // u0040 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u0041 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x0000, 0x0000,0x0000, // u0042 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0043 0x0000,0x0000,0x0000,0x7c00,0x4200,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4200,0x7c00,0x0000, 0x0000,0x0000, // u0044 0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u0045 0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000, 0x0000,0x0000, // u0046 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4f00,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0047 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u0048 0x0000,0x0000,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u0049 0x0000,0x0000,0x0000,0x0380,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x2100,0x2100,0x2100,0x1e00,0x0000, 0x0000,0x0000, // u004a 0x0000,0x0000,0x0000,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100,0x0000, 0x0000,0x0000, // u004b 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u004c 0x0000,0x0000,0x0000,0x4080,0x6180,0x5280,0x5280,0x4c80,0x4c80,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x0000, 0x0000,0x0000, // u004d 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x6100,0x5100,0x4900,0x4500,0x4300,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u004e 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u004f 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000, 0x0000,0x0000, // u0050 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4900,0x3e00,0x0200, 0x0100,0x0000, // u0051 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x5000,0x4800,0x4400,0x4200,0x4100,0x0000, 0x0000,0x0000, // u0052 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x3e00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0053 0x0000,0x0000,0x0000,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u0054 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0055 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x2200,0x2200,0x2200,0x1400,0x1400,0x1400,0x0800,0x0800,0x0000, 0x0000,0x0000, // u0056 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4c80,0x4c80,0x5280,0x5280,0x6180,0x4080,0x0000, 0x0000,0x0000, // u0057 0x0000,0x0000,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x0800,0x0800,0x1400,0x2200,0x2200,0x4100,0x4100,0x0000, 0x0000,0x0000, // u0058 0x0000,0x0000,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u0059 0x0000,0x0000,0x0000,0x7f00,0x0100,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u005a 0x0000,0x0000,0x0000,0x1c00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1c00,0x0000, 0x0000,0x0000, // u005b 0x0000,0x0000,0x0000,0x2000,0x2000,0x1000,0x1000,0x0800,0x0800,0x0400,0x0400,0x0200,0x0200,0x0100,0x0100,0x0000, 0x0000,0x0000, // u005c 0x0000,0x0000,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x1c00,0x0000, 0x0000,0x0000, // u005d 0x0000,0x0800,0x1400,0x2200,0x4100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u005e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x7f00,0x0000, // u005f 0x1000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0060 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u0061 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x0000, 0x0000,0x0000, // u0062 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0063 0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u0064 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0065 0x0000,0x0000,0x0000,0x0700,0x0800,0x0800,0x3e00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u0066 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100, 0x0100,0x3e00, // u0067 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u0068 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u0069 0x0000,0x0000,0x0000,0x0200,0x0200,0x0000,0x0600,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x2200, 0x2200,0x1c00, // u006a 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4100,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x4100,0x0000, 0x0000,0x0000, // u006b 0x0000,0x0000,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u006c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x0000, 0x0000,0x0000, // u006d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u006e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u006f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x4000, 0x4000,0x4000, // u0070 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100, 0x0100,0x0100, // u0071 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4f00,0x5000,0x6000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000, 0x0000,0x0000, // u0072 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4000,0x4000,0x3e00,0x0100,0x0100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0073 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x3e00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0700,0x0000, 0x0000,0x0000, // u0074 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u0075 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x0800,0x0000, 0x0000,0x0000, // u0076 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4900,0x4900,0x4900,0x4900,0x4900,0x3e00,0x0000, 0x0000,0x0000, // u0077 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x2200,0x1400,0x0800,0x1400,0x2200,0x4100,0x4100,0x0000, 0x0000,0x0000, // u0078 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100, 0x0100,0x3e00, // u0079 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u007a 0x0000,0x0000,0x0000,0x0600,0x0800,0x0800,0x0800,0x0800,0x3000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0600,0x0000, 0x0000,0x0000, // u007b 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u007c 0x0000,0x0000,0x0000,0x3000,0x0800,0x0800,0x0800,0x0800,0x0600,0x0800,0x0800,0x0800,0x0800,0x0800,0x3000,0x0000, 0x0000,0x0000, // u007d 0x0000,0x3100,0x4900,0x4900,0x4600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u007e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00a0 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u00a1 0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x3e00,0x4900,0x4800,0x4800,0x4800,0x4800,0x4800,0x4900,0x3e00,0x0800, 0x0800,0x0000, // u00a2 0x0000,0x0000,0x0000,0x1c00,0x2200,0x2000,0x2000,0x2000,0x7c00,0x2000,0x2000,0x2000,0x2000,0x2100,0x7f00,0x0000, 0x0000,0x0000, // u00a3 0x0000,0x0000,0x0000,0x0000,0x4080,0x2100,0x1e00,0x2100,0x2100,0x2100,0x2100,0x1e00,0x2100,0x4080,0x0000,0x0000, 0x0000,0x0000, // u00a4 0x0000,0x0000,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x0800,0x0800,0x3e00,0x0800,0x3e00,0x0800,0x0800,0x0000, 0x0000,0x0000, // u00a5 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u00a6 0x0000,0x0000,0x1c00,0x2200,0x2000,0x1800,0x2400,0x2200,0x2200,0x2200,0x1200,0x0c00,0x0200,0x2200,0x1c00,0x0000, 0x0000,0x0000, // u00a7 0x2200,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00a8 0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x9c80,0xa280,0xa080,0xa080,0xa280,0x9c80,0x4100,0x3e00,0x0000,0x0000, 0x0000,0x0000, // u00a9 0x0000,0x1e00,0x0100,0x1f00,0x2100,0x2100,0x1f00,0x0000,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0880,0x1100,0x2200,0x4400,0x8800,0x4400,0x2200,0x1100,0x0880,0x0000, 0x0000,0x0000, // u00ab 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0100,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00ac 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00ad 0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0xbc80,0xa280,0xa280,0xbc80,0xa480,0xa280,0x4100,0x3e00,0x0000,0x0000, 0x0000,0x0000, // u00ae 0x0000,0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00af 0x0000,0x1c00,0x2200,0x2200,0x2200,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x7f00,0x0800,0x0800,0x0800,0x0000,0x0000,0x7f00,0x0000, 0x0000,0x0000, // u00b1 0x0000,0x1c00,0x2200,0x2200,0x0400,0x0800,0x1000,0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00b2 0x0000,0x1c00,0x2200,0x0200,0x0c00,0x0200,0x2200,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00b3 0x0400,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4300,0x7d00,0x4000, 0x4000,0x4000, // u00b5 0x0000,0x0000,0x0000,0x3f00,0x4900,0x4900,0x4900,0x4900,0x4900,0x3900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0000, 0x0000,0x0000, // u00b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00b7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800, 0x0800,0x1000, // u00b8 0x0000,0x0800,0x1800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00b9 0x0000,0x1e00,0x2100,0x2100,0x2100,0x2100,0x1e00,0x0000,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8800,0x4400,0x2200,0x1100,0x0880,0x1100,0x2200,0x4400,0x8800,0x0000, 0x0000,0x0000, // u00bb 0x0000,0x0000,0x2000,0x6000,0x2080,0x2100,0x2200,0x2400,0x0800,0x1100,0x2300,0x4500,0x8900,0x0f00,0x0100,0x0100, 0x0000,0x0000, // u00bc 0x0000,0x0000,0x2000,0x6000,0x2080,0x2100,0x2200,0x2400,0x0800,0x1000,0x2600,0x4900,0x8100,0x0200,0x0400,0x0f00, 0x0000,0x0000, // u00bd 0x0000,0x0000,0xe000,0x1000,0x6080,0x1100,0x1200,0xe400,0x0800,0x1100,0x2300,0x4500,0x8900,0x0f00,0x0100,0x0100, 0x0000,0x0000, // u00be 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0800,0x0800,0x1000,0x2000,0x4000,0x4100,0x4100,0x2200,0x1c00,0x0000, 0x0000,0x0000, // u00bf 0x1000,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u00c0 0x0400,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u00c1 0x1c00,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u00c2 0x3300,0x4c00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u00c3 0x2200,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u00c4 0x1c00,0x2200,0x1c00,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u00c5 0x0000,0x0000,0x0000,0x7f80,0x8800,0x8800,0x8800,0x8800,0xff00,0x8800,0x8800,0x8800,0x8800,0x8800,0x8f80,0x0000, 0x0000,0x0000, // u00c6 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x4100,0x3e00,0x0800, 0x0800,0x1000, // u00c7 0x1000,0x0800,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u00c8 0x0400,0x0800,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u00c9 0x1c00,0x2200,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u00ca 0x2200,0x2200,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u00cb 0x1000,0x0800,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u00cc 0x0400,0x0800,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u00cd 0x1c00,0x2200,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u00ce 0x2200,0x2200,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u00cf 0x0000,0x0000,0x0000,0x7c00,0x4200,0x4100,0x4100,0x4100,0xf900,0x4100,0x4100,0x4100,0x4100,0x4200,0x7c00,0x0000, 0x0000,0x0000, // u00d0 0x3300,0x4c00,0x0000,0x4100,0x4100,0x4100,0x6100,0x5100,0x4900,0x4500,0x4300,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u00d1 0x1000,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u00d2 0x0400,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u00d3 0x1c00,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u00d4 0x3300,0x4c00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u00d5 0x2200,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u00d6 0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x2200,0x1400,0x0800,0x1400,0x2200,0x4100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00d7 0x0000,0x0000,0x0000,0x3e00,0x4180,0x4100,0x4300,0x4500,0x4900,0x5100,0x6100,0x4100,0xc100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u00d8 0x1000,0x0800,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u00d9 0x0400,0x0800,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u00da 0x1c00,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u00db 0x2200,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u00dc 0x0400,0x0800,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u00dd 0x0000,0x0000,0x0000,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x4000,0x4000,0x4000,0x0000, 0x0000,0x0000, // u00de 0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4400,0x7e00,0x4100,0x4100,0x4100,0x4100,0x6100,0x5e00,0x0000, 0x0000,0x0000, // u00df 0x0000,0x0000,0x0000,0x1000,0x0800,0x0000,0x3e00,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u00e0 0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x3e00,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u00e1 0x0000,0x0000,0x0000,0x1c00,0x2200,0x0000,0x3e00,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u00e2 0x0000,0x0000,0x0000,0x3300,0x4c00,0x0000,0x3e00,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u00e3 0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x3e00,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u00e4 0x0000,0x0000,0x0000,0x1c00,0x2200,0x1c00,0x3e00,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u00e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7700,0x0880,0x0880,0x7880,0x8f80,0x8800,0x8800,0x8880,0x7700,0x0000, 0x0000,0x0000, // u00e6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x3e00,0x0800, 0x0800,0x1000, // u00e7 0x0000,0x0000,0x0000,0x1000,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u00e8 0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u00e9 0x0000,0x0000,0x0000,0x1c00,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u00ea 0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u00eb 0x0000,0x0000,0x0000,0x1000,0x0800,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u00ec 0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u00ed 0x0000,0x0000,0x0000,0x1c00,0x2200,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u00ee 0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u00ef 0x0000,0x0000,0x0000,0x2c00,0x1000,0x6800,0x0400,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u00f0 0x0000,0x0000,0x0000,0x3300,0x4c00,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u00f1 0x0000,0x0000,0x0000,0x1000,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u00f2 0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u00f3 0x0000,0x0000,0x0000,0x1c00,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u00f4 0x0000,0x0000,0x0000,0x3300,0x4c00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u00f5 0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u00f6 0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x7f00,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00f7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e80,0x4100,0x4300,0x4500,0x4900,0x5100,0x6100,0x4100,0xbe00,0x0000, 0x0000,0x0000, // u00f8 0x0000,0x0000,0x0000,0x1000,0x0800,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u00f9 0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u00fa 0x0000,0x0000,0x0000,0x1c00,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u00fb 0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u00fc 0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100, 0x0100,0x3e00, // u00fd 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x4000, 0x4000,0x4000, // u00fe 0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100, 0x0100,0x3e00, // u00ff 0x0000,0x3e00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u0100 0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x3e00,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u0101 0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u0102 0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x3e00,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u0103 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x0100, 0x0200,0x0180, // u0104 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100, 0x0200,0x0180, // u0105 0x0400,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0106 0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x3e00,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0107 0x1c00,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0108 0x0000,0x0000,0x0000,0x1c00,0x2200,0x0000,0x3e00,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0109 0x0800,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u010a 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x3e00,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u010b 0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u010c 0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u010d 0x2200,0x1c00,0x0000,0x7c00,0x4200,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4200,0x7c00,0x0000, 0x0000,0x0000, // u010e 0x2200,0x1c00,0x0000,0x0100,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u010f 0x0000,0x0000,0x0000,0x7c00,0x4200,0x4100,0x4100,0x4100,0xf900,0x4100,0x4100,0x4100,0x4100,0x4200,0x7c00,0x0000, 0x0000,0x0000, // u0110 0x0000,0x0000,0x0000,0x0100,0x0f80,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u0111 0x0000,0x3e00,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u0112 0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0113 0x2200,0x1c00,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u0114 0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0115 0x0800,0x0800,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u0116 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0117 0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0100, 0x0200,0x0180, // u0118 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00,0x0800, 0x1000,0x0c00, // u0119 0x2200,0x1c00,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u011a 0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u011b 0x1c00,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4f00,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u011c 0x0000,0x0000,0x0000,0x1c00,0x2200,0x0000,0x3f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100, 0x0100,0x3e00, // u011d 0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4f00,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u011e 0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x3f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100, 0x0100,0x3e00, // u011f 0x0800,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4f00,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0120 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x3f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100, 0x0100,0x3e00, // u0121 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4f00,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0800, 0x0800,0x1000, // u0122 0x0000,0x0000,0x0400,0x0800,0x0800,0x0000,0x3f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100, 0x0100,0x3e00, // u0123 0x1c00,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u0124 0x1c00,0x2200,0x0000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u0125 0x0000,0x0000,0x0000,0x4100,0x4100,0xff80,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u0126 0x0000,0x0000,0x0000,0x4000,0xf800,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u0127 0x3300,0x4c00,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u0128 0x0000,0x0000,0x0000,0x3300,0x4c00,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u0129 0x0000,0x3e00,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u012a 0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u012b 0x2200,0x1c00,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u012c 0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u012d 0x0000,0x0000,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0800, 0x1000,0x0c00, // u012e 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0800, 0x1000,0x0c00, // u012f 0x0800,0x0800,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u0130 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u0131 0x0000,0x0000,0x0000,0xe380,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4900,0x4900,0x4900,0xe600,0x0000, 0x0000,0x0000, // u0132 0x0000,0x0000,0x0000,0x2080,0x2080,0x0000,0x6180,0x2080,0x2080,0x2080,0x2080,0x2080,0x2080,0x2080,0x7080,0x0480, 0x0480,0x0300, // u0133 0x0700,0x0880,0x0000,0x0700,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x4200,0x4200,0x4200,0x3c00,0x0000, 0x0000,0x0000, // u0134 0x0000,0x0000,0x0000,0x0700,0x0880,0x0000,0x0600,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x2200, 0x2200,0x1c00, // u0135 0x0000,0x0000,0x0000,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100,0x0800, 0x0800,0x1000, // u0136 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4100,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x4100,0x0800, 0x0800,0x1000, // u0137 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x4100,0x0000, 0x0000,0x0000, // u0138 0x2000,0x4000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u0139 0x0400,0x0800,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u013a 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0800, 0x0800,0x1000, // u013b 0x0000,0x0000,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0800, 0x0800,0x1000, // u013c 0x2200,0x1c00,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u013d 0x2200,0x1c00,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u013e 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4200,0x4200,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u013f 0x0000,0x0000,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0840,0x0840,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u0140 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x2800,0x3000,0x2000,0x6000,0xa000,0x2000,0x2000,0x2000,0x3f80,0x0000, 0x0000,0x0000, // u0141 0x0000,0x0000,0x0000,0x1800,0x0800,0x0800,0x0a00,0x0c00,0x0800,0x1800,0x2800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u0142 0x0400,0x0800,0x0000,0x4100,0x4100,0x4100,0x6100,0x5100,0x4900,0x4500,0x4300,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u0143 0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u0144 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x6100,0x5100,0x4900,0x4500,0x4300,0x4100,0x4100,0x4100,0x4100,0x0800, 0x0800,0x1000, // u0145 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0800, 0x0800,0x1000, // u0146 0x2200,0x1c00,0x0000,0x4100,0x4100,0x4100,0x6100,0x5100,0x4900,0x4500,0x4300,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u0147 0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u0148 0x0000,0x4000,0x4000,0x4000,0x8000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u0149 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x6100,0x5100,0x4900,0x4500,0x4300,0x4100,0x4100,0x4100,0x4100,0x0100, 0x0100,0x0600, // u014a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0100, 0x0100,0x0600, // u014b 0x0000,0x3e00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u014c 0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u014d 0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u014e 0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u014f 0x1100,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0150 0x0000,0x0000,0x0000,0x1100,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0151 0x0000,0x0000,0x0000,0x7f80,0x8800,0x8800,0x8800,0x8800,0x8f00,0x8800,0x8800,0x8800,0x8800,0x8800,0x7f80,0x0000, 0x0000,0x0000, // u0152 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x8880,0x8880,0x8880,0x8f80,0x8800,0x8800,0x8880,0x7f00,0x0000, 0x0000,0x0000, // u0153 0x0400,0x0800,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x5000,0x4800,0x4400,0x4200,0x4100,0x0000, 0x0000,0x0000, // u0154 0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x4f00,0x5000,0x6000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000, 0x0000,0x0000, // u0155 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x5000,0x4800,0x4400,0x4200,0x4100,0x0800, 0x0800,0x1000, // u0156 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4f00,0x5000,0x6000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x2000, 0x2000,0x4000, // u0157 0x2200,0x1c00,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x5000,0x4800,0x4400,0x4200,0x4100,0x0000, 0x0000,0x0000, // u0158 0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x4f00,0x5000,0x6000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000, 0x0000,0x0000, // u0159 0x0400,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x3e00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u015a 0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x3e00,0x4100,0x4000,0x4000,0x3e00,0x0100,0x0100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u015b 0x1c00,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x3e00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u015c 0x0000,0x0000,0x0000,0x1c00,0x2200,0x0000,0x3e00,0x4100,0x4000,0x4000,0x3e00,0x0100,0x0100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u015d 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x3e00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00,0x0800, 0x0800,0x1000, // u015e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4000,0x4000,0x3e00,0x0100,0x0100,0x4100,0x3e00,0x0800, 0x0800,0x1000, // u015f 0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x3e00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0160 0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4000,0x4000,0x3e00,0x0100,0x0100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0161 0x0000,0x0000,0x0000,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0400, 0x0400,0x0800, // u0162 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x3e00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0700,0x0200, 0x0200,0x0400, // u0163 0x2200,0x1c00,0x0000,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u0164 0x2200,0x1c00,0x0000,0x0800,0x0800,0x0800,0x3e00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0700,0x0000, 0x0000,0x0000, // u0165 0x0000,0x0000,0x0000,0x7f00,0x0800,0x0800,0x0800,0x0800,0x3e00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u0166 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x3e00,0x0800,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0700,0x0000, 0x0000,0x0000, // u0167 0x3300,0x4c00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0168 0x0000,0x0000,0x0000,0x3300,0x4c00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u0169 0x0000,0x3e00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u016a 0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u016b 0x2200,0x1c00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u016c 0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u016d 0x1c00,0x2200,0x1c00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u016e 0x0000,0x0000,0x0000,0x1c00,0x2200,0x1c00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u016f 0x1100,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0170 0x0000,0x0000,0x0000,0x1100,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u0171 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0800, 0x1000,0x0c00, // u0172 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100, 0x0200,0x0180, // u0173 0x1c00,0x2200,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4c80,0x4c80,0x5280,0x5280,0x6180,0x4080,0x0000, 0x0000,0x0000, // u0174 0x0000,0x0000,0x0000,0x1c00,0x2200,0x0000,0x4100,0x4100,0x4100,0x4900,0x4900,0x4900,0x4900,0x4900,0x3e00,0x0000, 0x0000,0x0000, // u0175 0x1c00,0x2200,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u0176 0x0000,0x0000,0x0000,0x1c00,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100, 0x0100,0x3e00, // u0177 0x2200,0x2200,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u0178 0x0400,0x0800,0x0000,0x7f00,0x0100,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u0179 0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x7f00,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u017a 0x0800,0x0800,0x0000,0x7f00,0x0100,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u017b 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x7f00,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u017c 0x2200,0x1c00,0x0000,0x7f00,0x0100,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u017d 0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x7f00,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u017e 0x0000,0x0000,0x0000,0x0700,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u017f 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0186 0x0000,0x0000,0x0000,0x7f00,0x0100,0x0100,0x0100,0x0100,0x1f00,0x0100,0x0100,0x0100,0x0100,0x0100,0x7f00,0x0000, 0x0000,0x0000, // u018e 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x0100,0x0100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u018f 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x3c00,0x4000,0x4000,0x4000,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0190 0x0000,0x0000,0x0000,0x0600,0x0900,0x0900,0x0800,0x0800,0x3e00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x4800, 0x4800,0x3000, // u0192 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x6100,0x5100,0x4900,0x4500,0x4300,0x4100,0x4100,0x4100,0x4100,0x4000, 0x4000,0x8000, // u019d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0100, 0x0100,0x0100, // u019e 0x0000,0x0000,0x0000,0x7f00,0x0100,0x0100,0x0200,0x0400,0x7f00,0x0800,0x1000,0x2000,0x4000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u01b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0100,0x0200,0x0400,0x7f00,0x1000,0x2000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u01b6 0x0000,0x0000,0x0000,0x7f00,0x0100,0x0200,0x0400,0x0800,0x1e00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u01b7 0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u01cd 0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x3e00,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u01ce 0x2200,0x1c00,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u01cf 0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u01d0 0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u01d1 0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u01d2 0x2200,0x1c00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u01d3 0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u01d4 0x0000,0x3f00,0x0000,0x7f80,0x8800,0x8800,0x8800,0x8800,0xff00,0x8800,0x8800,0x8800,0x8800,0x8800,0x8f80,0x0000, 0x0000,0x0000, // u01e2 0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x7700,0x0880,0x0880,0x7880,0x8f80,0x8800,0x8800,0x8880,0x7700,0x0000, 0x0000,0x0000, // u01e3 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4f00,0x4100,0x4780,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u01e4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x4100,0x4100,0x4100,0x4780,0x4100,0x4100,0x4100,0x3f00,0x0100, 0x0100,0x3e00, // u01e5 0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4f00,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u01e6 0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x3f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100, 0x0100,0x3e00, // u01e7 0x2200,0x1c00,0x0000,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100,0x0000, 0x0000,0x0000, // u01e8 0x2200,0x1c00,0x0000,0x4000,0x4000,0x4000,0x4100,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x4100,0x0000, 0x0000,0x0000, // u01e9 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0800, 0x1000,0x0c00, // u01ea 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0800, 0x1000,0x0c00, // u01eb 0x0000,0x3e00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0800, 0x1000,0x0c00, // u01ec 0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0800, 0x1000,0x0c00, // u01ed 0x2200,0x1c00,0x0000,0x7f00,0x0100,0x0200,0x0400,0x0800,0x1e00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u01ee 0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x7f00,0x0100,0x0200,0x0400,0x0800,0x1e00,0x0100,0x0100,0x0100,0x4100, 0x4100,0x3e00, // u01ef 0x0000,0x0000,0x0000,0x0880,0x0700,0x0000,0x0600,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x2200, 0x2200,0x1c00, // u01f0 0x0400,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4f00,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u01f4 0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x3f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100, 0x0100,0x3e00, // u01f5 0x0400,0x0800,0x0000,0x7f80,0x8800,0x8800,0x8800,0x8800,0xff00,0x8800,0x8800,0x8800,0x8800,0x8800,0x8f80,0x0000, 0x0000,0x0000, // u01fc 0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x7700,0x0880,0x0880,0x7880,0x8f80,0x8800,0x8800,0x8880,0x7700,0x0000, 0x0000,0x0000, // u01fd 0x0400,0x0800,0x0000,0x3e00,0x4180,0x4100,0x4300,0x4500,0x4900,0x5100,0x6100,0x4100,0xc100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u01fe 0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x3e80,0x4100,0x4300,0x4500,0x4900,0x5100,0x6100,0x4100,0xbe00,0x0000, 0x0000,0x0000, // u01ff 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x3e00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00,0x0800, 0x0800,0x1000, // u0218 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4000,0x4000,0x3e00,0x0100,0x0100,0x4100,0x3e00,0x0800, 0x0800,0x1000, // u0219 0x0000,0x0000,0x0000,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0400, 0x0400,0x0800, // u021a 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x3e00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0700,0x0100, 0x0100,0x0200, // u021b 0x0000,0x3e00,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u0232 0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100, 0x0100,0x3e00, // u0233 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x2200, 0x2200,0x1c00, // u0237 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x0100,0x0100,0x0100,0x0100,0x0100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0254 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x0100,0x0100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0258 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x0100,0x0100,0x7f00,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0259 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4000,0x4000,0x3c00,0x4000,0x4000,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u025b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4000, 0x4000,0x8000, // u0272 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0100,0x0200,0x0400,0x0800,0x1e00,0x0100,0x0100,0x0100,0x4100, 0x4100,0x3e00, // u0292 0x0400,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u02bb 0x0800,0x0800,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u02bc 0x0800,0x0800,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u02bd 0x1c00,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u02c6 0x2200,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u02c7 0x2200,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u02d8 0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u02d9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800, 0x1000,0x0c00, // u02db 0x3300,0x4c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u02dc 0x1100,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u02dd 0x1000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0300 0x0400,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0301 0x1c00,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0302 0x3300,0x4c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0303 0x0000,0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0304 0x0000,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0305 0x2200,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0306 0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0307 0x2200,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0308 0x1c00,0x2200,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u030a 0x1100,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u030b 0x2200,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u030c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0800,0x0800, // u0329 0x0000,0x4000,0x8000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0384 0x0400,0x0800,0x0000,0x2200,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0385 0x0000,0x4000,0x8000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u0386 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0387 0x0000,0x4000,0x8000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u0388 0x0000,0x4000,0x8000,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u0389 0x0000,0x4000,0x8000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u038a 0x0000,0x4000,0x8000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u038c 0x0000,0x4000,0x8000,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0a00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0000, 0x0000,0x0000, // u038e 0x0000,0x4000,0x8000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x2200,0x1400,0x1400,0x7700,0x0000, 0x0000,0x0000, // u038f 0x0400,0x0800,0x0000,0x2200,0x2200,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0600,0x0000, 0x0000,0x0000, // u0390 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u0391 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x0000, 0x0000,0x0000, // u0392 0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000, 0x0000,0x0000, // u0393 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x1400,0x1400,0x1400,0x2200,0x2200,0x2200,0x4100,0x4100,0x7f00,0x0000, 0x0000,0x0000, // u0394 0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u0395 0x0000,0x0000,0x0000,0x7f00,0x0100,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u0396 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u0397 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x5d00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0398 0x0000,0x0000,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u0399 0x0000,0x0000,0x0000,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100,0x0000, 0x0000,0x0000, // u039a 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x1400,0x1400,0x1400,0x2200,0x2200,0x2200,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u039b 0x0000,0x0000,0x0000,0x4080,0x6180,0x5280,0x5280,0x4c80,0x4c80,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x0000, 0x0000,0x0000, // u039c 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x6100,0x5100,0x4900,0x4500,0x4300,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u039d 0x0000,0x0000,0x0000,0x7f00,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0000, 0x0000,0x0000, // u039e 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u039f 0x0000,0x0000,0x0000,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u03a0 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000, 0x0000,0x0000, // u03a1 0x0000,0x0000,0x0000,0x7f00,0x4000,0x2000,0x1000,0x0800,0x0400,0x0400,0x0800,0x1000,0x2000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u03a3 0x0000,0x0000,0x0000,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u03a4 0x0000,0x0000,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u03a5 0x0000,0x0000,0x0000,0x0800,0x3e00,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x3e00,0x0800,0x0000, 0x0000,0x0000, // u03a6 0x0000,0x0000,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x0800,0x0800,0x1400,0x2200,0x2200,0x4100,0x4100,0x0000, 0x0000,0x0000, // u03a7 0x0000,0x0000,0x0000,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x3e00,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u03a8 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x2200,0x1400,0x1400,0x7700,0x0000, 0x0000,0x0000, // u03a9 0x2200,0x2200,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u03aa 0x2200,0x2200,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u03ab 0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x3d80,0x4300,0x4200,0x4200,0x4200,0x4200,0x4200,0x4300,0x3d80,0x0000, 0x0000,0x0000, // u03ac 0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x3e00,0x4100,0x4000,0x4000,0x3c00,0x4000,0x4000,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u03ad 0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0100, 0x0100,0x0100, // u03ae 0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0600,0x0000, 0x0000,0x0000, // u03af 0x0400,0x0800,0x0000,0x2200,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u03b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3d80,0x4300,0x4200,0x4200,0x4200,0x4200,0x4200,0x4300,0x3d80,0x0000, 0x0000,0x0000, // u03b1 0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4400,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x4000, 0x4000,0x4000, // u03b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x2200,0x2200,0x2200,0x1400,0x1400,0x0800,0x0800, 0x0800,0x0800, // u03b3 0x0000,0x0000,0x0000,0x3e00,0x1000,0x0800,0x1c00,0x2200,0x4100,0x4100,0x4100,0x4100,0x4100,0x2200,0x1c00,0x0000, 0x0000,0x0000, // u03b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4000,0x4000,0x3c00,0x4000,0x4000,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u03b5 0x0000,0x0000,0x0000,0x7f00,0x0200,0x0400,0x0800,0x1000,0x2000,0x2000,0x4000,0x4000,0x4000,0x4000,0x3e00,0x0100, 0x0100,0x0200, // u03b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0100, 0x0100,0x0100, // u03b7 0x0000,0x0000,0x0000,0x1e00,0x2100,0x2100,0x2100,0x2100,0x3f00,0x2100,0x2100,0x2100,0x2100,0x2100,0x1e00,0x0000, 0x0000,0x0000, // u03b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0600,0x0000, 0x0000,0x0000, // u03b9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x4100,0x0000, 0x0000,0x0000, // u03ba 0x0000,0x0000,0x0000,0x1000,0x1000,0x0800,0x0800,0x1400,0x1400,0x2200,0x2200,0x2200,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u03bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4300,0x7d00,0x4000, 0x4000,0x4000, // u03bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x0800,0x0000, 0x0000,0x0000, // u03bd 0x0000,0x0000,0x0000,0x3f00,0x4000,0x4000,0x4000,0x4000,0x3e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x3e00,0x0100, 0x0100,0x0200, // u03be 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u03bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u03c0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x4000, 0x4000,0x4000, // u03c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x3e00,0x0100, 0x0100,0x0200, // u03c2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x2200,0x4100,0x4100,0x4100,0x4100,0x4100,0x2200,0x1c00,0x0000, 0x0000,0x0000, // u03c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0600,0x0000, 0x0000,0x0000, // u03c4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u03c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2600,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x3e00,0x0800, 0x0800,0x0800, // u03c6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x0800,0x0800,0x1400,0x2200,0x2200, 0x4100,0x4100, // u03c7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x3e00,0x0800, 0x0800,0x0800, // u03c8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2200,0x4100,0x4100,0x4900,0x4900,0x4900,0x4900,0x4900,0x3600,0x0000, 0x0000,0x0000, // u03c9 0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0600,0x0000, 0x0000,0x0000, // u03ca 0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u03cb 0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u03cc 0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u03cd 0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x2200,0x4100,0x4100,0x4900,0x4900,0x4900,0x4900,0x4900,0x3600,0x0000, 0x0000,0x0000, // u03ce 0x0000,0x0000,0x0000,0x1e00,0x2100,0x2100,0x2100,0x1f80,0x0100,0x0100,0x6100,0x2100,0x2100,0x2100,0x1e00,0x0000, 0x0000,0x0000, // u03d1 0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x3e00,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x3e00,0x0800, 0x0800,0x0000, // u03d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xe080,0x1100,0x0a00,0x0c00,0x0800,0x1800,0x2800,0x4400,0x8380,0x0000, 0x0000,0x0000, // u03f0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x4000, 0x4000,0x3e00, // u03f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u03f2 0x0000,0x0000,0x0000,0x0200,0x0200,0x0000,0x0600,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x2200, 0x2200,0x1c00, // u03f3 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u03f4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2000,0x4000,0x4000,0x7e00,0x4000,0x4000,0x2000,0x1f00,0x0000, 0x0000,0x0000, // u03f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0200,0x0100,0x0100,0x3f00,0x0100,0x0100,0x0200,0x7c00,0x0000, 0x0000,0x0000, // u03f6 0x1000,0x0800,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u0400 0x2200,0x2200,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u0401 0x0000,0x0000,0x0000,0xf800,0x2000,0x2000,0x3e00,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2600,0x0000, 0x0000,0x0000, // u0402 0x0400,0x0800,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000, 0x0000,0x0000, // u0403 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0404 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x3e00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0405 0x0000,0x0000,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u0406 0x2200,0x2200,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u0407 0x0000,0x0000,0x0000,0x0380,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x2100,0x2100,0x2100,0x1e00,0x0000, 0x0000,0x0000, // u0408 0x0000,0x0000,0x0000,0x3800,0x4800,0x8800,0x8800,0x8f00,0x8880,0x8880,0x8880,0x8880,0x8880,0x8880,0x8f00,0x0000, 0x0000,0x0000, // u0409 0x0000,0x0000,0x0000,0x8800,0x8800,0x8800,0x8800,0x8f00,0xf880,0x8880,0x8880,0x8880,0x8880,0x8880,0x8f00,0x0000, 0x0000,0x0000, // u040a 0x0000,0x0000,0x0000,0xf800,0x2000,0x2000,0x3e00,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0000, // u040b 0x0400,0x0800,0x0000,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100,0x0000, 0x0000,0x0000, // u040c 0x1000,0x0800,0x0000,0x4100,0x4100,0x4100,0x4300,0x4500,0x4900,0x5100,0x6100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u040d 0x2200,0x1c00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100,0x0100,0x0100,0x0100,0x3e00,0x0000, 0x0000,0x0000, // u040e 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x0800, 0x0800,0x0000, // u040f 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u0410 0x0000,0x0000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x0000, 0x0000,0x0000, // u0411 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x0000, 0x0000,0x0000, // u0412 0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000, 0x0000,0x0000, // u0413 0x0000,0x0000,0x0000,0x0f00,0x1100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x7f80,0x4080, 0x4080,0x0000, // u0414 0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u0415 0x0000,0x0000,0x0000,0x4900,0x4900,0x4900,0x4900,0x2a00,0x1c00,0x2a00,0x4900,0x4900,0x4900,0x4900,0x4900,0x0000, 0x0000,0x0000, // u0416 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x0100,0x0100,0x1e00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0417 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4300,0x4500,0x4900,0x5100,0x6100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u0418 0x2200,0x1c00,0x0000,0x4100,0x4100,0x4100,0x4300,0x4500,0x4900,0x5100,0x6100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u0419 0x0000,0x0000,0x0000,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100,0x0000, 0x0000,0x0000, // u041a 0x0000,0x0000,0x0000,0x0f00,0x1100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x4100,0x0000, 0x0000,0x0000, // u041b 0x0000,0x0000,0x0000,0x4080,0x6180,0x5280,0x5280,0x4c80,0x4c80,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x0000, 0x0000,0x0000, // u041c 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u041d 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u041e 0x0000,0x0000,0x0000,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u041f 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000, 0x0000,0x0000, // u0420 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0421 0x0000,0x0000,0x0000,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u0422 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100,0x0100,0x0100,0x0100,0x3e00,0x0000, 0x0000,0x0000, // u0423 0x0000,0x0000,0x0800,0x3e00,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x3e00,0x0800, 0x0000,0x0000, // u0424 0x0000,0x0000,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x0800,0x0800,0x1400,0x2200,0x2200,0x4100,0x4100,0x0000, 0x0000,0x0000, // u0425 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f80,0x0080, 0x0080,0x0000, // u0426 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100,0x0100,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0000, // u0427 0x0000,0x0000,0x0000,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x3f00,0x0000, 0x0000,0x0000, // u0428 0x0000,0x0000,0x0000,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x3f80,0x0080, 0x0080,0x0000, // u0429 0x0000,0x0000,0x0000,0xc000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x0000, 0x0000,0x0000, // u042a 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x7880,0x4480,0x4480,0x4480,0x4480,0x4480,0x4480,0x7880,0x0000, 0x0000,0x0000, // u042b 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x0000, 0x0000,0x0000, // u042c 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x0100,0x0100,0x1f00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u042d 0x0000,0x0000,0x0000,0x4700,0x4880,0x4880,0x4880,0x4880,0x7880,0x4880,0x4880,0x4880,0x4880,0x4880,0x4700,0x0000, 0x0000,0x0000, // u042e 0x0000,0x0000,0x0000,0x3f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0500,0x0900,0x1100,0x2100,0x4100,0x0000, 0x0000,0x0000, // u042f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u0430 0x0000,0x0000,0x0000,0x3e00,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x0000, 0x0000,0x0000, // u0431 0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4400,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x0000, 0x0000,0x0000, // u0432 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000, 0x0000,0x0000, // u0433 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100, 0x0100,0x3e00, // u0434 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0435 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4900,0x4900,0x4900,0x2a00,0x1c00,0x2a00,0x4900,0x4900,0x4900,0x0000, 0x0000,0x0000, // u0436 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x0100,0x0100,0x1e00,0x0100,0x0100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0437 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u0438 0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u0439 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x4100,0x0000, 0x0000,0x0000, // u043a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f00,0x1100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x4100,0x0000, 0x0000,0x0000, // u043b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x6300,0x5500,0x4900,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u043c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u043d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u043e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u043f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x4000, 0x4000,0x4000, // u0440 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0441 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u0442 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100, 0x0100,0x3e00, // u0443 0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x3e00,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x3e00,0x0800, 0x0800,0x0000, // u0444 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x2200,0x1400,0x0800,0x1400,0x2200,0x4100,0x4100,0x0000, 0x0000,0x0000, // u0445 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f80,0x0080, 0x0080,0x0000, // u0446 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0000, // u0447 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x3f00,0x0000, 0x0000,0x0000, // u0448 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x3f80,0x0080, 0x0080,0x0000, // u0449 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x2000,0x2000,0x3e00,0x2100,0x2100,0x2100,0x2100,0x3e00,0x0000, 0x0000,0x0000, // u044a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x7880,0x4480,0x4480,0x4480,0x4480,0x7880,0x0000, 0x0000,0x0000, // u044b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x3e00,0x2100,0x2100,0x2100,0x2100,0x3e00,0x0000, 0x0000,0x0000, // u044c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x0100,0x0100,0x1f00,0x0100,0x0100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u044d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4700,0x4880,0x4880,0x4880,0x7880,0x4880,0x4880,0x4880,0x4700,0x0000, 0x0000,0x0000, // u044e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x4100,0x4100,0x4100,0x3f00,0x0500,0x0900,0x1100,0x2100,0x0000, 0x0000,0x0000, // u044f 0x0000,0x0000,0x0000,0x1000,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0450 0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0451 0x0000,0x0000,0x0000,0x4000,0xf800,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0100, 0x0100,0x0600, // u0452 0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000, 0x0000,0x0000, // u0453 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0454 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4000,0x4000,0x3e00,0x0100,0x0100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u0455 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u0456 0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u0457 0x0000,0x0000,0x0000,0x0200,0x0200,0x0000,0x0600,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x2200, 0x2200,0x1c00, // u0458 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x4800,0x8800,0x8f00,0x8880,0x8880,0x8880,0x8880,0x8f00,0x0000, 0x0000,0x0000, // u0459 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0x8800,0x8f00,0xf880,0x8880,0x8880,0x8880,0x8f00,0x0000, 0x0000,0x0000, // u045a 0x0000,0x0000,0x0000,0x4000,0xf800,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u045b 0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x4100,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x4100,0x0000, 0x0000,0x0000, // u045c 0x0000,0x0000,0x0000,0x1000,0x0800,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u045d 0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100, 0x0100,0x3e00, // u045e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x0800, 0x0800,0x0000, // u045f 0x0000,0x0000,0x0000,0x4000,0xf800,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x0000, 0x0000,0x0000, // u0462 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0xf800,0x2000,0x2000,0x3e00,0x2100,0x2100,0x2100,0x2100,0x3e00,0x0000, 0x0000,0x0000, // u0463 0x0000,0x0000,0x0000,0x7f00,0x4100,0x2200,0x2200,0x1400,0x0800,0x1c00,0x2a00,0x4900,0x4900,0x4900,0x4900,0x0000, 0x0000,0x0000, // u046a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x4100,0x2200,0x1400,0x1c00,0x2a00,0x4900,0x4900,0x4900,0x0000, 0x0000,0x0000, // u046b 0x0000,0x0100,0x0100,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000, 0x0000,0x0000, // u0490 0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000, 0x0000,0x0000, // u0491 0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0xf800,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000, 0x0000,0x0000, // u0492 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0xf800,0x4000,0x4000,0x4000,0x4000,0x0000, 0x0000,0x0000, // u0493 0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x0100, 0x0200,0x0000, // u0494 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200,0x0200, 0x0400,0x0000, // u0495 0x0000,0x0000,0x0000,0x4900,0x4900,0x4900,0x4900,0x2a00,0x1c00,0x2a00,0x4900,0x4900,0x4900,0x4900,0x4980,0x0080, 0x0080,0x0000, // u0496 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4900,0x4900,0x4900,0x2a00,0x1c00,0x2a00,0x4900,0x4900,0x4980,0x0080, 0x0080,0x0000, // u0497 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x0100,0x0100,0x1e00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00,0x0800, 0x0800,0x0800, // u0498 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x0100,0x0100,0x1e00,0x0100,0x0100,0x4100,0x3e00,0x0800, 0x0800,0x0800, // u0499 0x0000,0x0000,0x0000,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x4180,0x0080, 0x0080,0x0000, // u049a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x4180,0x0080, 0x0080,0x0000, // u049b 0x0000,0x0000,0x0000,0x4100,0x4100,0x4200,0x5400,0x5800,0x7000,0x7000,0x5800,0x5400,0x4200,0x4100,0x4100,0x0000, 0x0000,0x0000, // u049c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x5200,0x5400,0x5800,0x7000,0x5800,0x5400,0x5200,0x4100,0x0000, 0x0000,0x0000, // u049d 0x0000,0x0000,0x0000,0xc100,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100,0x0000, 0x0000,0x0000, // u04a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc100,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x4100,0x0000, 0x0000,0x0000, // u04a1 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4180,0x0080, 0x0080,0x0000, // u04a2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4180,0x0080, 0x0080,0x0000, // u04a3 0x0000,0x0000,0x0000,0x43c0,0x4200,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x0000, 0x0000,0x0000, // u04a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x43c0,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x0000, 0x0000,0x0000, // u04a5 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x4100,0x3e00,0x0800, 0x0800,0x0800, // u04aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x3e00,0x0800, 0x0800,0x0800, // u04ab 0x0000,0x0000,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u04ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x2200,0x2200,0x2200,0x1400,0x1400,0x0800,0x0800, 0x0800,0x0800, // u04af 0x0000,0x0000,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x3e00,0x0800,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u04b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x2200,0x2200,0x2200,0x1400,0x1400,0x0800,0x3e00, 0x0800,0x0800, // u04b1 0x0000,0x0000,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x0800,0x0800,0x1400,0x2200,0x2200,0x4100,0x4180,0x0080, 0x0080,0x0000, // u04b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x2200,0x1400,0x0800,0x1400,0x2200,0x4100,0x4180,0x0080, 0x0080,0x0000, // u04b3 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100,0x0100,0x0100,0x0100,0x0180,0x0080, 0x0080,0x0000, // u04b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100,0x0100,0x0100,0x0180,0x0080, 0x0080,0x0000, // u04b7 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4900,0x4900,0x4900,0x3f00,0x0900,0x0900,0x0900,0x0100,0x0100,0x0000, 0x0000,0x0000, // u04b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4900,0x4900,0x3f00,0x0900,0x0900,0x0100,0x0100,0x0000, 0x0000,0x0000, // u04b9 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u04ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u04bb 0x0000,0x0000,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u04c0 0x2200,0x1c00,0x0000,0x4900,0x4900,0x4900,0x4900,0x2a00,0x1c00,0x2a00,0x4900,0x4900,0x4900,0x4900,0x4900,0x0000, 0x0000,0x0000, // u04c1 0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x4900,0x4900,0x4900,0x2a00,0x1c00,0x2a00,0x4900,0x4900,0x4900,0x0000, 0x0000,0x0000, // u04c2 0x0000,0x0000,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0000,0x0000, // u04cf 0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u04d0 0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x3e00,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u04d1 0x2200,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u04d2 0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x3e00,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u04d3 0x0000,0x0000,0x0000,0x7f80,0x8800,0x8800,0x8800,0x8800,0xff00,0x8800,0x8800,0x8800,0x8800,0x8800,0x8f80,0x0000, 0x0000,0x0000, // u04d4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7700,0x0880,0x0880,0x7880,0x8f80,0x8800,0x8800,0x8880,0x7700,0x0000, 0x0000,0x0000, // u04d5 0x2200,0x1c00,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u04d6 0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u04d7 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x0100,0x0100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u04d8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x0100,0x0100,0x7f00,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u04d9 0x2200,0x2200,0x0000,0x3e00,0x4100,0x4100,0x0100,0x0100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u04da 0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x3e00,0x4100,0x0100,0x0100,0x7f00,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u04db 0x2200,0x2200,0x0000,0x4900,0x4900,0x4900,0x4900,0x2a00,0x1c00,0x2a00,0x4900,0x4900,0x4900,0x4900,0x4900,0x0000, 0x0000,0x0000, // u04dc 0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x4900,0x4900,0x4900,0x2a00,0x1c00,0x2a00,0x4900,0x4900,0x4900,0x0000, 0x0000,0x0000, // u04dd 0x2200,0x2200,0x0000,0x3e00,0x4100,0x4100,0x0100,0x0100,0x1e00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u04de 0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x3e00,0x4100,0x0100,0x0100,0x1e00,0x0100,0x0100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u04df 0x0000,0x3e00,0x0000,0x4100,0x4100,0x4100,0x4300,0x4500,0x4900,0x5100,0x6100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u04e2 0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u04e3 0x2200,0x2200,0x0000,0x4100,0x4100,0x4100,0x4300,0x4500,0x4900,0x5100,0x6100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u04e4 0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0000,0x0000, // u04e5 0x2200,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u04e6 0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u04e7 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u04e8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u04e9 0x2200,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u04ea 0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u04eb 0x2200,0x2200,0x0000,0x3e00,0x4100,0x4100,0x0100,0x0100,0x1f00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u04ec 0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x3e00,0x4100,0x0100,0x0100,0x1f00,0x0100,0x0100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u04ed 0x0000,0x3e00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100,0x0100,0x0100,0x0100,0x3e00,0x0000, 0x0000,0x0000, // u04ee 0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100, 0x0100,0x3e00, // u04ef 0x2200,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100,0x0100,0x0100,0x0100,0x3e00,0x0000, 0x0000,0x0000, // u04f0 0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100, 0x0100,0x3e00, // u04f1 0x1100,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100,0x0100,0x0100,0x0100,0x3e00,0x0000, 0x0000,0x0000, // u04f2 0x0000,0x0000,0x0000,0x1100,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100, 0x0100,0x3e00, // u04f3 0x2200,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100,0x0100,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0000, // u04f4 0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0000, // u04f5 0x2200,0x2200,0x0000,0x4080,0x4080,0x4080,0x4080,0x7880,0x4480,0x4480,0x4480,0x4480,0x4480,0x4480,0x7880,0x0000, 0x0000,0x0000, // u04f8 0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x4080,0x4080,0x4080,0x7880,0x4480,0x4480,0x4480,0x4480,0x7880,0x0000, 0x0000,0x0000, // u04f9 0x0000,0x0000,0x0000,0x2080,0x2080,0x1080,0x1080,0x0880,0x1900,0x2600,0x4400,0x4200,0x4200,0x4100,0x4100,0x0000, 0x0000,0x0000, // u05d0 0x0000,0x0000,0x0000,0x7e00,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x7f80,0x0000, 0x0000,0x0000, // u05d1 0x0000,0x0000,0x0000,0x3c00,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0600,0x0900,0x1100,0x2080,0x4080,0x0000, 0x0000,0x0000, // u05d2 0x0000,0x0000,0x0000,0x7f80,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0000, // u05d3 0x0000,0x0000,0x0000,0x7e00,0x0100,0x0100,0x0100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u05d4 0x0000,0x0000,0x0000,0x3000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u05d5 0x0000,0x0000,0x0000,0x3f00,0x0200,0x0400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u05d6 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u05d7 0x0000,0x0000,0x0000,0x4600,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u05d8 0x0000,0x0000,0x0000,0x3000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u05d9 0x0000,0x0000,0x0000,0x7e00,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0100,0x0100, // u05da 0x0000,0x0000,0x0000,0x7e00,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x7e00,0x0000, 0x0000,0x0000, // u05db 0x0000,0x4000,0x4000,0x7f00,0x0100,0x0100,0x0100,0x0100,0x0200,0x0400,0x0800,0x1000,0x1000,0x1000,0x1000,0x0000, 0x0000,0x0000, // u05dc 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x0000, 0x0000,0x0000, // u05dd 0x0000,0x0000,0x0000,0xdc00,0x6200,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4700,0x0000, 0x0000,0x0000, // u05de 0x0000,0x0000,0x0000,0x7800,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400, // u05df 0x0000,0x0000,0x0000,0x3c00,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x3e00,0x0000, 0x0000,0x0000, // u05e0 0x0000,0x0000,0x0000,0xfe00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u05e1 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x2100,0x2100,0x2100,0x1100,0x1200,0x1200,0x0c00,0x1800,0x6000,0x0000, 0x0000,0x0000, // u05e2 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x3100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0100,0x0100, // u05e3 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x3100,0x0100,0x0100,0x0100,0x0100,0x0100,0x7e00,0x0000, 0x0000,0x0000, // u05e4 0x0000,0x0000,0x0000,0x4100,0x4100,0x2100,0x2100,0x1200,0x1400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u05e5 0x0000,0x0000,0x0000,0x4100,0x4100,0x2100,0x2100,0x1200,0x1400,0x0800,0x0800,0x0400,0x0400,0x0200,0x7e00,0x0000, 0x0000,0x0000, // u05e6 0x0000,0x0000,0x0000,0x7f00,0x0100,0x0100,0x0100,0x4100,0x4100,0x4200,0x4400,0x4800,0x4800,0x4800,0x4800,0x4000, 0x4000,0x4000, // u05e7 0x0000,0x0000,0x0000,0x7e00,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0000, // u05e8 0x0000,0x0000,0x0000,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x5100,0x6100,0x4100,0x4100,0x4200,0x7c00,0x0000, 0x0000,0x0000, // u05e9 0x0000,0x0000,0x0000,0xfe00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x8100,0x0000, 0x0000,0x0000, // u05ea 0x0000,0x0000,0x0000,0x7c00,0x4200,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4200,0x7c00,0x0000, 0x1000,0x1000, // u1e0c 0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0800,0x0800, // u1e0d 0x0000,0x0000,0x0000,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100,0x0000, 0x3e00,0x0000, // u1e34 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4100,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x4100,0x0000, 0x3e00,0x0000, // u1e35 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0000, 0x0800,0x0800, // u1e36 0x0000,0x0000,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0800,0x0800, // u1e37 0x0800,0x0800,0x0000,0x4080,0x6180,0x5280,0x5280,0x4c80,0x4c80,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x0000, 0x0000,0x0000, // u1e40 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x7e00,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x0000, 0x0000,0x0000, // u1e41 0x0000,0x0000,0x0000,0x4080,0x6180,0x5280,0x5280,0x4c80,0x4c80,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x0000, 0x0800,0x0800, // u1e42 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x0000, 0x0800,0x0800, // u1e43 0x0800,0x0800,0x0000,0x4100,0x4100,0x4100,0x6100,0x5100,0x4900,0x4500,0x4300,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u1e44 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u1e45 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x6100,0x5100,0x4900,0x4500,0x4300,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0800,0x0800, // u1e46 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0800,0x0800, // u1e47 0x0000,0x0000,0x0000,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000, 0x0800,0x0800, // u1e6c 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x3e00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0700,0x0200, 0x0200,0x0000, // u1e6d 0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0000, 0x0800,0x0800, // u1eb8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00,0x0000, 0x0800,0x0800, // u1eb9 0x3300,0x4c00,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u1ebc 0x0000,0x0000,0x0000,0x3300,0x4c00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00,0x0000, 0x0000,0x0000, // u1ebd 0x0000,0x0000,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0800,0x0800, // u1eca 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000, 0x0800,0x0800, // u1ecb 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0800,0x0800, // u1ecc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0800,0x0800, // u1ecd 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0000, 0x0800,0x0800, // u1ee4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0000, 0x0800,0x0800, // u1ee5 0x3300,0x4c00,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u1ef8 0x0000,0x0000,0x0000,0x3300,0x4c00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100, 0x0100,0x3e00, // u1ef9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2001 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2002 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2003 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2004 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2005 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2006 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2007 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2008 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2009 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u200a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u200b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u200c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u200d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u200e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u200f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2010 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2011 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2012 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2013 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2014 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2015 0x0000,0x0000,0x0000,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x0000, 0x0000,0x0000, // u2016 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00, 0x0000,0x7f00, // u2017 0x0000,0x0400,0x0800,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2018 0x0000,0x0800,0x0800,0x0800,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2019 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x1000, 0x0000,0x0000, // u201a 0x0000,0x1000,0x1000,0x1000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u201b 0x0000,0x1100,0x2200,0x2200,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u201c 0x0000,0x1100,0x1100,0x1100,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u201d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2200,0x2200,0x2200,0x4400, 0x0000,0x0000, // u201e 0x0000,0x4400,0x4400,0x4400,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u201f 0x0000,0x0000,0x0000,0x0800,0x0800,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u2020 0x0000,0x0000,0x0000,0x0800,0x0800,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x7f00,0x0800,0x0800,0x0000, 0x0000,0x0000, // u2021 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x1e00,0x1e00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2022 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4900,0x4900,0x0000, 0x0000,0x0000, // u2026 0x0000,0x0000,0x0000,0xe400,0xa400,0xe800,0x0800,0x1000,0x1000,0x2000,0x2000,0x4000,0x5dc0,0x9540,0x9dc0,0x0000, 0x0000,0x0000, // u2030 0x0000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2032 0x0000,0x2200,0x2200,0x2200,0x2200,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2033 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0200,0x0400,0x0800,0x1000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0000, 0x0000,0x0000, // u2039 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0400,0x0800,0x1000,0x2000,0x0000, 0x0000,0x0000, // u203a 0x0000,0x0000,0x0000,0x2200,0x2200,0x2200,0x2200,0x2200,0x2200,0x2200,0x2200,0x0000,0x0000,0x2200,0x2200,0x0000, 0x0000,0x0000, // u203c 0x0000,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u203e 0x0000,0x1c00,0x2200,0x2200,0x2200,0x2200,0x2200,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2070 0x0800,0x0800,0x0000,0x1800,0x0800,0x0800,0x0800,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2071 0x0000,0x0200,0x0600,0x0a00,0x1200,0x3f00,0x0200,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2074 0x0000,0x3c00,0x2000,0x2000,0x3c00,0x0200,0x0200,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2075 0x0000,0x1c00,0x2000,0x2000,0x3c00,0x2200,0x2200,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2076 0x0000,0x3e00,0x0200,0x0400,0x0400,0x0800,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2077 0x0000,0x1c00,0x2200,0x2200,0x1c00,0x2200,0x2200,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2078 0x0000,0x1c00,0x2200,0x2200,0x1e00,0x0200,0x0200,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2079 0x0000,0x0000,0x0800,0x0800,0x3e00,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u207a 0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u207b 0x0000,0x0000,0x0000,0x3e00,0x0000,0x0000,0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u207c 0x0000,0x0400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u207d 0x0000,0x0800,0x0400,0x0400,0x0400,0x0400,0x0400,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u207e 0x0000,0x0000,0x3c00,0x2200,0x2200,0x2200,0x2200,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u207f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x2200,0x2200,0x2200,0x2200,0x2200,0x1c00, 0x0000,0x0000, // u2080 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000, // u2081 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x2200,0x2200,0x0400,0x0800,0x1000,0x3e00, 0x0000,0x0000, // u2082 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x2200,0x0200,0x0c00,0x0200,0x2200,0x1c00, 0x0000,0x0000, // u2083 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0200,0x0600,0x0a00,0x1200,0x3f00,0x0200,0x0200, 0x0000,0x0000, // u2084 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x2000,0x2000,0x3c00,0x0200,0x0200,0x3c00, 0x0000,0x0000, // u2085 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x2000,0x2000,0x3c00,0x2200,0x2200,0x1c00, 0x0000,0x0000, // u2086 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0200,0x0400,0x0400,0x0800,0x0800,0x0800, 0x0000,0x0000, // u2087 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x2200,0x2200,0x1c00,0x2200,0x2200,0x1c00, 0x0000,0x0000, // u2088 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x2200,0x2200,0x1e00,0x0200,0x0200,0x1c00, 0x0000,0x0000, // u2089 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x3e00,0x0800,0x0800,0x0000, 0x0000,0x0000, // u208a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x0000,0x0000, 0x0000,0x0000, // u208b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x0000,0x3e00,0x0000,0x0000, 0x0000,0x0000, // u208c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0400, 0x0000,0x0000, // u208d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0400,0x0400,0x0400,0x0400,0x0400,0x0800, 0x0000,0x0000, // u208e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0200,0x1e00,0x2200,0x2200,0x1e00, 0x0000,0x0000, // u2090 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x2200,0x3e00,0x2000,0x2000,0x1e00, 0x0000,0x0000, // u2091 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x2200,0x2200,0x2200,0x2200,0x1c00, 0x0000,0x0000, // u2092 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2200,0x1400,0x0800,0x0800,0x1400,0x2200, 0x0000,0x0000, // u2093 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x0200,0x0200,0x3e00,0x2200,0x1c00, 0x0000,0x0000, // u2094 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x3c00,0x2200,0x2200,0x2200,0x2200,0x2200, 0x0000,0x0000, // u2095 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2200,0x2400,0x2800,0x3800,0x2400,0x2200, 0x0000,0x0000, // u2096 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000, // u2097 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4900,0x4900,0x4900,0x4900,0x4900, 0x0000,0x0000, // u2098 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x2200,0x2200,0x2200,0x2200,0x3c00, 0x2000,0x2000, // u209a 0x0000,0x0000,0x0000,0x7800,0x4400,0x4400,0x4400,0x4400,0x7a00,0x4200,0x4700,0x4200,0x4200,0x4200,0x4100,0x0000, 0x0000,0x0000, // u20a7 0x0000,0x0000,0x0000,0x7900,0x4500,0x4500,0x5500,0x5500,0x5500,0x5500,0x5500,0x5500,0x5100,0x5100,0x5e00,0x0000, 0x0000,0x0000, // u20aa 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4000,0xfc00,0x4000,0x4000,0xfc00,0x4000,0x4080,0x2100,0x1e00,0x0000, 0x0000,0x0000, // u20ac 0x0000,0x0000,0x0000,0x7f00,0x0800,0x0800,0x0800,0x0e00,0x3800,0x0e00,0x3800,0x0800,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u20ae 0x0000,0x0000,0x0000,0x3e00,0x5100,0x5100,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5100,0x5100,0x3e00,0x0000, 0x0000,0x0000, // u2102 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u210e 0x0000,0x0000,0x0000,0x4000,0xf800,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u210f 0x0000,0x0000,0x0000,0x4100,0x4100,0x6100,0x5100,0x6900,0x5500,0x4b00,0x4500,0x4300,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u2115 0x0000,0x0000,0x0000,0x8400,0x8480,0xc540,0xc540,0xa480,0xa400,0x9400,0x9400,0x8dc0,0x8c00,0x85c0,0x8400,0x0000, 0x0000,0x0000, // u2116 0x0000,0x0000,0x0000,0x3e00,0x5100,0x5100,0x5100,0x5100,0x5100,0x5100,0x5100,0x5100,0x5100,0x5500,0x3e00,0x0100, 0x0080,0x0000, // u211a 0x0000,0x0000,0x0000,0x7e00,0x5100,0x5100,0x5100,0x5100,0x5100,0x5e00,0x5400,0x5a00,0x5500,0x5280,0x7180,0x0000, 0x0000,0x0000, // u211d 0x0000,0x0000,0x0000,0xe880,0x4d80,0x4a80,0x4880,0x4880,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2122 0x0000,0x0000,0x0000,0x7f00,0x0100,0x0300,0x0500,0x0a00,0x1400,0x2800,0x5000,0x6000,0x4000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u2124 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x2200,0x1400,0x1400,0x7700,0x0000, 0x0000,0x0000, // u2126 0x0000,0x0000,0x0000,0x4200,0x4200,0x2100,0x2100,0x1080,0x3100,0x4a00,0x8c00,0x8400,0x8400,0x8200,0x4200,0x0000, 0x0000,0x0000, // u2135 0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x2000,0x4000,0xff80,0x4000,0x2000,0x1000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2190 0x0000,0x0000,0x0000,0x0800,0x1c00,0x2a00,0x4900,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u2191 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0200,0x0100,0xff80,0x0100,0x0200,0x0400,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2192 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x4900,0x2a00,0x1c00,0x0800,0x0000, 0x0000,0x0000, // u2193 0x0000,0x0000,0x0000,0x0000,0x0000,0x1200,0x2100,0x4080,0xffc0,0x4080,0x2100,0x1200,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2194 0x0000,0x0000,0x0000,0x0800,0x1c00,0x2a00,0x4900,0x0800,0x0800,0x0800,0x0800,0x4900,0x2a00,0x1c00,0x0800,0x0000, 0x0000,0x0000, // u2195 0x0000,0x0000,0x0000,0x0000,0x0000,0x1080,0x2080,0x4080,0xff80,0x4080,0x2080,0x1080,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u21a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x8400,0x8200,0x8100,0xff80,0x8100,0x8200,0x8400,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u21a6 0x0000,0x0000,0x0000,0x0800,0x1c00,0x2a00,0x4900,0x0800,0x0800,0x0800,0x4900,0x2a00,0x1c00,0x0800,0x7f00,0x0000, 0x0000,0x0000, // u21a8 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0080,0x0080,0x1080,0x2080,0x4080,0xff80,0x4000,0x2000,0x1000,0x0000, 0x0000,0x0000, // u21b5 0x0000,0x0000,0x0000,0x0000,0x7800,0x1800,0x2800,0x4880,0x4080,0x4080,0x4080,0x2100,0x1e00,0x0000,0x0000,0x0000, 0x0000,0x0000, // u21bb 0x0000,0x0000,0x0000,0x0000,0x1000,0x2000,0x4000,0xff80,0x0000,0xff80,0x0100,0x0200,0x0400,0x0000,0x0000,0x0000, 0x0000,0x0000, // u21cb 0x0000,0x0000,0x0000,0x0000,0x0400,0x0200,0x0100,0xff80,0x0000,0xff80,0x4000,0x2000,0x1000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u21cc 0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x2000,0x7f80,0xc000,0x7f80,0x2000,0x1000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u21d0 0x0000,0x0000,0x0000,0x0800,0x1c00,0x3600,0x5500,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x0000, 0x0000,0x0000, // u21d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0200,0xff00,0x0180,0xff00,0x0200,0x0400,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u21d2 0x0000,0x0000,0x0000,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x5500,0x3600,0x1c00,0x0800,0x0000, 0x0000,0x0000, // u21d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x1200,0x2100,0x7f80,0xc0c0,0x7f80,0x2100,0x1200,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u21d4 0x0000,0x0000,0x0000,0x0800,0x1c00,0x3600,0x5500,0x1400,0x1400,0x1400,0x1400,0x5500,0x3600,0x1c00,0x0800,0x0000, 0x0000,0x0000, // u21d5 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x7f00,0x2200,0x2200,0x2200,0x1400,0x1400,0x1400,0x0800,0x0800,0x0000, 0x0000,0x0000, // u2200 0x0000,0x0000,0x0000,0x0000,0x7f00,0x0100,0x0100,0x0100,0x0100,0x7f00,0x0100,0x0100,0x0100,0x0100,0x7f00,0x0000, 0x0000,0x0000, // u2203 0x0000,0x0000,0x0000,0x0200,0x7f00,0x0500,0x0500,0x0900,0x0900,0x7f00,0x1100,0x1100,0x2100,0x2100,0x7f00,0x4000, 0x0000,0x0000, // u2204 0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x3e00,0x4500,0x4500,0x4900,0x5100,0x5100,0x3e00,0x2000,0x4000,0x0000, 0x0000,0x0000, // u2205 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x1400,0x1400,0x1400,0x2200,0x2200,0x2200,0x4100,0x4100,0x7f00,0x0000, 0x0000,0x0000, // u2206 0x0000,0x0000,0x0000,0x7f00,0x4100,0x4100,0x2200,0x2200,0x2200,0x1400,0x1400,0x1400,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u2207 0x0000,0x0000,0x0000,0x0000,0x0f00,0x1000,0x2000,0x4000,0x4000,0x7f00,0x4000,0x4000,0x2000,0x1000,0x0f00,0x0000, 0x0000,0x0000, // u2208 0x0000,0x0000,0x0000,0x0100,0x0f00,0x1200,0x2200,0x4400,0x4400,0x7f00,0x4800,0x4800,0x3000,0x1000,0x2f00,0x2000, 0x0000,0x0000, // u2209 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2000,0x4000,0x4000,0x7f00,0x4000,0x4000,0x2000,0x1f00,0x0000,0x0000,0x0000, 0x0000,0x0000, // u220a 0x0000,0x0000,0x0000,0x0000,0x7800,0x0400,0x0200,0x0100,0x0100,0x7f00,0x0100,0x0100,0x0200,0x0400,0x7800,0x0000, 0x0000,0x0000, // u220b 0x0000,0x0000,0x0000,0x4000,0x7800,0x2400,0x2200,0x1100,0x1100,0x7f00,0x0900,0x0900,0x0600,0x0400,0x7a00,0x0200, 0x0000,0x0000, // u220c 0x0000,0x0000,0x0000,0x0000,0x7c00,0x0200,0x0100,0x0100,0x7f00,0x0100,0x0100,0x0200,0x7c00,0x0000,0x0000,0x0000, 0x0000,0x0000, // u220d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2212 0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0000,0x0000,0x0800,0x0800,0x0800,0x7f00,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u2213 0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0800,0x0800,0x0800,0x7f00,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u2214 0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2215 0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0100,0x0080,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2216 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2219 0x0000,0x0380,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x4200,0x4200,0x4200,0x2200,0x1200,0x0a00,0x0600,0x0000, 0x0000,0x0000, // u221a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3600,0x4900,0x4900,0x4900,0x4900,0x3600,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u221e 0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u221f 0x0000,0x0000,0x0000,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x0000, 0x0000,0x0000, // u2225 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x1400,0x1400,0x2200,0x2200,0x2200,0x4100,0x4100,0x0000, 0x0000,0x0000, // u2227 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x2200,0x2200,0x2200,0x1400,0x1400,0x0800,0x0800,0x0000, 0x0000,0x0000, // u2228 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x2200,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u2229 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x2200,0x1c00,0x0000, 0x0000,0x0000, // u222a 0x0000,0x0000,0x0000,0x0000,0x0000,0x3100,0x4900,0x4600,0x0000,0x3100,0x4900,0x4600,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2248 0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x7f00,0x0400,0x0800,0x1000,0x7f00,0x4000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2260 0x0000,0x0000,0x0000,0x0000,0x7f00,0x0000,0x0000,0x0000,0x7f00,0x0000,0x0000,0x0000,0x7f00,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2261 0x0000,0x0000,0x0000,0x0200,0x0400,0x0800,0x1000,0x2000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0000,0x7f00,0x0000, 0x0000,0x0000, // u2264 0x0000,0x0000,0x0000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0200,0x0400,0x0800,0x1000,0x2000,0x0000,0x7f00,0x0000, 0x0000,0x0000, // u2265 0x0000,0x0000,0x0000,0x0000,0x0440,0x0880,0x1100,0x2200,0x4400,0x8800,0x4400,0x2200,0x1100,0x0880,0x0440,0x0000, 0x0000,0x0000, // u226a 0x0000,0x0000,0x0000,0x0000,0x8800,0x4400,0x2200,0x1100,0x0880,0x0440,0x0880,0x1100,0x2200,0x4400,0x8800,0x0000, 0x0000,0x0000, // u226b 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2000,0x4000,0x4000,0x4000,0x4000,0x4000,0x2000,0x1f00,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2282 0x0000,0x0000,0x0000,0x0000,0x7c00,0x0200,0x0100,0x0100,0x0100,0x0100,0x0100,0x0200,0x7c00,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2283 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2000,0x4000,0x4000,0x4000,0x4000,0x4000,0x2000,0x1f00,0x0000,0x7f00,0x0000, 0x0000,0x0000, // u2286 0x0000,0x0000,0x0000,0x0000,0x7c00,0x0200,0x0100,0x0100,0x0100,0x0100,0x0100,0x0200,0x7c00,0x0000,0x7f00,0x0000, 0x0000,0x0000, // u2287 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x7f00,0x0000, 0x0000,0x0000, // u22a5 0x0000,0x0000,0x0000,0x1c00,0x2200,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u22c2 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x2200,0x1c00,0x0000, 0x0000,0x0000, // u22c3 0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x3e00,0x4500,0x4500,0x4900,0x5100,0x5100,0x3e00,0x2000,0x4000,0x0000, 0x0000,0x0000, // u2300 0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1400,0x2200,0x4100,0x8080,0x8080,0x8080,0x8080,0x8080,0xff80,0x0000, 0x0000,0x0000, // u2302 0x0000,0x0000,0x0000,0x1c00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000, 0x0000,0x0000, // u2308 0x0000,0x0000,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0000, 0x0000,0x0000, // u2309 0x0000,0x0000,0x0000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1c00,0x0000, 0x0000,0x0000, // u230a 0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x1c00,0x0000, 0x0000,0x0000, // u230b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2310 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2319 0x0000,0x0000,0x0000,0x0600,0x0900,0x0900,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u2320 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x4800,0x4800,0x3000,0x0000, 0x0000,0x0000, // u2321 0x0100,0x0200,0x0400,0x0400,0x0800,0x0800,0x0800,0x1000,0x1000,0x1000,0x1000,0x2000,0x2000,0x2000,0x2000,0x2000, 0x2000,0x2000, // u239b 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, 0x2000,0x2000, // u239c 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x1000,0x1000,0x1000,0x1000,0x0800,0x0800,0x0800,0x0400,0x0400, 0x0200,0x0100, // u239d 0x2000,0x1000,0x0800,0x0800,0x0400,0x0400,0x0400,0x0200,0x0200,0x0200,0x0200,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0100,0x0100, // u239e 0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0100,0x0100, // u239f 0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0200,0x0200,0x0200,0x0200,0x0400,0x0400,0x0400,0x0800,0x0800, 0x1000,0x2000, // u23a0 0x3f00,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, 0x2000,0x2000, // u23a1 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, 0x2000,0x2000, // u23a2 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, 0x2000,0x3f00, // u23a3 0x3f00,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0100,0x0100, // u23a4 0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0100,0x0100, // u23a5 0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0100,0x3f00, // u23a6 0x0380,0x0c00,0x0800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, 0x1000,0x1000, // u23a7 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x2000,0xc000,0xc000,0x2000,0x1000,0x1000,0x1000,0x1000,0x1000, 0x1000,0x1000, // u23a8 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0800, 0x0c00,0x0380, // u23a9 0xe000,0x1800,0x0800,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400, // u23ab 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0200,0x0180,0x0180,0x0200,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400, // u23ac 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0800, 0x1800,0xe000, // u23ad 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u23ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u23af 0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u23ba 0x0000,0x0000,0x0000,0x0000,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u23bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x0000,0x0000, 0x0000,0x0000, // u23bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0xffc0, // u23bd 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u23d0 0x0000,0x0000,0x4400,0x4400,0x7c00,0x4400,0x4400,0x4400,0x0000,0x0f80,0x0200,0x0200,0x0200,0x0200,0x0200,0x0000, 0x0000,0x0000, // u2409 0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7c00,0x0000,0x0f80,0x0800,0x0e00,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u240a 0x0000,0x0000,0x4400,0x4400,0x2800,0x2800,0x1000,0x1000,0x0000,0x0000,0x0f80,0x0200,0x0200,0x0200,0x0200,0x0200, 0x0000,0x0000, // u240b 0x0000,0x0000,0x7c00,0x4000,0x7000,0x4000,0x4000,0x4000,0x0000,0x0f80,0x0800,0x0e00,0x0800,0x0800,0x0800,0x0000, 0x0000,0x0000, // u240c 0x0000,0x0000,0x3800,0x4400,0x4000,0x4000,0x4400,0x3800,0x0000,0x0f00,0x0880,0x0880,0x0f00,0x0900,0x0880,0x0000, 0x0000,0x0000, // u240d 0x0000,0x0000,0x4400,0x6400,0x5400,0x4c00,0x4400,0x4400,0x0000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0f80,0x0000, 0x0000,0x0000, // u2424 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2500 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2501 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u2502 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2503 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xd680,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2508 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xd680,0xd680,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2509 0x0800,0x0800,0x0800,0x0800,0x0000,0x0800,0x0800,0x0800,0x0000,0x0800,0x0800,0x0800,0x0800,0x0000,0x0800,0x0800, 0x0800,0x0000, // u250a 0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0c00,0x0c00,0x0c00,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0c00,0x0c00, 0x0c00,0x0000, // u250b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u250c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0fc0,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u250d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u250e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u250f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u2510 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u2511 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2512 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2513 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2514 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2515 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2516 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2517 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2518 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xf800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2519 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u251a 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u251b 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0fc0,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u251c 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0fc0,0x0fc0,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u251d 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u251e 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u251f 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2520 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0x0fc0,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u2521 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0fc0,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2522 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2523 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xf800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u2524 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xf800,0xf800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u2525 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u2526 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2527 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2528 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u2529 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u252a 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u252b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u252c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xf800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u252d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x0fc0,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u252e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u252f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2530 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2531 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2532 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2533 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2534 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xffc0,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2535 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xffc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2536 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2537 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2538 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2539 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u253a 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u253b 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xffc0,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u253c 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xffc0,0xf800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u253d 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xffc0,0x0fc0,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u253e 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xffc0,0xffc0,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u253f 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u2540 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2541 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2542 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0xf800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u2543 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0x0fc0,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u2544 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xffc0,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2545 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xffc0,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2546 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0xffc0,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u2547 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2548 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2549 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u254a 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u254b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x0000,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2550 0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400, 0x1400,0x1400, // u2551 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0800,0x0fc0,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u2552 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400, 0x1400,0x1400, // u2553 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x1000,0x17c0,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400, 0x1400,0x1400, // u2554 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0x0800,0xf800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u2555 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400, 0x1400,0x1400, // u2556 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0x0400,0xf400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400, 0x1400,0x1400, // u2557 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0fc0,0x0800,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2558 0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2559 0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x17c0,0x1000,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u255a 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xf800,0x0800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u255b 0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u255c 0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0xf400,0x0400,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u255d 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0fc0,0x0800,0x0fc0,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u255e 0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x17c0,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400, 0x1400,0x1400, // u255f 0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x17c0,0x1000,0x17c0,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400, 0x1400,0x1400, // u2560 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xf800,0x0800,0xf800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u2561 0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0xf400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400, 0x1400,0x1400, // u2562 0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0xf400,0x0400,0xf400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400, 0x1400,0x1400, // u2563 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x0000,0xffc0,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u2564 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400, 0x1400,0x1400, // u2565 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x0000,0xf7c0,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400, 0x1400,0x1400, // u2566 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xffc0,0x0000,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2567 0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2568 0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0xf7c0,0x0000,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2569 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xffc0,0x0800,0xffc0,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u256a 0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0xffc0,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400, 0x1400,0x1400, // u256b 0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0xf7c0,0x0000,0xf7c0,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400, 0x1400,0x1400, // u256c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x0200,0x0400,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u256d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0x2000,0x1000,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u256e 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1000,0x2000,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u256f 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0400,0x0200,0x01c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2570 0x0040,0x0080,0x0080,0x0100,0x0100,0x0200,0x0200,0x0400,0x0400,0x0800,0x0800,0x1000,0x1000,0x2000,0x2000,0x4000, 0x4000,0x8000, // u2571 0x8000,0x4000,0x4000,0x2000,0x2000,0x1000,0x1000,0x0800,0x0800,0x0400,0x0400,0x0200,0x0200,0x0100,0x0100,0x0080, 0x0080,0x0040, // u2572 0x8040,0x4080,0x4080,0x2100,0x2100,0x1200,0x1200,0x0c00,0x0c00,0x0c00,0x0c00,0x1200,0x1200,0x2100,0x2100,0x4080, 0x4080,0x8040, // u2573 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2574 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2575 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2576 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u2577 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2578 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2579 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u257a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u257b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u257c 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u257d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u257e 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800, // u257f 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2580 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0xffc0,0xffc0, // u2581 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0, 0xffc0,0xffc0, // u2582 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0, // u2583 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0, // u2584 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0, // u2585 0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0, // u2586 0x0000,0x0000,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0, // u2587 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0, // u2588 0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80, 0xff80,0xff80, // u2589 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, 0xfe00,0xfe00, // u258a 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, 0xfc00,0xfc00, // u258b 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, 0xf800,0xf800, // u258c 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, 0xf000,0xf000, // u258d 0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000, 0xc000,0xc000, // u258e 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, 0x8000,0x8000, // u258f 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, 0x07c0,0x07c0, // u2590 0xaa80,0x0000,0xaa80,0x0000,0xaa80,0x0000,0xaa80,0x0000,0xaa80,0x0000,0xaa80,0x0000,0xaa80,0x0000,0xaa80,0x0000, 0xaa80,0x0000, // u2591 0xaa80,0x5540,0xaa80,0x5540,0xaa80,0x5540,0xaa80,0x5540,0xaa80,0x5540,0xaa80,0x5540,0xaa80,0x5540,0xaa80,0x5540, 0xaa80,0x5540, // u2592 0xffc0,0xaa80,0xffc0,0xaa80,0xffc0,0xaa80,0xffc0,0xaa80,0xffc0,0xaa80,0xffc0,0xaa80,0xffc0,0xaa80,0xffc0,0xaa80, 0xffc0,0xaa80, // u2593 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, 0xf800,0xf800, // u2596 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, 0x07c0,0x07c0, // u2597 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2598 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0, // u2599 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, 0x07c0,0x07c0, // u259a 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, 0xf800,0xf800, // u259b 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, 0x07c0,0x07c0, // u259c 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u259d 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, 0xf800,0xf800, // u259e 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0, // u259f 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x3e00,0x3e00,0x3e00,0x3e00,0x3e00,0x3e00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u25a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x7f80,0x7f80,0x7f80,0x7f80,0x0000, 0x0000,0x0000, // u25ac 0x0000,0x0000,0x0000,0x7f00,0x7f00,0x7f00,0x7f00,0x7f00,0x7f00,0x7f00,0x7f00,0x7f00,0x7f00,0x7f00,0x7f00,0x0000, 0x0000,0x0000, // u25ae 0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x1c00,0x1c00,0x3e00,0x3e00,0x7f00,0x7f00,0xff80,0xff80,0x0000,0x0000, 0x0000,0x0000, // u25b2 0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xffc0,0xff00,0xfc00,0xf000,0xc000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u25b6 0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xffc0,0xff00,0xfc00,0xf000,0xc000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u25ba 0x0000,0x0000,0x0000,0x0000,0xff80,0xff80,0x7f00,0x7f00,0x3e00,0x3e00,0x1c00,0x1c00,0x0800,0x0800,0x0000,0x0000, 0x0000,0x0000, // u25bc 0x0000,0x0000,0x0000,0x0000,0x00c0,0x03c0,0x0fc0,0x3fc0,0xffc0,0x3fc0,0x0fc0,0x03c0,0x00c0,0x0000,0x0000,0x0000, 0x0000,0x0000, // u25c0 0x0000,0x0000,0x0000,0x0000,0x00c0,0x03c0,0x0fc0,0x3fc0,0xffc0,0x3fc0,0x0fc0,0x03c0,0x00c0,0x0000,0x0000,0x0000, 0x0000,0x0000, // u25c4 0x0000,0x0000,0x0000,0x0000,0x0800,0x1c00,0x3e00,0x7f00,0xff80,0x7f00,0x3e00,0x1c00,0x0800,0x0000,0x0000,0x0000, 0x0000,0x0000, // u25c6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1400,0x2200,0x4100,0x8080,0x4100,0x2200,0x1400,0x0800,0x0000,0x0000, 0x0000,0x0000, // u25ca 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x2100,0x2100,0x2100,0x1e00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u25cb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3f00,0x3f00,0x3f00,0x3f00,0x1e00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u25cf 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xf3c0,0xe1c0,0xe1c0,0xf3c0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0, // u25d8 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xe1c0,0xdec0,0xdec0,0xdec0,0xdec0,0xe1c0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0, // u25d9 0x0000,0x0000,0x0000,0x7f00,0x8080,0x8080,0xb680,0xb680,0x8080,0x8080,0xbe80,0x9c80,0x8080,0x8080,0x7f00,0x0000, 0x0000,0x0000, // u263a 0x0000,0x0000,0x0000,0x7f00,0xff80,0xff80,0xc980,0xc980,0xff80,0xff80,0xc180,0xe380,0xff80,0xff80,0x7f00,0x0000, 0x0000,0x0000, // u263b 0x0000,0x0000,0x0000,0x0800,0x8880,0x4900,0x2a00,0x1c00,0xf780,0x1c00,0x2a00,0x4900,0x8880,0x0800,0x0000,0x0000, 0x0000,0x0000, // u263c 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0800,0x0800,0x7f00,0x0800,0x0800,0x0000, 0x0000,0x0000, // u2640 0x0000,0x0000,0x0000,0x0f00,0x0300,0x0500,0x0900,0x3c00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200,0x3c00,0x0000, 0x0000,0x0000, // u2642 0x0000,0x0000,0x0000,0x0800,0x0800,0x1c00,0x3e00,0x7f00,0xff80,0xff80,0xff80,0x6b00,0x0800,0x0800,0x3e00,0x0000, 0x0000,0x0000, // u2660 0x0000,0x0000,0x0000,0x1c00,0x3e00,0x3e00,0x1c00,0x0800,0x6b00,0xff80,0xff80,0xff80,0x6b00,0x0800,0x3e00,0x0000, 0x0000,0x0000, // u2663 0x0000,0x0000,0x0000,0x0000,0x6300,0xf780,0xff80,0xff80,0xff80,0xff80,0x7f00,0x3e00,0x1c00,0x0800,0x0000,0x0000, 0x0000,0x0000, // u2665 0x0000,0x0000,0x0000,0x0000,0x0800,0x1c00,0x3e00,0x7f00,0xff80,0x7f00,0x3e00,0x1c00,0x0800,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2666 0x0000,0x0000,0x0000,0x1f80,0x1080,0x1080,0x1f80,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xe000,0x0000, 0x0000,0x0000, // u266a 0x0000,0x0000,0x0000,0x7f00,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4200,0x8000,0x0000, 0x0000,0x0000, // u266b 0x0000,0x0000,0x0000,0x0080,0x0080,0x0100,0x0100,0x8200,0x8200,0x4400,0x4400,0x2800,0x2800,0x1000,0x1000,0x0000, 0x0000,0x0000, // u2713 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x0180,0x0180,0xc300,0xc300,0x6600,0x6600,0x3c00,0x3c00,0x1800,0x1800,0x0000, 0x0000,0x0000, // u2714 0x0000,0x0000,0x0000,0x0200,0x4200,0x2400,0x1400,0x0800,0x0c00,0x1200,0x1100,0x2000,0x2000,0x4000,0x4000,0x0000, 0x0000,0x0000, // u2717 0x0000,0x0000,0x0000,0x0300,0x6300,0x3600,0x1e00,0x0c00,0x0e00,0x1b00,0x1980,0x3000,0x3000,0x6000,0x6000,0x0000, 0x0000,0x0000, // u2718 0x0000,0x0000,0x0200,0x0200,0x0400,0x0400,0x0800,0x0800,0x1000,0x0800,0x0800,0x0400,0x0400,0x0200,0x0200,0x0000, 0x0000,0x0000, // u27e8 0x0000,0x0000,0x1000,0x1000,0x0800,0x0800,0x0400,0x0400,0x0200,0x0400,0x0400,0x0800,0x0800,0x1000,0x1000,0x0000, 0x0000,0x0000, // u27e9 0x0000,0x0000,0x0880,0x0880,0x1100,0x1100,0x2200,0x2200,0x4400,0x2200,0x2200,0x1100,0x1100,0x0880,0x0880,0x0000, 0x0000,0x0000, // u27ea 0x0000,0x0000,0x4400,0x4400,0x2200,0x2200,0x1100,0x1100,0x0880,0x1100,0x1100,0x2200,0x2200,0x4400,0x4400,0x0000, 0x0000,0x0000, // u27eb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2800 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2801 0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2802 0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2803 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2804 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2805 0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2806 0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2807 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2808 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2809 0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u280a 0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u280b 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u280c 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u280d 0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u280e 0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u280f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2810 0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2811 0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2812 0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2813 0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2814 0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2815 0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2816 0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2817 0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2818 0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2819 0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u281a 0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u281b 0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u281c 0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u281d 0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u281e 0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u281f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2820 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2821 0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2822 0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2823 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2824 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2825 0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2826 0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2827 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2828 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2829 0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u282a 0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u282b 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u282c 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u282d 0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u282e 0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u282f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2830 0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2831 0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2832 0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2833 0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2834 0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2835 0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2836 0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2837 0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2838 0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2839 0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u283a 0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u283b 0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u283c 0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u283d 0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u283e 0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u283f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2840 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2841 0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2842 0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2843 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2844 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2845 0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2846 0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2847 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2848 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2849 0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u284a 0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u284b 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u284c 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u284d 0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u284e 0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u284f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2850 0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2851 0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2852 0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2853 0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2854 0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2855 0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2856 0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2857 0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2858 0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2859 0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u285a 0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u285b 0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u285c 0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u285d 0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u285e 0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u285f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2860 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2861 0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2862 0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2863 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2864 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2865 0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2866 0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2867 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2868 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2869 0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u286a 0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u286b 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u286c 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u286d 0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u286e 0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u286f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2870 0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2871 0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2872 0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2873 0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2874 0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2875 0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2876 0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2877 0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2878 0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u2879 0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u287a 0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u287b 0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u287c 0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u287d 0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u287e 0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000, 0x0000,0x0000, // u287f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u2880 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u2881 0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u2882 0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u2883 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u2884 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u2885 0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u2886 0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u2887 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u2888 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u2889 0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u288a 0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u288b 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u288c 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u288d 0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u288e 0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u288f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u2890 0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u2891 0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u2892 0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u2893 0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u2894 0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u2895 0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u2896 0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u2897 0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u2898 0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u2899 0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u289a 0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u289b 0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u289c 0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u289d 0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u289e 0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u289f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28a0 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28a1 0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28a2 0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28a4 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28a5 0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28a6 0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28a7 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28a8 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28a9 0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28aa 0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28ab 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28ac 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28ad 0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28ae 0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28af 0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28b0 0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28b1 0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28b2 0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28b4 0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28b6 0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28b7 0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28b8 0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28b9 0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28ba 0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28bb 0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28bc 0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28bd 0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28be 0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100, 0x0000,0x0000, // u28bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28c0 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28c2 0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28c4 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28c6 0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28c7 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28c8 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28c9 0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28ca 0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28cb 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28cc 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28cd 0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28ce 0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28cf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28d0 0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28d2 0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28d4 0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28d6 0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28d7 0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28d8 0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28d9 0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28da 0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28db 0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28dc 0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28dd 0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28de 0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28df 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28e0 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28e1 0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28e2 0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28e3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28e4 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28e6 0x0000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28e7 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28e8 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28e9 0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28ea 0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28eb 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28ec 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28ed 0x0000,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28ee 0x0000,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28ef 0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28f0 0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28f2 0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28f3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28f4 0x0000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28f6 0x0000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28f7 0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28f8 0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28f9 0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28fa 0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28fb 0x0000,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28fc 0x0000,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28fd 0x0000,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28fe 0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100, 0x0000,0x0000, // u28ff 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x0000,0x0000, 0x0000,0x0000, // u2e2c 0x8000,0x8000,0x8400,0x8e00,0x9500,0xa480,0x8400,0x8400,0x8400,0x8800,0x1000,0x2000,0x4000,0x8000,0x8000,0x8000, 0x8000,0x8000, // ue0a0 0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7c00,0x0000,0x0880,0x0c80,0x0a80,0x0980,0x0880,0x0880,0x0000, 0x0000,0x0000, // ue0a1 0x0000,0x0000,0x1e00,0x2100,0x2100,0x2100,0x2100,0x2100,0x7f80,0x7f80,0x7380,0x6180,0x7380,0x7f80,0x7f80,0x7f80, 0x0000,0x0000, // ue0a2 0x8000,0xc000,0xe000,0xf000,0xf800,0xfc00,0xfe00,0xff00,0xff80,0xff80,0xff00,0xfe00,0xfc00,0xf800,0xf000,0xe000, 0xc000,0x8000, // ue0b0 0x8000,0x4000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0100,0x0080,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000, 0x4000,0x8000, // ue0b1 0x0040,0x00c0,0x01c0,0x03c0,0x07c0,0x0fc0,0x1fc0,0x3fc0,0x7fc0,0x7fc0,0x3fc0,0x1fc0,0x0fc0,0x07c0,0x03c0,0x01c0, 0x00c0,0x0040, // ue0b2 0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0100, 0x0080,0x0040, // ue0b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x2200, 0x2200,0x1c00, // uf6be 0x0000,0x0000,0x0000,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x0000, 0x0000,0x0000 // ufffd }; // codepoints array constexpr std::array fixedfont_codepoints = { 0x0000,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e, 0x002f,0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e, 0x003f,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e, 0x004f,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e, 0x005f,0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e, 0x006f,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e, 0x00a0,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af, 0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf, 0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf, 0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df, 0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef, 0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff, 0x0100,0x0101,0x0102,0x0103,0x0104,0x0105,0x0106,0x0107,0x0108,0x0109,0x010a,0x010b,0x010c,0x010d,0x010e,0x010f, 0x0110,0x0111,0x0112,0x0113,0x0114,0x0115,0x0116,0x0117,0x0118,0x0119,0x011a,0x011b,0x011c,0x011d,0x011e,0x011f, 0x0120,0x0121,0x0122,0x0123,0x0124,0x0125,0x0126,0x0127,0x0128,0x0129,0x012a,0x012b,0x012c,0x012d,0x012e,0x012f, 0x0130,0x0131,0x0132,0x0133,0x0134,0x0135,0x0136,0x0137,0x0138,0x0139,0x013a,0x013b,0x013c,0x013d,0x013e,0x013f, 0x0140,0x0141,0x0142,0x0143,0x0144,0x0145,0x0146,0x0147,0x0148,0x0149,0x014a,0x014b,0x014c,0x014d,0x014e,0x014f, 0x0150,0x0151,0x0152,0x0153,0x0154,0x0155,0x0156,0x0157,0x0158,0x0159,0x015a,0x015b,0x015c,0x015d,0x015e,0x015f, 0x0160,0x0161,0x0162,0x0163,0x0164,0x0165,0x0166,0x0167,0x0168,0x0169,0x016a,0x016b,0x016c,0x016d,0x016e,0x016f, 0x0170,0x0171,0x0172,0x0173,0x0174,0x0175,0x0176,0x0177,0x0178,0x0179,0x017a,0x017b,0x017c,0x017d,0x017e,0x017f, 0x0186,0x018e,0x018f,0x0190,0x0192,0x019d,0x019e,0x01b5,0x01b6,0x01b7,0x01cd,0x01ce,0x01cf,0x01d0,0x01d1,0x01d2, 0x01d3,0x01d4,0x01e2,0x01e3,0x01e4,0x01e5,0x01e6,0x01e7,0x01e8,0x01e9,0x01ea,0x01eb,0x01ec,0x01ed,0x01ee,0x01ef, 0x01f0,0x01f4,0x01f5,0x01fc,0x01fd,0x01fe,0x01ff,0x0218,0x0219,0x021a,0x021b,0x0232,0x0233,0x0237,0x0254,0x0258, 0x0259,0x025b,0x0272,0x0292,0x02bb,0x02bc,0x02bd,0x02c6,0x02c7,0x02d8,0x02d9,0x02db,0x02dc,0x02dd,0x0300,0x0301, 0x0302,0x0303,0x0304,0x0305,0x0306,0x0307,0x0308,0x030a,0x030b,0x030c,0x0329,0x0384,0x0385,0x0386,0x0387,0x0388, 0x0389,0x038a,0x038c,0x038e,0x038f,0x0390,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039a, 0x039b,0x039c,0x039d,0x039e,0x039f,0x03a0,0x03a1,0x03a3,0x03a4,0x03a5,0x03a6,0x03a7,0x03a8,0x03a9,0x03aa,0x03ab, 0x03ac,0x03ad,0x03ae,0x03af,0x03b0,0x03b1,0x03b2,0x03b3,0x03b4,0x03b5,0x03b6,0x03b7,0x03b8,0x03b9,0x03ba,0x03bb, 0x03bc,0x03bd,0x03be,0x03bf,0x03c0,0x03c1,0x03c2,0x03c3,0x03c4,0x03c5,0x03c6,0x03c7,0x03c8,0x03c9,0x03ca,0x03cb, 0x03cc,0x03cd,0x03ce,0x03d1,0x03d5,0x03f0,0x03f1,0x03f2,0x03f3,0x03f4,0x03f5,0x03f6,0x0400,0x0401,0x0402,0x0403, 0x0404,0x0405,0x0406,0x0407,0x0408,0x0409,0x040a,0x040b,0x040c,0x040d,0x040e,0x040f,0x0410,0x0411,0x0412,0x0413, 0x0414,0x0415,0x0416,0x0417,0x0418,0x0419,0x041a,0x041b,0x041c,0x041d,0x041e,0x041f,0x0420,0x0421,0x0422,0x0423, 0x0424,0x0425,0x0426,0x0427,0x0428,0x0429,0x042a,0x042b,0x042c,0x042d,0x042e,0x042f,0x0430,0x0431,0x0432,0x0433, 0x0434,0x0435,0x0436,0x0437,0x0438,0x0439,0x043a,0x043b,0x043c,0x043d,0x043e,0x043f,0x0440,0x0441,0x0442,0x0443, 0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,0x044a,0x044b,0x044c,0x044d,0x044e,0x044f,0x0450,0x0451,0x0452,0x0453, 0x0454,0x0455,0x0456,0x0457,0x0458,0x0459,0x045a,0x045b,0x045c,0x045d,0x045e,0x045f,0x0462,0x0463,0x046a,0x046b, 0x0490,0x0491,0x0492,0x0493,0x0494,0x0495,0x0496,0x0497,0x0498,0x0499,0x049a,0x049b,0x049c,0x049d,0x04a0,0x04a1, 0x04a2,0x04a3,0x04a4,0x04a5,0x04aa,0x04ab,0x04ae,0x04af,0x04b0,0x04b1,0x04b2,0x04b3,0x04b6,0x04b7,0x04b8,0x04b9, 0x04ba,0x04bb,0x04c0,0x04c1,0x04c2,0x04cf,0x04d0,0x04d1,0x04d2,0x04d3,0x04d4,0x04d5,0x04d6,0x04d7,0x04d8,0x04d9, 0x04da,0x04db,0x04dc,0x04dd,0x04de,0x04df,0x04e2,0x04e3,0x04e4,0x04e5,0x04e6,0x04e7,0x04e8,0x04e9,0x04ea,0x04eb, 0x04ec,0x04ed,0x04ee,0x04ef,0x04f0,0x04f1,0x04f2,0x04f3,0x04f4,0x04f5,0x04f8,0x04f9,0x05d0,0x05d1,0x05d2,0x05d3, 0x05d4,0x05d5,0x05d6,0x05d7,0x05d8,0x05d9,0x05da,0x05db,0x05dc,0x05dd,0x05de,0x05df,0x05e0,0x05e1,0x05e2,0x05e3, 0x05e4,0x05e5,0x05e6,0x05e7,0x05e8,0x05e9,0x05ea,0x1e0c,0x1e0d,0x1e34,0x1e35,0x1e36,0x1e37,0x1e40,0x1e41,0x1e42, 0x1e43,0x1e44,0x1e45,0x1e46,0x1e47,0x1e6c,0x1e6d,0x1eb8,0x1eb9,0x1ebc,0x1ebd,0x1eca,0x1ecb,0x1ecc,0x1ecd,0x1ee4, 0x1ee5,0x1ef8,0x1ef9,0x2000,0x2001,0x2002,0x2003,0x2004,0x2005,0x2006,0x2007,0x2008,0x2009,0x200a,0x200b,0x200c, 0x200d,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x2015,0x2016,0x2017,0x2018,0x2019,0x201a,0x201b,0x201c, 0x201d,0x201e,0x201f,0x2020,0x2021,0x2022,0x2026,0x2030,0x2032,0x2033,0x2039,0x203a,0x203c,0x203e,0x2070,0x2071, 0x2074,0x2075,0x2076,0x2077,0x2078,0x2079,0x207a,0x207b,0x207c,0x207d,0x207e,0x207f,0x2080,0x2081,0x2082,0x2083, 0x2084,0x2085,0x2086,0x2087,0x2088,0x2089,0x208a,0x208b,0x208c,0x208d,0x208e,0x2090,0x2091,0x2092,0x2093,0x2094, 0x2095,0x2096,0x2097,0x2098,0x209a,0x20a7,0x20aa,0x20ac,0x20ae,0x2102,0x210e,0x210f,0x2115,0x2116,0x211a,0x211d, 0x2122,0x2124,0x2126,0x2135,0x2190,0x2191,0x2192,0x2193,0x2194,0x2195,0x21a4,0x21a6,0x21a8,0x21b5,0x21bb,0x21cb, 0x21cc,0x21d0,0x21d1,0x21d2,0x21d3,0x21d4,0x21d5,0x2200,0x2203,0x2204,0x2205,0x2206,0x2207,0x2208,0x2209,0x220a, 0x220b,0x220c,0x220d,0x2212,0x2213,0x2214,0x2215,0x2216,0x2219,0x221a,0x221e,0x221f,0x2225,0x2227,0x2228,0x2229, 0x222a,0x2248,0x2260,0x2261,0x2264,0x2265,0x226a,0x226b,0x2282,0x2283,0x2286,0x2287,0x22a5,0x22c2,0x22c3,0x2300, 0x2302,0x2308,0x2309,0x230a,0x230b,0x2310,0x2319,0x2320,0x2321,0x239b,0x239c,0x239d,0x239e,0x239f,0x23a0,0x23a1, 0x23a2,0x23a3,0x23a4,0x23a5,0x23a6,0x23a7,0x23a8,0x23a9,0x23ab,0x23ac,0x23ad,0x23ae,0x23af,0x23ba,0x23bb,0x23bc, 0x23bd,0x23d0,0x2409,0x240a,0x240b,0x240c,0x240d,0x2424,0x2500,0x2501,0x2502,0x2503,0x2508,0x2509,0x250a,0x250b, 0x250c,0x250d,0x250e,0x250f,0x2510,0x2511,0x2512,0x2513,0x2514,0x2515,0x2516,0x2517,0x2518,0x2519,0x251a,0x251b, 0x251c,0x251d,0x251e,0x251f,0x2520,0x2521,0x2522,0x2523,0x2524,0x2525,0x2526,0x2527,0x2528,0x2529,0x252a,0x252b, 0x252c,0x252d,0x252e,0x252f,0x2530,0x2531,0x2532,0x2533,0x2534,0x2535,0x2536,0x2537,0x2538,0x2539,0x253a,0x253b, 0x253c,0x253d,0x253e,0x253f,0x2540,0x2541,0x2542,0x2543,0x2544,0x2545,0x2546,0x2547,0x2548,0x2549,0x254a,0x254b, 0x2550,0x2551,0x2552,0x2553,0x2554,0x2555,0x2556,0x2557,0x2558,0x2559,0x255a,0x255b,0x255c,0x255d,0x255e,0x255f, 0x2560,0x2561,0x2562,0x2563,0x2564,0x2565,0x2566,0x2567,0x2568,0x2569,0x256a,0x256b,0x256c,0x256d,0x256e,0x256f, 0x2570,0x2571,0x2572,0x2573,0x2574,0x2575,0x2576,0x2577,0x2578,0x2579,0x257a,0x257b,0x257c,0x257d,0x257e,0x257f, 0x2580,0x2581,0x2582,0x2583,0x2584,0x2585,0x2586,0x2587,0x2588,0x2589,0x258a,0x258b,0x258c,0x258d,0x258e,0x258f, 0x2590,0x2591,0x2592,0x2593,0x2596,0x2597,0x2598,0x2599,0x259a,0x259b,0x259c,0x259d,0x259e,0x259f,0x25a0,0x25ac, 0x25ae,0x25b2,0x25b6,0x25ba,0x25bc,0x25c0,0x25c4,0x25c6,0x25ca,0x25cb,0x25cf,0x25d8,0x25d9,0x263a,0x263b,0x263c, 0x2640,0x2642,0x2660,0x2663,0x2665,0x2666,0x266a,0x266b,0x2713,0x2714,0x2717,0x2718,0x27e8,0x27e9,0x27ea,0x27eb, 0x2800,0x2801,0x2802,0x2803,0x2804,0x2805,0x2806,0x2807,0x2808,0x2809,0x280a,0x280b,0x280c,0x280d,0x280e,0x280f, 0x2810,0x2811,0x2812,0x2813,0x2814,0x2815,0x2816,0x2817,0x2818,0x2819,0x281a,0x281b,0x281c,0x281d,0x281e,0x281f, 0x2820,0x2821,0x2822,0x2823,0x2824,0x2825,0x2826,0x2827,0x2828,0x2829,0x282a,0x282b,0x282c,0x282d,0x282e,0x282f, 0x2830,0x2831,0x2832,0x2833,0x2834,0x2835,0x2836,0x2837,0x2838,0x2839,0x283a,0x283b,0x283c,0x283d,0x283e,0x283f, 0x2840,0x2841,0x2842,0x2843,0x2844,0x2845,0x2846,0x2847,0x2848,0x2849,0x284a,0x284b,0x284c,0x284d,0x284e,0x284f, 0x2850,0x2851,0x2852,0x2853,0x2854,0x2855,0x2856,0x2857,0x2858,0x2859,0x285a,0x285b,0x285c,0x285d,0x285e,0x285f, 0x2860,0x2861,0x2862,0x2863,0x2864,0x2865,0x2866,0x2867,0x2868,0x2869,0x286a,0x286b,0x286c,0x286d,0x286e,0x286f, 0x2870,0x2871,0x2872,0x2873,0x2874,0x2875,0x2876,0x2877,0x2878,0x2879,0x287a,0x287b,0x287c,0x287d,0x287e,0x287f, 0x2880,0x2881,0x2882,0x2883,0x2884,0x2885,0x2886,0x2887,0x2888,0x2889,0x288a,0x288b,0x288c,0x288d,0x288e,0x288f, 0x2890,0x2891,0x2892,0x2893,0x2894,0x2895,0x2896,0x2897,0x2898,0x2899,0x289a,0x289b,0x289c,0x289d,0x289e,0x289f, 0x28a0,0x28a1,0x28a2,0x28a3,0x28a4,0x28a5,0x28a6,0x28a7,0x28a8,0x28a9,0x28aa,0x28ab,0x28ac,0x28ad,0x28ae,0x28af, 0x28b0,0x28b1,0x28b2,0x28b3,0x28b4,0x28b5,0x28b6,0x28b7,0x28b8,0x28b9,0x28ba,0x28bb,0x28bc,0x28bd,0x28be,0x28bf, 0x28c0,0x28c1,0x28c2,0x28c3,0x28c4,0x28c5,0x28c6,0x28c7,0x28c8,0x28c9,0x28ca,0x28cb,0x28cc,0x28cd,0x28ce,0x28cf, 0x28d0,0x28d1,0x28d2,0x28d3,0x28d4,0x28d5,0x28d6,0x28d7,0x28d8,0x28d9,0x28da,0x28db,0x28dc,0x28dd,0x28de,0x28df, 0x28e0,0x28e1,0x28e2,0x28e3,0x28e4,0x28e5,0x28e6,0x28e7,0x28e8,0x28e9,0x28ea,0x28eb,0x28ec,0x28ed,0x28ee,0x28ef, 0x28f0,0x28f1,0x28f2,0x28f3,0x28f4,0x28f5,0x28f6,0x28f7,0x28f8,0x28f9,0x28fa,0x28fb,0x28fc,0x28fd,0x28fe,0x28ff, 0x2e2c,0xe0a0,0xe0a1,0xe0a2,0xe0b0,0xe0b1,0xe0b2,0xe0b3,0xf6be,0xfffd }; } // namespace // -- end of autogenerated text --- namespace fixed_font_18b { // -- start of autogenerated text --- // definition section for font: ter-u18b.bdf constexpr int CHARCOUNT = 1354; constexpr int WIDTH = 10; constexpr int HEIGHT = 18; constexpr int OFFSET_X = 0; constexpr int OFFSET_Y = 0; constexpr FixedFont_info_t fixedfont_info = { "Terminus", // font name "ter-u18b.bdf", // font name internal CHARCOUNT, // num of chars WIDTH, HEIGHT, OFFSET_X, OFFSET_Y, true // bold }; // font bitmap definitions constexpr std::array fixedfont_bitmap = { 0x0000,0x0000,0x0000,0x7380,0x6180,0x6180,0x0000,0x6180,0x6180,0x6180,0x6180,0x0000,0x6180,0x6180,0x7380,0x0000, 0x0000,0x0000, // u0000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0020 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u0021 0x0000,0x3300,0x3300,0x3300,0x3300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0022 0x0000,0x0000,0x0000,0x3300,0x3300,0x3300,0x7f80,0x3300,0x3300,0x3300,0x3300,0x7f80,0x3300,0x3300,0x3300,0x0000, 0x0000,0x0000, // u0023 0x0000,0x0000,0x0c00,0x0c00,0x3f00,0x6d80,0x6c00,0x6c00,0x6c00,0x3f00,0x0d80,0x0d80,0x0d80,0x6d80,0x3f00,0x0c00, 0x0c00,0x0000, // u0024 0x0000,0x0000,0x0000,0x7300,0x5300,0x7600,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x3000,0x3700,0x6500,0x6700,0x0000, 0x0000,0x0000, // u0025 0x0000,0x0000,0x0000,0x3c00,0x6600,0x6600,0x6600,0x3c00,0x3980,0x6d80,0xc700,0xc300,0xc300,0x6780,0x3d80,0x0000, 0x0000,0x0000, // u0026 0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0027 0x0000,0x0000,0x0000,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0c00,0x0c00,0x0600,0x0000, 0x0000,0x0000, // u0028 0x0000,0x0000,0x0000,0x1800,0x0c00,0x0c00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0c00,0x0c00,0x1800,0x0000, 0x0000,0x0000, // u0029 0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x3600,0x1c00,0xff80,0x1c00,0x3600,0x6300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u002a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u002b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x1800, 0x0000,0x0000, // u002c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u002d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u002e 0x0000,0x0000,0x0000,0x0300,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x3000,0x3000,0x6000,0x6000,0x0000, 0x0000,0x0000, // u002f 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6380,0x6780,0x6d80,0x7980,0x7180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0030 0x0000,0x0000,0x0000,0x0c00,0x1c00,0x3c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x3f00,0x0000, 0x0000,0x0000, // u0031 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u0032 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x0180,0x0180,0x1f00,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0033 0x0000,0x0000,0x0000,0x0180,0x0380,0x0780,0x0d80,0x1980,0x3180,0x6180,0x6180,0x7f80,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0000, // u0034 0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x7f00,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0035 0x0000,0x0000,0x0000,0x1f00,0x3000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0036 0x0000,0x0000,0x0000,0x7f80,0x6180,0x6180,0x0180,0x0300,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u0037 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0038 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180,0x0180,0x0180,0x0300,0x3e00,0x0000, 0x0000,0x0000, // u0039 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0000, 0x0000,0x0000, // u003a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x1800, 0x0000,0x0000, // u003b 0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0000, 0x0000,0x0000, // u003c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u003d 0x0000,0x0000,0x0000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x0000, 0x0000,0x0000, // u003e 0x0000,0x0000,0x0000,0x1e00,0x3300,0x6180,0x6180,0x0180,0x0300,0x0600,0x0c00,0x0c00,0x0000,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u003f 0x0000,0x0000,0x0000,0x7f00,0xc180,0xc180,0xcf80,0xd980,0xd980,0xd980,0xd980,0xcf80,0xc000,0xc000,0x7f80,0x0000, 0x0000,0x0000, // u0040 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u0041 0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x0000, 0x0000,0x0000, // u0042 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0043 0x0000,0x0000,0x0000,0x7e00,0x6300,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6300,0x7e00,0x0000, 0x0000,0x0000, // u0044 0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u0045 0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, 0x0000,0x0000, // u0046 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6780,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0047 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u0048 0x0000,0x0000,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u0049 0x0000,0x0000,0x0000,0x0780,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x6300,0x6300,0x6300,0x3e00,0x0000, 0x0000,0x0000, // u004a 0x0000,0x0000,0x0000,0x6180,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7800,0x6c00,0x6600,0x6300,0x6180,0x6180,0x0000, 0x0000,0x0000, // u004b 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u004c 0x0000,0x0000,0x0000,0x8080,0xc180,0xe380,0xf780,0xdd80,0xc980,0xc180,0xc180,0xc180,0xc180,0xc180,0xc180,0x0000, 0x0000,0x0000, // u004d 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x7180,0x7980,0x6d80,0x6780,0x6380,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u004e 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u004f 0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, 0x0000,0x0000, // u0050 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6780,0x3f00,0x0300, 0x0180,0x0000, // u0051 0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x7800,0x6c00,0x6600,0x6300,0x6180,0x0000, 0x0000,0x0000, // u0052 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x3f00,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0053 0x0000,0x0000,0x0000,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u0054 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0055 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x3300,0x3300,0x3300,0x3300,0x1e00,0x1e00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u0056 0x0000,0x0000,0x0000,0xc180,0xc180,0xc180,0xc180,0xc180,0xc180,0xc980,0xdd80,0xf780,0xe380,0xc180,0x8080,0x0000, 0x0000,0x0000, // u0057 0x0000,0x0000,0x0000,0x6180,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x1e00,0x3300,0x3300,0x6180,0x6180,0x0000, 0x0000,0x0000, // u0058 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u0059 0x0000,0x0000,0x0000,0x7f80,0x0180,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u005a 0x0000,0x0000,0x0000,0x1e00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1e00,0x0000, 0x0000,0x0000, // u005b 0x0000,0x0000,0x0000,0x6000,0x6000,0x3000,0x3000,0x1800,0x1800,0x0c00,0x0c00,0x0600,0x0600,0x0300,0x0300,0x0000, 0x0000,0x0000, // u005c 0x0000,0x0000,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x1e00,0x0000, 0x0000,0x0000, // u005d 0x0000,0x0c00,0x1e00,0x3300,0x6180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u005e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x7f80,0x0000, // u005f 0x1800,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0060 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u0061 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x0000, 0x0000,0x0000, // u0062 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0063 0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u0064 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0065 0x0000,0x0000,0x0000,0x0780,0x0c00,0x0c00,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u0066 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180, 0x0180,0x3f00, // u0067 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u0068 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u0069 0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0700,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x3300, 0x3300,0x1e00, // u006a 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6180,0x6300,0x6600,0x6c00,0x7800,0x6c00,0x6600,0x6300,0x6180,0x0000, 0x0000,0x0000, // u006b 0x0000,0x0000,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u006c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x0000, 0x0000,0x0000, // u006d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u006e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u006f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x6000, 0x6000,0x6000, // u0070 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180, 0x0180,0x0180, // u0071 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6f80,0x7800,0x7000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, 0x0000,0x0000, // u0072 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6000,0x6000,0x3f00,0x0180,0x0180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0073 0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x7e00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0f00,0x0000, 0x0000,0x0000, // u0074 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u0075 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u0076 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3f00,0x0000, 0x0000,0x0000, // u0077 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x3300,0x1e00,0x0c00,0x1e00,0x3300,0x6180,0x6180,0x0000, 0x0000,0x0000, // u0078 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180, 0x0180,0x3f00, // u0079 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u007a 0x0000,0x0000,0x0000,0x0700,0x0c00,0x0c00,0x0c00,0x0c00,0x3800,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0700,0x0000, 0x0000,0x0000, // u007b 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u007c 0x0000,0x0000,0x0000,0x3800,0x0c00,0x0c00,0x0c00,0x0c00,0x0700,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x3800,0x0000, 0x0000,0x0000, // u007d 0x0000,0x3980,0x6d80,0x6d80,0x6700,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u007e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00a0 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u00a1 0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x3f00,0x6d80,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6d80,0x3f00,0x0c00, 0x0c00,0x0000, // u00a2 0x0000,0x0000,0x0000,0x1e00,0x3300,0x3000,0x3000,0x3000,0x7e00,0x3000,0x3000,0x3000,0x3000,0x3180,0x7f80,0x0000, 0x0000,0x0000, // u00a3 0x0000,0x0000,0x0000,0x0000,0xc180,0x6300,0x3e00,0x6300,0x6300,0x6300,0x6300,0x3e00,0x6300,0xc180,0x0000,0x0000, 0x0000,0x0000, // u00a4 0x0000,0x0000,0x0000,0x6180,0x6180,0x3300,0x3300,0x1e00,0x1e00,0x0c00,0x3f00,0x0c00,0x3f00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u00a5 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u00a6 0x0000,0x0000,0x1e00,0x3300,0x3000,0x1c00,0x3600,0x3300,0x3300,0x3300,0x1b00,0x0e00,0x0300,0x3300,0x1e00,0x0000, 0x0000,0x0000, // u00a7 0x3300,0x3300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00a8 0x0000,0x0000,0x0000,0x0000,0x3f00,0x4080,0x9e40,0xb340,0xb040,0xb040,0xb340,0x9e40,0x4080,0x3f00,0x0000,0x0000, 0x0000,0x0000, // u00a9 0x0000,0x3e00,0x0300,0x3f00,0x6300,0x6300,0x3f00,0x0000,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0cc0,0x1980,0x3300,0x6600,0xcc00,0x6600,0x3300,0x1980,0x0cc0,0x0000, 0x0000,0x0000, // u00ab 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00ac 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00ad 0x0000,0x0000,0x0000,0x0000,0x3f00,0x4080,0xbe40,0xb340,0xb340,0xbe40,0xb640,0xb340,0x4080,0x3f00,0x0000,0x0000, 0x0000,0x0000, // u00ae 0x0000,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00af 0x0000,0x1e00,0x3300,0x3300,0x3300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x7f80,0x0000, 0x0000,0x0000, // u00b1 0x0000,0x1e00,0x3300,0x3300,0x0600,0x0c00,0x1800,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00b2 0x0000,0x1e00,0x3300,0x0300,0x0e00,0x0300,0x3300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00b3 0x0600,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6380,0x7d80,0x6000, 0x6000,0x6000, // u00b5 0x0000,0x0000,0x0000,0x3f80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3d80,0x0d80,0x0d80,0x0d80,0x0d80,0x0d80,0x0000, 0x0000,0x0000, // u00b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00b7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00, 0x0c00,0x1800, // u00b8 0x0000,0x0c00,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00b9 0x0000,0x3e00,0x6300,0x6300,0x6300,0x6300,0x3e00,0x0000,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xcc00,0x6600,0x3300,0x1980,0x0cc0,0x1980,0x3300,0x6600,0xcc00,0x0000, 0x0000,0x0000, // u00bb 0x0000,0x0000,0x3000,0x7000,0x3080,0x3180,0x3300,0x3600,0x0c00,0x1980,0x3380,0x6780,0xcd80,0x8f80,0x0180,0x0180, 0x0000,0x0000, // u00bc 0x0000,0x0000,0x3000,0x7000,0x3080,0x3180,0x3300,0x3600,0x0c00,0x1800,0x3700,0x6d80,0xc180,0x8300,0x0600,0x0f80, 0x0000,0x0000, // u00bd 0x0000,0x0000,0xf000,0x1800,0x7080,0x1980,0x1b00,0xf600,0x0c00,0x1980,0x3380,0x6780,0xcd80,0x8f80,0x0180,0x0180, 0x0000,0x0000, // u00be 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0c00,0x0c00,0x1800,0x3000,0x6000,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000, // u00bf 0x1800,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u00c0 0x0600,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u00c1 0x1e00,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u00c2 0x3b80,0x6e00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u00c3 0x3300,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u00c4 0x1e00,0x3300,0x1e00,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u00c5 0x0000,0x0000,0x0000,0x7fc0,0xc600,0xc600,0xc600,0xc600,0xffc0,0xc600,0xc600,0xc600,0xc600,0xc600,0xc7c0,0x0000, 0x0000,0x0000, // u00c6 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x6180,0x3f00,0x0c00, 0x0c00,0x1800, // u00c7 0x1800,0x0c00,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u00c8 0x0600,0x0c00,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u00c9 0x1e00,0x3300,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u00ca 0x3300,0x3300,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u00cb 0x1800,0x0c00,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u00cc 0x0600,0x0c00,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u00cd 0x1e00,0x3300,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u00ce 0x3300,0x3300,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u00cf 0x0000,0x0000,0x0000,0x7e00,0x6300,0x6180,0x6180,0x6180,0xfd80,0x6180,0x6180,0x6180,0x6180,0x6300,0x7e00,0x0000, 0x0000,0x0000, // u00d0 0x3b80,0x6e00,0x0000,0x6180,0x6180,0x6180,0x7180,0x7980,0x6d80,0x6780,0x6380,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u00d1 0x1800,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u00d2 0x0600,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u00d3 0x1e00,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u00d4 0x3b80,0x6e00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u00d5 0x3300,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u00d6 0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x3300,0x1e00,0x0c00,0x1e00,0x3300,0x6180,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00d7 0x0000,0x0000,0x0000,0x3f00,0x61c0,0x6180,0x6380,0x6780,0x6d80,0x7980,0x7180,0x6180,0xe180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u00d8 0x1800,0x0c00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u00d9 0x0600,0x0c00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u00da 0x1e00,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u00db 0x3300,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u00dc 0x0600,0x0c00,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u00dd 0x0000,0x0000,0x0000,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x6000,0x6000,0x6000,0x0000, 0x0000,0x0000, // u00de 0x0000,0x0000,0x0000,0x3e00,0x6300,0x6300,0x6300,0x6200,0x7f00,0x6180,0x6180,0x6180,0x6180,0x7180,0x6f00,0x0000, 0x0000,0x0000, // u00df 0x0000,0x0000,0x0000,0x1800,0x0c00,0x0000,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u00e0 0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u00e1 0x0000,0x0000,0x0000,0x1e00,0x3300,0x0000,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u00e2 0x0000,0x0000,0x0000,0x3b80,0x6e00,0x0000,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u00e3 0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u00e4 0x0000,0x0000,0x0000,0x1e00,0x3300,0x1e00,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u00e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7b80,0x0cc0,0x0cc0,0x7cc0,0xcfc0,0xcc00,0xcc00,0xccc0,0x7780,0x0000, 0x0000,0x0000, // u00e6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x3f00,0x0c00, 0x0c00,0x1800, // u00e7 0x0000,0x0000,0x0000,0x1800,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u00e8 0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u00e9 0x0000,0x0000,0x0000,0x1e00,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u00ea 0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u00eb 0x0000,0x0000,0x0000,0x1800,0x0c00,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u00ec 0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u00ed 0x0000,0x0000,0x0000,0x1e00,0x3300,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u00ee 0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u00ef 0x0000,0x0000,0x0000,0x3600,0x3c00,0x6c00,0x0600,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u00f0 0x0000,0x0000,0x0000,0x3b80,0x6e00,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u00f1 0x0000,0x0000,0x0000,0x1800,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u00f2 0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u00f3 0x0000,0x0000,0x0000,0x1e00,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u00f4 0x0000,0x0000,0x0000,0x3b80,0x6e00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u00f5 0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u00f6 0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0000,0x0000, 0x0000,0x0000, // u00f7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f40,0x6180,0x6380,0x6780,0x6d80,0x7980,0x7180,0x6180,0xbf00,0x0000, 0x0000,0x0000, // u00f8 0x0000,0x0000,0x0000,0x1800,0x0c00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u00f9 0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u00fa 0x0000,0x0000,0x0000,0x1e00,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u00fb 0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u00fc 0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180, 0x0180,0x3f00, // u00fd 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x6000, 0x6000,0x6000, // u00fe 0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180, 0x0180,0x3f00, // u00ff 0x0000,0x3f00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u0100 0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u0101 0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u0102 0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u0103 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x0180, 0x0300,0x01c0, // u0104 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180, 0x0300,0x01c0, // u0105 0x0600,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0106 0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x3f00,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0107 0x1e00,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0108 0x0000,0x0000,0x0000,0x1e00,0x3300,0x0000,0x3f00,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0109 0x0c00,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u010a 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x3f00,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u010b 0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u010c 0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u010d 0x3300,0x1e00,0x0000,0x7e00,0x6300,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6300,0x7e00,0x0000, 0x0000,0x0000, // u010e 0x3300,0x1e00,0x0000,0x0180,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u010f 0x0000,0x0000,0x0000,0x7e00,0x6300,0x6180,0x6180,0x6180,0xfd80,0x6180,0x6180,0x6180,0x6180,0x6300,0x7e00,0x0000, 0x0000,0x0000, // u0110 0x0000,0x0000,0x0000,0x0180,0x0fc0,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u0111 0x0000,0x3f00,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u0112 0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0113 0x3300,0x1e00,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u0114 0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0115 0x0c00,0x0c00,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u0116 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0117 0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0180, 0x0300,0x01c0, // u0118 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00,0x0c00, 0x1800,0x0e00, // u0119 0x3300,0x1e00,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u011a 0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u011b 0x1e00,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6780,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u011c 0x0000,0x0000,0x0000,0x1e00,0x3300,0x0000,0x3f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180, 0x0180,0x3f00, // u011d 0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6780,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u011e 0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x3f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180, 0x0180,0x3f00, // u011f 0x0c00,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6780,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0120 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x3f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180, 0x0180,0x3f00, // u0121 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6780,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0c00, 0x0c00,0x1800, // u0122 0x0000,0x0000,0x0600,0x0c00,0x0c00,0x0000,0x3f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180, 0x0180,0x3f00, // u0123 0x1e00,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u0124 0x1e00,0x3300,0x0000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u0125 0x0000,0x0000,0x0000,0x6180,0x6180,0xffc0,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u0126 0x0000,0x0000,0x0000,0x6000,0xfc00,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u0127 0x3b80,0x6e00,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u0128 0x0000,0x0000,0x0000,0x3b80,0x6e00,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u0129 0x0000,0x3f00,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u012a 0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u012b 0x3300,0x1e00,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u012c 0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u012d 0x0000,0x0000,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0c00, 0x1800,0x0e00, // u012e 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0c00, 0x1800,0x0e00, // u012f 0x0c00,0x0c00,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u0130 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u0131 0x0000,0x0000,0x0000,0xf3c0,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6d80,0x6d80,0x6d80,0xf700,0x0000, 0x0000,0x0000, // u0132 0x0000,0x0000,0x0000,0x6180,0x6180,0x0000,0xe380,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0xf180,0x0d80, 0x0d80,0x0700, // u0133 0x0780,0x0cc0,0x0000,0x0780,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x6300,0x6300,0x6300,0x3e00,0x0000, 0x0000,0x0000, // u0134 0x0000,0x0000,0x0000,0x0780,0x0cc0,0x0000,0x0700,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x3300, 0x3300,0x1e00, // u0135 0x0000,0x0000,0x0000,0x6180,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7800,0x6c00,0x6600,0x6300,0x6180,0x6180,0x0c00, 0x0c00,0x1800, // u0136 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6180,0x6300,0x6600,0x6c00,0x7800,0x6c00,0x6600,0x6300,0x6180,0x0c00, 0x0c00,0x1800, // u0137 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6300,0x6600,0x6c00,0x7800,0x6c00,0x6600,0x6300,0x6180,0x0000, 0x0000,0x0000, // u0138 0x3000,0x6000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u0139 0x0600,0x0c00,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u013a 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0c00, 0x0c00,0x1800, // u013b 0x0000,0x0000,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0c00, 0x0c00,0x1800, // u013c 0x3300,0x1e00,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u013d 0x3300,0x1e00,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u013e 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6300,0x6300,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u013f 0x0000,0x0000,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0cc0,0x0cc0,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u0140 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3c00,0x3800,0x3000,0x7000,0xf000,0x3000,0x3000,0x3000,0x3fc0,0x0000, 0x0000,0x0000, // u0141 0x0000,0x0000,0x0000,0x1c00,0x0c00,0x0c00,0x0f00,0x0e00,0x0c00,0x1c00,0x3c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u0142 0x0600,0x0c00,0x0000,0x6180,0x6180,0x6180,0x7180,0x7980,0x6d80,0x6780,0x6380,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u0143 0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u0144 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x7180,0x7980,0x6d80,0x6780,0x6380,0x6180,0x6180,0x6180,0x6180,0x0c00, 0x0c00,0x1800, // u0145 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0c00, 0x0c00,0x1800, // u0146 0x3300,0x1e00,0x0000,0x6180,0x6180,0x6180,0x7180,0x7980,0x6d80,0x6780,0x6380,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u0147 0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u0148 0x0000,0x6000,0x6000,0x6000,0xc000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u0149 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x7180,0x7980,0x6d80,0x6780,0x6380,0x6180,0x6180,0x6180,0x6180,0x0180, 0x0180,0x0700, // u014a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0180, 0x0180,0x0700, // u014b 0x0000,0x3f00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u014c 0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u014d 0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u014e 0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u014f 0x1980,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0150 0x0000,0x0000,0x0000,0x1980,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0151 0x0000,0x0000,0x0000,0x7fc0,0xc600,0xc600,0xc600,0xc600,0xc7c0,0xc600,0xc600,0xc600,0xc600,0xc600,0x7fc0,0x0000, 0x0000,0x0000, // u0152 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0xccc0,0xccc0,0xccc0,0xcfc0,0xcc00,0xcc00,0xccc0,0x7f80,0x0000, 0x0000,0x0000, // u0153 0x0600,0x0c00,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x7800,0x6c00,0x6600,0x6300,0x6180,0x0000, 0x0000,0x0000, // u0154 0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x6f80,0x7800,0x7000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, 0x0000,0x0000, // u0155 0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x7800,0x6c00,0x6600,0x6300,0x6180,0x0c00, 0x0c00,0x1800, // u0156 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6f80,0x7800,0x7000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x3000, 0x3000,0x6000, // u0157 0x3300,0x1e00,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x7800,0x6c00,0x6600,0x6300,0x6180,0x0000, 0x0000,0x0000, // u0158 0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x6f80,0x7800,0x7000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, 0x0000,0x0000, // u0159 0x0600,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x3f00,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u015a 0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x3f00,0x6180,0x6000,0x6000,0x3f00,0x0180,0x0180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u015b 0x1e00,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x3f00,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u015c 0x0000,0x0000,0x0000,0x1e00,0x3300,0x0000,0x3f00,0x6180,0x6000,0x6000,0x3f00,0x0180,0x0180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u015d 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x3f00,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00,0x0c00, 0x0c00,0x1800, // u015e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6000,0x6000,0x3f00,0x0180,0x0180,0x6180,0x3f00,0x0c00, 0x0c00,0x1800, // u015f 0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x3f00,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0160 0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6000,0x6000,0x3f00,0x0180,0x0180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0161 0x0000,0x0000,0x0000,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0600, 0x0600,0x0c00, // u0162 0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x7e00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0f00,0x0600, 0x0600,0x0c00, // u0163 0x3300,0x1e00,0x0000,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u0164 0x6600,0x3c00,0x0000,0x1800,0x1800,0x1800,0x7e00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0f00,0x0000, 0x0000,0x0000, // u0165 0x0000,0x0000,0x0000,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u0166 0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x7e00,0x1800,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x0f00,0x0000, 0x0000,0x0000, // u0167 0x3b80,0x6e00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0168 0x0000,0x0000,0x0000,0x3b80,0x6e00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u0169 0x0000,0x3f00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u016a 0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u016b 0x3300,0x1e00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u016c 0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u016d 0x1e00,0x3300,0x1e00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u016e 0x0000,0x0000,0x0000,0x1e00,0x3300,0x1e00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u016f 0x1980,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0170 0x0000,0x0000,0x0000,0x1980,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u0171 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0c00, 0x1800,0x0e00, // u0172 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180, 0x0300,0x01c0, // u0173 0x1e00,0x3300,0x0000,0xc180,0xc180,0xc180,0xc180,0xc180,0xc180,0xc980,0xdd80,0xf780,0xe380,0xc180,0x8080,0x0000, 0x0000,0x0000, // u0174 0x0000,0x0000,0x0000,0x1e00,0x3300,0x0000,0x6180,0x6180,0x6180,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3f00,0x0000, 0x0000,0x0000, // u0175 0x1e00,0x3300,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u0176 0x0000,0x0000,0x0000,0x1e00,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180, 0x0180,0x3f00, // u0177 0x3300,0x3300,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u0178 0x0600,0x0c00,0x0000,0x7f80,0x0180,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u0179 0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x7f80,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u017a 0x0c00,0x0c00,0x0000,0x7f80,0x0180,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u017b 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x7f80,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u017c 0x3300,0x1e00,0x0000,0x7f80,0x0180,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u017d 0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x7f80,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u017e 0x0000,0x0000,0x0000,0x0780,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u017f 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0186 0x0000,0x0000,0x0000,0x7f80,0x0180,0x0180,0x0180,0x0180,0x1f80,0x0180,0x0180,0x0180,0x0180,0x0180,0x7f80,0x0000, 0x0000,0x0000, // u018e 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x0180,0x0180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u018f 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x3e00,0x6000,0x6000,0x6000,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0190 0x0000,0x0000,0x0000,0x0700,0x0d80,0x0d80,0x0c00,0x0c00,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x6c00, 0x6c00,0x3800, // u0192 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x7180,0x7980,0x6d80,0x6780,0x6380,0x6180,0x6180,0x6180,0x6180,0x6000, 0x6000,0xc000, // u019d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0180, 0x0180,0x0180, // u019e 0x0000,0x0000,0x0000,0x7f80,0x0180,0x0180,0x0300,0x0600,0x7f80,0x0c00,0x1800,0x3000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u01b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0180,0x0300,0x0600,0x7f80,0x1800,0x3000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u01b6 0x0000,0x0000,0x0000,0x7f80,0x0180,0x0300,0x0600,0x0c00,0x1f00,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u01b7 0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u01cd 0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u01ce 0x3300,0x1e00,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u01cf 0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u01d0 0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u01d1 0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u01d2 0x3300,0x1e00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u01d3 0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u01d4 0x0000,0x3f80,0x0000,0x7fc0,0xc600,0xc600,0xc600,0xc600,0xffc0,0xc600,0xc600,0xc600,0xc600,0xc600,0xc7c0,0x0000, 0x0000,0x0000, // u01e2 0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x7b80,0x0cc0,0x0cc0,0x7cc0,0xcfc0,0xcc00,0xcc00,0xccc0,0x7780,0x0000, 0x0000,0x0000, // u01e3 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6780,0x6180,0x67c0,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u01e4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x6180,0x6180,0x6180,0x67c0,0x6180,0x6180,0x6180,0x3f80,0x0180, 0x0180,0x3f00, // u01e5 0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6780,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u01e6 0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x3f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180, 0x0180,0x3f00, // u01e7 0x3300,0x1e00,0x0000,0x6180,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7800,0x6c00,0x6600,0x6300,0x6180,0x6180,0x0000, 0x0000,0x0000, // u01e8 0x3300,0x1e00,0x0000,0x6000,0x6000,0x6000,0x6180,0x6300,0x6600,0x6c00,0x7800,0x6c00,0x6600,0x6300,0x6180,0x0000, 0x0000,0x0000, // u01e9 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0c00, 0x1800,0x0e00, // u01ea 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0c00, 0x1800,0x0e00, // u01eb 0x0000,0x3f00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0c00, 0x1800,0x0e00, // u01ec 0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0c00, 0x1800,0x0e00, // u01ed 0x3300,0x1e00,0x0000,0x7f80,0x0180,0x0300,0x0600,0x0c00,0x1f00,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u01ee 0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x7f80,0x0180,0x0300,0x0600,0x0c00,0x1f00,0x0180,0x0180,0x0180,0x6180, 0x6180,0x3f00, // u01ef 0x0000,0x0000,0x0000,0x0cc0,0x0780,0x0000,0x0700,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x3300, 0x3300,0x1e00, // u01f0 0x0600,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6780,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u01f4 0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x3f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180, 0x0180,0x3f00, // u01f5 0x0600,0x0c00,0x0000,0x7fc0,0xc600,0xc600,0xc600,0xc600,0xffc0,0xc600,0xc600,0xc600,0xc600,0xc600,0xc7c0,0x0000, 0x0000,0x0000, // u01fc 0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x7b80,0x0cc0,0x0cc0,0x7cc0,0xcfc0,0xcc00,0xcc00,0xccc0,0x7780,0x0000, 0x0000,0x0000, // u01fd 0x0600,0x0c00,0x0000,0x3f00,0x61c0,0x6180,0x6380,0x6780,0x6d80,0x7980,0x7180,0x6180,0xe180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u01fe 0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x3f40,0x6180,0x6380,0x6780,0x6d80,0x7980,0x7180,0x6180,0xbf00,0x0000, 0x0000,0x0000, // u01ff 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x3f00,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00,0x0c00, 0x0c00,0x1800, // u0218 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6000,0x6000,0x3f00,0x0180,0x0180,0x6180,0x3f00,0x0c00, 0x0c00,0x1800, // u0219 0x0000,0x0000,0x0000,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0600, 0x0600,0x0c00, // u021a 0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x7e00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0f00,0x0300, 0x0300,0x0600, // u021b 0x0000,0x3f00,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u0232 0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180, 0x0180,0x3f00, // u0233 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x3300, 0x3300,0x1e00, // u0237 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x0180,0x0180,0x0180,0x0180,0x0180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0254 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x0180,0x0180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0258 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x0180,0x0180,0x7f80,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0259 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6000,0x6000,0x3e00,0x6000,0x6000,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u025b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6000, 0x6000,0xc000, // u0272 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0180,0x0300,0x0600,0x0c00,0x1f00,0x0180,0x0180,0x0180,0x6180, 0x6180,0x3f00, // u0292 0x0600,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u02bb 0x0c00,0x0c00,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u02bc 0x0c00,0x0c00,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u02bd 0x1e00,0x3300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u02c6 0x3300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u02c7 0x3300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u02d8 0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u02d9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00, 0x1800,0x0e00, // u02db 0x3b80,0x6e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u02dc 0x1980,0x3300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u02dd 0x1800,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0300 0x0600,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0301 0x1e00,0x3300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0302 0x3b80,0x6e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0303 0x0000,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0304 0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0305 0x3300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0306 0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0307 0x3300,0x3300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0308 0x1e00,0x3300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u030a 0x1980,0x3300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u030b 0x3300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u030c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0c00,0x0c00, // u0329 0x0000,0x6000,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0384 0x0600,0x0c00,0x0000,0x3300,0x3300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0385 0x0000,0x6000,0xc000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u0386 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u0387 0x0000,0x6000,0xc000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u0388 0x0000,0x6000,0xc000,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u0389 0x0000,0x6000,0xc000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u038a 0x0000,0x6000,0xc000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u038c 0x0000,0x6000,0xc000,0x30c0,0x30c0,0x30c0,0x1980,0x1980,0x0f00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000, 0x0000,0x0000, // u038e 0x0000,0x6000,0xc000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300,0x3300,0x7380,0x0000, 0x0000,0x0000, // u038f 0x0600,0x0c00,0x0000,0x3300,0x3300,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0700,0x0000, 0x0000,0x0000, // u0390 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u0391 0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x0000, 0x0000,0x0000, // u0392 0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, 0x0000,0x0000, // u0393 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x1e00,0x1e00,0x3300,0x3300,0x3300,0x6180,0x6180,0x6180,0x7f80,0x0000, 0x0000,0x0000, // u0394 0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u0395 0x0000,0x0000,0x0000,0x7f80,0x0180,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u0396 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u0397 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6d80,0x6d80,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0398 0x0000,0x0000,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u0399 0x0000,0x0000,0x0000,0x6180,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7800,0x6c00,0x6600,0x6300,0x6180,0x6180,0x0000, 0x0000,0x0000, // u039a 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x1e00,0x1e00,0x1e00,0x3300,0x3300,0x3300,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u039b 0x0000,0x0000,0x0000,0x8080,0xc180,0xe380,0xf780,0xdd80,0xc980,0xc180,0xc180,0xc180,0xc180,0xc180,0xc180,0x0000, 0x0000,0x0000, // u039c 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x7180,0x7980,0x6d80,0x6780,0x6380,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u039d 0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000, 0x0000,0x0000, // u039e 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u039f 0x0000,0x0000,0x0000,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u03a0 0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, 0x0000,0x0000, // u03a1 0x0000,0x0000,0x0000,0x7f80,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0600,0x0c00,0x1800,0x3000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u03a3 0x0000,0x0000,0x0000,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u03a4 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u03a5 0x0000,0x0000,0x0000,0x0c00,0x3f00,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3f00,0x0c00,0x0000, 0x0000,0x0000, // u03a6 0x0000,0x0000,0x0000,0x6180,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x1e00,0x3300,0x3300,0x6180,0x6180,0x0000, 0x0000,0x0000, // u03a7 0x0000,0x0000,0x0000,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3f00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u03a8 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300,0x3300,0x7380,0x0000, 0x0000,0x0000, // u03a9 0x3300,0x3300,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u03aa 0x3300,0x3300,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u03ab 0x0000,0x0000,0x0000,0x0c00,0x1800,0x0000,0x7d80,0xc700,0xc600,0xc600,0xc600,0xc600,0xc600,0xc700,0x7d80,0x0000, 0x0000,0x0000, // u03ac 0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x3f00,0x6180,0x6000,0x6000,0x3e00,0x6000,0x6000,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u03ad 0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0180, 0x0180,0x0180, // u03ae 0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0700,0x0000, 0x0000,0x0000, // u03af 0x0600,0x0c00,0x0000,0x3300,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u03b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7d80,0xc700,0xc600,0xc600,0xc600,0xc600,0xc600,0xc700,0x7d80,0x0000, 0x0000,0x0000, // u03b1 0x0000,0x0000,0x0000,0x3e00,0x6300,0x6300,0x6300,0x6200,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x6000, 0x6000,0x6000, // u03b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x3300,0x1e00,0x1e00,0x0c00,0x0c00, 0x0c00,0x0c00, // u03b3 0x0000,0x0000,0x0000,0x3f00,0x1800,0x0c00,0x1e00,0x3300,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000, // u03b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6000,0x6000,0x3e00,0x6000,0x6000,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u03b5 0x0000,0x0000,0x0000,0x7f80,0x0300,0x0600,0x0c00,0x1800,0x3000,0x3000,0x6000,0x6000,0x6000,0x6000,0x3f00,0x0180, 0x0180,0x0300, // u03b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0180, 0x0180,0x0180, // u03b7 0x0000,0x0000,0x0000,0x3e00,0x6300,0x6300,0x6300,0x6300,0x7f00,0x6300,0x6300,0x6300,0x6300,0x6300,0x3e00,0x0000, 0x0000,0x0000, // u03b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0700,0x0000, 0x0000,0x0000, // u03b9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6300,0x6600,0x6c00,0x7800,0x6c00,0x6600,0x6300,0x6180,0x0000, 0x0000,0x0000, // u03ba 0x0000,0x0000,0x0000,0x1800,0x1800,0x0c00,0x0c00,0x1e00,0x1e00,0x3300,0x3300,0x3300,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u03bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6380,0x7d80,0x6000, 0x6000,0x6000, // u03bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u03bd 0x0000,0x0000,0x0000,0x3f80,0x6000,0x6000,0x6000,0x6000,0x3f00,0x6000,0x6000,0x6000,0x6000,0x6000,0x3f00,0x0180, 0x0180,0x0300, // u03be 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u03bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u03c0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x6000, 0x6000,0x6000, // u03c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x3f00,0x0180, 0x0180,0x0300, // u03c2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3300,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000, // u03c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0700,0x0000, 0x0000,0x0000, // u03c4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u03c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2700,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3f00,0x0c00, 0x0c00,0x0c00, // u03c6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x1e00,0x3300,0x3300, 0x6180,0x6180, // u03c7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3f00,0x0c00, 0x0c00,0x0c00, // u03c8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3300,0x6180,0x6180,0x6d80,0x6d80,0x6d80,0x6d80,0x7f80,0x3300,0x0000, 0x0000,0x0000, // u03c9 0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0700,0x0000, 0x0000,0x0000, // u03ca 0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u03cb 0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u03cc 0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u03cd 0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x3300,0x6180,0x6180,0x6d80,0x6d80,0x6d80,0x6d80,0x7f80,0x3300,0x0000, 0x0000,0x0000, // u03ce 0x0000,0x0000,0x0000,0x3e00,0x6300,0x6300,0x6300,0x3f80,0x0300,0x0300,0xe300,0x6300,0x6300,0x6300,0x3e00,0x0000, 0x0000,0x0000, // u03d1 0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x3f00,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3f00,0x0c00, 0x0c00,0x0000, // u03d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf0c0,0x1980,0x0b00,0x0e00,0x0c00,0x1c00,0x3400,0x6600,0xc3c0,0x0000, 0x0000,0x0000, // u03f0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x6000, 0x6000,0x3f00, // u03f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u03f2 0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0700,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x3300, 0x3300,0x1e00, // u03f3 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u03f4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6000,0xc000,0xc000,0xfe00,0xc000,0xc000,0x6000,0x3f00,0x0000, 0x0000,0x0000, // u03f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0x0600,0x0300,0x0300,0x7f00,0x0300,0x0300,0x0600,0xfc00,0x0000, 0x0000,0x0000, // u03f6 0x1800,0x0c00,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u0400 0x3300,0x3300,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u0401 0x0000,0x0000,0x0000,0xfc00,0x3000,0x3000,0x3f00,0x3180,0x3180,0x3180,0x3180,0x3180,0x3180,0x3180,0x3300,0x0000, 0x0000,0x0000, // u0402 0x0600,0x0c00,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, 0x0000,0x0000, // u0403 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0404 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x3f00,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0405 0x0000,0x0000,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u0406 0x3300,0x3300,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u0407 0x0000,0x0000,0x0000,0x0780,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x6300,0x6300,0x6300,0x3e00,0x0000, 0x0000,0x0000, // u0408 0x0000,0x0000,0x0000,0x3c00,0x6c00,0xcc00,0xcc00,0xcf80,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0x8f80,0x0000, 0x0000,0x0000, // u0409 0x0000,0x0000,0x0000,0xcc00,0xcc00,0xcc00,0xcc00,0xcf80,0xfcc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xcf80,0x0000, 0x0000,0x0000, // u040a 0x0000,0x0000,0x0000,0xfc00,0x3000,0x3000,0x3f00,0x3180,0x3180,0x3180,0x3180,0x3180,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0000, // u040b 0x0600,0x0c00,0x0000,0x6180,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7800,0x6c00,0x6600,0x6300,0x6180,0x6180,0x0000, 0x0000,0x0000, // u040c 0x1800,0x0c00,0x0000,0x6180,0x6180,0x6180,0x6380,0x6780,0x6d80,0x7980,0x7180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u040d 0x3300,0x1e00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180,0x0180,0x0180,0x0180,0x3f00,0x0000, 0x0000,0x0000, // u040e 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x0c00, 0x0c00,0x0000, // u040f 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u0410 0x0000,0x0000,0x0000,0x7f00,0x6000,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x0000, 0x0000,0x0000, // u0411 0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x0000, 0x0000,0x0000, // u0412 0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, 0x0000,0x0000, // u0413 0x0000,0x0000,0x0000,0x1f00,0x3300,0x6300,0x6300,0x6300,0x6300,0x6300,0x6300,0x6300,0x6300,0x6300,0xff80,0xc180, 0xc180,0x0000, // u0414 0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u0415 0x0000,0x0000,0x0000,0x6d80,0x6d80,0x6d80,0x6d80,0x3f00,0x1e00,0x3f00,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x0000, 0x0000,0x0000, // u0416 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x0180,0x0180,0x1f00,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0417 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6380,0x6780,0x6d80,0x7980,0x7180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u0418 0x3300,0x1e00,0x0000,0x6180,0x6180,0x6180,0x6380,0x6780,0x6d80,0x7980,0x7180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u0419 0x0000,0x0000,0x0000,0x6180,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7800,0x6c00,0x6600,0x6300,0x6180,0x6180,0x0000, 0x0000,0x0000, // u041a 0x0000,0x0000,0x0000,0x0f80,0x1980,0x3180,0x3180,0x3180,0x3180,0x3180,0x3180,0x3180,0x3180,0x3180,0x6180,0x0000, 0x0000,0x0000, // u041b 0x0000,0x0000,0x0000,0x8080,0xc180,0xe380,0xf780,0xdd80,0xc980,0xc180,0xc180,0xc180,0xc180,0xc180,0xc180,0x0000, 0x0000,0x0000, // u041c 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u041d 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u041e 0x0000,0x0000,0x0000,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u041f 0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, 0x0000,0x0000, // u0420 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0421 0x0000,0x0000,0x0000,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u0422 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180,0x0180,0x0180,0x0180,0x3f00,0x0000, 0x0000,0x0000, // u0423 0x0000,0x0000,0x0c00,0x3f00,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3f00,0x0c00, 0x0000,0x0000, // u0424 0x0000,0x0000,0x0000,0x6180,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x1e00,0x3300,0x3300,0x6180,0x6180,0x0000, 0x0000,0x0000, // u0425 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3fc0,0x00c0, 0x00c0,0x0000, // u0426 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0000, // u0427 0x0000,0x0000,0x0000,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3f80,0x0000, 0x0000,0x0000, // u0428 0x0000,0x0000,0x0000,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3fc0,0x00c0, 0x00c0,0x0000, // u0429 0x0000,0x0000,0x0000,0xe000,0xe000,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x0000, 0x0000,0x0000, // u042a 0x0000,0x0000,0x0000,0xc180,0xc180,0xc180,0xc180,0xf980,0xcd80,0xcd80,0xcd80,0xcd80,0xcd80,0xcd80,0xf980,0x0000, 0x0000,0x0000, // u042b 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x0000, 0x0000,0x0000, // u042c 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x0180,0x0180,0x1f80,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u042d 0x0000,0x0000,0x0000,0xcf00,0xd980,0xd980,0xd980,0xd980,0xf980,0xd980,0xd980,0xd980,0xd980,0xd980,0xcf00,0x0000, 0x0000,0x0000, // u042e 0x0000,0x0000,0x0000,0x3f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0780,0x0d80,0x1980,0x3180,0x6180,0x0000, 0x0000,0x0000, // u042f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u0430 0x0000,0x0000,0x0000,0x3e00,0x6000,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x0000, 0x0000,0x0000, // u0431 0x0000,0x0000,0x0000,0x3e00,0x6300,0x6300,0x6300,0x6200,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x0000, 0x0000,0x0000, // u0432 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, 0x0000,0x0000, // u0433 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180, 0x0180,0x3f00, // u0434 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0435 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6d80,0x6d80,0x6d80,0x3f00,0x1e00,0x3f00,0x6d80,0x6d80,0x6d80,0x0000, 0x0000,0x0000, // u0436 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x0180,0x0180,0x1f00,0x0180,0x0180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0437 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u0438 0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u0439 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6300,0x6600,0x6c00,0x7800,0x6c00,0x6600,0x6300,0x6180,0x0000, 0x0000,0x0000, // u043a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f80,0x1980,0x3180,0x3180,0x3180,0x3180,0x3180,0x3180,0x6180,0x0000, 0x0000,0x0000, // u043b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x6180,0x7380,0x7f80,0x6d80,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u043c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u043d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u043e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u043f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x6000, 0x6000,0x6000, // u0440 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0441 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u0442 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180, 0x0180,0x3f00, // u0443 0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x3f00,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3f00,0x0c00, 0x0c00,0x0000, // u0444 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x3300,0x1e00,0x0c00,0x1e00,0x3300,0x6180,0x6180,0x0000, 0x0000,0x0000, // u0445 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3fc0,0x00c0, 0x00c0,0x0000, // u0446 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0000, // u0447 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3f80,0x0000, 0x0000,0x0000, // u0448 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3fc0,0x00c0, 0x00c0,0x0000, // u0449 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x3000,0x3000,0x3f00,0x3180,0x3180,0x3180,0x3180,0x3f00,0x0000, 0x0000,0x0000, // u044a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc180,0xc180,0xc180,0xf980,0xcd80,0xcd80,0xcd80,0xcd80,0xf980,0x0000, 0x0000,0x0000, // u044b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x7e00,0x6300,0x6300,0x6300,0x6300,0x7e00,0x0000, 0x0000,0x0000, // u044c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x0180,0x0180,0x1f80,0x0180,0x0180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u044d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xcf00,0xd980,0xd980,0xd980,0xf980,0xd980,0xd980,0xd980,0xcf00,0x0000, 0x0000,0x0000, // u044e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x6180,0x6180,0x6180,0x3f80,0x0d80,0x1980,0x3180,0x6180,0x0000, 0x0000,0x0000, // u044f 0x0000,0x0000,0x0000,0x1800,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0450 0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0451 0x0000,0x0000,0x0000,0x6000,0xfc00,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0180, 0x0180,0x0700, // u0452 0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, 0x0000,0x0000, // u0453 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0454 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6000,0x6000,0x3f00,0x0180,0x0180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u0455 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u0456 0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u0457 0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0700,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x3300, 0x3300,0x1e00, // u0458 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x6c00,0xcc00,0xcf80,0xccc0,0xccc0,0xccc0,0xccc0,0x8f80,0x0000, 0x0000,0x0000, // u0459 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xcc00,0xcc00,0xcc00,0xcf80,0xfcc0,0xccc0,0xccc0,0xccc0,0xcf80,0x0000, 0x0000,0x0000, // u045a 0x0000,0x0000,0x0000,0x6000,0xfc00,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u045b 0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x6180,0x6300,0x6600,0x6c00,0x7800,0x6c00,0x6600,0x6300,0x6180,0x0000, 0x0000,0x0000, // u045c 0x0000,0x0000,0x0000,0x1800,0x0c00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u045d 0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180, 0x0180,0x3f00, // u045e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x0c00, 0x0c00,0x0000, // u045f 0x0000,0x0000,0x0000,0x6000,0xfc00,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x0000, 0x0000,0x0000, // u0462 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0xfc00,0x3000,0x3000,0x3f00,0x3180,0x3180,0x3180,0x3180,0x3f00,0x0000, 0x0000,0x0000, // u0463 0x0000,0x0000,0x0000,0x7f80,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x1e00,0x3f00,0x6d80,0x6d80,0x6d80,0x6d80,0x0000, 0x0000,0x0000, // u046a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x6180,0x3300,0x1e00,0x1e00,0x3f00,0x6d80,0x6d80,0x6d80,0x0000, 0x0000,0x0000, // u046b 0x0000,0x0180,0x0180,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, 0x0000,0x0000, // u0490 0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, 0x0000,0x0000, // u0491 0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0xfc00,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, 0x0000,0x0000, // u0492 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0xfc00,0x6000,0x6000,0x6000,0x6000,0x0000, 0x0000,0x0000, // u0493 0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x0180, 0x0300,0x0000, // u0494 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x7e00,0x6300,0x6300,0x6300,0x6300,0x0300, 0x0600,0x0000, // u0495 0x0000,0x0000,0x0000,0x6d80,0x6d80,0x6d80,0x6d80,0x3f00,0x1e00,0x3f00,0x6d80,0x6d80,0x6d80,0x6d80,0x6dc0,0x00c0, 0x00c0,0x0000, // u0496 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6d80,0x6d80,0x6d80,0x3f00,0x1e00,0x3f00,0x6d80,0x6d80,0x6dc0,0x00c0, 0x00c0,0x0000, // u0497 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x0180,0x0180,0x1f00,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00,0x0c00, 0x0c00,0x0c00, // u0498 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x0180,0x0180,0x1f00,0x0180,0x0180,0x6180,0x3f00,0x0c00, 0x0c00,0x0c00, // u0499 0x0000,0x0000,0x0000,0x6180,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7800,0x6c00,0x6600,0x6300,0x6180,0x61c0,0x00c0, 0x00c0,0x0000, // u049a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6300,0x6600,0x6c00,0x7800,0x6c00,0x6600,0x6300,0x61c0,0x00c0, 0x00c0,0x0000, // u049b 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6b00,0x6e00,0x7c00,0x7c00,0x6e00,0x6b00,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u049c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6b00,0x6e00,0x6c00,0x7800,0x6c00,0x6e00,0x6b00,0x6180,0x0000, 0x0000,0x0000, // u049d 0x0000,0x0000,0x0000,0xe180,0xe180,0x6300,0x6600,0x6c00,0x7800,0x7800,0x6c00,0x6600,0x6300,0x6180,0x6180,0x0000, 0x0000,0x0000, // u04a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xe180,0x6300,0x6600,0x6c00,0x7800,0x6c00,0x6600,0x6300,0x6180,0x0000, 0x0000,0x0000, // u04a1 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x61c0,0x00c0, 0x00c0,0x0000, // u04a2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x61c0,0x00c0, 0x00c0,0x0000, // u04a3 0x0000,0x0000,0x0000,0xc7c0,0xc600,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0x0000, 0x0000,0x0000, // u04a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc7c0,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0x0000, 0x0000,0x0000, // u04a5 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x6180,0x3f00,0x0c00, 0x0c00,0x0c00, // u04aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x3f00,0x0c00, 0x0c00,0x0c00, // u04ab 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u04ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x3300,0x1e00,0x1e00,0x0c00,0x0c00, 0x0c00,0x0c00, // u04af 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u04b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x3300,0x1e00,0x1e00,0x0c00,0x3f00, 0x0c00,0x0c00, // u04b1 0x0000,0x0000,0x0000,0x6180,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x1e00,0x3300,0x3300,0x6180,0x61c0,0x00c0, 0x00c0,0x0000, // u04b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x3300,0x1e00,0x0c00,0x1e00,0x3300,0x6180,0x61c0,0x00c0, 0x00c0,0x0000, // u04b3 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180,0x0180,0x0180,0x0180,0x01c0,0x00c0, 0x00c0,0x0000, // u04b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180,0x0180,0x0180,0x01c0,0x00c0, 0x00c0,0x0000, // u04b7 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6d80,0x6d80,0x6d80,0x3f80,0x0d80,0x0d80,0x0d80,0x0180,0x0180,0x0000, 0x0000,0x0000, // u04b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6d80,0x6d80,0x3f80,0x0d80,0x0d80,0x0180,0x0180,0x0000, 0x0000,0x0000, // u04b9 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u04ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u04bb 0x0000,0x0000,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u04c0 0x3300,0x1e00,0x0000,0x6d80,0x6d80,0x6d80,0x6d80,0x3f00,0x1e00,0x3f00,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x0000, 0x0000,0x0000, // u04c1 0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x6d80,0x6d80,0x6d80,0x3f00,0x1e00,0x3f00,0x6d80,0x6d80,0x6d80,0x0000, 0x0000,0x0000, // u04c2 0x0000,0x0000,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0000,0x0000, // u04cf 0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u04d0 0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u04d1 0x3300,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u04d2 0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u04d3 0x0000,0x0000,0x0000,0x7fc0,0xc600,0xc600,0xc600,0xc600,0xffc0,0xc600,0xc600,0xc600,0xc600,0xc600,0xc7c0,0x0000, 0x0000,0x0000, // u04d4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7b80,0x0cc0,0x0cc0,0x7cc0,0xcfc0,0xcc00,0xcc00,0xccc0,0x7780,0x0000, 0x0000,0x0000, // u04d5 0x3300,0x1e00,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u04d6 0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u04d7 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x0180,0x0180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u04d8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x0180,0x0180,0x7f80,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u04d9 0x3300,0x3300,0x0000,0x3f00,0x6180,0x6180,0x0180,0x0180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u04da 0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x3f00,0x6180,0x0180,0x0180,0x7f80,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u04db 0x3300,0x3300,0x0000,0x6d80,0x6d80,0x6d80,0x6d80,0x3f00,0x1e00,0x3f00,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x0000, 0x0000,0x0000, // u04dc 0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x6d80,0x6d80,0x6d80,0x3f00,0x1e00,0x3f00,0x6d80,0x6d80,0x6d80,0x0000, 0x0000,0x0000, // u04dd 0x3300,0x3300,0x0000,0x3f00,0x6180,0x6180,0x0180,0x0180,0x1f00,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u04de 0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x3f00,0x6180,0x0180,0x0180,0x1f00,0x0180,0x0180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u04df 0x0000,0x3f00,0x0000,0x6180,0x6180,0x6180,0x6380,0x6780,0x6d80,0x7980,0x7180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u04e2 0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u04e3 0x3300,0x3300,0x0000,0x6180,0x6180,0x6180,0x6380,0x6780,0x6d80,0x7980,0x7180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u04e4 0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0000,0x0000, // u04e5 0x3300,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u04e6 0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u04e7 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u04e8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u04e9 0x3300,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u04ea 0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u04eb 0x3300,0x3300,0x0000,0x3f00,0x6180,0x6180,0x0180,0x0180,0x1f80,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u04ec 0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x3f00,0x6180,0x0180,0x0180,0x1f80,0x0180,0x0180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u04ed 0x0000,0x3f00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180,0x0180,0x0180,0x0180,0x3f00,0x0000, 0x0000,0x0000, // u04ee 0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180, 0x0180,0x3f00, // u04ef 0x3300,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180,0x0180,0x0180,0x0180,0x3f00,0x0000, 0x0000,0x0000, // u04f0 0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180, 0x0180,0x3f00, // u04f1 0x1980,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180,0x0180,0x0180,0x0180,0x3f00,0x0000, 0x0000,0x0000, // u04f2 0x0000,0x0000,0x0000,0x1980,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180, 0x0180,0x3f00, // u04f3 0x3300,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0000, // u04f4 0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0000, // u04f5 0x6600,0x6600,0x0000,0xc180,0xc180,0xc180,0xc180,0xf980,0xcd80,0xcd80,0xcd80,0xcd80,0xcd80,0xcd80,0xf980,0x0000, 0x0000,0x0000, // u04f8 0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0xc180,0xc180,0xc180,0xf980,0xcd80,0xcd80,0xcd80,0xcd80,0xf980,0x0000, 0x0000,0x0000, // u04f9 0x0000,0x0000,0x0000,0x6180,0x6180,0x3180,0x3180,0x1980,0x3b00,0x6e00,0xcc00,0xc600,0xc600,0xc300,0xc300,0x0000, 0x0000,0x0000, // u05d0 0x0000,0x0000,0x0000,0x7f00,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x7fc0,0x0000, 0x0000,0x0000, // u05d1 0x0000,0x0000,0x0000,0x7c00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0e00,0x1b00,0x3300,0x6180,0xc180,0x0000, 0x0000,0x0000, // u05d2 0x0000,0x0000,0x0000,0x7fc0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0000, // u05d3 0x0000,0x0000,0x0000,0x7f00,0x0180,0x0180,0x0180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u05d4 0x0000,0x0000,0x0000,0x3800,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u05d5 0x0000,0x0000,0x0000,0x3f00,0x0300,0x0600,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u05d6 0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u05d7 0x0000,0x0000,0x0000,0x6700,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u05d8 0x0000,0x0000,0x0000,0x3800,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u05d9 0x0000,0x0000,0x0000,0x7f00,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180, // u05da 0x0000,0x0000,0x0000,0x7f00,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x7f00,0x0000, 0x0000,0x0000, // u05db 0x0000,0x6000,0x6000,0x7f80,0x0180,0x0180,0x0180,0x0180,0x0300,0x0600,0x0c00,0x1800,0x1800,0x1800,0x1800,0x0000, 0x0000,0x0000, // u05dc 0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x0000, 0x0000,0x0000, // u05dd 0x0000,0x0000,0x0000,0xde00,0x7300,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6780,0x0000, 0x0000,0x0000, // u05de 0x0000,0x0000,0x0000,0x7c00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600, // u05df 0x0000,0x0000,0x0000,0x3e00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x3f00,0x0000, 0x0000,0x0000, // u05e0 0x0000,0x0000,0x0000,0xff00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u05e1 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x3180,0x3180,0x3180,0x1980,0x1b00,0x1b00,0x0e00,0x1c00,0x7000,0x0000, 0x0000,0x0000, // u05e2 0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x3980,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180, // u05e3 0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x3980,0x0180,0x0180,0x0180,0x0180,0x0180,0x7f00,0x0000, 0x0000,0x0000, // u05e4 0x0000,0x0000,0x0000,0x6180,0x6180,0x3180,0x3180,0x1b00,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u05e5 0x0000,0x0000,0x0000,0x6180,0x6180,0x3180,0x3180,0x1b00,0x1e00,0x0c00,0x0c00,0x0600,0x0600,0x0300,0x7f00,0x0000, 0x0000,0x0000, // u05e6 0x0000,0x0000,0x0000,0x7f80,0x0180,0x0180,0x0180,0x6180,0x6180,0x6300,0x6600,0x6c00,0x6c00,0x6c00,0x6c00,0x6000, 0x6000,0x6000, // u05e7 0x0000,0x0000,0x0000,0x7f00,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0000, // u05e8 0x0000,0x0000,0x0000,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x7980,0x7180,0x6180,0x6180,0x6300,0x7e00,0x0000, 0x0000,0x0000, // u05e9 0x0000,0x0000,0x0000,0xff00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0xc180,0x0000, 0x0000,0x0000, // u05ea 0x0000,0x0000,0x0000,0x7e00,0x6300,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6300,0x7e00,0x0000, 0x1800,0x1800, // u1e0c 0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0c00,0x0c00, // u1e0d 0x0000,0x0000,0x0000,0x6180,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7800,0x6c00,0x6600,0x6300,0x6180,0x6180,0x0000, 0x3f00,0x0000, // u1e34 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6180,0x6300,0x6600,0x6c00,0x7800,0x6c00,0x6600,0x6300,0x6180,0x0000, 0x3f00,0x0000, // u1e35 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0c00,0x0c00, // u1e36 0x0000,0x0000,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0c00,0x0c00, // u1e37 0x0c00,0x0c00,0x0000,0x8080,0xc180,0xe380,0xf780,0xdd80,0xc980,0xc180,0xc180,0xc180,0xc180,0xc180,0xc180,0x0000, 0x0000,0x0000, // u1e40 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x7f00,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x0000, 0x0000,0x0000, // u1e41 0x0000,0x0000,0x0000,0x8080,0xc180,0xe380,0xf780,0xdd80,0xc980,0xc180,0xc180,0xc180,0xc180,0xc180,0xc180,0x0000, 0x0c00,0x0c00, // u1e42 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x0000, 0x0c00,0x0c00, // u1e43 0x0c00,0x0c00,0x0000,0x6180,0x6180,0x6180,0x7180,0x7980,0x6d80,0x6780,0x6380,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u1e44 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u1e45 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x7180,0x7980,0x6d80,0x6780,0x6380,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0c00,0x0c00, // u1e46 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0c00,0x0c00, // u1e47 0x0000,0x0000,0x0000,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0c00,0x0c00, // u1e6c 0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x7e00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0f00,0x0600, 0x0600,0x0000, // u1e6d 0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0c00,0x0c00, // u1eb8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00,0x0000, 0x0c00,0x0c00, // u1eb9 0x3b80,0x6e00,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000, // u1ebc 0x0000,0x0000,0x0000,0x3b80,0x6e00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00,0x0000, 0x0000,0x0000, // u1ebd 0x0000,0x0000,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0c00,0x0c00, // u1eca 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000, 0x0c00,0x0c00, // u1ecb 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0c00,0x0c00, // u1ecc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0c00,0x0c00, // u1ecd 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000, 0x0c00,0x0c00, // u1ee4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0000, 0x0c00,0x0c00, // u1ee5 0x3b80,0x6e00,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u1ef8 0x0000,0x0000,0x0000,0x3b80,0x6e00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180, 0x0180,0x3f00, // u1ef9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2001 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2002 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2003 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2004 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2005 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2006 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2007 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2008 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2009 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u200a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u200b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u200c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u200d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u200e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u200f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2010 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2011 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2012 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2013 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2014 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2015 0x0000,0x0000,0x0000,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x0000, 0x0000,0x0000, // u2016 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80, 0x0000,0x7f80, // u2017 0x0000,0x0600,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2018 0x0000,0x0c00,0x0c00,0x0c00,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2019 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x1800, 0x0000,0x0000, // u201a 0x0000,0x1800,0x1800,0x1800,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u201b 0x0000,0x1980,0x3300,0x3300,0x3300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u201c 0x0000,0x1980,0x1980,0x1980,0x3300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u201d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3300,0x3300,0x3300,0x6600, 0x0000,0x0000, // u201e 0x0000,0x6600,0x6600,0x6600,0x3300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u201f 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u2020 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u2021 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x1e00,0x1e00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2022 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6d80,0x6d80,0x0000, 0x0000,0x0000, // u2026 0x0000,0x0000,0x0000,0xe600,0xa600,0xec00,0x0c00,0x1800,0x1800,0x3000,0x3000,0x6000,0x6fc0,0xcb40,0xcfc0,0x0000, 0x0000,0x0000, // u2030 0x0000,0x0c00,0x0c00,0x0c00,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2032 0x0000,0x3300,0x3300,0x3300,0x2200,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2033 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x1800,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0000, 0x0000,0x0000, // u2039 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0600,0x0c00,0x1800,0x3000,0x0000, 0x0000,0x0000, // u203a 0x0000,0x0000,0x0000,0x3300,0x3300,0x3300,0x3300,0x3300,0x3300,0x3300,0x3300,0x0000,0x0000,0x3300,0x3300,0x0000, 0x0000,0x0000, // u203c 0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u203e 0x0000,0x1e00,0x3300,0x3300,0x3300,0x3300,0x3300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2070 0x0c00,0x0c00,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2071 0x0000,0x0300,0x0700,0x0f00,0x1b00,0x3f80,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2074 0x0000,0x3e00,0x3000,0x3000,0x3e00,0x0300,0x0300,0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2075 0x0000,0x1e00,0x3000,0x3000,0x3e00,0x3300,0x3300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2076 0x0000,0x3f00,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2077 0x0000,0x1e00,0x3300,0x3300,0x1e00,0x3300,0x3300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2078 0x0000,0x1e00,0x3300,0x3300,0x1f00,0x0300,0x0300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2079 0x0000,0x0000,0x0c00,0x0c00,0x3f00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u207a 0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u207b 0x0000,0x0000,0x0000,0x3f00,0x0000,0x0000,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u207c 0x0000,0x0600,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u207d 0x0000,0x0c00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u207e 0x0000,0x0000,0x3e00,0x3300,0x3300,0x3300,0x3300,0x3300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u207f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x3300,0x3300,0x3300,0x3300,0x1e00, 0x0000,0x0000, // u2080 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000, // u2081 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x3300,0x0600,0x0c00,0x1800,0x3f00, 0x0000,0x0000, // u2082 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x0300,0x0e00,0x0300,0x3300,0x1e00, 0x0000,0x0000, // u2083 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0700,0x0f00,0x1b00,0x3f80,0x0300,0x0300, 0x0000,0x0000, // u2084 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x3000,0x3000,0x3e00,0x0300,0x0300,0x3e00, 0x0000,0x0000, // u2085 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3000,0x3000,0x3e00,0x3300,0x3300,0x1e00, 0x0000,0x0000, // u2086 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x0c00, 0x0000,0x0000, // u2087 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x3300,0x1e00,0x3300,0x3300,0x1e00, 0x0000,0x0000, // u2088 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x3300,0x1f00,0x0300,0x0300,0x1e00, 0x0000,0x0000, // u2089 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x3f00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u208a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x0000,0x0000, 0x0000,0x0000, // u208b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x0000,0x3f00,0x0000,0x0000, 0x0000,0x0000, // u208c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0600, 0x0000,0x0000, // u208d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0c00, 0x0000,0x0000, // u208e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x0300,0x1f00,0x3300,0x3300,0x1f00, 0x0000,0x0000, // u2090 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x3f00,0x3000,0x3000,0x1f00, 0x0000,0x0000, // u2091 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x3300,0x3300,0x3300,0x1e00, 0x0000,0x0000, // u2092 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3300,0x1e00,0x0c00,0x0c00,0x1e00,0x3300, 0x0000,0x0000, // u2093 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0300,0x0300,0x3f00,0x3300,0x1e00, 0x0000,0x0000, // u2094 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3e00,0x3300,0x3300,0x3300,0x3300,0x3300, 0x0000,0x0000, // u2095 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3300,0x3600,0x3c00,0x3c00,0x3600,0x3300, 0x0000,0x0000, // u2096 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000, // u2097 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80, 0x0000,0x0000, // u2098 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x3300,0x3300,0x3300,0x3300,0x3e00, 0x3000,0x3000, // u209a 0x0000,0x0000,0x0000,0xf800,0xcc00,0xcc00,0xcc00,0xcc00,0xfb00,0xc300,0xc780,0xc300,0xc300,0xc300,0xc180,0x0000, 0x0000,0x0000, // u20a7 0x0000,0x0000,0x0000,0xf880,0x8480,0x8480,0x9480,0x9480,0x9480,0x9480,0x9480,0x9480,0x9080,0x9080,0x9f00,0x0000, 0x0000,0x0000, // u20aa 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x6000,0xfe00,0x6000,0x6000,0xfe00,0x6000,0x60c0,0x3180,0x1f00,0x0000, 0x0000,0x0000, // u20ac 0x0000,0x0000,0x0000,0x7f80,0x0c00,0x0c00,0x0c00,0x0f00,0x3c00,0x0f00,0x3c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u20ae 0x0000,0x0000,0x0000,0x3e00,0x5100,0x5100,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5100,0x5100,0x3e00,0x0000, 0x0000,0x0000, // u2102 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u210e 0x0000,0x0000,0x0000,0x6000,0xfc00,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u210f 0x0000,0x0000,0x0000,0x4100,0x4100,0x6100,0x5100,0x6900,0x5500,0x4b00,0x4500,0x4300,0x4100,0x4100,0x4100,0x0000, 0x0000,0x0000, // u2115 0x0000,0x0000,0x0000,0xcc00,0xcdc0,0xcd40,0xed40,0xedc0,0xfc00,0xfc00,0xddc0,0xddc0,0xcc00,0xcdc0,0xcdc0,0x0000, 0x0000,0x0000, // u2116 0x0000,0x0000,0x0000,0x3e00,0x5100,0x5100,0x5100,0x5100,0x5100,0x5100,0x5100,0x5100,0x5100,0x5500,0x3e00,0x0100, 0x0080,0x0000, // u211a 0x0000,0x0000,0x0000,0x7e00,0x5100,0x5100,0x5100,0x5100,0x5100,0x5e00,0x5400,0x5a00,0x5500,0x5280,0x7180,0x0000, 0x0000,0x0000, // u211d 0x0000,0x0000,0x0000,0xf440,0x66c0,0x67c0,0x66c0,0x66c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2122 0x0000,0x0000,0x0000,0x7f00,0x0100,0x0300,0x0500,0x0a00,0x1400,0x2800,0x5000,0x6000,0x4000,0x4000,0x7f00,0x0000, 0x0000,0x0000, // u2124 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300,0x3300,0x7380,0x0000, 0x0000,0x0000, // u2126 0x0000,0x0000,0x0000,0x6300,0x6300,0x3180,0x3180,0x18c0,0x3980,0x6f00,0xce00,0xc600,0xc600,0xc300,0x6300,0x0000, 0x0000,0x0000, // u2135 0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x3000,0x6000,0xff80,0xff80,0x6000,0x3000,0x1000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2190 0x0000,0x0000,0x0000,0x0c00,0x1e00,0x3f00,0x6d80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u2191 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0600,0x0300,0xff80,0xff80,0x0300,0x0600,0x0400,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2192 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x6d80,0x3f00,0x1e00,0x0c00,0x0000, 0x0000,0x0000, // u2193 0x0000,0x0000,0x0000,0x0000,0x0000,0x1200,0x3300,0x6180,0xffc0,0xffc0,0x6180,0x3300,0x1200,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2194 0x0000,0x0000,0x0000,0x0c00,0x1e00,0x3f00,0x6d80,0x0c00,0x0c00,0x0c00,0x0c00,0x6d80,0x3f00,0x1e00,0x0c00,0x0000, 0x0000,0x0000, // u2195 0x0000,0x0000,0x0000,0x0000,0x0000,0x1180,0x3180,0x6180,0xff80,0xff80,0x6180,0x3180,0x1180,0x0000,0x0000,0x0000, 0x0000,0x0000, // u21a4 0x0000,0x0000,0x0000,0x0000,0x0000,0xc400,0xc600,0xc300,0xff80,0xff80,0xc300,0xc600,0xc400,0x0000,0x0000,0x0000, 0x0000,0x0000, // u21a6 0x0000,0x0000,0x0000,0x0c00,0x1e00,0x3f00,0x6d80,0x0c00,0x0c00,0x0c00,0x6d80,0x3f00,0x1e00,0x0c00,0x7f80,0x0000, 0x0000,0x0000, // u21a8 0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x1180,0x3180,0x6180,0xff80,0xff80,0x6000,0x3000,0x1000,0x0000, 0x0000,0x0000, // u21b5 0x0000,0x0000,0x0000,0x0000,0xf800,0x3800,0x6800,0xc980,0xc180,0xc180,0xc180,0x6300,0x3e00,0x0000,0x0000,0x0000, 0x0000,0x0000, // u21bb 0x0000,0x0000,0x0000,0x1000,0x3000,0x6000,0xff80,0xff80,0x0000,0xff80,0xff80,0x0300,0x0600,0x0400,0x0000,0x0000, 0x0000,0x0000, // u21cb 0x0000,0x0000,0x0000,0x0400,0x0600,0x0300,0xff80,0xff80,0x0000,0xff80,0xff80,0x6000,0x3000,0x1000,0x0000,0x0000, 0x0000,0x0000, // u21cc 0x0000,0x0000,0x0000,0x0000,0x0800,0x1800,0x3f80,0x7f80,0xe000,0x7f80,0x3f80,0x1800,0x0800,0x0000,0x0000,0x0000, 0x0000,0x0000, // u21d0 0x0000,0x0000,0x0000,0x0800,0x1c00,0x3e00,0x7700,0xf780,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x0000, 0x0000,0x0000, // u21d1 0x0000,0x0000,0x0000,0x0000,0x0800,0x0c00,0xfe00,0xff00,0x0380,0xff00,0xfe00,0x0c00,0x0800,0x0000,0x0000,0x0000, 0x0000,0x0000, // u21d2 0x0000,0x0000,0x0000,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0xf780,0x7700,0x3e00,0x1c00,0x0800,0x0000, 0x0000,0x0000, // u21d3 0x0000,0x0000,0x0000,0x0000,0x1200,0x3300,0x7f80,0xffc0,0xc0c0,0xffc0,0x7f80,0x3300,0x1200,0x0000,0x0000,0x0000, 0x0000,0x0000, // u21d4 0x0000,0x0000,0x0000,0x0800,0x1c00,0x3e00,0x7700,0xf780,0x3600,0x3600,0xf780,0x7700,0x3e00,0x1c00,0x0800,0x0000, 0x0000,0x0000, // u21d5 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x7f80,0x3300,0x3300,0x3300,0x1200,0x1e00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u2200 0x0000,0x0000,0x0000,0x0000,0x7f80,0x0180,0x0180,0x0180,0x0180,0x7f80,0x0180,0x0180,0x0180,0x0180,0x7f80,0x0000, 0x0000,0x0000, // u2203 0x0000,0x0000,0x0000,0x0300,0x7f80,0x0780,0x0580,0x0d80,0x0d80,0x7f80,0x1980,0x1980,0x3180,0x3180,0x7f80,0x6000, 0x0000,0x0000, // u2204 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x3f00,0x6780,0x6d80,0x6d80,0x6d80,0x7980,0x3f00,0x3000,0x6000,0x0000, 0x0000,0x0000, // u2205 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x1e00,0x1e00,0x3300,0x3300,0x3300,0x6180,0x6180,0x6180,0x7f80,0x0000, 0x0000,0x0000, // u2206 0x0000,0x0000,0x0000,0x7f80,0x6180,0x6180,0x6180,0x3300,0x3300,0x3300,0x1e00,0x1e00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u2207 0x0000,0x0000,0x0000,0x0000,0x0f80,0x1800,0x3000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x3000,0x1800,0x0f80,0x0000, 0x0000,0x0000, // u2208 0x0000,0x0000,0x0000,0x0180,0x0f80,0x1b00,0x3300,0x6600,0x6600,0x7f80,0x6c00,0x6c00,0x3800,0x1800,0x3f80,0x3000, 0x0000,0x0000, // u2209 0x0000,0x0000,0x0000,0x0000,0x1f80,0x3000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x3000,0x1f80,0x0000,0x0000,0x0000, 0x0000,0x0000, // u220a 0x0000,0x0000,0x0000,0x0000,0x7c00,0x0600,0x0300,0x0180,0x0180,0x7f80,0x0180,0x0180,0x0300,0x0600,0x7c00,0x0000, 0x0000,0x0000, // u220b 0x0000,0x0000,0x0000,0x6000,0x7c00,0x3600,0x3300,0x1980,0x1980,0x7f80,0x0d80,0x0d80,0x0700,0x0600,0x7f00,0x0300, 0x0000,0x0000, // u220c 0x0000,0x0000,0x0000,0x0000,0x7e00,0x0300,0x0180,0x0180,0x7f80,0x0180,0x0180,0x0300,0x7e00,0x0000,0x0000,0x0000, 0x0000,0x0000, // u220d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2212 0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u2213 0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u2214 0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0xc000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2215 0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2216 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x1c00,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2219 0x0000,0x0380,0x0380,0x0300,0x0300,0x0300,0x0300,0x0300,0x6300,0x6300,0x6300,0x3300,0x1b00,0x0f00,0x0700,0x0000, 0x0000,0x0000, // u221a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6d80,0x6d80,0x6d80,0x6d80,0x3f00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u221e 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u221f 0x0000,0x0000,0x0000,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x0000, 0x0000,0x0000, // u2225 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x1e00,0x1e00,0x3300,0x3300,0x3300,0x6180,0x6180,0x0000, 0x0000,0x0000, // u2227 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x3300,0x3300,0x3300,0x1e00,0x1e00,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u2228 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u2229 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000, // u222a 0x0000,0x0000,0x0000,0x0000,0x0000,0x3980,0x6d80,0x6700,0x0000,0x3980,0x6d80,0x6700,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2248 0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x7f80,0x0600,0x0c00,0x1800,0x7f80,0x6000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2260 0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2261 0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x1800,0x3000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0000,0x7f80,0x0000, 0x0000,0x0000, // u2264 0x0000,0x0000,0x0000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0300,0x0600,0x0c00,0x1800,0x3000,0x0000,0x7f80,0x0000, 0x0000,0x0000, // u2265 0x0000,0x0000,0x0000,0x0000,0x0440,0x0cc0,0x1980,0x3300,0x6600,0xcc00,0x6600,0x3300,0x1980,0x0cc0,0x0440,0x0000, 0x0000,0x0000, // u226a 0x0000,0x0000,0x0000,0x0000,0x8800,0xcc00,0x6600,0x3300,0x1980,0x0cc0,0x1980,0x3300,0x6600,0xcc00,0x8800,0x0000, 0x0000,0x0000, // u226b 0x0000,0x0000,0x0000,0x0000,0x1f80,0x3000,0x6000,0x6000,0x6000,0x6000,0x6000,0x3000,0x1f80,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2282 0x0000,0x0000,0x0000,0x0000,0x7e00,0x0300,0x0180,0x0180,0x0180,0x0180,0x0180,0x0300,0x7e00,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2283 0x0000,0x0000,0x0000,0x0000,0x1f80,0x3000,0x6000,0x6000,0x6000,0x6000,0x6000,0x3000,0x1f80,0x0000,0x7f80,0x0000, 0x0000,0x0000, // u2286 0x0000,0x0000,0x0000,0x0000,0x7e00,0x0300,0x0180,0x0180,0x0180,0x0180,0x0180,0x0300,0x7e00,0x0000,0x7f80,0x0000, 0x0000,0x0000, // u2287 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x7f80,0x0000, 0x0000,0x0000, // u22a5 0x0000,0x0000,0x0000,0x1e00,0x3300,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000, // u22c2 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000, // u22c3 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x3f00,0x6780,0x6d80,0x6d80,0x6d80,0x7980,0x3f00,0x3000,0x6000,0x0000, 0x0000,0x0000, // u2300 0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1c00,0x3600,0x6300,0xc180,0xc180,0xc180,0xc180,0xc180,0xff80,0x0000, 0x0000,0x0000, // u2302 0x0000,0x0000,0x0000,0x1e00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000, 0x0000,0x0000, // u2308 0x0000,0x0000,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000, 0x0000,0x0000, // u2309 0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1e00,0x0000, 0x0000,0x0000, // u230a 0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x1e00,0x0000, 0x0000,0x0000, // u230b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2310 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2319 0x0000,0x0000,0x0000,0x0700,0x0d80,0x0d80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2320 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x6c00,0x6c00,0x3800,0x0000, 0x0000,0x0000, // u2321 0x0300,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x1800,0x3000,0x3000,0x3000,0x3000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000, // u239b 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000, // u239c 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x3000,0x3000,0x3000,0x3000,0x1800,0x1800,0x1800,0x0c00,0x0c00, 0x0600,0x0300, // u239d 0x6000,0x3000,0x1800,0x1800,0x0c00,0x0c00,0x0c00,0x0600,0x0600,0x0600,0x0600,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300, // u239e 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300, // u239f 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0600,0x0600,0x0600,0x0600,0x0c00,0x0c00,0x0c00,0x1800,0x1800, 0x3000,0x6000, // u23a0 0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000, // u23a1 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000, // u23a2 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x7f00, // u23a3 0x7f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300, // u23a4 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300, // u23a5 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x7f00, // u23a6 0x03c0,0x0e00,0x0c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, 0x1800,0x1800, // u23a7 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3000,0xe000,0xe000,0x3000,0x1800,0x1800,0x1800,0x1800,0x1800, 0x1800,0x1800, // u23a8 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0c00, 0x0e00,0x03c0, // u23a9 0xf000,0x1c00,0x0c00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600, // u23ab 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0300,0x01c0,0x01c0,0x0300,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600, // u23ac 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0c00, 0x1c00,0xf000, // u23ad 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u23ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u23af 0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u23ba 0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u23bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x0000,0x0000, 0x0000,0x0000, // u23bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0xffc0,0xffc0, // u23bd 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u23d0 0x0000,0x0000,0xcc00,0xcc00,0xfc00,0xcc00,0xcc00,0xcc00,0x0000,0x1f80,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000, 0x0000,0x0000, // u2409 0x0000,0x0000,0xc000,0xc000,0xc000,0xc000,0xc000,0xfc00,0x0000,0x1f80,0x1800,0x1e00,0x1800,0x1800,0x1800,0x0000, 0x0000,0x0000, // u240a 0x0000,0x0000,0xcc00,0xcc00,0xcc00,0xcc00,0x7800,0x3000,0x0000,0x0000,0x1f80,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0000,0x0000, // u240b 0x0000,0x0000,0xfc00,0xc000,0xf000,0xc000,0xc000,0xc000,0x0000,0x1f80,0x1800,0x1e00,0x1800,0x1800,0x1800,0x0000, 0x0000,0x0000, // u240c 0x0000,0x0000,0x7800,0xcc00,0xc000,0xc000,0xcc00,0x7800,0x0000,0x1f00,0x1980,0x1980,0x1f00,0x1b00,0x1980,0x0000, 0x0000,0x0000, // u240d 0x0000,0x0000,0xcc00,0xec00,0xfc00,0xdc00,0xcc00,0xcc00,0x0000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1f80,0x0000, 0x0000,0x0000, // u2424 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2500 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2501 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2502 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00, // u2503 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xd680,0xd680,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2508 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xd680,0xd680,0xd680,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2509 0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0c00,0x0c00,0x0c00,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0c00,0x0c00, 0x0c00,0x0000, // u250a 0x1c00,0x1c00,0x1c00,0x1c00,0x0000,0x1c00,0x1c00,0x1c00,0x0000,0x1c00,0x1c00,0x1c00,0x1c00,0x0000,0x1c00,0x1c00, 0x1c00,0x0000, // u250b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u250c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0fc0,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u250d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x1fc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00, // u250e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x1fc0,0x1fc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00, // u250f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2510 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2511 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00, // u2512 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0xfc00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00, // u2513 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2514 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2515 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1fc0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2516 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1fc0,0x1fc0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2517 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2518 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2519 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u251a 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xfc00,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u251b 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u251c 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0x0fc0,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u251d 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1fc0,0x1fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u251e 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1fc0,0x1fc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00, // u251f 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1fc0,0x1fc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00, // u2520 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1fc0,0x1fc0,0x1fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2521 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1fc0,0x1fc0,0x1fc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00, // u2522 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1fc0,0x1fc0,0x1fc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00, // u2523 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2524 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2525 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2526 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00, // u2527 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xfc00,0xfc00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00, // u2528 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xfc00,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2529 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0xfc00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00, // u252a 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xfc00,0xfc00,0xfc00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00, // u252b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u252c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u252d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u252e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u252f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00, // u2530 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xffc0,0xffc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00, // u2531 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0xffc0,0xffc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00, // u2532 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0xffc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00, // u2533 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2534 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2535 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2536 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2537 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2538 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xfc00,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2539 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1fc0,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u253a 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xffc0,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u253b 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u253c 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u253d 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u253e 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u253f 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2540 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0xffc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00, // u2541 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xffc0,0xffc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00, // u2542 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xfc00,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2543 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1fc0,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2544 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xffc0,0xffc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00, // u2545 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0xffc0,0xffc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00, // u2546 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xffc0,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2547 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0xffc0,0xffc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00, // u2548 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xfc00,0xffc0,0xffc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00, // u2549 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1fc0,0xffc0,0xffc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00, // u254a 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xffc0,0xffc0,0xffc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00, // u254b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x0000,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2550 0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600, 0x3600,0x3600, // u2551 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0fc0,0x0c00,0x0fc0,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2552 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x3fc0,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600, 0x3600,0x3600, // u2553 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x3fc0,0x3000,0x37c0,0x37c0,0x3600,0x3600,0x3600,0x3600,0x3600, 0x3600,0x3600, // u2554 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0x0c00,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2555 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xfe00,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600, 0x3600,0x3600, // u2556 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xfe00,0x0600,0xf600,0xf600,0x3600,0x3600,0x3600,0x3600,0x3600, 0x3600,0x3600, // u2557 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0x0fc0,0x0c00,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2558 0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3fc0,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2559 0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x37c0,0x37c0,0x3000,0x3fc0,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u255a 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0x0c00,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u255b 0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0xfe00,0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u255c 0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0xf600,0xf600,0x0600,0xfe00,0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u255d 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0x0fc0,0x0c00,0x0fc0,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u255e 0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x37c0,0x37c0,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600, 0x3600,0x3600, // u255f 0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x37c0,0x37c0,0x3000,0x37c0,0x37c0,0x3600,0x3600,0x3600,0x3600,0x3600, 0x3600,0x3600, // u2560 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0x0c00,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2561 0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0xf600,0xf600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600, 0x3600,0x3600, // u2562 0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0xf600,0xf600,0x0600,0xf600,0xf600,0x3600,0x3600,0x3600,0x3600,0x3600, 0x3600,0x3600, // u2563 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x0000,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2564 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600, 0x3600,0x3600, // u2565 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x0000,0xf7c0,0xf7c0,0x3600,0x3600,0x3600,0x3600,0x3600, 0x3600,0x3600, // u2566 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0xffc0,0x0000,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2567 0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2568 0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0xf7c0,0xf7c0,0x0000,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2569 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0xffc0,0x0c00,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u256a 0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0xffc0,0xffc0,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600, 0x3600,0x3600, // u256b 0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0xf7c0,0xf7c0,0x0000,0xf7c0,0xf7c0,0x3600,0x3600,0x3600,0x3600,0x3600, 0x3600,0x3600, // u256c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x03c0,0x0700,0x0e00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u256d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xe000,0xf000,0x3800,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u256e 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1c00,0x3800,0xf000,0xe000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u256f 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0e00,0x0700,0x03c0,0x01c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2570 0x0040,0x00c0,0x0080,0x0180,0x0100,0x0300,0x0200,0x0600,0x0400,0x0c00,0x0800,0x1800,0x1000,0x3000,0x2000,0x6000, 0x4000,0xc000, // u2571 0xc000,0x4000,0x6000,0x2000,0x3000,0x1000,0x1800,0x0800,0x0c00,0x0400,0x0600,0x0200,0x0300,0x0100,0x0180,0x0080, 0x00c0,0x0040, // u2572 0xc040,0x40c0,0x6080,0x2180,0x3100,0x1300,0x1a00,0x0e00,0x0c00,0x0c00,0x0e00,0x1a00,0x1300,0x3100,0x2180,0x6080, 0x40c0,0xc040, // u2573 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2574 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2575 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2576 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u2577 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2578 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2579 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u257a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00, // u257b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u257c 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00, // u257d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u257e 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00, // u257f 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2580 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0xffc0,0xffc0, // u2581 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0, // u2582 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0, // u2583 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0, // u2584 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0, // u2585 0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0, // u2586 0x0000,0x0000,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0, // u2587 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0, // u2588 0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80, 0xff80,0xff80, // u2589 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, 0xff00,0xff00, // u258a 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, 0xfc00,0xfc00, // u258b 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, 0xf800,0xf800, // u258c 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, 0xf000,0xf000, // u258d 0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000, 0xe000,0xe000, // u258e 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, 0x8000,0x8000, // u258f 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, 0x07c0,0x07c0, // u2590 0xaa80,0x0000,0xaa80,0x0000,0xaa80,0x0000,0xaa80,0x0000,0xaa80,0x0000,0xaa80,0x0000,0xaa80,0x0000,0xaa80,0x0000, 0xaa80,0x0000, // u2591 0xaa80,0x5540,0xaa80,0x5540,0xaa80,0x5540,0xaa80,0x5540,0xaa80,0x5540,0xaa80,0x5540,0xaa80,0x5540,0xaa80,0x5540, 0xaa80,0x5540, // u2592 0xffc0,0xaa80,0xffc0,0xaa80,0xffc0,0xaa80,0xffc0,0xaa80,0xffc0,0xaa80,0xffc0,0xaa80,0xffc0,0xaa80,0xffc0,0xaa80, 0xffc0,0xaa80, // u2593 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, 0xf800,0xf800, // u2596 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, 0x07c0,0x07c0, // u2597 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2598 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0, // u2599 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, 0x07c0,0x07c0, // u259a 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, 0xf800,0xf800, // u259b 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, 0x07c0,0x07c0, // u259c 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u259d 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, 0xf800,0xf800, // u259e 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0, // u259f 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x3f00,0x3f00,0x3f00,0x3f00,0x3f00,0x3f00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u25a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff80,0xff80,0xff80,0xff80,0xff80,0x0000, 0x0000,0x0000, // u25ac 0x0000,0x0000,0x0000,0x7f80,0x7f80,0x7f80,0x7f80,0x7f80,0x7f80,0x7f80,0x7f80,0x7f80,0x7f80,0x7f80,0x7f80,0x0000, 0x0000,0x0000, // u25ae 0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x1e00,0x1e00,0x3f00,0x3f00,0x7f80,0x7f80,0xffc0,0xffc0,0x0000,0x0000, 0x0000,0x0000, // u25b2 0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xffc0,0xffc0,0xff00,0xfc00,0xf000,0xc000,0x0000,0x0000, 0x0000,0x0000, // u25b6 0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xffc0,0xffc0,0xff00,0xfc00,0xf000,0xc000,0x0000,0x0000, 0x0000,0x0000, // u25ba 0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x7f80,0x7f80,0x3f00,0x3f00,0x1e00,0x1e00,0x0c00,0x0c00,0x0000,0x0000, 0x0000,0x0000, // u25bc 0x0000,0x0000,0x0000,0x0000,0x00c0,0x03c0,0x0fc0,0x3fc0,0xffc0,0xffc0,0x3fc0,0x0fc0,0x03c0,0x00c0,0x0000,0x0000, 0x0000,0x0000, // u25c0 0x0000,0x0000,0x0000,0x0000,0x00c0,0x03c0,0x0fc0,0x3fc0,0xffc0,0xffc0,0x3fc0,0x0fc0,0x03c0,0x00c0,0x0000,0x0000, 0x0000,0x0000, // u25c4 0x0000,0x0000,0x0000,0x0000,0x0c00,0x1e00,0x3f00,0x7f80,0xffc0,0xffc0,0x7f80,0x3f00,0x1e00,0x0c00,0x0000,0x0000, 0x0000,0x0000, // u25c6 0x0000,0x0000,0x0000,0x0000,0x0c00,0x1e00,0x3300,0x6180,0xc0c0,0xc0c0,0x6180,0x3300,0x1e00,0x0c00,0x0000,0x0000, 0x0000,0x0000, // u25ca 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x2100,0x2100,0x3300,0x1e00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u25cb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3f00,0x3f00,0x3f00,0x3f00,0x1e00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u25cf 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xf3c0,0xe1c0,0xe1c0,0xf3c0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0, // u25d8 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xe1c0,0xccc0,0xdec0,0xdec0,0xccc0,0xe1c0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0, // u25d9 0x0000,0x0000,0x0000,0x7f80,0x8040,0x8040,0xb340,0xb340,0x8040,0x8040,0xbf40,0x9e40,0x8040,0x8040,0x7f80,0x0000, 0x0000,0x0000, // u263a 0x0000,0x0000,0x0000,0x7f80,0xffc0,0xffc0,0xccc0,0xccc0,0xffc0,0xffc0,0xc0c0,0xe1c0,0xffc0,0xffc0,0x7f80,0x0000, 0x0000,0x0000, // u263b 0x0000,0x0000,0x0000,0x0c00,0xccc0,0x6d80,0x3f00,0x1e00,0xf3c0,0x1e00,0x3f00,0x6d80,0xccc0,0x0c00,0x0000,0x0000, 0x0000,0x0000, // u263c 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0000, 0x0000,0x0000, // u2640 0x0000,0x0000,0x0000,0x0f80,0x0380,0x0680,0x0c80,0x3e00,0x6300,0x6300,0x6300,0x6300,0x6300,0x6300,0x3e00,0x0000, 0x0000,0x0000, // u2642 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x1e00,0x3f00,0x7f80,0xffc0,0xffc0,0xffc0,0x6d80,0x0c00,0x0c00,0x3f00,0x0000, 0x0000,0x0000, // u2660 0x0000,0x0000,0x0000,0x1e00,0x3f00,0x3f00,0x1e00,0x0c00,0x6d80,0xffc0,0xffc0,0xffc0,0x6d80,0x0c00,0x3f00,0x0000, 0x0000,0x0000, // u2663 0x0000,0x0000,0x0000,0x0000,0x7380,0xf3c0,0xffc0,0xffc0,0xffc0,0xffc0,0x7f80,0x3f00,0x1e00,0x0c00,0x0000,0x0000, 0x0000,0x0000, // u2665 0x0000,0x0000,0x0000,0x0000,0x0c00,0x1e00,0x3f00,0x7f80,0xffc0,0xffc0,0x7f80,0x3f00,0x1e00,0x0c00,0x0000,0x0000, 0x0000,0x0000, // u2666 0x0000,0x0000,0x0000,0x3f80,0x3180,0x3180,0x3f80,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0xf000,0xe000,0x0000, 0x0000,0x0000, // u266a 0x0000,0x0000,0x0000,0x7f80,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6380,0xe300,0xc000,0x0000, 0x0000,0x0000, // u266b 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x0180,0x0180,0xc300,0xc300,0x6600,0x6600,0x3c00,0x3c00,0x1800,0x1800,0x0000, 0x0000,0x0000, // u2713 0x0000,0x0000,0x0000,0x01c0,0x01c0,0x0380,0x0380,0xe700,0xe700,0x7e00,0x7e00,0x3c00,0x3c00,0x1800,0x1800,0x0000, 0x0000,0x0000, // u2714 0x0000,0x0000,0x0000,0x0300,0x6300,0x3600,0x1e00,0x0c00,0x0e00,0x1b00,0x1980,0x3000,0x3000,0x6000,0x6000,0x0000, 0x0000,0x0000, // u2717 0x0000,0x0000,0x0000,0x0700,0xe700,0x7e00,0x3e00,0x1c00,0x1e00,0x3f00,0x3b80,0x7180,0x7000,0xe000,0xe000,0x0000, 0x0000,0x0000, // u2718 0x0000,0x0000,0x0600,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x3000,0x1800,0x1800,0x0c00,0x0c00,0x0600,0x0600,0x0000, 0x0000,0x0000, // u27e8 0x0000,0x0000,0x3000,0x3000,0x1800,0x1800,0x0c00,0x0c00,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x3000,0x3000,0x0000, 0x0000,0x0000, // u27e9 0x0000,0x0000,0x1980,0x1980,0x3300,0x3300,0x6600,0x6600,0xcc00,0x6600,0x6600,0x3300,0x3300,0x1980,0x1980,0x0000, 0x0000,0x0000, // u27ea 0x0000,0x0000,0xcc00,0xcc00,0x6600,0x6600,0x3300,0x3300,0x1980,0x3300,0x3300,0x6600,0x6600,0xcc00,0xcc00,0x0000, 0x0000,0x0000, // u27eb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2800 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2801 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2802 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2803 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2804 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2805 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2806 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2807 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2808 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2809 0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u280a 0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u280b 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u280c 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u280d 0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u280e 0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u280f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2810 0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2811 0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2812 0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2813 0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2814 0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2815 0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2816 0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2817 0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2818 0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2819 0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u281a 0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u281b 0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u281c 0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u281d 0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u281e 0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u281f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2820 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2821 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2822 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2823 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2824 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2825 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2826 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2827 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2828 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2829 0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u282a 0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u282b 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u282c 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u282d 0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u282e 0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u282f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2830 0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2831 0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2832 0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2833 0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2834 0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2835 0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2836 0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2837 0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2838 0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u2839 0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u283a 0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u283b 0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u283c 0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u283d 0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u283e 0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000, // u283f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2840 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2841 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2842 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2843 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2844 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2845 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2846 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2847 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2848 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2849 0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u284a 0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u284b 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u284c 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u284d 0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u284e 0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u284f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2850 0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2851 0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2852 0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2853 0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2854 0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2855 0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2856 0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2857 0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2858 0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2859 0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u285a 0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u285b 0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u285c 0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u285d 0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u285e 0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u285f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2860 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2861 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2862 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2863 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2864 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2865 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2866 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2867 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2868 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2869 0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u286a 0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u286b 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u286c 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u286d 0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u286e 0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u286f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2870 0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2871 0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2872 0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2873 0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2874 0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2875 0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2876 0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2877 0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2878 0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u2879 0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u287a 0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u287b 0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u287c 0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u287d 0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u287e 0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000, 0x0000,0x0000, // u287f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u2880 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u2881 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u2882 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u2883 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u2884 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u2885 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u2886 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u2887 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u2888 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u2889 0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u288a 0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u288b 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u288c 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u288d 0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u288e 0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u288f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u2890 0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u2891 0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u2892 0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u2893 0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u2894 0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u2895 0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u2896 0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u2897 0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u2898 0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u2899 0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u289a 0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u289b 0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u289c 0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u289d 0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u289e 0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u289f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28a0 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28a1 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28a2 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28a4 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28a5 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28a6 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28a7 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28a8 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28a9 0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28aa 0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28ab 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28ac 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28ad 0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28ae 0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28af 0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28b0 0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28b1 0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28b2 0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28b4 0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28b6 0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28b7 0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28b8 0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28b9 0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28ba 0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28bb 0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28bc 0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28bd 0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28be 0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300, 0x0000,0x0000, // u28bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28c0 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28c2 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28c4 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28c6 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28c7 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28c8 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28c9 0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28ca 0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28cb 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28cc 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28cd 0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28ce 0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28cf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28d0 0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28d2 0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28d4 0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28d6 0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28d7 0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28d8 0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28d9 0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28da 0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28db 0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28dc 0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28dd 0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28de 0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28df 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28e0 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28e1 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28e2 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28e3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28e4 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28e6 0x0000,0x6000,0x6000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28e7 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28e8 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28e9 0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28ea 0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28eb 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28ec 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28ed 0x0000,0x0300,0x0300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28ee 0x0000,0x6300,0x6300,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28ef 0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28f0 0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28f2 0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28f3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28f4 0x0000,0x6000,0x6000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28f6 0x0000,0x6000,0x6000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28f7 0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28f8 0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28f9 0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28fa 0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28fb 0x0000,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28fc 0x0000,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28fd 0x0000,0x0300,0x0300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28fe 0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x6300,0x6300, 0x0000,0x0000, // u28ff 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x0000,0x0000, 0x0000,0x0000, // u2e2c 0xc000,0xc000,0xc600,0xcf00,0xdf80,0xf6c0,0xc600,0xc600,0xc600,0x8c00,0x1800,0x3000,0x6000,0xc000,0xc000,0xc000, 0xc000,0xc000, // ue0a0 0x0000,0x0000,0xc000,0xc000,0xc000,0xc000,0xc000,0xfc00,0x0000,0x1980,0x1d80,0x1f80,0x1b80,0x1980,0x1980,0x0000, 0x0000,0x0000, // ue0a1 0x0000,0x0000,0x3e00,0x6300,0x6300,0x6300,0x6300,0x6300,0xff80,0xff80,0xf780,0xe380,0xe380,0xf780,0xff80,0xff80, 0x0000,0x0000, // ue0a2 0x8000,0xc000,0xe000,0xf000,0xf800,0xfc00,0xfe00,0xff00,0xff80,0xff80,0xff00,0xfe00,0xfc00,0xf800,0xf000,0xe000, 0xc000,0x8000, // ue0b0 0x8000,0xc000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000, 0xc000,0x8000, // ue0b1 0x0040,0x00c0,0x01c0,0x03c0,0x07c0,0x0fc0,0x1fc0,0x3fc0,0x7fc0,0x7fc0,0x3fc0,0x1fc0,0x0fc0,0x07c0,0x03c0,0x01c0, 0x00c0,0x0040, // ue0b2 0x0040,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180, 0x00c0,0x0040, // ue0b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x3300, 0x3300,0x1e00, // uf6be 0x0000,0x0000,0x0000,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x0000, 0x0000,0x0000 // ufffd }; // codepoints array constexpr std::array fixedfont_codepoints = { 0x0000,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e, 0x002f,0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e, 0x003f,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e, 0x004f,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e, 0x005f,0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e, 0x006f,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e, 0x00a0,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af, 0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf, 0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf, 0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df, 0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef, 0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff, 0x0100,0x0101,0x0102,0x0103,0x0104,0x0105,0x0106,0x0107,0x0108,0x0109,0x010a,0x010b,0x010c,0x010d,0x010e,0x010f, 0x0110,0x0111,0x0112,0x0113,0x0114,0x0115,0x0116,0x0117,0x0118,0x0119,0x011a,0x011b,0x011c,0x011d,0x011e,0x011f, 0x0120,0x0121,0x0122,0x0123,0x0124,0x0125,0x0126,0x0127,0x0128,0x0129,0x012a,0x012b,0x012c,0x012d,0x012e,0x012f, 0x0130,0x0131,0x0132,0x0133,0x0134,0x0135,0x0136,0x0137,0x0138,0x0139,0x013a,0x013b,0x013c,0x013d,0x013e,0x013f, 0x0140,0x0141,0x0142,0x0143,0x0144,0x0145,0x0146,0x0147,0x0148,0x0149,0x014a,0x014b,0x014c,0x014d,0x014e,0x014f, 0x0150,0x0151,0x0152,0x0153,0x0154,0x0155,0x0156,0x0157,0x0158,0x0159,0x015a,0x015b,0x015c,0x015d,0x015e,0x015f, 0x0160,0x0161,0x0162,0x0163,0x0164,0x0165,0x0166,0x0167,0x0168,0x0169,0x016a,0x016b,0x016c,0x016d,0x016e,0x016f, 0x0170,0x0171,0x0172,0x0173,0x0174,0x0175,0x0176,0x0177,0x0178,0x0179,0x017a,0x017b,0x017c,0x017d,0x017e,0x017f, 0x0186,0x018e,0x018f,0x0190,0x0192,0x019d,0x019e,0x01b5,0x01b6,0x01b7,0x01cd,0x01ce,0x01cf,0x01d0,0x01d1,0x01d2, 0x01d3,0x01d4,0x01e2,0x01e3,0x01e4,0x01e5,0x01e6,0x01e7,0x01e8,0x01e9,0x01ea,0x01eb,0x01ec,0x01ed,0x01ee,0x01ef, 0x01f0,0x01f4,0x01f5,0x01fc,0x01fd,0x01fe,0x01ff,0x0218,0x0219,0x021a,0x021b,0x0232,0x0233,0x0237,0x0254,0x0258, 0x0259,0x025b,0x0272,0x0292,0x02bb,0x02bc,0x02bd,0x02c6,0x02c7,0x02d8,0x02d9,0x02db,0x02dc,0x02dd,0x0300,0x0301, 0x0302,0x0303,0x0304,0x0305,0x0306,0x0307,0x0308,0x030a,0x030b,0x030c,0x0329,0x0384,0x0385,0x0386,0x0387,0x0388, 0x0389,0x038a,0x038c,0x038e,0x038f,0x0390,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039a, 0x039b,0x039c,0x039d,0x039e,0x039f,0x03a0,0x03a1,0x03a3,0x03a4,0x03a5,0x03a6,0x03a7,0x03a8,0x03a9,0x03aa,0x03ab, 0x03ac,0x03ad,0x03ae,0x03af,0x03b0,0x03b1,0x03b2,0x03b3,0x03b4,0x03b5,0x03b6,0x03b7,0x03b8,0x03b9,0x03ba,0x03bb, 0x03bc,0x03bd,0x03be,0x03bf,0x03c0,0x03c1,0x03c2,0x03c3,0x03c4,0x03c5,0x03c6,0x03c7,0x03c8,0x03c9,0x03ca,0x03cb, 0x03cc,0x03cd,0x03ce,0x03d1,0x03d5,0x03f0,0x03f1,0x03f2,0x03f3,0x03f4,0x03f5,0x03f6,0x0400,0x0401,0x0402,0x0403, 0x0404,0x0405,0x0406,0x0407,0x0408,0x0409,0x040a,0x040b,0x040c,0x040d,0x040e,0x040f,0x0410,0x0411,0x0412,0x0413, 0x0414,0x0415,0x0416,0x0417,0x0418,0x0419,0x041a,0x041b,0x041c,0x041d,0x041e,0x041f,0x0420,0x0421,0x0422,0x0423, 0x0424,0x0425,0x0426,0x0427,0x0428,0x0429,0x042a,0x042b,0x042c,0x042d,0x042e,0x042f,0x0430,0x0431,0x0432,0x0433, 0x0434,0x0435,0x0436,0x0437,0x0438,0x0439,0x043a,0x043b,0x043c,0x043d,0x043e,0x043f,0x0440,0x0441,0x0442,0x0443, 0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,0x044a,0x044b,0x044c,0x044d,0x044e,0x044f,0x0450,0x0451,0x0452,0x0453, 0x0454,0x0455,0x0456,0x0457,0x0458,0x0459,0x045a,0x045b,0x045c,0x045d,0x045e,0x045f,0x0462,0x0463,0x046a,0x046b, 0x0490,0x0491,0x0492,0x0493,0x0494,0x0495,0x0496,0x0497,0x0498,0x0499,0x049a,0x049b,0x049c,0x049d,0x04a0,0x04a1, 0x04a2,0x04a3,0x04a4,0x04a5,0x04aa,0x04ab,0x04ae,0x04af,0x04b0,0x04b1,0x04b2,0x04b3,0x04b6,0x04b7,0x04b8,0x04b9, 0x04ba,0x04bb,0x04c0,0x04c1,0x04c2,0x04cf,0x04d0,0x04d1,0x04d2,0x04d3,0x04d4,0x04d5,0x04d6,0x04d7,0x04d8,0x04d9, 0x04da,0x04db,0x04dc,0x04dd,0x04de,0x04df,0x04e2,0x04e3,0x04e4,0x04e5,0x04e6,0x04e7,0x04e8,0x04e9,0x04ea,0x04eb, 0x04ec,0x04ed,0x04ee,0x04ef,0x04f0,0x04f1,0x04f2,0x04f3,0x04f4,0x04f5,0x04f8,0x04f9,0x05d0,0x05d1,0x05d2,0x05d3, 0x05d4,0x05d5,0x05d6,0x05d7,0x05d8,0x05d9,0x05da,0x05db,0x05dc,0x05dd,0x05de,0x05df,0x05e0,0x05e1,0x05e2,0x05e3, 0x05e4,0x05e5,0x05e6,0x05e7,0x05e8,0x05e9,0x05ea,0x1e0c,0x1e0d,0x1e34,0x1e35,0x1e36,0x1e37,0x1e40,0x1e41,0x1e42, 0x1e43,0x1e44,0x1e45,0x1e46,0x1e47,0x1e6c,0x1e6d,0x1eb8,0x1eb9,0x1ebc,0x1ebd,0x1eca,0x1ecb,0x1ecc,0x1ecd,0x1ee4, 0x1ee5,0x1ef8,0x1ef9,0x2000,0x2001,0x2002,0x2003,0x2004,0x2005,0x2006,0x2007,0x2008,0x2009,0x200a,0x200b,0x200c, 0x200d,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x2015,0x2016,0x2017,0x2018,0x2019,0x201a,0x201b,0x201c, 0x201d,0x201e,0x201f,0x2020,0x2021,0x2022,0x2026,0x2030,0x2032,0x2033,0x2039,0x203a,0x203c,0x203e,0x2070,0x2071, 0x2074,0x2075,0x2076,0x2077,0x2078,0x2079,0x207a,0x207b,0x207c,0x207d,0x207e,0x207f,0x2080,0x2081,0x2082,0x2083, 0x2084,0x2085,0x2086,0x2087,0x2088,0x2089,0x208a,0x208b,0x208c,0x208d,0x208e,0x2090,0x2091,0x2092,0x2093,0x2094, 0x2095,0x2096,0x2097,0x2098,0x209a,0x20a7,0x20aa,0x20ac,0x20ae,0x2102,0x210e,0x210f,0x2115,0x2116,0x211a,0x211d, 0x2122,0x2124,0x2126,0x2135,0x2190,0x2191,0x2192,0x2193,0x2194,0x2195,0x21a4,0x21a6,0x21a8,0x21b5,0x21bb,0x21cb, 0x21cc,0x21d0,0x21d1,0x21d2,0x21d3,0x21d4,0x21d5,0x2200,0x2203,0x2204,0x2205,0x2206,0x2207,0x2208,0x2209,0x220a, 0x220b,0x220c,0x220d,0x2212,0x2213,0x2214,0x2215,0x2216,0x2219,0x221a,0x221e,0x221f,0x2225,0x2227,0x2228,0x2229, 0x222a,0x2248,0x2260,0x2261,0x2264,0x2265,0x226a,0x226b,0x2282,0x2283,0x2286,0x2287,0x22a5,0x22c2,0x22c3,0x2300, 0x2302,0x2308,0x2309,0x230a,0x230b,0x2310,0x2319,0x2320,0x2321,0x239b,0x239c,0x239d,0x239e,0x239f,0x23a0,0x23a1, 0x23a2,0x23a3,0x23a4,0x23a5,0x23a6,0x23a7,0x23a8,0x23a9,0x23ab,0x23ac,0x23ad,0x23ae,0x23af,0x23ba,0x23bb,0x23bc, 0x23bd,0x23d0,0x2409,0x240a,0x240b,0x240c,0x240d,0x2424,0x2500,0x2501,0x2502,0x2503,0x2508,0x2509,0x250a,0x250b, 0x250c,0x250d,0x250e,0x250f,0x2510,0x2511,0x2512,0x2513,0x2514,0x2515,0x2516,0x2517,0x2518,0x2519,0x251a,0x251b, 0x251c,0x251d,0x251e,0x251f,0x2520,0x2521,0x2522,0x2523,0x2524,0x2525,0x2526,0x2527,0x2528,0x2529,0x252a,0x252b, 0x252c,0x252d,0x252e,0x252f,0x2530,0x2531,0x2532,0x2533,0x2534,0x2535,0x2536,0x2537,0x2538,0x2539,0x253a,0x253b, 0x253c,0x253d,0x253e,0x253f,0x2540,0x2541,0x2542,0x2543,0x2544,0x2545,0x2546,0x2547,0x2548,0x2549,0x254a,0x254b, 0x2550,0x2551,0x2552,0x2553,0x2554,0x2555,0x2556,0x2557,0x2558,0x2559,0x255a,0x255b,0x255c,0x255d,0x255e,0x255f, 0x2560,0x2561,0x2562,0x2563,0x2564,0x2565,0x2566,0x2567,0x2568,0x2569,0x256a,0x256b,0x256c,0x256d,0x256e,0x256f, 0x2570,0x2571,0x2572,0x2573,0x2574,0x2575,0x2576,0x2577,0x2578,0x2579,0x257a,0x257b,0x257c,0x257d,0x257e,0x257f, 0x2580,0x2581,0x2582,0x2583,0x2584,0x2585,0x2586,0x2587,0x2588,0x2589,0x258a,0x258b,0x258c,0x258d,0x258e,0x258f, 0x2590,0x2591,0x2592,0x2593,0x2596,0x2597,0x2598,0x2599,0x259a,0x259b,0x259c,0x259d,0x259e,0x259f,0x25a0,0x25ac, 0x25ae,0x25b2,0x25b6,0x25ba,0x25bc,0x25c0,0x25c4,0x25c6,0x25ca,0x25cb,0x25cf,0x25d8,0x25d9,0x263a,0x263b,0x263c, 0x2640,0x2642,0x2660,0x2663,0x2665,0x2666,0x266a,0x266b,0x2713,0x2714,0x2717,0x2718,0x27e8,0x27e9,0x27ea,0x27eb, 0x2800,0x2801,0x2802,0x2803,0x2804,0x2805,0x2806,0x2807,0x2808,0x2809,0x280a,0x280b,0x280c,0x280d,0x280e,0x280f, 0x2810,0x2811,0x2812,0x2813,0x2814,0x2815,0x2816,0x2817,0x2818,0x2819,0x281a,0x281b,0x281c,0x281d,0x281e,0x281f, 0x2820,0x2821,0x2822,0x2823,0x2824,0x2825,0x2826,0x2827,0x2828,0x2829,0x282a,0x282b,0x282c,0x282d,0x282e,0x282f, 0x2830,0x2831,0x2832,0x2833,0x2834,0x2835,0x2836,0x2837,0x2838,0x2839,0x283a,0x283b,0x283c,0x283d,0x283e,0x283f, 0x2840,0x2841,0x2842,0x2843,0x2844,0x2845,0x2846,0x2847,0x2848,0x2849,0x284a,0x284b,0x284c,0x284d,0x284e,0x284f, 0x2850,0x2851,0x2852,0x2853,0x2854,0x2855,0x2856,0x2857,0x2858,0x2859,0x285a,0x285b,0x285c,0x285d,0x285e,0x285f, 0x2860,0x2861,0x2862,0x2863,0x2864,0x2865,0x2866,0x2867,0x2868,0x2869,0x286a,0x286b,0x286c,0x286d,0x286e,0x286f, 0x2870,0x2871,0x2872,0x2873,0x2874,0x2875,0x2876,0x2877,0x2878,0x2879,0x287a,0x287b,0x287c,0x287d,0x287e,0x287f, 0x2880,0x2881,0x2882,0x2883,0x2884,0x2885,0x2886,0x2887,0x2888,0x2889,0x288a,0x288b,0x288c,0x288d,0x288e,0x288f, 0x2890,0x2891,0x2892,0x2893,0x2894,0x2895,0x2896,0x2897,0x2898,0x2899,0x289a,0x289b,0x289c,0x289d,0x289e,0x289f, 0x28a0,0x28a1,0x28a2,0x28a3,0x28a4,0x28a5,0x28a6,0x28a7,0x28a8,0x28a9,0x28aa,0x28ab,0x28ac,0x28ad,0x28ae,0x28af, 0x28b0,0x28b1,0x28b2,0x28b3,0x28b4,0x28b5,0x28b6,0x28b7,0x28b8,0x28b9,0x28ba,0x28bb,0x28bc,0x28bd,0x28be,0x28bf, 0x28c0,0x28c1,0x28c2,0x28c3,0x28c4,0x28c5,0x28c6,0x28c7,0x28c8,0x28c9,0x28ca,0x28cb,0x28cc,0x28cd,0x28ce,0x28cf, 0x28d0,0x28d1,0x28d2,0x28d3,0x28d4,0x28d5,0x28d6,0x28d7,0x28d8,0x28d9,0x28da,0x28db,0x28dc,0x28dd,0x28de,0x28df, 0x28e0,0x28e1,0x28e2,0x28e3,0x28e4,0x28e5,0x28e6,0x28e7,0x28e8,0x28e9,0x28ea,0x28eb,0x28ec,0x28ed,0x28ee,0x28ef, 0x28f0,0x28f1,0x28f2,0x28f3,0x28f4,0x28f5,0x28f6,0x28f7,0x28f8,0x28f9,0x28fa,0x28fb,0x28fc,0x28fd,0x28fe,0x28ff, 0x2e2c,0xe0a0,0xe0a1,0xe0a2,0xe0b0,0xe0b1,0xe0b2,0xe0b3,0xf6be,0xfffd }; } // namespace // -- end of autogenerated text --- namespace fixed_font_20n { // -- start of autogenerated text --- // definition section for font: ter-u20n.bdf constexpr int CHARCOUNT = 1354; constexpr int WIDTH = 10; constexpr int HEIGHT = 20; constexpr int OFFSET_X = 0; constexpr int OFFSET_Y = 0; constexpr FixedFont_info_t fixedfont_info = { "Terminus", // font name "ter-u20n.bdf", // font name internal CHARCOUNT, // num of chars WIDTH, HEIGHT, OFFSET_X, OFFSET_Y, false // bold }; // font bitmap definitions constexpr std::array fixedfont_bitmap = { 0x0000,0x0000,0x0000,0x6300,0x4100,0x4100,0x0000,0x0000,0x4100,0x4100,0x4100,0x0000,0x0000,0x4100,0x4100,0x6300, 0x0000,0x0000,0x0000,0x0000, // u0000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0020 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u0021 0x0000,0x2200,0x2200,0x2200,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0022 0x0000,0x0000,0x0000,0x2200,0x2200,0x2200,0x2200,0x7f00,0x2200,0x2200,0x2200,0x7f00,0x2200,0x2200,0x2200,0x2200, 0x0000,0x0000,0x0000,0x0000, // u0023 0x0000,0x0000,0x0800,0x0800,0x3e00,0x4900,0x4800,0x4800,0x4800,0x3e00,0x0900,0x0900,0x0900,0x4900,0x3e00,0x0800, 0x0800,0x0000,0x0000,0x0000, // u0024 0x0000,0x0000,0x0000,0x0000,0x7100,0x5100,0x7200,0x0200,0x0400,0x0400,0x0800,0x0800,0x1000,0x1380,0x2280,0x2380, 0x0000,0x0000,0x0000,0x0000, // u0025 0x0000,0x0000,0x0000,0x1c00,0x2200,0x2200,0x2200,0x1400,0x0800,0x1480,0x2280,0x4100,0x4100,0x4100,0x2280,0x1c80, 0x0000,0x0000,0x0000,0x0000, // u0026 0x0000,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0027 0x0000,0x0000,0x0000,0x0400,0x0800,0x0800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0800,0x0800,0x0400, 0x0000,0x0000,0x0000,0x0000, // u0028 0x0000,0x0000,0x0000,0x1000,0x0800,0x0800,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0800,0x0800,0x1000, 0x0000,0x0000,0x0000,0x0000, // u0029 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2200,0x1400,0x0800,0x7f00,0x0800,0x1400,0x2200,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u002a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x7f00,0x0800,0x0800,0x0800,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u002b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0800, 0x1000,0x0000,0x0000,0x0000, // u002c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u002d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u002e 0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0200,0x0200,0x0400,0x0400,0x0800,0x0800,0x1000,0x1000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0000, // u002f 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4300,0x4500,0x4900,0x5100,0x6100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0030 0x0000,0x0000,0x0000,0x0800,0x1800,0x2800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0031 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x0100,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u0032 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x0100,0x0100,0x0100,0x1e00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0033 0x0000,0x0000,0x0000,0x0100,0x0300,0x0500,0x0900,0x1100,0x2100,0x4100,0x4100,0x4100,0x7f00,0x0100,0x0100,0x0100, 0x0000,0x0000,0x0000,0x0000, // u0034 0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x7e00,0x0100,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0035 0x0000,0x0000,0x0000,0x1e00,0x2000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0036 0x0000,0x0000,0x0000,0x7f00,0x4100,0x4100,0x0100,0x0200,0x0200,0x0400,0x0400,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u0037 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0038 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100,0x0100,0x0100,0x0200,0x3c00, 0x0000,0x0000,0x0000,0x0000, // u0039 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000, 0x0000,0x0000,0x0000,0x0000, // u003a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0800, 0x1000,0x0000,0x0000,0x0000, // u003b 0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0100, 0x0000,0x0000,0x0000,0x0000, // u003c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0000,0x0000,0x0000,0x7f00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u003d 0x0000,0x0000,0x0000,0x4000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000, 0x0000,0x0000,0x0000,0x0000, // u003e 0x0000,0x0000,0x0000,0x1c00,0x2200,0x4100,0x4100,0x0100,0x0200,0x0400,0x0800,0x0800,0x0000,0x0000,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u003f 0x0000,0x0000,0x0000,0x3f00,0x4080,0x4080,0x4780,0x4880,0x4880,0x4880,0x4880,0x4980,0x4680,0x4000,0x4000,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u0040 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0041 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00, 0x0000,0x0000,0x0000,0x0000, // u0042 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0043 0x0000,0x0000,0x0000,0x7c00,0x4200,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4200,0x7c00, 0x0000,0x0000,0x0000,0x0000, // u0044 0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u0045 0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x0000,0x0000,0x0000,0x0000, // u0046 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0047 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0048 0x0000,0x0000,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u0049 0x0000,0x0000,0x0000,0x0380,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x2100,0x2100,0x2100,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u004a 0x0000,0x0000,0x0000,0x4100,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u004b 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u004c 0x0000,0x0000,0x0000,0x4080,0x6180,0x5280,0x5280,0x4c80,0x4c80,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x0000,0x0000,0x0000,0x0000, // u004d 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x6100,0x5100,0x4900,0x4500,0x4300,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u004e 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u004f 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x0000,0x0000,0x0000,0x0000, // u0050 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4900,0x3e00, 0x0200,0x0100,0x0000,0x0000, // u0051 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0052 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x3e00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0053 0x0000,0x0000,0x0000,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u0054 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0055 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x2200,0x2200,0x2200,0x2200,0x1400,0x1400,0x1400,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u0056 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4c80,0x4c80,0x5280,0x5280,0x6180,0x4080, 0x0000,0x0000,0x0000,0x0000, // u0057 0x0000,0x0000,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x1400,0x1400,0x2200,0x2200,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0058 0x0000,0x0000,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u0059 0x0000,0x0000,0x0000,0x7f00,0x0100,0x0100,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u005a 0x0000,0x0000,0x0000,0x1c00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u005b 0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x1000,0x1000,0x0800,0x0800,0x0400,0x0400,0x0200,0x0200,0x0100,0x0100, 0x0000,0x0000,0x0000,0x0000, // u005c 0x0000,0x0000,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u005d 0x0000,0x0800,0x1400,0x2200,0x4100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u005e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x7f00,0x0000,0x0000, // u005f 0x1000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0060 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0061 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00, 0x0000,0x0000,0x0000,0x0000, // u0062 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0063 0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0064 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0065 0x0000,0x0000,0x0000,0x0700,0x0800,0x0800,0x0800,0x3e00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u0066 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0100,0x0100,0x3e00,0x0000, // u0067 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0068 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u0069 0x0000,0x0000,0x0000,0x0200,0x0200,0x0000,0x0000,0x0600,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200, 0x2200,0x2200,0x1c00,0x0000, // u006a 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4100,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x4100, 0x0000,0x0000,0x0000,0x0000, // u006b 0x0000,0x0000,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u006c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900, 0x0000,0x0000,0x0000,0x0000, // u006d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u006e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u006f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00, 0x4000,0x4000,0x4000,0x0000, // u0070 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0100,0x0100,0x0100,0x0000, // u0071 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4f00,0x5000,0x6000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x0000,0x0000,0x0000,0x0000, // u0072 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4000,0x4000,0x3e00,0x0100,0x0100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0073 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x3e00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0700, 0x0000,0x0000,0x0000,0x0000, // u0074 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0075 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u0076 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4900,0x4900,0x4900,0x4900,0x4900,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0077 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x2200,0x1400,0x0800,0x1400,0x2200,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0078 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0100,0x0100,0x3e00,0x0000, // u0079 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u007a 0x0000,0x0000,0x0000,0x0600,0x0800,0x0800,0x0800,0x0800,0x0800,0x3000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0600, 0x0000,0x0000,0x0000,0x0000, // u007b 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u007c 0x0000,0x0000,0x0000,0x3000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0600,0x0800,0x0800,0x0800,0x0800,0x0800,0x3000, 0x0000,0x0000,0x0000,0x0000, // u007d 0x0000,0x3100,0x4900,0x4900,0x4600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u007e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00a0 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u00a1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x3e00,0x4900,0x4800,0x4800,0x4800,0x4800,0x4800,0x4900,0x3e00, 0x0800,0x0800,0x0000,0x0000, // u00a2 0x0000,0x0000,0x0000,0x1c00,0x2200,0x2000,0x2000,0x2000,0x2000,0x7c00,0x2000,0x2000,0x2000,0x2000,0x2100,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u00a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x2100,0x1e00,0x2100,0x2100,0x2100,0x2100,0x1e00,0x2100,0x4080,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00a4 0x0000,0x0000,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x0800,0x3e00,0x0800,0x3e00,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u00a5 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u00a6 0x0000,0x0000,0x1c00,0x2200,0x2000,0x2000,0x1800,0x2400,0x2200,0x2200,0x2200,0x1200,0x0c00,0x0200,0x0200,0x2200, 0x1c00,0x0000,0x0000,0x0000, // u00a7 0x2200,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00a8 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x9c80,0xa280,0xa080,0xa080,0xa280,0x9c80,0x4100,0x3e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00a9 0x0000,0x1e00,0x0100,0x1f00,0x2100,0x2100,0x2100,0x1f00,0x0000,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0880,0x1100,0x2200,0x4400,0x8800,0x4400,0x2200,0x1100,0x0880, 0x0000,0x0000,0x0000,0x0000, // u00ab 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0100,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00ac 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00ad 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0xbc80,0xa280,0xa280,0xbc80,0xa480,0xa280,0x4100,0x3e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00ae 0x0000,0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00af 0x0000,0x1c00,0x2200,0x2200,0x2200,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x7f00,0x0800,0x0800,0x0800,0x0000,0x0000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u00b1 0x0000,0x1c00,0x2200,0x2200,0x0400,0x0800,0x1000,0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00b2 0x0000,0x1c00,0x2200,0x0200,0x0c00,0x0200,0x2200,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00b3 0x0400,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4300,0x7d00, 0x4000,0x4000,0x4000,0x0000, // u00b5 0x0000,0x0000,0x0000,0x3f00,0x4900,0x4900,0x4900,0x4900,0x4900,0x3900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900, 0x0000,0x0000,0x0000,0x0000, // u00b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00b7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0800,0x0800,0x1000,0x0000, // u00b8 0x0000,0x0800,0x1800,0x0800,0x0800,0x0800,0x0800,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00b9 0x0000,0x1e00,0x2100,0x2100,0x2100,0x2100,0x2100,0x1e00,0x0000,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8800,0x4400,0x2200,0x1100,0x0880,0x1100,0x2200,0x4400,0x8800, 0x0000,0x0000,0x0000,0x0000, // u00bb 0x0000,0x0000,0x1000,0x3000,0x1000,0x1080,0x1100,0x1200,0x0400,0x0800,0x1100,0x2300,0x4500,0x8900,0x0f00,0x0100, 0x0100,0x0000,0x0000,0x0000, // u00bc 0x0000,0x0000,0x1000,0x3000,0x1000,0x1080,0x1100,0x1200,0x0400,0x0800,0x1000,0x2600,0x4900,0x8100,0x0200,0x0400, 0x0f00,0x0000,0x0000,0x0000, // u00bd 0x0000,0x0000,0x7000,0x0800,0x3000,0x0880,0x0900,0x7200,0x0400,0x0800,0x1100,0x2300,0x4500,0x8900,0x0f00,0x0100, 0x0100,0x0000,0x0000,0x0000, // u00be 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0800,0x0800,0x1000,0x2000,0x4000,0x4100,0x4100,0x2200,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u00bf 0x1000,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u00c0 0x0400,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u00c1 0x1c00,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u00c2 0x3300,0x4c00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u00c3 0x2200,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u00c4 0x1c00,0x2200,0x1c00,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u00c5 0x0000,0x0000,0x0000,0x7f80,0x8800,0x8800,0x8800,0x8800,0x8800,0xff00,0x8800,0x8800,0x8800,0x8800,0x8800,0x8f80, 0x0000,0x0000,0x0000,0x0000, // u00c6 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x4100,0x3e00, 0x0800,0x0800,0x1000,0x0000, // u00c7 0x1000,0x0800,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u00c8 0x0400,0x0800,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u00c9 0x1c00,0x2200,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u00ca 0x2200,0x2200,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u00cb 0x1000,0x0800,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u00cc 0x0400,0x0800,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u00cd 0x1c00,0x2200,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u00ce 0x2200,0x2200,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u00cf 0x0000,0x0000,0x0000,0x7c00,0x4200,0x4100,0x4100,0x4100,0x4100,0xf900,0x4100,0x4100,0x4100,0x4100,0x4200,0x7c00, 0x0000,0x0000,0x0000,0x0000, // u00d0 0x3300,0x4c00,0x0000,0x4100,0x4100,0x4100,0x4100,0x6100,0x5100,0x4900,0x4500,0x4300,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u00d1 0x1000,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u00d2 0x0400,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u00d3 0x1c00,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u00d4 0x3300,0x4c00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u00d5 0x2200,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u00d6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x2200,0x1400,0x0800,0x1400,0x2200,0x4100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00d7 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4180,0x4100,0x4300,0x4500,0x4900,0x5100,0x6100,0x4100,0xc100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u00d8 0x1000,0x0800,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u00d9 0x0400,0x0800,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u00da 0x1c00,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u00db 0x2200,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u00dc 0x0400,0x0800,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u00dd 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x4000,0x4000,0x4000, 0x0000,0x0000,0x0000,0x0000, // u00de 0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4400,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x6100,0x5e00, 0x0000,0x0000,0x0000,0x0000, // u00df 0x0000,0x0000,0x0000,0x0000,0x1000,0x0800,0x0000,0x3e00,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00e0 0x0000,0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x3e00,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00e1 0x0000,0x0000,0x0000,0x0000,0x1c00,0x2200,0x0000,0x3e00,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00e2 0x0000,0x0000,0x0000,0x0000,0x3300,0x4c00,0x0000,0x3e00,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00e3 0x0000,0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x3e00,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00e4 0x0000,0x0000,0x0000,0x0000,0x1c00,0x2200,0x1c00,0x3e00,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7700,0x0880,0x0880,0x7880,0x8f80,0x8800,0x8800,0x8880,0x7700, 0x0000,0x0000,0x0000,0x0000, // u00e6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x3e00, 0x0800,0x0800,0x1000,0x0000, // u00e7 0x0000,0x0000,0x0000,0x0000,0x1000,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u00e8 0x0000,0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u00e9 0x0000,0x0000,0x0000,0x0000,0x1c00,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u00ea 0x0000,0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u00eb 0x0000,0x0000,0x0000,0x0000,0x1000,0x0800,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u00ec 0x0000,0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u00ed 0x0000,0x0000,0x0000,0x0000,0x1c00,0x2200,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u00ee 0x0000,0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u00ef 0x0000,0x0000,0x0000,0x2c00,0x1000,0x6800,0x0400,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u00f0 0x0000,0x0000,0x0000,0x0000,0x3300,0x4c00,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u00f1 0x0000,0x0000,0x0000,0x0000,0x1000,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u00f2 0x0000,0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u00f3 0x0000,0x0000,0x0000,0x0000,0x1c00,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u00f4 0x0000,0x0000,0x0000,0x0000,0x3300,0x4c00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u00f5 0x0000,0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u00f6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x7f00,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00f7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e80,0x4100,0x4300,0x4500,0x4900,0x5100,0x6100,0x4100,0xbe00, 0x0000,0x0000,0x0000,0x0000, // u00f8 0x0000,0x0000,0x0000,0x0000,0x1000,0x0800,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00f9 0x0000,0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00fa 0x0000,0x0000,0x0000,0x0000,0x1c00,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00fb 0x0000,0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00fc 0x0000,0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0100,0x0100,0x3e00,0x0000, // u00fd 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00, 0x4000,0x4000,0x4000,0x0000, // u00fe 0x0000,0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0100,0x0100,0x3e00,0x0000, // u00ff 0x0000,0x3e00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0100 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x3e00,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0101 0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0102 0x0000,0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x3e00,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0103 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0100,0x0200,0x0180,0x0000, // u0104 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0100,0x0200,0x0180,0x0000, // u0105 0x0400,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0106 0x0000,0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x3e00,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0107 0x1c00,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0108 0x0000,0x0000,0x0000,0x0000,0x1c00,0x2200,0x0000,0x3e00,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0109 0x0800,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u010a 0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x3e00,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u010b 0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u010c 0x0000,0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u010d 0x2200,0x1c00,0x0000,0x7c00,0x4200,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4200,0x7c00, 0x0000,0x0000,0x0000,0x0000, // u010e 0x2200,0x1c00,0x0000,0x0100,0x0100,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u010f 0x0000,0x0000,0x0000,0x7c00,0x4200,0x4100,0x4100,0x4100,0x4100,0xf900,0x4100,0x4100,0x4100,0x4100,0x4200,0x7c00, 0x0000,0x0000,0x0000,0x0000, // u0110 0x0000,0x0000,0x0000,0x0100,0x0f80,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0111 0x0000,0x3e00,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u0112 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0113 0x2200,0x1c00,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u0114 0x0000,0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0115 0x0800,0x0800,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u0116 0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0117 0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00, 0x0100,0x0200,0x0180,0x0000, // u0118 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00, 0x0800,0x1000,0x0c00,0x0000, // u0119 0x2200,0x1c00,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u011a 0x0000,0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u011b 0x1c00,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u011c 0x0000,0x0000,0x0000,0x0000,0x1c00,0x2200,0x0000,0x3f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0100,0x0100,0x3e00,0x0000, // u011d 0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u011e 0x0000,0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x3f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0100,0x0100,0x3e00,0x0000, // u011f 0x0800,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0120 0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x3f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0100,0x0100,0x3e00,0x0000, // u0121 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0800,0x0800,0x1000, // u0122 0x0000,0x0000,0x0000,0x0400,0x0800,0x0800,0x0000,0x3f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0100,0x0100,0x3e00,0x0000, // u0123 0x1c00,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0124 0x1c00,0x2200,0x0000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0125 0x0000,0x0000,0x0000,0x4100,0x4100,0xff80,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0126 0x0000,0x0000,0x0000,0x4000,0xf800,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0127 0x3300,0x4c00,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u0128 0x0000,0x0000,0x0000,0x0000,0x3300,0x4c00,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u0129 0x0000,0x3e00,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u012a 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u012b 0x2200,0x1c00,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u012c 0x0000,0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u012d 0x0000,0x0000,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0800,0x1000,0x0c00,0x0000, // u012e 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0800,0x1000,0x0c00,0x0000, // u012f 0x0800,0x0800,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u0130 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u0131 0x0000,0x0000,0x0000,0xe380,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4900,0x4900,0x4900,0xe600, 0x0000,0x0000,0x0000,0x0000, // u0132 0x0000,0x0000,0x0000,0x2080,0x2080,0x0000,0x0000,0x6180,0x2080,0x2080,0x2080,0x2080,0x2080,0x2080,0x2080,0x7080, 0x0480,0x0480,0x0300,0x0000, // u0133 0x0700,0x0880,0x0000,0x0700,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x4200,0x4200,0x4200,0x3c00, 0x0000,0x0000,0x0000,0x0000, // u0134 0x0000,0x0000,0x0000,0x0000,0x0700,0x0880,0x0000,0x0600,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200, 0x2200,0x2200,0x1c00,0x0000, // u0135 0x0000,0x0000,0x0000,0x4100,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100,0x4100, 0x0000,0x0800,0x0800,0x1000, // u0136 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4100,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x4100, 0x0000,0x0800,0x0800,0x1000, // u0137 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0138 0x2000,0x4000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u0139 0x0400,0x0800,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u013a 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00, 0x0000,0x0800,0x0800,0x1000, // u013b 0x0000,0x0000,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0800,0x0800,0x1000, // u013c 0x2200,0x1c00,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u013d 0x2200,0x1c00,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u013e 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4200,0x4200,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u013f 0x0000,0x0000,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0840,0x0840,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u0140 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x2000,0x2800,0x3000,0x2000,0x6000,0xa000,0x2000,0x2000,0x2000,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u0141 0x0000,0x0000,0x0000,0x1800,0x0800,0x0800,0x0800,0x0a00,0x0c00,0x0800,0x1800,0x2800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u0142 0x0400,0x0800,0x0000,0x4100,0x4100,0x4100,0x4100,0x6100,0x5100,0x4900,0x4500,0x4300,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0143 0x0000,0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0144 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x6100,0x5100,0x4900,0x4500,0x4300,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0800,0x0800,0x1000, // u0145 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0800,0x0800,0x1000, // u0146 0x2200,0x1c00,0x0000,0x4100,0x4100,0x4100,0x4100,0x6100,0x5100,0x4900,0x4500,0x4300,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0147 0x0000,0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0148 0x0000,0x4000,0x4000,0x4000,0x8000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0149 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x6100,0x5100,0x4900,0x4500,0x4300,0x4100,0x4100,0x4100,0x4100, 0x0100,0x0100,0x0600,0x0000, // u014a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0100,0x0100,0x0600,0x0000, // u014b 0x0000,0x3e00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u014c 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u014d 0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u014e 0x0000,0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u014f 0x1100,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0150 0x0000,0x0000,0x0000,0x0000,0x1100,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0151 0x0000,0x0000,0x0000,0x7f80,0x8800,0x8800,0x8800,0x8800,0x8800,0x8f00,0x8800,0x8800,0x8800,0x8800,0x8800,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u0152 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x8880,0x8880,0x8880,0x8f80,0x8800,0x8800,0x8880,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u0153 0x0400,0x0800,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0154 0x0000,0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x4f00,0x5000,0x6000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x0000,0x0000,0x0000,0x0000, // u0155 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100, 0x0000,0x0800,0x0800,0x1000, // u0156 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4f00,0x5000,0x6000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x0000,0x4000,0x4000,0x8000, // u0157 0x2200,0x1c00,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0158 0x0000,0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x4f00,0x5000,0x6000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x0000,0x0000,0x0000,0x0000, // u0159 0x0400,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x3e00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u015a 0x0000,0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x3e00,0x4100,0x4000,0x4000,0x3e00,0x0100,0x0100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u015b 0x1c00,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x3e00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u015c 0x0000,0x0000,0x0000,0x0000,0x1c00,0x2200,0x0000,0x3e00,0x4100,0x4000,0x4000,0x3e00,0x0100,0x0100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u015d 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x3e00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00, 0x0800,0x0800,0x1000,0x0000, // u015e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4000,0x4000,0x3e00,0x0100,0x0100,0x4100,0x3e00, 0x0800,0x0800,0x1000,0x0000, // u015f 0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x3e00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0160 0x0000,0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4000,0x4000,0x3e00,0x0100,0x0100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0161 0x0000,0x0000,0x0000,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0400,0x0400,0x0800,0x0000, // u0162 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x3e00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0700, 0x0200,0x0200,0x0400,0x0000, // u0163 0x2200,0x1c00,0x0000,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u0164 0x2200,0x1c00,0x0000,0x0800,0x0800,0x0800,0x0800,0x3e00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0700, 0x0000,0x0000,0x0000,0x0000, // u0165 0x0000,0x0000,0x0000,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x3e00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u0166 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x3e00,0x0800,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0700, 0x0000,0x0000,0x0000,0x0000, // u0167 0x3300,0x4c00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0168 0x0000,0x0000,0x0000,0x0000,0x3300,0x4c00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0169 0x0000,0x3e00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u016a 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u016b 0x2200,0x1c00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u016c 0x0000,0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u016d 0x1c00,0x2200,0x1c00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u016e 0x0000,0x0000,0x0000,0x0000,0x1c00,0x2200,0x1c00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u016f 0x1100,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0170 0x0000,0x0000,0x0000,0x0000,0x1100,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0171 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0800,0x1000,0x0c00,0x0000, // u0172 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0100,0x0200,0x0180,0x0000, // u0173 0x1c00,0x2200,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4c80,0x4c80,0x5280,0x5280,0x6180,0x4080, 0x0000,0x0000,0x0000,0x0000, // u0174 0x0000,0x0000,0x0000,0x0000,0x1c00,0x2200,0x0000,0x4100,0x4100,0x4100,0x4900,0x4900,0x4900,0x4900,0x4900,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0175 0x1c00,0x2200,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u0176 0x0000,0x0000,0x0000,0x0000,0x1c00,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0100,0x0100,0x3e00,0x0000, // u0177 0x2200,0x2200,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u0178 0x0400,0x0800,0x0000,0x7f00,0x0100,0x0100,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u0179 0x0000,0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x7f00,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u017a 0x0800,0x0800,0x0000,0x7f00,0x0100,0x0100,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u017b 0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x7f00,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u017c 0x2200,0x1c00,0x0000,0x7f00,0x0100,0x0100,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u017d 0x0000,0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x7f00,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u017e 0x0000,0x0000,0x0000,0x0700,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u017f 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0186 0x0000,0x0000,0x0000,0x7f00,0x0100,0x0100,0x0100,0x0100,0x0100,0x1f00,0x0100,0x0100,0x0100,0x0100,0x0100,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u018e 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x0100,0x0100,0x0100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u018f 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x3c00,0x4000,0x4000,0x4000,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0190 0x0000,0x0000,0x0000,0x0600,0x0900,0x0900,0x0800,0x0800,0x3e00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x4800,0x4800,0x3000,0x0000, // u0192 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x6100,0x5100,0x4900,0x4500,0x4300,0x4100,0x4100,0x4100,0x4100, 0x4000,0x4000,0x8000,0x0000, // u019d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0100,0x0100,0x0100,0x0000, // u019e 0x0000,0x0000,0x0000,0x7f00,0x0100,0x0100,0x0100,0x0200,0x0400,0x7f00,0x0800,0x1000,0x2000,0x4000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u01b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0100,0x0200,0x0400,0x7f00,0x1000,0x2000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u01b6 0x0000,0x0000,0x0000,0x7f00,0x0100,0x0200,0x0400,0x0800,0x1e00,0x0100,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u01b7 0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u01cd 0x0000,0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x3e00,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u01ce 0x2200,0x1c00,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u01cf 0x0000,0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u01d0 0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u01d1 0x0000,0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u01d2 0x2200,0x1c00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u01d3 0x0000,0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u01d4 0x0000,0x3f00,0x0000,0x7f80,0x8800,0x8800,0x8800,0x8800,0x8800,0xff00,0x8800,0x8800,0x8800,0x8800,0x8800,0x8f80, 0x0000,0x0000,0x0000,0x0000, // u01e2 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x7700,0x0880,0x0880,0x7880,0x8f80,0x8800,0x8800,0x8880,0x7700, 0x0000,0x0000,0x0000,0x0000, // u01e3 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4f00,0x4100,0x4100,0x4780,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u01e4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x4100,0x4100,0x4100,0x4780,0x4100,0x4100,0x4100,0x3f00, 0x0100,0x0100,0x3e00,0x0000, // u01e5 0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u01e6 0x0000,0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x3f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0100,0x0100,0x3e00,0x0000, // u01e7 0x2200,0x1c00,0x0000,0x4100,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u01e8 0x2200,0x1c00,0x0000,0x4000,0x4000,0x4000,0x4000,0x4100,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x4100, 0x0000,0x0000,0x0000,0x0000, // u01e9 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0800,0x1000,0x0c00,0x0000, // u01ea 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0800,0x1000,0x0c00,0x0000, // u01eb 0x0000,0x3e00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0800,0x1000,0x0c00,0x0000, // u01ec 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0800,0x1000,0x0c00,0x0000, // u01ed 0x2200,0x1c00,0x0000,0x7f00,0x0100,0x0200,0x0400,0x0800,0x1e00,0x0100,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u01ee 0x0000,0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x7f00,0x0100,0x0200,0x0400,0x0800,0x1e00,0x0100,0x0100,0x0100, 0x4100,0x4100,0x3e00,0x0000, // u01ef 0x0000,0x0000,0x0000,0x0000,0x0880,0x0700,0x0000,0x0600,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200, 0x2200,0x2200,0x1c00,0x0000, // u01f0 0x0400,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u01f4 0x0000,0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x3f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0100,0x0100,0x3e00,0x0000, // u01f5 0x0400,0x0800,0x0000,0x7f80,0x8800,0x8800,0x8800,0x8800,0x8800,0xff00,0x8800,0x8800,0x8800,0x8800,0x8800,0x8f80, 0x0000,0x0000,0x0000,0x0000, // u01fc 0x0000,0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x7700,0x0880,0x0880,0x7880,0x8f80,0x8800,0x8800,0x8880,0x7700, 0x0000,0x0000,0x0000,0x0000, // u01fd 0x0400,0x0800,0x0000,0x3e00,0x4100,0x4180,0x4100,0x4300,0x4500,0x4900,0x5100,0x6100,0x4100,0xc100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u01fe 0x0000,0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x3e80,0x4100,0x4300,0x4500,0x4900,0x5100,0x6100,0x4100,0xbe00, 0x0000,0x0000,0x0000,0x0000, // u01ff 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x3e00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00, 0x0000,0x0800,0x0800,0x1000, // u0218 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4000,0x4000,0x3e00,0x0100,0x0100,0x4100,0x3e00, 0x0000,0x0800,0x0800,0x1000, // u0219 0x0000,0x0000,0x0000,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0800,0x0800,0x1000, // u021a 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x3e00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0700, 0x0000,0x0200,0x0200,0x0400, // u021b 0x0000,0x3e00,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u0232 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0100,0x0100,0x3e00,0x0000, // u0233 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200, 0x2200,0x2200,0x1c00,0x0000, // u0237 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x0100,0x0100,0x0100,0x0100,0x0100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0254 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x0100,0x0100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0258 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x0100,0x0100,0x7f00,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0259 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4000,0x4000,0x3c00,0x4000,0x4000,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u025b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x4000,0x4000,0x8000,0x0000, // u0272 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0100,0x0200,0x0400,0x0800,0x1e00,0x0100,0x0100,0x0100, 0x4100,0x4100,0x3e00,0x0000, // u0292 0x0400,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u02bb 0x0800,0x0800,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u02bc 0x0800,0x0800,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u02bd 0x1c00,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u02c6 0x2200,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u02c7 0x2200,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u02d8 0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u02d9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0800,0x1000,0x0c00,0x0000, // u02db 0x3300,0x4c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u02dc 0x1100,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u02dd 0x1000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0300 0x0400,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0301 0x1c00,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0302 0x3300,0x4c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0303 0x0000,0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0304 0x0000,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0305 0x2200,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0306 0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0307 0x2200,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0308 0x1c00,0x2200,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u030a 0x1100,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u030b 0x2200,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u030c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0800,0x0800,0x0000, // u0329 0x0000,0x4000,0x8000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0384 0x0000,0x0400,0x0800,0x0000,0x2200,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0385 0x0000,0x4000,0x8000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0386 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0387 0x0000,0x4000,0x8000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u0388 0x0000,0x4000,0x8000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0389 0x0000,0x4000,0x8000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u038a 0x0000,0x4000,0x8000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u038c 0x0000,0x4000,0x8000,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0a00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0000,0x0000,0x0000,0x0000, // u038e 0x0000,0x4000,0x8000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x2200,0x1400,0x1400,0x7700, 0x0000,0x0000,0x0000,0x0000, // u038f 0x0000,0x0400,0x0800,0x0000,0x2200,0x2200,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0600, 0x0000,0x0000,0x0000,0x0000, // u0390 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0391 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00, 0x0000,0x0000,0x0000,0x0000, // u0392 0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x0000,0x0000,0x0000,0x0000, // u0393 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x1400,0x1400,0x1400,0x2200,0x2200,0x2200,0x4100,0x4100,0x4100,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u0394 0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u0395 0x0000,0x0000,0x0000,0x7f00,0x0100,0x0100,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u0396 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0397 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x5d00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0398 0x0000,0x0000,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u0399 0x0000,0x0000,0x0000,0x4100,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u039a 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x1400,0x1400,0x1400,0x2200,0x2200,0x2200,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u039b 0x0000,0x0000,0x0000,0x4080,0x6180,0x5280,0x5280,0x4c80,0x4c80,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x0000,0x0000,0x0000,0x0000, // u039c 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x6100,0x5100,0x4900,0x4500,0x4300,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u039d 0x0000,0x0000,0x0000,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u039e 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u039f 0x0000,0x0000,0x0000,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u03a0 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x0000,0x0000,0x0000,0x0000, // u03a1 0x0000,0x0000,0x0000,0x7f00,0x4000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u03a3 0x0000,0x0000,0x0000,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u03a4 0x0000,0x0000,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u03a5 0x0000,0x0000,0x0000,0x0800,0x3e00,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x3e00,0x0800, 0x0000,0x0000,0x0000,0x0000, // u03a6 0x0000,0x0000,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x1400,0x1400,0x2200,0x2200,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u03a7 0x0000,0x0000,0x0000,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x3e00,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u03a8 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x2200,0x1400,0x1400,0x7700, 0x0000,0x0000,0x0000,0x0000, // u03a9 0x2200,0x2200,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u03aa 0x2200,0x2200,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u03ab 0x0000,0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x3d80,0x4300,0x4200,0x4200,0x4200,0x4200,0x4200,0x4300,0x3d80, 0x0000,0x0000,0x0000,0x0000, // u03ac 0x0000,0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x3e00,0x4100,0x4000,0x4000,0x3c00,0x4000,0x4000,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u03ad 0x0000,0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0100,0x0100,0x0100,0x0000, // u03ae 0x0000,0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0600, 0x0000,0x0000,0x0000,0x0000, // u03af 0x0000,0x0400,0x0800,0x0000,0x2200,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u03b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3d80,0x4300,0x4200,0x4200,0x4200,0x4200,0x4200,0x4300,0x3d80, 0x0000,0x0000,0x0000,0x0000, // u03b1 0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4400,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00, 0x4000,0x4000,0x4000,0x0000, // u03b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x2200,0x2200,0x2200,0x1400,0x1400,0x0800, 0x0800,0x0800,0x0800,0x0000, // u03b3 0x0000,0x0000,0x0000,0x3e00,0x1000,0x0800,0x0400,0x1e00,0x2300,0x4100,0x4100,0x4100,0x4100,0x4100,0x2200,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u03b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4000,0x4000,0x3c00,0x4000,0x4000,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u03b5 0x0000,0x0000,0x0000,0x7f00,0x0200,0x0400,0x0800,0x1000,0x2000,0x2000,0x4000,0x4000,0x4000,0x4000,0x4000,0x3e00, 0x0100,0x0100,0x0200,0x0000, // u03b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0100,0x0100,0x0100,0x0000, // u03b7 0x0000,0x0000,0x0000,0x1e00,0x2100,0x2100,0x2100,0x2100,0x2100,0x3f00,0x2100,0x2100,0x2100,0x2100,0x2100,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u03b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0600, 0x0000,0x0000,0x0000,0x0000, // u03b9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x4100, 0x0000,0x0000,0x0000,0x0000, // u03ba 0x0000,0x0000,0x0000,0x1000,0x1000,0x0800,0x0800,0x0800,0x1400,0x1400,0x2200,0x2200,0x2200,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u03bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4300,0x7d00, 0x4000,0x4000,0x4000,0x0000, // u03bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u03bd 0x0000,0x0000,0x0000,0x3f00,0x4000,0x4000,0x4000,0x4000,0x3e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x3e00, 0x0100,0x0100,0x0200,0x0000, // u03be 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u03bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u03c0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00, 0x4000,0x4000,0x4000,0x0000, // u03c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x3e00, 0x0100,0x0100,0x0200,0x0000, // u03c2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x2200,0x4100,0x4100,0x4100,0x4100,0x4100,0x2200,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u03c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0600, 0x0000,0x0000,0x0000,0x0000, // u03c4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u03c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2600,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x3e00, 0x0800,0x0800,0x0800,0x0000, // u03c6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x0800,0x0800,0x1400,0x2200, 0x2200,0x4100,0x4100,0x0000, // u03c7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x3e00, 0x0800,0x0800,0x0800,0x0000, // u03c8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2200,0x4100,0x4100,0x4900,0x4900,0x4900,0x4900,0x4900,0x3600, 0x0000,0x0000,0x0000,0x0000, // u03c9 0x0000,0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0600, 0x0000,0x0000,0x0000,0x0000, // u03ca 0x0000,0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u03cb 0x0000,0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u03cc 0x0000,0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u03cd 0x0000,0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x2200,0x4100,0x4100,0x4900,0x4900,0x4900,0x4900,0x4900,0x3600, 0x0000,0x0000,0x0000,0x0000, // u03ce 0x0000,0x0000,0x0000,0x1e00,0x2100,0x2100,0x2100,0x2100,0x1f80,0x0100,0x0100,0x6100,0x2100,0x2100,0x2100,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u03d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x3e00,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x3e00, 0x0800,0x0800,0x0000,0x0000, // u03d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xe080,0x1100,0x0a00,0x0c00,0x0800,0x1800,0x2800,0x4400,0x8380, 0x0000,0x0000,0x0000,0x0000, // u03f0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00, 0x4000,0x4000,0x3e00,0x0000, // u03f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u03f2 0x0000,0x0000,0x0000,0x0200,0x0200,0x0000,0x0000,0x0600,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200, 0x2200,0x2200,0x1c00,0x0000, // u03f3 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u03f4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2000,0x4000,0x4000,0x7e00,0x4000,0x4000,0x2000,0x1f00, 0x0000,0x0000,0x0000,0x0000, // u03f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0200,0x0100,0x0100,0x3f00,0x0100,0x0100,0x0200,0x7c00, 0x0000,0x0000,0x0000,0x0000, // u03f6 0x1000,0x0800,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u0400 0x2200,0x2200,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u0401 0x0000,0x0000,0x0000,0xf800,0x2000,0x2000,0x2000,0x3e00,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2600, 0x0000,0x0000,0x0000,0x0000, // u0402 0x0400,0x0800,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x0000,0x0000,0x0000,0x0000, // u0403 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0404 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x3e00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0405 0x0000,0x0000,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u0406 0x2200,0x2200,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u0407 0x0000,0x0000,0x0000,0x0380,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x2100,0x2100,0x2100,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u0408 0x0000,0x0000,0x0000,0x3800,0x4800,0x8800,0x8800,0x8800,0x8f00,0x8880,0x8880,0x8880,0x8880,0x8880,0x8880,0x8f00, 0x0000,0x0000,0x0000,0x0000, // u0409 0x0000,0x0000,0x0000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8f00,0xf880,0x8880,0x8880,0x8880,0x8880,0x8880,0x8f00, 0x0000,0x0000,0x0000,0x0000, // u040a 0x0000,0x0000,0x0000,0xf800,0x2000,0x2000,0x2000,0x3e00,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100, 0x0000,0x0000,0x0000,0x0000, // u040b 0x0400,0x0800,0x0000,0x4100,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u040c 0x1000,0x0800,0x0000,0x4100,0x4100,0x4100,0x4100,0x4300,0x4500,0x4900,0x5100,0x6100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u040d 0x2200,0x1c00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100,0x0100,0x0100,0x0100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u040e 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00, 0x0800,0x0800,0x0000,0x0000, // u040f 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0410 0x0000,0x0000,0x0000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00, 0x0000,0x0000,0x0000,0x0000, // u0411 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00, 0x0000,0x0000,0x0000,0x0000, // u0412 0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x0000,0x0000,0x0000,0x0000, // u0413 0x0000,0x0000,0x0000,0x0f00,0x1100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x7f80, 0x4080,0x4080,0x0000,0x0000, // u0414 0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u0415 0x0000,0x0000,0x0000,0x4900,0x4900,0x4900,0x4900,0x4900,0x2a00,0x1c00,0x2a00,0x4900,0x4900,0x4900,0x4900,0x4900, 0x0000,0x0000,0x0000,0x0000, // u0416 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x0100,0x0100,0x0100,0x1e00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0417 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4300,0x4500,0x4900,0x5100,0x6100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0418 0x2200,0x1c00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4300,0x4500,0x4900,0x5100,0x6100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0419 0x0000,0x0000,0x0000,0x4100,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u041a 0x0000,0x0000,0x0000,0x0f00,0x1100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u041b 0x0000,0x0000,0x0000,0x4080,0x6180,0x5280,0x5280,0x4c80,0x4c80,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x0000,0x0000,0x0000,0x0000, // u041c 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u041d 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u041e 0x0000,0x0000,0x0000,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u041f 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x0000,0x0000,0x0000,0x0000, // u0420 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0421 0x0000,0x0000,0x0000,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u0422 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100,0x0100,0x0100,0x0100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0423 0x0000,0x0000,0x0800,0x3e00,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x3e00, 0x0800,0x0000,0x0000,0x0000, // u0424 0x0000,0x0000,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x1400,0x1400,0x2200,0x2200,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0425 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f80, 0x0080,0x0080,0x0000,0x0000, // u0426 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0000,0x0000,0x0000,0x0000, // u0427 0x0000,0x0000,0x0000,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0428 0x0000,0x0000,0x0000,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x3f80, 0x0080,0x0080,0x0000,0x0000, // u0429 0x0000,0x0000,0x0000,0xc000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00, 0x0000,0x0000,0x0000,0x0000, // u042a 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x7880,0x4480,0x4480,0x4480,0x4480,0x4480,0x4480,0x4480,0x7880, 0x0000,0x0000,0x0000,0x0000, // u042b 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00, 0x0000,0x0000,0x0000,0x0000, // u042c 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x0100,0x0100,0x0100,0x1f00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u042d 0x0000,0x0000,0x0000,0x4700,0x4880,0x4880,0x4880,0x4880,0x4880,0x7880,0x4880,0x4880,0x4880,0x4880,0x4880,0x4700, 0x0000,0x0000,0x0000,0x0000, // u042e 0x0000,0x0000,0x0000,0x3f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0300,0x0500,0x0900,0x1100,0x2100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u042f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0430 0x0000,0x0000,0x0000,0x3e00,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00, 0x0000,0x0000,0x0000,0x0000, // u0431 0x0000,0x0000,0x0000,0x3c00,0x4200,0x4200,0x4200,0x4400,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00, 0x0000,0x0000,0x0000,0x0000, // u0432 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x0000,0x0000,0x0000,0x0000, // u0433 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0100,0x0100,0x3e00,0x0000, // u0434 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0435 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4900,0x4900,0x4900,0x2a00,0x1c00,0x2a00,0x4900,0x4900,0x4900, 0x0000,0x0000,0x0000,0x0000, // u0436 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x0100,0x0100,0x1e00,0x0100,0x0100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0437 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0438 0x0000,0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0439 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x4100, 0x0000,0x0000,0x0000,0x0000, // u043a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f00,0x1100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u043b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x6300,0x5500,0x4900,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u043c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u043d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u043e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u043f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00, 0x4000,0x4000,0x4000,0x0000, // u0440 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0441 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u0442 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0100,0x0100,0x3e00,0x0000, // u0443 0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x3e00,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x3e00, 0x0800,0x0800,0x0000,0x0000, // u0444 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x2200,0x1400,0x0800,0x1400,0x2200,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u0445 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f80, 0x0080,0x0080,0x0000,0x0000, // u0446 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100,0x0100,0x0100,0x0100, 0x0000,0x0000,0x0000,0x0000, // u0447 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0448 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x3f80, 0x0080,0x0080,0x0000,0x0000, // u0449 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x2000,0x2000,0x3e00,0x2100,0x2100,0x2100,0x2100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u044a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x7880,0x4480,0x4480,0x4480,0x4480,0x7880, 0x0000,0x0000,0x0000,0x0000, // u044b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x3e00,0x2100,0x2100,0x2100,0x2100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u044c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x0100,0x0100,0x1f00,0x0100,0x0100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u044d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4700,0x4880,0x4880,0x4880,0x7880,0x4880,0x4880,0x4880,0x4700, 0x0000,0x0000,0x0000,0x0000, // u044e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x4100,0x4100,0x4100,0x3f00,0x0500,0x0900,0x1100,0x2100, 0x0000,0x0000,0x0000,0x0000, // u044f 0x0000,0x0000,0x0000,0x0000,0x1000,0x0800,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0450 0x0000,0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0451 0x0000,0x0000,0x0000,0x4000,0xf800,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0100,0x0100,0x0600,0x0000, // u0452 0x0000,0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x0000,0x0000,0x0000,0x0000, // u0453 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0454 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4000,0x4000,0x3e00,0x0100,0x0100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0455 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u0456 0x0000,0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u0457 0x0000,0x0000,0x0000,0x0200,0x0200,0x0000,0x0000,0x0600,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200, 0x2200,0x2200,0x1c00,0x0000, // u0458 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x4800,0x8800,0x8f00,0x8880,0x8880,0x8880,0x8880,0x8f00, 0x0000,0x0000,0x0000,0x0000, // u0459 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0x8800,0x8f00,0xf880,0x8880,0x8880,0x8880,0x8f00, 0x0000,0x0000,0x0000,0x0000, // u045a 0x0000,0x0000,0x0000,0x4000,0xf800,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u045b 0x0000,0x0000,0x0000,0x0000,0x0400,0x0800,0x0000,0x4100,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x4100, 0x0000,0x0000,0x0000,0x0000, // u045c 0x0000,0x0000,0x0000,0x0000,0x1000,0x0800,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u045d 0x0000,0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0100,0x0100,0x3e00,0x0000, // u045e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00, 0x0800,0x0800,0x0000,0x0000, // u045f 0x0000,0x0000,0x0000,0x4000,0xf800,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7e00, 0x0000,0x0000,0x0000,0x0000, // u0462 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0xf800,0x2000,0x2000,0x2000,0x3e00,0x2100,0x2100,0x2100,0x2100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0463 0x0000,0x0000,0x0000,0x7f00,0x4100,0x2200,0x2200,0x1400,0x0800,0x1c00,0x2a00,0x4900,0x4900,0x4900,0x4900,0x4900, 0x0000,0x0000,0x0000,0x0000, // u046a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x4100,0x2200,0x1400,0x1c00,0x2a00,0x4900,0x4900,0x4900, 0x0000,0x0000,0x0000,0x0000, // u046b 0x0000,0x0100,0x0100,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x0000,0x0000,0x0000,0x0000, // u0490 0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x0000,0x0000,0x0000,0x0000, // u0491 0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0xf800,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x0000,0x0000,0x0000,0x0000, // u0492 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0xf800,0x4000,0x4000,0x4000,0x4000, 0x0000,0x0000,0x0000,0x0000, // u0493 0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0100,0x0200,0x0000,0x0000, // u0494 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x7c00,0x4200,0x4200,0x4200,0x4200, 0x0200,0x0400,0x0000,0x0000, // u0495 0x0000,0x0000,0x0000,0x4900,0x4900,0x4900,0x4900,0x4900,0x2a00,0x1c00,0x2a00,0x4900,0x4900,0x4900,0x4900,0x4980, 0x0080,0x0080,0x0000,0x0000, // u0496 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4900,0x4900,0x4900,0x2a00,0x1c00,0x2a00,0x4900,0x4900,0x4980, 0x0080,0x0080,0x0000,0x0000, // u0497 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x0100,0x0100,0x0100,0x1e00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00, 0x0800,0x0800,0x0800,0x0000, // u0498 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x0100,0x0100,0x1e00,0x0100,0x0100,0x4100,0x3e00, 0x0800,0x0800,0x0800,0x0000, // u0499 0x0000,0x0000,0x0000,0x4100,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100,0x4180, 0x0080,0x0080,0x0000,0x0000, // u049a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x4180, 0x0080,0x0080,0x0000,0x0000, // u049b 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x5200,0x5400,0x5800,0x7000,0x5800,0x5400,0x5200,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u049c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x5200,0x5400,0x5800,0x7000,0x5800,0x5400,0x5200,0x4100, 0x0000,0x0000,0x0000,0x0000, // u049d 0x0000,0x0000,0x0000,0xc100,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u04a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc100,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x4100, 0x0000,0x0000,0x0000,0x0000, // u04a1 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4180, 0x0080,0x0080,0x0000,0x0000, // u04a2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4180, 0x0080,0x0080,0x0000,0x0000, // u04a3 0x0000,0x0000,0x0000,0x43c0,0x4200,0x4200,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200, 0x0000,0x0000,0x0000,0x0000, // u04a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x43c0,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200, 0x0000,0x0000,0x0000,0x0000, // u04a5 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x4100,0x3e00, 0x0800,0x0800,0x0800,0x0000, // u04aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x3e00, 0x0800,0x0800,0x0800,0x0000, // u04ab 0x0000,0x0000,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u04ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x2200,0x2200,0x2200,0x1400,0x1400,0x0800, 0x0800,0x0800,0x0800,0x0000, // u04af 0x0000,0x0000,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x0800,0x3e00,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u04b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x2200,0x2200,0x2200,0x1400,0x1400,0x0800, 0x3e00,0x0800,0x0800,0x0000, // u04b1 0x0000,0x0000,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x1400,0x1400,0x2200,0x2200,0x4100,0x4180, 0x0080,0x0080,0x0000,0x0000, // u04b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x2200,0x1400,0x0800,0x1400,0x2200,0x4100,0x4180, 0x0080,0x0080,0x0000,0x0000, // u04b3 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100,0x0100,0x0100,0x0100,0x0100,0x0180, 0x0080,0x0080,0x0000,0x0000, // u04b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100,0x0100,0x0100,0x0180, 0x0080,0x0080,0x0000,0x0000, // u04b7 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4900,0x4900,0x4900,0x3f00,0x0900,0x0900,0x0900,0x0100,0x0100,0x0100, 0x0000,0x0000,0x0000,0x0000, // u04b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4900,0x4900,0x3f00,0x0900,0x0900,0x0100,0x0100, 0x0000,0x0000,0x0000,0x0000, // u04b9 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u04ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u04bb 0x0000,0x0000,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u04c0 0x2200,0x1c00,0x0000,0x4900,0x4900,0x4900,0x4900,0x4900,0x2a00,0x1c00,0x2a00,0x4900,0x4900,0x4900,0x4900,0x4900, 0x0000,0x0000,0x0000,0x0000, // u04c1 0x0000,0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x4900,0x4900,0x4900,0x2a00,0x1c00,0x2a00,0x4900,0x4900,0x4900, 0x0000,0x0000,0x0000,0x0000, // u04c2 0x0000,0x0000,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u04cf 0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u04d0 0x0000,0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x3e00,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u04d1 0x2200,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u04d2 0x0000,0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x3e00,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u04d3 0x0000,0x0000,0x0000,0x7f80,0x8800,0x8800,0x8800,0x8800,0x8800,0xff00,0x8800,0x8800,0x8800,0x8800,0x8800,0x8f80, 0x0000,0x0000,0x0000,0x0000, // u04d4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7700,0x0880,0x0880,0x7880,0x8f80,0x8800,0x8800,0x8880,0x7700, 0x0000,0x0000,0x0000,0x0000, // u04d5 0x2200,0x1c00,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u04d6 0x0000,0x0000,0x0000,0x0000,0x2200,0x1c00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u04d7 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x0100,0x0100,0x0100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u04d8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x0100,0x0100,0x7f00,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u04d9 0x2200,0x2200,0x0000,0x3e00,0x4100,0x4100,0x0100,0x0100,0x0100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u04da 0x0000,0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x3e00,0x4100,0x0100,0x0100,0x7f00,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u04db 0x2200,0x2200,0x0000,0x4900,0x4900,0x4900,0x4900,0x4900,0x2a00,0x1c00,0x2a00,0x4900,0x4900,0x4900,0x4900,0x4900, 0x0000,0x0000,0x0000,0x0000, // u04dc 0x0000,0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x4900,0x4900,0x4900,0x2a00,0x1c00,0x2a00,0x4900,0x4900,0x4900, 0x0000,0x0000,0x0000,0x0000, // u04dd 0x2200,0x2200,0x0000,0x3e00,0x4100,0x4100,0x0100,0x0100,0x0100,0x1e00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u04de 0x0000,0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x3e00,0x4100,0x0100,0x0100,0x1e00,0x0100,0x0100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u04df 0x0000,0x3e00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4300,0x4500,0x4900,0x5100,0x6100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u04e2 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u04e3 0x2200,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4300,0x4500,0x4900,0x5100,0x6100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u04e4 0x0000,0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u04e5 0x2200,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u04e6 0x0000,0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u04e7 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u04e8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u04e9 0x2200,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u04ea 0x0000,0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u04eb 0x2200,0x2200,0x0000,0x3e00,0x4100,0x4100,0x0100,0x0100,0x0100,0x1f00,0x0100,0x0100,0x0100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u04ec 0x0000,0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x3e00,0x4100,0x0100,0x0100,0x1f00,0x0100,0x0100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u04ed 0x0000,0x3e00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100,0x0100,0x0100,0x0100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u04ee 0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0100,0x0100,0x3e00,0x0000, // u04ef 0x2200,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100,0x0100,0x0100,0x0100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u04f0 0x0000,0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0100,0x0100,0x3e00,0x0000, // u04f1 0x1100,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100,0x0100,0x0100,0x0100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u04f2 0x0000,0x0000,0x0000,0x0000,0x1100,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0100,0x0100,0x3e00,0x0000, // u04f3 0x2200,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0000,0x0000,0x0000,0x0000, // u04f4 0x0000,0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x4100,0x4100,0x4100,0x4100,0x3f00,0x0100,0x0100,0x0100,0x0100, 0x0000,0x0000,0x0000,0x0000, // u04f5 0x2200,0x2200,0x0000,0x4080,0x4080,0x4080,0x4080,0x7880,0x4480,0x4480,0x4480,0x4480,0x4480,0x4480,0x4480,0x7880, 0x0000,0x0000,0x0000,0x0000, // u04f8 0x0000,0x0000,0x0000,0x0000,0x2200,0x2200,0x0000,0x4080,0x4080,0x4080,0x7880,0x4480,0x4480,0x4480,0x4480,0x7880, 0x0000,0x0000,0x0000,0x0000, // u04f9 0x0000,0x0000,0x0000,0x2080,0x2080,0x1080,0x1080,0x0880,0x0900,0x1600,0x2400,0x4400,0x4200,0x4200,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u05d0 0x0000,0x0000,0x0000,0x7e00,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u05d1 0x0000,0x0000,0x0000,0x3c00,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0600,0x0900,0x1100,0x2080,0x4080, 0x0000,0x0000,0x0000,0x0000, // u05d2 0x0000,0x0000,0x0000,0x7f80,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0000,0x0000,0x0000,0x0000, // u05d3 0x0000,0x0000,0x0000,0x7e00,0x0100,0x0100,0x0100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u05d4 0x0000,0x0000,0x0000,0x3000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u05d5 0x0000,0x0000,0x0000,0x0000,0x3f00,0x0200,0x0400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u05d6 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u05d7 0x0000,0x0000,0x0000,0x4600,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u05d8 0x0000,0x0000,0x0000,0x3000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u05d9 0x0000,0x0000,0x0000,0x7e00,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0100,0x0100,0x0100,0x0000, // u05da 0x0000,0x0000,0x0000,0x7e00,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x7e00, 0x0000,0x0000,0x0000,0x0000, // u05db 0x0000,0x4000,0x4000,0x7f00,0x0100,0x0100,0x0100,0x0100,0x0100,0x0200,0x0400,0x0800,0x1000,0x1000,0x1000,0x1000, 0x0000,0x0000,0x0000,0x0000, // u05dc 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u05dd 0x0000,0x0000,0x0000,0x0000,0xdc00,0x6200,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4700, 0x0000,0x0000,0x0000,0x0000, // u05de 0x0000,0x0000,0x0000,0x7800,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000, // u05df 0x0000,0x0000,0x0000,0x3c00,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u05e0 0x0000,0x0000,0x0000,0xfe00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u05e1 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x2100,0x2100,0x2100,0x1100,0x1100,0x0a00,0x0a00,0x0c00,0x1800,0x6000, 0x0000,0x0000,0x0000,0x0000, // u05e2 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0100,0x0100,0x0100,0x0000, // u05e3 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x3100,0x0100,0x0100,0x0100,0x0100,0x0100,0x7e00, 0x0000,0x0000,0x0000,0x0000, // u05e4 0x0000,0x0000,0x0000,0x4100,0x4100,0x2100,0x2100,0x1100,0x1200,0x0c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0000, // u05e5 0x0000,0x0000,0x0000,0x4100,0x4100,0x2100,0x2100,0x1100,0x1200,0x0c00,0x0800,0x0400,0x0400,0x0200,0x0200,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u05e6 0x0000,0x0000,0x0000,0x7f00,0x0100,0x0100,0x0100,0x4100,0x4100,0x4200,0x4400,0x4800,0x4800,0x4800,0x4800,0x4800, 0x4000,0x4000,0x4000,0x0000, // u05e7 0x0000,0x0000,0x0000,0x7e00,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0000,0x0000,0x0000,0x0000, // u05e8 0x0000,0x0000,0x0000,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x5100,0x6100,0x4100,0x4100,0x4100,0x4200,0x7c00, 0x0000,0x0000,0x0000,0x0000, // u05e9 0x0000,0x0000,0x0000,0xfe00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x8100, 0x0000,0x0000,0x0000,0x0000, // u05ea 0x0000,0x0000,0x0000,0x7c00,0x4200,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4200,0x7c00, 0x0000,0x1000,0x1000,0x0000, // u1e0c 0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0100,0x3f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0800,0x0800,0x0000, // u1e0d 0x0000,0x0000,0x0000,0x4100,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100,0x4100, 0x0000,0x3e00,0x0000,0x0000, // u1e34 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4100,0x4200,0x4400,0x4800,0x7000,0x4800,0x4400,0x4200,0x4100, 0x0000,0x3e00,0x0000,0x0000, // u1e35 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00, 0x0000,0x0800,0x0800,0x0000, // u1e36 0x0000,0x0000,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0800,0x0800,0x0000, // u1e37 0x0800,0x0800,0x0000,0x4080,0x6180,0x5280,0x5280,0x4c80,0x4c80,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x0000,0x0000,0x0000,0x0000, // u1e40 0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x7e00,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900, 0x0000,0x0000,0x0000,0x0000, // u1e41 0x0000,0x0000,0x0000,0x4080,0x6180,0x5280,0x5280,0x4c80,0x4c80,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x0000,0x0800,0x0800,0x0000, // u1e42 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900,0x4900, 0x0000,0x0800,0x0800,0x0000, // u1e43 0x0800,0x0800,0x0000,0x4100,0x4100,0x4100,0x4100,0x6100,0x5100,0x4900,0x4500,0x4300,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u1e44 0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u1e45 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x6100,0x5100,0x4900,0x4500,0x4300,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0800,0x0800,0x0000, // u1e46 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0800,0x0800,0x0000, // u1e47 0x0000,0x0000,0x0000,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0800,0x0800,0x0000, // u1e6c 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x3e00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0700, 0x0000,0x0200,0x0200,0x0000, // u1e6d 0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00, 0x0000,0x0800,0x0800,0x0000, // u1eb8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00, 0x0000,0x0800,0x0800,0x0000, // u1eb9 0x3300,0x4c00,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u1ebc 0x0000,0x0000,0x0000,0x0000,0x3300,0x4c00,0x0000,0x3e00,0x4100,0x4100,0x4100,0x7f00,0x4000,0x4000,0x4100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u1ebd 0x0000,0x0000,0x0000,0x1c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0800,0x0800,0x0000, // u1eca 0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1c00, 0x0000,0x0800,0x0800,0x0000, // u1ecb 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0800,0x0800,0x0000, // u1ecc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0800,0x0800,0x0000, // u1ecd 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00, 0x0000,0x0800,0x0800,0x0000, // u1ee4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0000,0x0800,0x0800,0x0000, // u1ee5 0x3300,0x4c00,0x0000,0x4100,0x4100,0x2200,0x2200,0x1400,0x1400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u1ef8 0x0000,0x0000,0x0000,0x0000,0x3300,0x4c00,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3f00, 0x0100,0x0100,0x3e00,0x0000, // u1ef9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2001 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2002 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2003 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2004 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2005 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2006 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2007 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2008 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2009 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u200a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u200b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u200c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u200d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u200e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u200f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2010 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2011 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2012 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2013 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2014 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2015 0x0000,0x0000,0x0000,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400, 0x0000,0x0000,0x0000,0x0000, // u2016 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x7f00,0x0000,0x7f00, // u2017 0x0000,0x0400,0x0800,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2018 0x0000,0x0800,0x0800,0x0800,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2019 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0800, 0x1000,0x0000,0x0000,0x0000, // u201a 0x0000,0x1000,0x1000,0x1000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u201b 0x0000,0x1100,0x2200,0x2200,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u201c 0x0000,0x1100,0x1100,0x1100,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u201d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2200,0x2200,0x2200, 0x4400,0x0000,0x0000,0x0000, // u201e 0x0000,0x4400,0x4400,0x4400,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u201f 0x0000,0x0000,0x0000,0x0800,0x0800,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u2020 0x0000,0x0000,0x0000,0x0800,0x0800,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x7f00,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u2021 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x1e00,0x1e00,0x0c00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2022 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4900,0x4900, 0x0000,0x0000,0x0000,0x0000, // u2026 0x0000,0x0000,0x0000,0x0000,0xe400,0xa400,0xe800,0x0800,0x1000,0x1000,0x2000,0x2000,0x4000,0x5dc0,0x9540,0x9dc0, 0x0000,0x0000,0x0000,0x0000, // u2030 0x0000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2032 0x0000,0x2200,0x2200,0x2200,0x2200,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2033 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0200,0x0400,0x0800,0x1000,0x2000,0x1000,0x0800,0x0400,0x0200, 0x0000,0x0000,0x0000,0x0000, // u2039 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0400,0x0800,0x1000,0x2000, 0x0000,0x0000,0x0000,0x0000, // u203a 0x0000,0x0000,0x0000,0x2200,0x2200,0x2200,0x2200,0x2200,0x2200,0x2200,0x2200,0x2200,0x0000,0x0000,0x2200,0x2200, 0x0000,0x0000,0x0000,0x0000, // u203c 0x0000,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u203e 0x0000,0x1c00,0x2200,0x2200,0x2200,0x2200,0x2200,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2070 0x0800,0x0800,0x0000,0x1800,0x0800,0x0800,0x0800,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2071 0x0000,0x0200,0x0600,0x0a00,0x1200,0x3f00,0x0200,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2074 0x0000,0x3c00,0x2000,0x2000,0x3c00,0x0200,0x0200,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2075 0x0000,0x1c00,0x2000,0x2000,0x3c00,0x2200,0x2200,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2076 0x0000,0x3e00,0x0200,0x0400,0x0400,0x0800,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2077 0x0000,0x1c00,0x2200,0x2200,0x1c00,0x2200,0x2200,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2078 0x0000,0x1c00,0x2200,0x2200,0x1e00,0x0200,0x0200,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2079 0x0000,0x0000,0x0800,0x0800,0x3e00,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u207a 0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u207b 0x0000,0x0000,0x0000,0x3e00,0x0000,0x0000,0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u207c 0x0000,0x0400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u207d 0x0000,0x0800,0x0400,0x0400,0x0400,0x0400,0x0400,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u207e 0x0000,0x0000,0x3c00,0x2200,0x2200,0x2200,0x2200,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u207f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x2200,0x2200,0x2200,0x2200,0x2200, 0x1c00,0x0000,0x0000,0x0000, // u2080 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1800,0x0800,0x0800,0x0800,0x0800, 0x1c00,0x0000,0x0000,0x0000, // u2081 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x2200,0x2200,0x0400,0x0800,0x1000, 0x3e00,0x0000,0x0000,0x0000, // u2082 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x2200,0x0200,0x0c00,0x0200,0x2200, 0x1c00,0x0000,0x0000,0x0000, // u2083 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0200,0x0600,0x0a00,0x1200,0x3f00,0x0200, 0x0200,0x0000,0x0000,0x0000, // u2084 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x2000,0x2000,0x3c00,0x0200,0x0200, 0x3c00,0x0000,0x0000,0x0000, // u2085 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x2000,0x2000,0x3c00,0x2200,0x2200, 0x1c00,0x0000,0x0000,0x0000, // u2086 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0200,0x0400,0x0400,0x0800,0x0800, 0x0800,0x0000,0x0000,0x0000, // u2087 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x2200,0x2200,0x1c00,0x2200,0x2200, 0x1c00,0x0000,0x0000,0x0000, // u2088 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x2200,0x2200,0x1e00,0x0200,0x0200, 0x1c00,0x0000,0x0000,0x0000, // u2089 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x3e00,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u208a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u208b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0000,0x0000,0x3e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u208c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0400,0x0000,0x0000,0x0000, // u208d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0800,0x0000,0x0000,0x0000, // u208e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0200,0x1e00,0x2200,0x2200, 0x1e00,0x0000,0x0000,0x0000, // u2090 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x2200,0x3e00,0x2000,0x2000, 0x1e00,0x0000,0x0000,0x0000, // u2091 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x2200,0x2200,0x2200,0x2200, 0x1c00,0x0000,0x0000,0x0000, // u2092 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2200,0x1400,0x0800,0x0800,0x1400, 0x2200,0x0000,0x0000,0x0000, // u2093 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x0200,0x0200,0x3e00,0x2200, 0x1c00,0x0000,0x0000,0x0000, // u2094 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x3c00,0x2200,0x2200,0x2200,0x2200, 0x2200,0x0000,0x0000,0x0000, // u2095 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2200,0x2400,0x2800,0x3800,0x2400, 0x2200,0x0000,0x0000,0x0000, // u2096 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x1c00,0x0000,0x0000,0x0000, // u2097 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4900,0x4900,0x4900,0x4900, 0x4900,0x0000,0x0000,0x0000, // u2098 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x2200,0x2200,0x2200,0x2200, 0x3c00,0x2000,0x2000,0x0000, // u209a 0x0000,0x0000,0x0000,0x7800,0x4400,0x4400,0x4400,0x4400,0x4400,0x7a00,0x4200,0x4700,0x4200,0x4200,0x4200,0x4100, 0x0000,0x0000,0x0000,0x0000, // u20a7 0x0000,0x0000,0x0000,0x7900,0x4500,0x4500,0x4500,0x5500,0x5500,0x5500,0x5500,0x5500,0x5100,0x5100,0x5100,0x5e00, 0x0000,0x0000,0x0000,0x0000, // u20aa 0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4000,0xfc00,0x4000,0x4000,0xfc00,0x4000,0x4080,0x2100,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u20ac 0x0000,0x0000,0x0000,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0e00,0x3800,0x0e00,0x3800,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u20ae 0x0000,0x0000,0x0000,0x3e00,0x5100,0x5100,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5100,0x5100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u2102 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u210e 0x0000,0x0000,0x0000,0x4000,0xf800,0x4000,0x4000,0x7e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u210f 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x6100,0x5100,0x6900,0x5500,0x4b00,0x4500,0x4300,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u2115 0x0000,0x0000,0x0000,0x8400,0x8480,0xc540,0xc540,0xa480,0xa400,0x9400,0x9400,0x8dc0,0x8c00,0x85c0,0x8400,0x8400, 0x0000,0x0000,0x0000,0x0000, // u2116 0x0000,0x0000,0x0000,0x3e00,0x5100,0x5100,0x5100,0x5100,0x5100,0x5100,0x5100,0x5100,0x5100,0x5100,0x5500,0x3e00, 0x0100,0x0080,0x0000,0x0000, // u211a 0x0000,0x0000,0x0000,0x7e00,0x5100,0x5100,0x5100,0x5100,0x5100,0x5e00,0x5800,0x5400,0x5a00,0x5500,0x5280,0x7180, 0x0000,0x0000,0x0000,0x0000, // u211d 0x0000,0x0000,0x0000,0xe880,0x4d80,0x4a80,0x4880,0x4880,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2122 0x0000,0x0000,0x0000,0x7f00,0x0100,0x0100,0x0300,0x0500,0x0a00,0x1400,0x2800,0x5000,0x6000,0x4000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u2124 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x2200,0x1400,0x1400,0x7700, 0x0000,0x0000,0x0000,0x0000, // u2126 0x0000,0x0000,0x0000,0x0000,0x4200,0x4200,0x2100,0x2100,0x1080,0x3100,0x4a00,0x8c00,0x8400,0x8400,0x8200,0x4200, 0x0000,0x0000,0x0000,0x0000, // u2135 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x2000,0x4000,0xff80,0x4000,0x2000,0x1000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2190 0x0000,0x0000,0x0000,0x0800,0x1c00,0x2a00,0x4900,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u2191 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0200,0x0100,0xff80,0x0100,0x0200,0x0400,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2192 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x4900,0x2a00,0x1c00,0x0800, 0x0000,0x0000,0x0000,0x0000, // u2193 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1200,0x2100,0x4080,0xffc0,0x4080,0x2100,0x1200,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2194 0x0000,0x0000,0x0000,0x0800,0x1c00,0x2a00,0x4900,0x0800,0x0800,0x0800,0x0800,0x0800,0x4900,0x2a00,0x1c00,0x0800, 0x0000,0x0000,0x0000,0x0000, // u2195 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1080,0x2080,0x4080,0xff80,0x4080,0x2080,0x1080,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u21a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8400,0x8200,0x8100,0xff80,0x8100,0x8200,0x8400,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u21a6 0x0000,0x0000,0x0000,0x0800,0x1c00,0x2a00,0x4900,0x0800,0x0800,0x0800,0x0800,0x4900,0x2a00,0x1c00,0x0800,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u21a8 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x1080,0x2080,0x4080,0xff80,0x4000,0x2000,0x1000, 0x0000,0x0000,0x0000,0x0000, // u21b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x7800,0x1800,0x2800,0x4880,0x4080,0x4080,0x4080,0x2100,0x1e00,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u21bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x2000,0x4000,0xff80,0x0000,0xff80,0x0100,0x0200,0x0400,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u21cb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0200,0x0100,0xff80,0x0000,0xff80,0x4000,0x2000,0x1000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u21cc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x2000,0x7f80,0xc000,0x7f80,0x2000,0x1000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u21d0 0x0000,0x0000,0x0000,0x0800,0x1c00,0x3600,0x5500,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400, 0x0000,0x0000,0x0000,0x0000, // u21d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0200,0xff00,0x0180,0xff00,0x0200,0x0400,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u21d2 0x0000,0x0000,0x0000,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x5500,0x3600,0x1c00,0x0800, 0x0000,0x0000,0x0000,0x0000, // u21d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1200,0x2100,0x7f80,0xc0c0,0x7f80,0x2100,0x1200,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u21d4 0x0000,0x0000,0x0000,0x0800,0x1c00,0x3600,0x5500,0x1400,0x1400,0x1400,0x1400,0x1400,0x5500,0x3600,0x1c00,0x0800, 0x0000,0x0000,0x0000,0x0000, // u21d5 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x7f00,0x2200,0x2200,0x2200,0x1400,0x1400,0x1400,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u2200 0x0000,0x0000,0x0000,0x7f00,0x0100,0x0100,0x0100,0x0100,0x0100,0x7f00,0x0100,0x0100,0x0100,0x0100,0x0100,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u2203 0x0000,0x0100,0x0100,0x7f00,0x0300,0x0500,0x0500,0x0900,0x0900,0x7f00,0x1100,0x1100,0x2100,0x2100,0x4100,0x7f00, 0x8000,0x8000,0x0000,0x0000, // u2204 0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x3e00,0x4500,0x4500,0x4900,0x5100,0x5100,0x3e00,0x2000,0x4000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2205 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x1400,0x1400,0x1400,0x2200,0x2200,0x2200,0x4100,0x4100,0x4100,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u2206 0x0000,0x0000,0x0000,0x7f00,0x4100,0x4100,0x4100,0x2200,0x2200,0x2200,0x1400,0x1400,0x1400,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u2207 0x0000,0x0000,0x0000,0x0f00,0x1000,0x2000,0x4000,0x4000,0x4000,0x7f00,0x4000,0x4000,0x4000,0x2000,0x1000,0x0f00, 0x0000,0x0000,0x0000,0x0000, // u2208 0x0000,0x0080,0x0080,0x0f00,0x1100,0x2200,0x4200,0x4400,0x4400,0x7f00,0x4800,0x4800,0x5000,0x3000,0x3000,0x2f00, 0x4000,0x4000,0x0000,0x0000, // u2209 0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2000,0x4000,0x4000,0x7f00,0x4000,0x4000,0x2000,0x1f00,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u220a 0x0000,0x0000,0x0000,0x7800,0x0400,0x0200,0x0100,0x0100,0x0100,0x7f00,0x0100,0x0100,0x0100,0x0200,0x0400,0x7800, 0x0000,0x0000,0x0000,0x0000, // u220b 0x0000,0x4000,0x4000,0x3c00,0x2200,0x1100,0x1080,0x0880,0x0880,0x3f80,0x0480,0x0480,0x0280,0x0300,0x0300,0x3d00, 0x0080,0x0080,0x0000,0x0000, // u220c 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0200,0x0100,0x0100,0x7f00,0x0100,0x0100,0x0200,0x7c00,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u220d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2212 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0000,0x0000,0x0800,0x0800,0x0800,0x7f00,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u2213 0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0800,0x0800,0x0800,0x7f00,0x0800,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u2214 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2215 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0100,0x0080,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2216 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2219 0x0000,0x0380,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x4200,0x4200,0x4200,0x2200,0x1200,0x0a00,0x0600, 0x0000,0x0000,0x0000,0x0000, // u221a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3600,0x4900,0x4900,0x4900,0x4900,0x3600,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u221e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u221f 0x0000,0x0000,0x0000,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400, 0x0000,0x0000,0x0000,0x0000, // u2225 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x1400,0x1400,0x2200,0x2200,0x2200,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u2227 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x2200,0x2200,0x2200,0x1400,0x1400,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u2228 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x2200,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u2229 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x2200,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u222a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3100,0x4900,0x4600,0x0000,0x3100,0x4900,0x4600,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2248 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x7f00,0x0400,0x0800,0x1000,0x7f00,0x4000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2260 0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0000,0x0000,0x0000,0x7f00,0x0000,0x0000,0x0000,0x7f00,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2261 0x0000,0x0000,0x0000,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u2264 0x0000,0x0000,0x0000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x0000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u2265 0x0000,0x0000,0x0000,0x0000,0x0440,0x0880,0x1100,0x2200,0x4400,0x8800,0x4400,0x2200,0x1100,0x0880,0x0440,0x0000, 0x0000,0x0000,0x0000,0x0000, // u226a 0x0000,0x0000,0x0000,0x0000,0x8800,0x4400,0x2200,0x1100,0x0880,0x0440,0x0880,0x1100,0x2200,0x4400,0x8800,0x0000, 0x0000,0x0000,0x0000,0x0000, // u226b 0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2000,0x4000,0x4000,0x4000,0x4000,0x4000,0x2000,0x1f00,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2282 0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x0200,0x0100,0x0100,0x0100,0x0100,0x0100,0x0200,0x7c00,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2283 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2000,0x4000,0x4000,0x4000,0x4000,0x4000,0x2000,0x1f00,0x0000,0x7f00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2286 0x0000,0x0000,0x0000,0x0000,0x7c00,0x0200,0x0100,0x0100,0x0100,0x0100,0x0100,0x0200,0x7c00,0x0000,0x7f00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2287 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u22a5 0x0000,0x0000,0x0000,0x1c00,0x2200,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u22c2 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x2200,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u22c3 0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x3e00,0x4500,0x4500,0x4900,0x5100,0x5100,0x3e00,0x2000,0x4000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2300 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1400,0x2200,0x4100,0x8080,0x8080,0x8080,0x8080,0x8080,0xff80, 0x0000,0x0000,0x0000,0x0000, // u2302 0x0000,0x0000,0x0000,0x1c00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, 0x0000,0x0000,0x0000,0x0000, // u2308 0x0000,0x0000,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0000,0x0000,0x0000,0x0000, // u2309 0x0000,0x0000,0x0000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u230a 0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x1c00, 0x0000,0x0000,0x0000,0x0000, // u230b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2310 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2319 0x0000,0x0000,0x0000,0x0600,0x0900,0x0900,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u2320 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x4800,0x4800,0x3000, 0x0000,0x0000,0x0000,0x0000, // u2321 0x0100,0x0200,0x0400,0x0400,0x0800,0x0800,0x0800,0x1000,0x1000,0x1000,0x1000,0x2000,0x2000,0x2000,0x2000,0x2000, 0x2000,0x2000,0x2000,0x2000, // u239b 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, 0x2000,0x2000,0x2000,0x2000, // u239c 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x1000,0x1000,0x1000,0x1000,0x0800,0x0800,0x0800, 0x0400,0x0400,0x0200,0x0100, // u239d 0x2000,0x1000,0x0800,0x0800,0x0400,0x0400,0x0400,0x0200,0x0200,0x0200,0x0200,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0100,0x0100,0x0100,0x0100, // u239e 0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0100,0x0100,0x0100,0x0100, // u239f 0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0200,0x0200,0x0200,0x0200,0x0400,0x0400,0x0400, 0x0800,0x0800,0x1000,0x2000, // u23a0 0x3f00,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, 0x2000,0x2000,0x2000,0x2000, // u23a1 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, 0x2000,0x2000,0x2000,0x2000, // u23a2 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, 0x2000,0x2000,0x2000,0x3f00, // u23a3 0x3f00,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0100,0x0100,0x0100,0x0100, // u23a4 0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0100,0x0100,0x0100,0x0100, // u23a5 0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0100,0x0100,0x0100,0x3f00, // u23a6 0x0380,0x0c00,0x0800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, 0x1000,0x1000,0x1000,0x1000, // u23a7 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x2000,0xc000,0xc000,0x2000,0x1000,0x1000,0x1000,0x1000, 0x1000,0x1000,0x1000,0x1000, // u23a8 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, 0x1000,0x0800,0x0c00,0x0380, // u23a9 0xe000,0x1800,0x0800,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400, // u23ab 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0200,0x0180,0x0180,0x0200,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400, // u23ac 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0800,0x1800,0xe000, // u23ad 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u23ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u23af 0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u23ba 0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u23bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x0000, 0x0000,0x0000,0x0000,0x0000, // u23bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0xffc0, // u23bd 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u23d0 0x0000,0x0000,0x4400,0x4400,0x4400,0x7c00,0x4400,0x4400,0x4400,0x0000,0x0f80,0x0200,0x0200,0x0200,0x0200,0x0200, 0x0200,0x0000,0x0000,0x0000, // u2409 0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7c00,0x0000,0x0f80,0x0800,0x0800,0x0e00,0x0800,0x0800, 0x0800,0x0000,0x0000,0x0000, // u240a 0x0000,0x0000,0x4400,0x4400,0x4400,0x2800,0x2800,0x1000,0x1000,0x0000,0x0f80,0x0200,0x0200,0x0200,0x0200,0x0200, 0x0200,0x0000,0x0000,0x0000, // u240b 0x0000,0x0000,0x7c00,0x4000,0x4000,0x7000,0x4000,0x4000,0x4000,0x0000,0x0f80,0x0800,0x0800,0x0e00,0x0800,0x0800, 0x0800,0x0000,0x0000,0x0000, // u240c 0x0000,0x0000,0x3800,0x4400,0x4000,0x4000,0x4000,0x4400,0x3800,0x0000,0x0f00,0x0880,0x0880,0x0f00,0x0a00,0x0900, 0x0880,0x0000,0x0000,0x0000, // u240d 0x0000,0x0000,0x4400,0x4400,0x6400,0x5400,0x4c00,0x4400,0x4400,0x0000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0f80,0x0000,0x0000,0x0000, // u2424 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2500 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2501 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u2502 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2503 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xd680,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2508 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xd680,0xd680,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2509 0x0800,0x0800,0x0800,0x0800,0x0000,0x0800,0x0800,0x0800,0x0800,0x0000,0x0800,0x0800,0x0800,0x0800,0x0000,0x0800, 0x0800,0x0800,0x0800,0x0000, // u250a 0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0c00, 0x0c00,0x0c00,0x0c00,0x0000, // u250b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u250c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0fc0,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u250d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u250e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u250f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u2510 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u2511 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2512 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2513 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2514 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2515 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2516 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2517 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2518 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xf800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2519 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u251a 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u251b 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0fc0,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u251c 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0fc0,0x0fc0,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u251d 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u251e 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u251f 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2520 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0x0fc0,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u2521 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0fc0,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2522 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2523 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xf800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u2524 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xf800,0xf800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u2525 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u2526 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2527 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2528 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u2529 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u252a 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u252b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u252c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xf800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u252d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x0fc0,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u252e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u252f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2530 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2531 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2532 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2533 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2534 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xffc0,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2535 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xffc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2536 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2537 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2538 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2539 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u253a 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u253b 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xffc0,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u253c 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xffc0,0xf800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u253d 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xffc0,0x0fc0,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u253e 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xffc0,0xffc0,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u253f 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u2540 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2541 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2542 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0xf800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u2543 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0x0fc0,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u2544 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xffc0,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2545 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xffc0,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2546 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0xffc0,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u2547 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2548 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2549 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u254a 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u254b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x0000,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2550 0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400, 0x1400,0x1400,0x1400,0x1400, // u2551 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0800,0x0fc0,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u2552 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400, 0x1400,0x1400,0x1400,0x1400, // u2553 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x1000,0x17c0,0x1400,0x1400,0x1400,0x1400,0x1400, 0x1400,0x1400,0x1400,0x1400, // u2554 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0x0800,0xf800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u2555 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400, 0x1400,0x1400,0x1400,0x1400, // u2556 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0x0400,0xf400,0x1400,0x1400,0x1400,0x1400,0x1400, 0x1400,0x1400,0x1400,0x1400, // u2557 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0fc0,0x0800,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2558 0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2559 0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x17c0,0x1000,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u255a 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xf800,0x0800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u255b 0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u255c 0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0xf400,0x0400,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u255d 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0fc0,0x0800,0x0fc0,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u255e 0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x17c0,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400, 0x1400,0x1400,0x1400,0x1400, // u255f 0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x17c0,0x1000,0x17c0,0x1400,0x1400,0x1400,0x1400,0x1400, 0x1400,0x1400,0x1400,0x1400, // u2560 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xf800,0x0800,0xf800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u2561 0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0xf400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400, 0x1400,0x1400,0x1400,0x1400, // u2562 0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0xf400,0x0400,0xf400,0x1400,0x1400,0x1400,0x1400,0x1400, 0x1400,0x1400,0x1400,0x1400, // u2563 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x0000,0xffc0,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u2564 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400, 0x1400,0x1400,0x1400,0x1400, // u2565 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x0000,0xf7c0,0x1400,0x1400,0x1400,0x1400,0x1400, 0x1400,0x1400,0x1400,0x1400, // u2566 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xffc0,0x0000,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2567 0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2568 0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0xf7c0,0x0000,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2569 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0xffc0,0x0800,0xffc0,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u256a 0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0xffc0,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400, 0x1400,0x1400,0x1400,0x1400, // u256b 0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0xf7c0,0x0000,0xf7c0,0x1400,0x1400,0x1400,0x1400,0x1400, 0x1400,0x1400,0x1400,0x1400, // u256c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x0200,0x0400,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u256d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0x2000,0x1000,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u256e 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1000,0x2000,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u256f 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0400,0x0200,0x01c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2570 0x0040,0x0040,0x0080,0x0080,0x0100,0x0100,0x0200,0x0200,0x0400,0x0400,0x0800,0x0800,0x1000,0x1000,0x2000,0x2000, 0x4000,0x4000,0x8000,0x8000, // u2571 0x8000,0x8000,0x4000,0x4000,0x2000,0x2000,0x1000,0x1000,0x0800,0x0800,0x0400,0x0400,0x0200,0x0200,0x0100,0x0100, 0x0080,0x0080,0x0040,0x0040, // u2572 0x8040,0x8040,0x4080,0x4080,0x2100,0x2100,0x1200,0x1200,0x0c00,0x0c00,0x0c00,0x0c00,0x1200,0x1200,0x2100,0x2100, 0x4080,0x4080,0x8040,0x8040, // u2573 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2574 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2575 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2576 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u2577 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2578 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2579 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u257a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u257b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u257c 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u257d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u257e 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800, // u257f 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2580 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0xffc0,0xffc0, // u2581 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0, 0xffc0,0xffc0,0xffc0,0xffc0, // u2582 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0xffc0,0xffc0, // u2583 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0xffc0,0xffc0, // u2584 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0xffc0,0xffc0, // u2585 0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0xffc0,0xffc0, // u2586 0x0000,0x0000,0x0000,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0xffc0,0xffc0, // u2587 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0xffc0,0xffc0, // u2588 0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80, 0xff80,0xff80,0xff80,0xff80, // u2589 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, 0xfe00,0xfe00,0xfe00,0xfe00, // u258a 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, 0xfc00,0xfc00,0xfc00,0xfc00, // u258b 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, 0xf800,0xf800,0xf800,0xf800, // u258c 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, 0xf000,0xf000,0xf000,0xf000, // u258d 0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000, 0xc000,0xc000,0xc000,0xc000, // u258e 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, 0x8000,0x8000,0x8000,0x8000, // u258f 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, 0x07c0,0x07c0,0x07c0,0x07c0, // u2590 0xaa80,0x0000,0xaa80,0x0000,0xaa80,0x0000,0xaa80,0x0000,0xaa80,0x0000,0xaa80,0x0000,0xaa80,0x0000,0xaa80,0x0000, 0xaa80,0x0000,0xaa80,0x0000, // u2591 0xaa80,0x5540,0xaa80,0x5540,0xaa80,0x5540,0xaa80,0x5540,0xaa80,0x5540,0xaa80,0x5540,0xaa80,0x5540,0xaa80,0x5540, 0xaa80,0x5540,0xaa80,0x5540, // u2592 0xffc0,0xaa80,0xffc0,0xaa80,0xffc0,0xaa80,0xffc0,0xaa80,0xffc0,0xaa80,0xffc0,0xaa80,0xffc0,0xaa80,0xffc0,0xaa80, 0xffc0,0xaa80,0xffc0,0xaa80, // u2593 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, 0xf800,0xf800,0xf800,0xf800, // u2596 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, 0x07c0,0x07c0,0x07c0,0x07c0, // u2597 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2598 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0xffc0,0xffc0, // u2599 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, 0x07c0,0x07c0,0x07c0,0x07c0, // u259a 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, 0xf800,0xf800,0xf800,0xf800, // u259b 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, 0x07c0,0x07c0,0x07c0,0x07c0, // u259c 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u259d 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, 0xf800,0xf800,0xf800,0xf800, // u259e 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0xffc0,0xffc0, // u259f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x3e00,0x3e00,0x3e00,0x3e00,0x3e00,0x3e00,0x3e00,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u25a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x7f80,0x7f80,0x7f80,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u25ac 0x0000,0x0000,0x0000,0x7f00,0x7f00,0x7f00,0x7f00,0x7f00,0x7f00,0x7f00,0x7f00,0x7f00,0x7f00,0x7f00,0x7f00,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u25ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x1c00,0x1c00,0x3e00,0x3e00,0x7f00,0x7f00,0xff80,0xff80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u25b2 0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xffc0,0xff00,0xfc00,0xf000,0xc000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u25b6 0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xffc0,0xff00,0xfc00,0xf000,0xc000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u25ba 0x0000,0x0000,0x0000,0x0000,0x0000,0xff80,0xff80,0x7f00,0x7f00,0x3e00,0x3e00,0x1c00,0x1c00,0x0800,0x0800,0x0000, 0x0000,0x0000,0x0000,0x0000, // u25bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x03c0,0x0fc0,0x3fc0,0xffc0,0x3fc0,0x0fc0,0x03c0,0x00c0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u25c0 0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x03c0,0x0fc0,0x3fc0,0xffc0,0x3fc0,0x0fc0,0x03c0,0x00c0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u25c4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1c00,0x3e00,0x7f00,0xff80,0x7f00,0x3e00,0x1c00,0x0800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u25c6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1400,0x2200,0x4100,0x8080,0x4100,0x2200,0x1400,0x0800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u25ca 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x2100,0x2100,0x2100,0x1e00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u25cb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3f00,0x3f00,0x3f00,0x3f00,0x1e00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u25cf 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xf3c0,0xe1c0,0xe1c0,0xf3c0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0xffc0,0xffc0, // u25d8 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xe1c0,0xdec0,0xdec0,0xdec0,0xdec0,0xe1c0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0xffc0,0xffc0, // u25d9 0x0000,0x0000,0x0000,0x7f00,0x8080,0x8080,0xb680,0xb680,0x8080,0x8080,0xbe80,0x9c80,0x8080,0x8080,0x8080,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u263a 0x0000,0x0000,0x0000,0x7f00,0xff80,0xff80,0xc980,0xc980,0xff80,0xff80,0xc180,0xe380,0xff80,0xff80,0xff80,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u263b 0x0000,0x0000,0x0000,0x0800,0x0800,0x8880,0x4900,0x2a00,0x1c00,0xf780,0x1c00,0x2a00,0x4900,0x8880,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u263c 0x0000,0x0000,0x0000,0x3e00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x3e00,0x0800,0x0800,0x7f00,0x0800,0x0800, 0x0000,0x0000,0x0000,0x0000, // u2640 0x0000,0x0000,0x0000,0x0f80,0x0180,0x0280,0x0480,0x0880,0x7c00,0x8200,0x8200,0x8200,0x8200,0x8200,0x8200,0x7c00, 0x0000,0x0000,0x0000,0x0000, // u2642 0x0000,0x0000,0x0000,0x0800,0x0800,0x1c00,0x3e00,0x7f00,0xff80,0xff80,0xff80,0xff80,0x6b00,0x0800,0x0800,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u2660 0x0000,0x0000,0x0000,0x1c00,0x3e00,0x3e00,0x1c00,0x0800,0x6b00,0xff80,0xff80,0xff80,0x6b00,0x0800,0x0800,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u2663 0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0xf780,0xff80,0xff80,0xff80,0xff80,0x7f00,0x3e00,0x1c00,0x0800,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2665 0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1c00,0x3e00,0x7f00,0xff80,0x7f00,0x3e00,0x1c00,0x0800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2666 0x0000,0x0000,0x0000,0x1f80,0x1080,0x1080,0x1f80,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0xe000, 0x0000,0x0000,0x0000,0x0000, // u266a 0x0000,0x0000,0x0000,0x7f00,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4200,0x8000, 0x0000,0x0000,0x0000,0x0000, // u266b 0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0100,0x0100,0x8200,0x8200,0x4400,0x4400,0x2800,0x2800,0x1000,0x1000, 0x0000,0x0000,0x0000,0x0000, // u2713 0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x0180,0x0180,0xc300,0xc300,0x6600,0x6600,0x3c00,0x3c00,0x1800,0x1800, 0x0000,0x0000,0x0000,0x0000, // u2714 0x0000,0x0000,0x0000,0x0000,0x0200,0x4200,0x2400,0x1400,0x0800,0x0c00,0x1200,0x1100,0x2000,0x2000,0x4000,0x4000, 0x0000,0x0000,0x0000,0x0000, // u2717 0x0000,0x0000,0x0000,0x0000,0x0300,0x6300,0x3600,0x1e00,0x0c00,0x0e00,0x1b00,0x1980,0x3000,0x3000,0x6000,0x6000, 0x0000,0x0000,0x0000,0x0000, // u2718 0x0000,0x0000,0x0000,0x0200,0x0200,0x0400,0x0400,0x0800,0x0800,0x1000,0x0800,0x0800,0x0400,0x0400,0x0200,0x0200, 0x0000,0x0000,0x0000,0x0000, // u27e8 0x0000,0x0000,0x0000,0x1000,0x1000,0x0800,0x0800,0x0400,0x0400,0x0200,0x0400,0x0400,0x0800,0x0800,0x1000,0x1000, 0x0000,0x0000,0x0000,0x0000, // u27e9 0x0000,0x0000,0x0000,0x0880,0x0880,0x1100,0x1100,0x2200,0x2200,0x4400,0x2200,0x2200,0x1100,0x1100,0x0880,0x0880, 0x0000,0x0000,0x0000,0x0000, // u27ea 0x0000,0x0000,0x0000,0x4400,0x4400,0x2200,0x2200,0x1100,0x1100,0x0880,0x1100,0x1100,0x2200,0x2200,0x4400,0x4400, 0x0000,0x0000,0x0000,0x0000, // u27eb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2800 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2801 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2802 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2803 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2804 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2805 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2806 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2807 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2808 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2809 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u280a 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u280b 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u280c 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u280d 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u280e 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u280f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2810 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2811 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2812 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2813 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2814 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2815 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2816 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2817 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2818 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2819 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u281a 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u281b 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u281c 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u281d 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u281e 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u281f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2820 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2821 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2822 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2823 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2824 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2825 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2826 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2827 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2828 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2829 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u282a 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u282b 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u282c 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u282d 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u282e 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u282f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2830 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2831 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2832 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2833 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2834 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2835 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2836 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2837 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2838 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2839 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u283a 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u283b 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u283c 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u283d 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u283e 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u283f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2840 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2841 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2842 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2843 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2844 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2845 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2846 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2847 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2848 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2849 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u284a 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u284b 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u284c 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u284d 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u284e 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u284f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2850 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2851 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2852 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2853 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2854 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2855 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2856 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2857 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2858 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2859 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u285a 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u285b 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u285c 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u285d 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u285e 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u285f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2860 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2861 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2862 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2863 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2864 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2865 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2866 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2867 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2868 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2869 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u286a 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u286b 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u286c 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u286d 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u286e 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u286f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2870 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2871 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2872 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2873 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2874 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2875 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2876 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2877 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2878 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u2879 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u287a 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u287b 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u287c 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u287d 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u287e 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2000,0x2000,0x0000,0x0000, // u287f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u2880 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u2881 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u2882 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u2883 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u2884 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u2885 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u2886 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u2887 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u2888 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u2889 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u288a 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u288b 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u288c 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u288d 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u288e 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u288f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u2890 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u2891 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u2892 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u2893 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u2894 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u2895 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u2896 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u2897 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u2898 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u2899 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u289a 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u289b 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u289c 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u289d 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u289e 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u289f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28a0 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28a1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28a2 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28a4 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28a5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28a6 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28a7 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28a8 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28a9 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28aa 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28ab 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28ac 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28ad 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28ae 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28af 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28b0 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28b1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28b2 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28b4 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28b6 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28b7 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28b8 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28b9 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28ba 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28bb 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28bc 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28bd 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28be 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x0100,0x0100,0x0000,0x0000, // u28bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28c0 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28c2 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28c4 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28c6 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28c7 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28c8 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28c9 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28ca 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28cb 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28cc 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28cd 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28ce 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28cf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28d0 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28d2 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28d4 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28d6 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28d7 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28d8 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28d9 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28da 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28db 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28dc 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28dd 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28de 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28df 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28e0 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28e1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28e2 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28e3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28e4 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28e6 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28e7 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28e8 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28e9 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28ea 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28eb 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28ec 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28ed 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28ee 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28ef 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28f0 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28f2 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28f3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28f4 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28f6 0x0000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28f7 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28f8 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28f9 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28fa 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28fb 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28fc 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28fd 0x0000,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28fe 0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x0000,0x0000,0x0000, 0x2100,0x2100,0x0000,0x0000, // u28ff 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x0000,0x0000,0x0000,0x0000,0x4100,0x4100,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2e2c 0x8000,0x8000,0x8400,0x8e00,0x9500,0xa480,0x8400,0x8400,0x8400,0x8400,0x8800,0x1000,0x2000,0x4000,0x8000,0x8000, 0x8000,0x8000,0x8000,0x8000, // ue0a0 0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7c00,0x0000,0x0880,0x0880,0x0c80,0x0a80,0x0980,0x0880, 0x0880,0x0000,0x0000,0x0000, // ue0a1 0x0000,0x0000,0x0000,0x1e00,0x2100,0x2100,0x2100,0x2100,0x2100,0x7f80,0x7f80,0x7380,0x6180,0x7380,0x7f80,0x7f80, 0x7f80,0x0000,0x0000,0x0000, // ue0a2 0x8000,0xc000,0xe000,0xf000,0xf800,0xfc00,0xfe00,0xff00,0xff80,0xffc0,0xffc0,0xff80,0xff00,0xfe00,0xfc00,0xf800, 0xf000,0xe000,0xc000,0x8000, // ue0b0 0x8000,0x4000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0100,0x0080,0x0040,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800, 0x1000,0x2000,0x4000,0x8000, // ue0b1 0x0040,0x00c0,0x01c0,0x03c0,0x07c0,0x0fc0,0x1fc0,0x3fc0,0x7fc0,0xffc0,0xffc0,0x7fc0,0x3fc0,0x1fc0,0x0fc0,0x07c0, 0x03c0,0x01c0,0x00c0,0x0040, // ue0b2 0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000,0x8000,0x4000,0x2000,0x1000,0x0800,0x0400, 0x0200,0x0100,0x0080,0x0040, // ue0b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200, 0x2200,0x2200,0x1c00,0x0000, // uf6be 0x0000,0x0000,0x0000,0x7f00,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00, 0x0000,0x0000,0x0000,0x0000 // ufffd }; // codepoints array constexpr std::array fixedfont_codepoints = { 0x0000,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e, 0x002f,0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e, 0x003f,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e, 0x004f,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e, 0x005f,0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e, 0x006f,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e, 0x00a0,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af, 0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf, 0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf, 0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df, 0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef, 0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff, 0x0100,0x0101,0x0102,0x0103,0x0104,0x0105,0x0106,0x0107,0x0108,0x0109,0x010a,0x010b,0x010c,0x010d,0x010e,0x010f, 0x0110,0x0111,0x0112,0x0113,0x0114,0x0115,0x0116,0x0117,0x0118,0x0119,0x011a,0x011b,0x011c,0x011d,0x011e,0x011f, 0x0120,0x0121,0x0122,0x0123,0x0124,0x0125,0x0126,0x0127,0x0128,0x0129,0x012a,0x012b,0x012c,0x012d,0x012e,0x012f, 0x0130,0x0131,0x0132,0x0133,0x0134,0x0135,0x0136,0x0137,0x0138,0x0139,0x013a,0x013b,0x013c,0x013d,0x013e,0x013f, 0x0140,0x0141,0x0142,0x0143,0x0144,0x0145,0x0146,0x0147,0x0148,0x0149,0x014a,0x014b,0x014c,0x014d,0x014e,0x014f, 0x0150,0x0151,0x0152,0x0153,0x0154,0x0155,0x0156,0x0157,0x0158,0x0159,0x015a,0x015b,0x015c,0x015d,0x015e,0x015f, 0x0160,0x0161,0x0162,0x0163,0x0164,0x0165,0x0166,0x0167,0x0168,0x0169,0x016a,0x016b,0x016c,0x016d,0x016e,0x016f, 0x0170,0x0171,0x0172,0x0173,0x0174,0x0175,0x0176,0x0177,0x0178,0x0179,0x017a,0x017b,0x017c,0x017d,0x017e,0x017f, 0x0186,0x018e,0x018f,0x0190,0x0192,0x019d,0x019e,0x01b5,0x01b6,0x01b7,0x01cd,0x01ce,0x01cf,0x01d0,0x01d1,0x01d2, 0x01d3,0x01d4,0x01e2,0x01e3,0x01e4,0x01e5,0x01e6,0x01e7,0x01e8,0x01e9,0x01ea,0x01eb,0x01ec,0x01ed,0x01ee,0x01ef, 0x01f0,0x01f4,0x01f5,0x01fc,0x01fd,0x01fe,0x01ff,0x0218,0x0219,0x021a,0x021b,0x0232,0x0233,0x0237,0x0254,0x0258, 0x0259,0x025b,0x0272,0x0292,0x02bb,0x02bc,0x02bd,0x02c6,0x02c7,0x02d8,0x02d9,0x02db,0x02dc,0x02dd,0x0300,0x0301, 0x0302,0x0303,0x0304,0x0305,0x0306,0x0307,0x0308,0x030a,0x030b,0x030c,0x0329,0x0384,0x0385,0x0386,0x0387,0x0388, 0x0389,0x038a,0x038c,0x038e,0x038f,0x0390,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039a, 0x039b,0x039c,0x039d,0x039e,0x039f,0x03a0,0x03a1,0x03a3,0x03a4,0x03a5,0x03a6,0x03a7,0x03a8,0x03a9,0x03aa,0x03ab, 0x03ac,0x03ad,0x03ae,0x03af,0x03b0,0x03b1,0x03b2,0x03b3,0x03b4,0x03b5,0x03b6,0x03b7,0x03b8,0x03b9,0x03ba,0x03bb, 0x03bc,0x03bd,0x03be,0x03bf,0x03c0,0x03c1,0x03c2,0x03c3,0x03c4,0x03c5,0x03c6,0x03c7,0x03c8,0x03c9,0x03ca,0x03cb, 0x03cc,0x03cd,0x03ce,0x03d1,0x03d5,0x03f0,0x03f1,0x03f2,0x03f3,0x03f4,0x03f5,0x03f6,0x0400,0x0401,0x0402,0x0403, 0x0404,0x0405,0x0406,0x0407,0x0408,0x0409,0x040a,0x040b,0x040c,0x040d,0x040e,0x040f,0x0410,0x0411,0x0412,0x0413, 0x0414,0x0415,0x0416,0x0417,0x0418,0x0419,0x041a,0x041b,0x041c,0x041d,0x041e,0x041f,0x0420,0x0421,0x0422,0x0423, 0x0424,0x0425,0x0426,0x0427,0x0428,0x0429,0x042a,0x042b,0x042c,0x042d,0x042e,0x042f,0x0430,0x0431,0x0432,0x0433, 0x0434,0x0435,0x0436,0x0437,0x0438,0x0439,0x043a,0x043b,0x043c,0x043d,0x043e,0x043f,0x0440,0x0441,0x0442,0x0443, 0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,0x044a,0x044b,0x044c,0x044d,0x044e,0x044f,0x0450,0x0451,0x0452,0x0453, 0x0454,0x0455,0x0456,0x0457,0x0458,0x0459,0x045a,0x045b,0x045c,0x045d,0x045e,0x045f,0x0462,0x0463,0x046a,0x046b, 0x0490,0x0491,0x0492,0x0493,0x0494,0x0495,0x0496,0x0497,0x0498,0x0499,0x049a,0x049b,0x049c,0x049d,0x04a0,0x04a1, 0x04a2,0x04a3,0x04a4,0x04a5,0x04aa,0x04ab,0x04ae,0x04af,0x04b0,0x04b1,0x04b2,0x04b3,0x04b6,0x04b7,0x04b8,0x04b9, 0x04ba,0x04bb,0x04c0,0x04c1,0x04c2,0x04cf,0x04d0,0x04d1,0x04d2,0x04d3,0x04d4,0x04d5,0x04d6,0x04d7,0x04d8,0x04d9, 0x04da,0x04db,0x04dc,0x04dd,0x04de,0x04df,0x04e2,0x04e3,0x04e4,0x04e5,0x04e6,0x04e7,0x04e8,0x04e9,0x04ea,0x04eb, 0x04ec,0x04ed,0x04ee,0x04ef,0x04f0,0x04f1,0x04f2,0x04f3,0x04f4,0x04f5,0x04f8,0x04f9,0x05d0,0x05d1,0x05d2,0x05d3, 0x05d4,0x05d5,0x05d6,0x05d7,0x05d8,0x05d9,0x05da,0x05db,0x05dc,0x05dd,0x05de,0x05df,0x05e0,0x05e1,0x05e2,0x05e3, 0x05e4,0x05e5,0x05e6,0x05e7,0x05e8,0x05e9,0x05ea,0x1e0c,0x1e0d,0x1e34,0x1e35,0x1e36,0x1e37,0x1e40,0x1e41,0x1e42, 0x1e43,0x1e44,0x1e45,0x1e46,0x1e47,0x1e6c,0x1e6d,0x1eb8,0x1eb9,0x1ebc,0x1ebd,0x1eca,0x1ecb,0x1ecc,0x1ecd,0x1ee4, 0x1ee5,0x1ef8,0x1ef9,0x2000,0x2001,0x2002,0x2003,0x2004,0x2005,0x2006,0x2007,0x2008,0x2009,0x200a,0x200b,0x200c, 0x200d,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x2015,0x2016,0x2017,0x2018,0x2019,0x201a,0x201b,0x201c, 0x201d,0x201e,0x201f,0x2020,0x2021,0x2022,0x2026,0x2030,0x2032,0x2033,0x2039,0x203a,0x203c,0x203e,0x2070,0x2071, 0x2074,0x2075,0x2076,0x2077,0x2078,0x2079,0x207a,0x207b,0x207c,0x207d,0x207e,0x207f,0x2080,0x2081,0x2082,0x2083, 0x2084,0x2085,0x2086,0x2087,0x2088,0x2089,0x208a,0x208b,0x208c,0x208d,0x208e,0x2090,0x2091,0x2092,0x2093,0x2094, 0x2095,0x2096,0x2097,0x2098,0x209a,0x20a7,0x20aa,0x20ac,0x20ae,0x2102,0x210e,0x210f,0x2115,0x2116,0x211a,0x211d, 0x2122,0x2124,0x2126,0x2135,0x2190,0x2191,0x2192,0x2193,0x2194,0x2195,0x21a4,0x21a6,0x21a8,0x21b5,0x21bb,0x21cb, 0x21cc,0x21d0,0x21d1,0x21d2,0x21d3,0x21d4,0x21d5,0x2200,0x2203,0x2204,0x2205,0x2206,0x2207,0x2208,0x2209,0x220a, 0x220b,0x220c,0x220d,0x2212,0x2213,0x2214,0x2215,0x2216,0x2219,0x221a,0x221e,0x221f,0x2225,0x2227,0x2228,0x2229, 0x222a,0x2248,0x2260,0x2261,0x2264,0x2265,0x226a,0x226b,0x2282,0x2283,0x2286,0x2287,0x22a5,0x22c2,0x22c3,0x2300, 0x2302,0x2308,0x2309,0x230a,0x230b,0x2310,0x2319,0x2320,0x2321,0x239b,0x239c,0x239d,0x239e,0x239f,0x23a0,0x23a1, 0x23a2,0x23a3,0x23a4,0x23a5,0x23a6,0x23a7,0x23a8,0x23a9,0x23ab,0x23ac,0x23ad,0x23ae,0x23af,0x23ba,0x23bb,0x23bc, 0x23bd,0x23d0,0x2409,0x240a,0x240b,0x240c,0x240d,0x2424,0x2500,0x2501,0x2502,0x2503,0x2508,0x2509,0x250a,0x250b, 0x250c,0x250d,0x250e,0x250f,0x2510,0x2511,0x2512,0x2513,0x2514,0x2515,0x2516,0x2517,0x2518,0x2519,0x251a,0x251b, 0x251c,0x251d,0x251e,0x251f,0x2520,0x2521,0x2522,0x2523,0x2524,0x2525,0x2526,0x2527,0x2528,0x2529,0x252a,0x252b, 0x252c,0x252d,0x252e,0x252f,0x2530,0x2531,0x2532,0x2533,0x2534,0x2535,0x2536,0x2537,0x2538,0x2539,0x253a,0x253b, 0x253c,0x253d,0x253e,0x253f,0x2540,0x2541,0x2542,0x2543,0x2544,0x2545,0x2546,0x2547,0x2548,0x2549,0x254a,0x254b, 0x2550,0x2551,0x2552,0x2553,0x2554,0x2555,0x2556,0x2557,0x2558,0x2559,0x255a,0x255b,0x255c,0x255d,0x255e,0x255f, 0x2560,0x2561,0x2562,0x2563,0x2564,0x2565,0x2566,0x2567,0x2568,0x2569,0x256a,0x256b,0x256c,0x256d,0x256e,0x256f, 0x2570,0x2571,0x2572,0x2573,0x2574,0x2575,0x2576,0x2577,0x2578,0x2579,0x257a,0x257b,0x257c,0x257d,0x257e,0x257f, 0x2580,0x2581,0x2582,0x2583,0x2584,0x2585,0x2586,0x2587,0x2588,0x2589,0x258a,0x258b,0x258c,0x258d,0x258e,0x258f, 0x2590,0x2591,0x2592,0x2593,0x2596,0x2597,0x2598,0x2599,0x259a,0x259b,0x259c,0x259d,0x259e,0x259f,0x25a0,0x25ac, 0x25ae,0x25b2,0x25b6,0x25ba,0x25bc,0x25c0,0x25c4,0x25c6,0x25ca,0x25cb,0x25cf,0x25d8,0x25d9,0x263a,0x263b,0x263c, 0x2640,0x2642,0x2660,0x2663,0x2665,0x2666,0x266a,0x266b,0x2713,0x2714,0x2717,0x2718,0x27e8,0x27e9,0x27ea,0x27eb, 0x2800,0x2801,0x2802,0x2803,0x2804,0x2805,0x2806,0x2807,0x2808,0x2809,0x280a,0x280b,0x280c,0x280d,0x280e,0x280f, 0x2810,0x2811,0x2812,0x2813,0x2814,0x2815,0x2816,0x2817,0x2818,0x2819,0x281a,0x281b,0x281c,0x281d,0x281e,0x281f, 0x2820,0x2821,0x2822,0x2823,0x2824,0x2825,0x2826,0x2827,0x2828,0x2829,0x282a,0x282b,0x282c,0x282d,0x282e,0x282f, 0x2830,0x2831,0x2832,0x2833,0x2834,0x2835,0x2836,0x2837,0x2838,0x2839,0x283a,0x283b,0x283c,0x283d,0x283e,0x283f, 0x2840,0x2841,0x2842,0x2843,0x2844,0x2845,0x2846,0x2847,0x2848,0x2849,0x284a,0x284b,0x284c,0x284d,0x284e,0x284f, 0x2850,0x2851,0x2852,0x2853,0x2854,0x2855,0x2856,0x2857,0x2858,0x2859,0x285a,0x285b,0x285c,0x285d,0x285e,0x285f, 0x2860,0x2861,0x2862,0x2863,0x2864,0x2865,0x2866,0x2867,0x2868,0x2869,0x286a,0x286b,0x286c,0x286d,0x286e,0x286f, 0x2870,0x2871,0x2872,0x2873,0x2874,0x2875,0x2876,0x2877,0x2878,0x2879,0x287a,0x287b,0x287c,0x287d,0x287e,0x287f, 0x2880,0x2881,0x2882,0x2883,0x2884,0x2885,0x2886,0x2887,0x2888,0x2889,0x288a,0x288b,0x288c,0x288d,0x288e,0x288f, 0x2890,0x2891,0x2892,0x2893,0x2894,0x2895,0x2896,0x2897,0x2898,0x2899,0x289a,0x289b,0x289c,0x289d,0x289e,0x289f, 0x28a0,0x28a1,0x28a2,0x28a3,0x28a4,0x28a5,0x28a6,0x28a7,0x28a8,0x28a9,0x28aa,0x28ab,0x28ac,0x28ad,0x28ae,0x28af, 0x28b0,0x28b1,0x28b2,0x28b3,0x28b4,0x28b5,0x28b6,0x28b7,0x28b8,0x28b9,0x28ba,0x28bb,0x28bc,0x28bd,0x28be,0x28bf, 0x28c0,0x28c1,0x28c2,0x28c3,0x28c4,0x28c5,0x28c6,0x28c7,0x28c8,0x28c9,0x28ca,0x28cb,0x28cc,0x28cd,0x28ce,0x28cf, 0x28d0,0x28d1,0x28d2,0x28d3,0x28d4,0x28d5,0x28d6,0x28d7,0x28d8,0x28d9,0x28da,0x28db,0x28dc,0x28dd,0x28de,0x28df, 0x28e0,0x28e1,0x28e2,0x28e3,0x28e4,0x28e5,0x28e6,0x28e7,0x28e8,0x28e9,0x28ea,0x28eb,0x28ec,0x28ed,0x28ee,0x28ef, 0x28f0,0x28f1,0x28f2,0x28f3,0x28f4,0x28f5,0x28f6,0x28f7,0x28f8,0x28f9,0x28fa,0x28fb,0x28fc,0x28fd,0x28fe,0x28ff, 0x2e2c,0xe0a0,0xe0a1,0xe0a2,0xe0b0,0xe0b1,0xe0b2,0xe0b3,0xf6be,0xfffd }; } // namespace // -- end of autogenerated text --- namespace fixed_font_20b { // -- start of autogenerated text --- // definition section for font: ter-u20b.bdf constexpr int CHARCOUNT = 1354; constexpr int WIDTH = 10; constexpr int HEIGHT = 20; constexpr int OFFSET_X = 0; constexpr int OFFSET_Y = 0; constexpr FixedFont_info_t fixedfont_info = { "Terminus", // font name "ter-u20b.bdf", // font name internal CHARCOUNT, // num of chars WIDTH, HEIGHT, OFFSET_X, OFFSET_Y, true // bold }; // font bitmap definitions constexpr std::array fixedfont_bitmap = { 0x0000,0x0000,0x0000,0x7380,0x6180,0x6180,0x0000,0x0000,0x6180,0x6180,0x6180,0x0000,0x0000,0x6180,0x6180,0x7380, 0x0000,0x0000,0x0000,0x0000, // u0000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0020 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u0021 0x0000,0x3300,0x3300,0x3300,0x3300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0022 0x0000,0x0000,0x0000,0x3300,0x3300,0x3300,0x3300,0x7f80,0x3300,0x3300,0x3300,0x7f80,0x3300,0x3300,0x3300,0x3300, 0x0000,0x0000,0x0000,0x0000, // u0023 0x0000,0x0000,0x0c00,0x0c00,0x3f00,0x6d80,0x6c00,0x6c00,0x6c00,0x3f00,0x0d80,0x0d80,0x0d80,0x6d80,0x3f00,0x0c00, 0x0c00,0x0000,0x0000,0x0000, // u0024 0x0000,0x0000,0x0000,0x0000,0x7300,0x5300,0x7600,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x3000,0x3700,0x6500,0x6700, 0x0000,0x0000,0x0000,0x0000, // u0025 0x0000,0x0000,0x0000,0x3c00,0x6600,0x6600,0x6600,0x3c00,0x1800,0x3980,0x6d80,0xc700,0xc300,0xc300,0x6780,0x3d80, 0x0000,0x0000,0x0000,0x0000, // u0026 0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0027 0x0000,0x0000,0x0000,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0c00,0x0c00,0x0600, 0x0000,0x0000,0x0000,0x0000, // u0028 0x0000,0x0000,0x0000,0x1800,0x0c00,0x0c00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0c00,0x0c00,0x1800, 0x0000,0x0000,0x0000,0x0000, // u0029 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x3600,0x1c00,0xff80,0x1c00,0x3600,0x6300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u002a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u002b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00, 0x1800,0x0000,0x0000,0x0000, // u002c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u002d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u002e 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x3000,0x3000,0x6000,0x6000, 0x0000,0x0000,0x0000,0x0000, // u002f 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6380,0x6780,0x6d80,0x7980,0x7180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0030 0x0000,0x0000,0x0000,0x0c00,0x1c00,0x3c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0031 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x0180,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u0032 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x0180,0x0180,0x0180,0x1f00,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0033 0x0000,0x0000,0x0000,0x0180,0x0380,0x0780,0x0d80,0x1980,0x3180,0x6180,0x6180,0x6180,0x7f80,0x0180,0x0180,0x0180, 0x0000,0x0000,0x0000,0x0000, // u0034 0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x7f00,0x0180,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0035 0x0000,0x0000,0x0000,0x1f00,0x3000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0036 0x0000,0x0000,0x0000,0x7f80,0x6180,0x6180,0x0180,0x0300,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u0037 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0038 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180,0x0180,0x0180,0x0300,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0039 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u003a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00, 0x1800,0x0000,0x0000,0x0000, // u003b 0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180, 0x0000,0x0000,0x0000,0x0000, // u003c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u003d 0x0000,0x0000,0x0000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000, 0x0000,0x0000,0x0000,0x0000, // u003e 0x0000,0x0000,0x0000,0x1e00,0x3300,0x6180,0x6180,0x0180,0x0300,0x0600,0x0c00,0x0c00,0x0000,0x0000,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u003f 0x0000,0x0000,0x0000,0x7f00,0xc180,0xc180,0xcf80,0xd980,0xd980,0xd980,0xd980,0xd980,0xcf80,0xc000,0xc000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u0040 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0041 0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u0042 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0043 0x0000,0x0000,0x0000,0x7e00,0x6300,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6300,0x7e00, 0x0000,0x0000,0x0000,0x0000, // u0044 0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u0045 0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x0000,0x0000,0x0000,0x0000, // u0046 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6780,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0047 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0048 0x0000,0x0000,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u0049 0x0000,0x0000,0x0000,0x0780,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x6300,0x6300,0x6300,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u004a 0x0000,0x0000,0x0000,0x6180,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7000,0x7800,0x6c00,0x6600,0x6300,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u004b 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u004c 0x0000,0x0000,0x0000,0x8080,0xc180,0xe380,0xf780,0xdd80,0xc980,0xc180,0xc180,0xc180,0xc180,0xc180,0xc180,0xc180, 0x0000,0x0000,0x0000,0x0000, // u004d 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x7180,0x7980,0x6d80,0x6780,0x6380,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u004e 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u004f 0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x0000,0x0000,0x0000,0x0000, // u0050 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6780,0x3f00, 0x0300,0x0180,0x0000,0x0000, // u0051 0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x7800,0x6c00,0x6600,0x6300,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0052 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x3f00,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0053 0x0000,0x0000,0x0000,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u0054 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0055 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300,0x3300,0x3300,0x3300,0x1e00,0x1e00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u0056 0x0000,0x0000,0x0000,0xc180,0xc180,0xc180,0xc180,0xc180,0xc180,0xc180,0xc980,0xdd80,0xf780,0xe380,0xc180,0x8080, 0x0000,0x0000,0x0000,0x0000, // u0057 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x1e00,0x3300,0x3300,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0058 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u0059 0x0000,0x0000,0x0000,0x7f80,0x0180,0x0180,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x6000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u005a 0x0000,0x0000,0x0000,0x1e00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u005b 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x3000,0x3000,0x1800,0x1800,0x0c00,0x0c00,0x0600,0x0600,0x0300,0x0300, 0x0000,0x0000,0x0000,0x0000, // u005c 0x0000,0x0000,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u005d 0x0000,0x0c00,0x1e00,0x3300,0x6180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u005e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x7f80,0x0000,0x0000, // u005f 0x1800,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0060 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u0061 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u0062 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0063 0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u0064 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0065 0x0000,0x0000,0x0000,0x0780,0x0c00,0x0c00,0x0c00,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u0066 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0180,0x0180,0x3f00,0x0000, // u0067 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0068 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u0069 0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0700,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x3300,0x3300,0x1e00,0x0000, // u006a 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6180,0x6300,0x6600,0x6c00,0x7800,0x6c00,0x6600,0x6300,0x6180, 0x0000,0x0000,0x0000,0x0000, // u006b 0x0000,0x0000,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u006c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80, 0x0000,0x0000,0x0000,0x0000, // u006d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u006e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u006f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00, 0x6000,0x6000,0x6000,0x0000, // u0070 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0180,0x0180,0x0180,0x0000, // u0071 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6f80,0x7800,0x7000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x0000,0x0000,0x0000,0x0000, // u0072 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6000,0x6000,0x3f00,0x0180,0x0180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0073 0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x7e00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0f00, 0x0000,0x0000,0x0000,0x0000, // u0074 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u0075 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x3300,0x1e00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u0076 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0077 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x3300,0x1e00,0x0c00,0x1e00,0x3300,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0078 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0180,0x0180,0x3f00,0x0000, // u0079 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u007a 0x0000,0x0000,0x0000,0x0700,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x3800,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0700, 0x0000,0x0000,0x0000,0x0000, // u007b 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u007c 0x0000,0x0000,0x0000,0x3800,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0700,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x3800, 0x0000,0x0000,0x0000,0x0000, // u007d 0x0000,0x3980,0x6d80,0x6d80,0x6700,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u007e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00a0 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u00a1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x3f00,0x6d80,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6d80,0x3f00, 0x0c00,0x0c00,0x0000,0x0000, // u00a2 0x0000,0x0000,0x0000,0x1e00,0x3300,0x3000,0x3000,0x3000,0x3000,0x7e00,0x3000,0x3000,0x3000,0x3000,0x3180,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u00a3 0x0000,0x0000,0x0000,0x0000,0x0000,0xc180,0x6300,0x3e00,0x6300,0x6300,0x6300,0x6300,0x3e00,0x6300,0xc180,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00a4 0x0000,0x0000,0x0000,0x6180,0x6180,0x3300,0x3300,0x3300,0x1e00,0x1e00,0x0c00,0x3f00,0x0c00,0x3f00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u00a5 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u00a6 0x0000,0x0000,0x1e00,0x3300,0x3000,0x3000,0x1c00,0x3600,0x3300,0x3300,0x3300,0x1b00,0x0e00,0x0300,0x0300,0x3300, 0x1e00,0x0000,0x0000,0x0000, // u00a7 0x3300,0x3300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00a8 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x4080,0x9e40,0xb340,0xb040,0xb040,0xb340,0x9e40,0x4080,0x3f00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00a9 0x0000,0x3e00,0x0300,0x3f00,0x6300,0x6300,0x6300,0x3f00,0x0000,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0cc0,0x1980,0x3300,0x6600,0xcc00,0x6600,0x3300,0x1980,0x0cc0, 0x0000,0x0000,0x0000,0x0000, // u00ab 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00ac 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00ad 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x4080,0xbe40,0xb340,0xb340,0xbe40,0xb640,0xb340,0x4080,0x3f00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00ae 0x0000,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00af 0x0000,0x1e00,0x3300,0x3300,0x3300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u00b1 0x0000,0x1e00,0x3300,0x3300,0x0600,0x0c00,0x1800,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00b2 0x0000,0x1e00,0x3300,0x0300,0x0e00,0x0300,0x3300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00b3 0x0600,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6380,0x7d80, 0x6000,0x6000,0x6000,0x0000, // u00b5 0x0000,0x0000,0x0000,0x3f80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3d80,0x0d80,0x0d80,0x0d80,0x0d80,0x0d80,0x0d80, 0x0000,0x0000,0x0000,0x0000, // u00b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00b7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0c00,0x0c00,0x1800,0x0000, // u00b8 0x0000,0x0c00,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00b9 0x0000,0x3e00,0x6300,0x6300,0x6300,0x6300,0x6300,0x3e00,0x0000,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xcc00,0x6600,0x3300,0x1980,0x0cc0,0x1980,0x3300,0x6600,0xcc00, 0x0000,0x0000,0x0000,0x0000, // u00bb 0x0000,0x0000,0x3000,0x7000,0x3000,0x3080,0x3180,0x3300,0x0600,0x0c00,0x1980,0x3380,0x6780,0xcd80,0x8f80,0x0180, 0x0180,0x0000,0x0000,0x0000, // u00bc 0x0000,0x0000,0x3000,0x7000,0x3000,0x3080,0x3180,0x3300,0x0600,0x0c00,0x1800,0x3700,0x6d80,0xc180,0x8300,0x0600, 0x0f80,0x0000,0x0000,0x0000, // u00bd 0x0000,0x0000,0xf000,0x1800,0x7000,0x1880,0x1980,0xf300,0x0600,0x0c00,0x1980,0x3380,0x6780,0xcd80,0x8f80,0x0180, 0x0180,0x0000,0x0000,0x0000, // u00be 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0000,0x0c00,0x0c00,0x1800,0x3000,0x6000,0x6180,0x6180,0x3300,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u00bf 0x1800,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u00c0 0x0600,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u00c1 0x1e00,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u00c2 0x3b80,0x6e00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u00c3 0x3300,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u00c4 0x1e00,0x3300,0x1e00,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u00c5 0x0000,0x0000,0x0000,0x7fc0,0xc600,0xc600,0xc600,0xc600,0xc600,0xffc0,0xc600,0xc600,0xc600,0xc600,0xc600,0xc7c0, 0x0000,0x0000,0x0000,0x0000, // u00c6 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x6180,0x3f00, 0x0c00,0x0c00,0x1800,0x0000, // u00c7 0x1800,0x0c00,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u00c8 0x0600,0x0c00,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u00c9 0x1e00,0x3300,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u00ca 0x3300,0x3300,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u00cb 0x1800,0x0c00,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u00cc 0x0600,0x0c00,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u00cd 0x1e00,0x3300,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u00ce 0x3300,0x3300,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u00cf 0x0000,0x0000,0x0000,0x7e00,0x6300,0x6180,0x6180,0x6180,0x6180,0xfd80,0x6180,0x6180,0x6180,0x6180,0x6300,0x7e00, 0x0000,0x0000,0x0000,0x0000, // u00d0 0x3b80,0x6e00,0x0000,0x6180,0x6180,0x6180,0x6180,0x7180,0x7980,0x6d80,0x6780,0x6380,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u00d1 0x1800,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00d2 0x0600,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00d3 0x1e00,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00d4 0x3b80,0x6e00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00d5 0x3300,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00d6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x3300,0x1e00,0x0c00,0x1e00,0x3300,0x6180,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00d7 0x0000,0x0000,0x0000,0x3f00,0x6180,0x61c0,0x6180,0x6380,0x6780,0x6d80,0x7980,0x7180,0x6180,0xe180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00d8 0x1800,0x0c00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00d9 0x0600,0x0c00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00da 0x1e00,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00db 0x3300,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00dc 0x0600,0x0c00,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u00dd 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x6000,0x6000,0x6000, 0x0000,0x0000,0x0000,0x0000, // u00de 0x0000,0x0000,0x0000,0x3e00,0x6300,0x6300,0x6300,0x6200,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7180,0x6f00, 0x0000,0x0000,0x0000,0x0000, // u00df 0x0000,0x0000,0x0000,0x0000,0x1800,0x0c00,0x0000,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u00e0 0x0000,0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u00e1 0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x0000,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u00e2 0x0000,0x0000,0x0000,0x0000,0x3b80,0x6e00,0x0000,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u00e3 0x0000,0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u00e4 0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x1e00,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u00e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7b80,0x0cc0,0x0cc0,0x7cc0,0xcfc0,0xcc00,0xcc00,0xccc0,0x7780, 0x0000,0x0000,0x0000,0x0000, // u00e6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x3f00, 0x0c00,0x0c00,0x1800,0x0000, // u00e7 0x0000,0x0000,0x0000,0x0000,0x1800,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00e8 0x0000,0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00e9 0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00ea 0x0000,0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00eb 0x0000,0x0000,0x0000,0x0000,0x1800,0x0c00,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u00ec 0x0000,0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u00ed 0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u00ee 0x0000,0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u00ef 0x0000,0x0000,0x0000,0x3600,0x3c00,0x6c00,0x0600,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00f0 0x0000,0x0000,0x0000,0x0000,0x3b80,0x6e00,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u00f1 0x0000,0x0000,0x0000,0x0000,0x1800,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00f2 0x0000,0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00f3 0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00f4 0x0000,0x0000,0x0000,0x0000,0x3b80,0x6e00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00f5 0x0000,0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u00f6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00f7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f40,0x6180,0x6380,0x6780,0x6d80,0x7980,0x7180,0x6180,0xbf00, 0x0000,0x0000,0x0000,0x0000, // u00f8 0x0000,0x0000,0x0000,0x0000,0x1800,0x0c00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u00f9 0x0000,0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u00fa 0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u00fb 0x0000,0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u00fc 0x0000,0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0180,0x0180,0x3f00,0x0000, // u00fd 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00, 0x6000,0x6000,0x6000,0x0000, // u00fe 0x0000,0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0180,0x0180,0x3f00,0x0000, // u00ff 0x0000,0x3f00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0100 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u0101 0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0102 0x0000,0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u0103 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0180,0x0300,0x01c0,0x0000, // u0104 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0180,0x0300,0x01c0,0x0000, // u0105 0x0600,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0106 0x0000,0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x3f00,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0107 0x1e00,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0108 0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x0000,0x3f00,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0109 0x0c00,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u010a 0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x3f00,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u010b 0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u010c 0x0000,0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u010d 0x3300,0x1e00,0x0000,0x7e00,0x6300,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6300,0x7e00, 0x0000,0x0000,0x0000,0x0000, // u010e 0x3300,0x1e00,0x0000,0x0180,0x0180,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u010f 0x0000,0x0000,0x0000,0x7e00,0x6300,0x6180,0x6180,0x6180,0x6180,0xfd80,0x6180,0x6180,0x6180,0x6180,0x6300,0x7e00, 0x0000,0x0000,0x0000,0x0000, // u0110 0x0000,0x0000,0x0000,0x0180,0x0fc0,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u0111 0x0000,0x3f00,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u0112 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0113 0x3300,0x1e00,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u0114 0x0000,0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0115 0x0c00,0x0c00,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u0116 0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0117 0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80, 0x0180,0x0300,0x01c0,0x0000, // u0118 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00, 0x0c00,0x1800,0x0e00,0x0000, // u0119 0x3300,0x1e00,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u011a 0x0000,0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u011b 0x1e00,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6780,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u011c 0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x0000,0x3f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0180,0x0180,0x3f00,0x0000, // u011d 0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6780,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u011e 0x0000,0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x3f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0180,0x0180,0x3f00,0x0000, // u011f 0x0c00,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6780,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0120 0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x3f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0180,0x0180,0x3f00,0x0000, // u0121 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6780,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0c00,0x0c00,0x1800, // u0122 0x0000,0x0000,0x0000,0x0600,0x0c00,0x0c00,0x0000,0x3f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0180,0x0180,0x3f00,0x0000, // u0123 0x1e00,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0124 0x1e00,0x3300,0x0000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0125 0x0000,0x0000,0x0000,0x6180,0x6180,0xffc0,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0126 0x0000,0x0000,0x0000,0x6000,0xfc00,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0127 0x3b80,0x6e00,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u0128 0x0000,0x0000,0x0000,0x0000,0x3b80,0x6e00,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u0129 0x0000,0x3f00,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u012a 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u012b 0x3300,0x1e00,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u012c 0x0000,0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u012d 0x0000,0x0000,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0c00,0x1800,0x0e00,0x0000, // u012e 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0c00,0x1800,0x0e00,0x0000, // u012f 0x0c00,0x0c00,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u0130 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u0131 0x0000,0x0000,0x0000,0xf3c0,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6d80,0x6d80,0x6d80,0xf700, 0x0000,0x0000,0x0000,0x0000, // u0132 0x0000,0x0000,0x0000,0x6180,0x6180,0x0000,0x0000,0xe380,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0xf180, 0x0d80,0x0d80,0x0700,0x0000, // u0133 0x0780,0x0cc0,0x0000,0x0780,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x6300,0x6300,0x6300,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0134 0x0000,0x0000,0x0000,0x0000,0x0780,0x0cc0,0x0000,0x0700,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x3300,0x3300,0x1e00,0x0000, // u0135 0x0000,0x0000,0x0000,0x6180,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7000,0x7800,0x6c00,0x6600,0x6300,0x6180,0x6180, 0x0000,0x0c00,0x0c00,0x1800, // u0136 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6180,0x6300,0x6600,0x6c00,0x7800,0x6c00,0x6600,0x6300,0x6180, 0x0000,0x0c00,0x0c00,0x1800, // u0137 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6300,0x6600,0x6c00,0x7800,0x6c00,0x6600,0x6300,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0138 0x3000,0x6000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u0139 0x0600,0x0c00,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u013a 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80, 0x0000,0x0c00,0x0c00,0x1800, // u013b 0x0000,0x0000,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0c00,0x0c00,0x1800, // u013c 0x3300,0x1e00,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u013d 0x3300,0x1e00,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u013e 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6300,0x6300,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u013f 0x0000,0x0000,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0cc0,0x0cc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u0140 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3c00,0x3800,0x3000,0x7000,0xf000,0x3000,0x3000,0x3000,0x3fc0, 0x0000,0x0000,0x0000,0x0000, // u0141 0x0000,0x0000,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0f00,0x0e00,0x0c00,0x1c00,0x3c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u0142 0x0600,0x0c00,0x0000,0x6180,0x6180,0x6180,0x6180,0x7180,0x7980,0x6d80,0x6780,0x6380,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0143 0x0000,0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0144 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x7180,0x7980,0x6d80,0x6780,0x6380,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0c00,0x0c00,0x1800, // u0145 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0c00,0x0c00,0x1800, // u0146 0x3300,0x1e00,0x0000,0x6180,0x6180,0x6180,0x6180,0x7180,0x7980,0x6d80,0x6780,0x6380,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0147 0x0000,0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0148 0x0000,0x6000,0x6000,0x6000,0xc000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0149 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x7180,0x7980,0x6d80,0x6780,0x6380,0x6180,0x6180,0x6180,0x6180, 0x0180,0x0180,0x0700,0x0000, // u014a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0180,0x0180,0x0700,0x0000, // u014b 0x0000,0x3f00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u014c 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u014d 0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u014e 0x0000,0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u014f 0x1980,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0150 0x0000,0x0000,0x0000,0x0000,0x1980,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0151 0x0000,0x0000,0x0000,0x7fc0,0xc600,0xc600,0xc600,0xc600,0xc600,0xc7c0,0xc600,0xc600,0xc600,0xc600,0xc600,0x7fc0, 0x0000,0x0000,0x0000,0x0000, // u0152 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0xccc0,0xccc0,0xccc0,0xcfc0,0xcc00,0xcc00,0xccc0,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u0153 0x0600,0x0c00,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x7800,0x6c00,0x6600,0x6300,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0154 0x0000,0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x6f80,0x7800,0x7000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x0000,0x0000,0x0000,0x0000, // u0155 0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x7800,0x6c00,0x6600,0x6300,0x6180,0x6180, 0x0000,0x0c00,0x0c00,0x1800, // u0156 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6f80,0x7800,0x7000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x0000,0x6000,0x6000,0xc000, // u0157 0x3300,0x1e00,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x7800,0x6c00,0x6600,0x6300,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0158 0x0000,0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x6f80,0x7800,0x7000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x0000,0x0000,0x0000,0x0000, // u0159 0x0600,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x3f00,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u015a 0x0000,0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x3f00,0x6180,0x6000,0x6000,0x3f00,0x0180,0x0180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u015b 0x1e00,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x3f00,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u015c 0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x0000,0x3f00,0x6180,0x6000,0x6000,0x3f00,0x0180,0x0180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u015d 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x3f00,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00, 0x0c00,0x0c00,0x1800,0x0000, // u015e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6000,0x6000,0x3f00,0x0180,0x0180,0x6180,0x3f00, 0x0c00,0x0c00,0x1800,0x0000, // u015f 0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x3f00,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0160 0x0000,0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6000,0x6000,0x3f00,0x0180,0x0180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0161 0x0000,0x0000,0x0000,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0600,0x0600,0x0c00,0x0000, // u0162 0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x7e00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0f00, 0x0600,0x0600,0x0c00,0x0000, // u0163 0x3300,0x1e00,0x0000,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u0164 0x6600,0x3c00,0x0000,0x1800,0x1800,0x1800,0x1800,0x7e00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0f00, 0x0000,0x0000,0x0000,0x0000, // u0165 0x0000,0x0000,0x0000,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u0166 0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x7e00,0x1800,0x3c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x0f00, 0x0000,0x0000,0x0000,0x0000, // u0167 0x3b80,0x6e00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0168 0x0000,0x0000,0x0000,0x0000,0x3b80,0x6e00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u0169 0x0000,0x3f00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u016a 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u016b 0x3300,0x1e00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u016c 0x0000,0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u016d 0x1e00,0x3300,0x1e00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u016e 0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x1e00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u016f 0x1980,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0170 0x0000,0x0000,0x0000,0x0000,0x1980,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u0171 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0c00,0x1800,0x0e00,0x0000, // u0172 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0180,0x0300,0x01c0,0x0000, // u0173 0x1e00,0x3300,0x0000,0xc180,0xc180,0xc180,0xc180,0xc180,0xc180,0xc180,0xc980,0xdd80,0xf780,0xe380,0xc180,0x8080, 0x0000,0x0000,0x0000,0x0000, // u0174 0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x0000,0x6180,0x6180,0x6180,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0175 0x1e00,0x3300,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u0176 0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0180,0x0180,0x3f00,0x0000, // u0177 0x3300,0x3300,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u0178 0x0600,0x0c00,0x0000,0x7f80,0x0180,0x0180,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x6000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u0179 0x0000,0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x7f80,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u017a 0x0c00,0x0c00,0x0000,0x7f80,0x0180,0x0180,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x6000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u017b 0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x7f80,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u017c 0x3300,0x1e00,0x0000,0x7f80,0x0180,0x0180,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x6000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u017d 0x0000,0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x7f80,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u017e 0x0000,0x0000,0x0000,0x0780,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u017f 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0186 0x0000,0x0000,0x0000,0x7f80,0x0180,0x0180,0x0180,0x0180,0x0180,0x1f80,0x0180,0x0180,0x0180,0x0180,0x0180,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u018e 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x0180,0x0180,0x0180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u018f 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x3e00,0x6000,0x6000,0x6000,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0190 0x0000,0x0000,0x0000,0x0700,0x0d80,0x0d80,0x0c00,0x0c00,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x6c00,0x6c00,0x3800,0x0000, // u0192 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x7180,0x7980,0x6d80,0x6780,0x6380,0x6180,0x6180,0x6180,0x6180, 0x6000,0x6000,0xc000,0x0000, // u019d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0180,0x0180,0x0180,0x0000, // u019e 0x0000,0x0000,0x0000,0x7f80,0x0180,0x0180,0x0180,0x0300,0x0600,0x7f80,0x0c00,0x1800,0x3000,0x6000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u01b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0180,0x0300,0x0600,0x7f80,0x1800,0x3000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u01b6 0x0000,0x0000,0x0000,0x7f80,0x0180,0x0300,0x0600,0x0c00,0x1f00,0x0180,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u01b7 0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u01cd 0x0000,0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u01ce 0x3300,0x1e00,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u01cf 0x0000,0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u01d0 0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u01d1 0x0000,0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u01d2 0x3300,0x1e00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u01d3 0x0000,0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u01d4 0x0000,0x3f80,0x0000,0x7fc0,0xc600,0xc600,0xc600,0xc600,0xc600,0xffc0,0xc600,0xc600,0xc600,0xc600,0xc600,0xc7c0, 0x0000,0x0000,0x0000,0x0000, // u01e2 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x7b80,0x0cc0,0x0cc0,0x7cc0,0xcfc0,0xcc00,0xcc00,0xccc0,0x7780, 0x0000,0x0000,0x0000,0x0000, // u01e3 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6780,0x6180,0x6180,0x67c0,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u01e4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x6180,0x6180,0x6180,0x67c0,0x6180,0x6180,0x6180,0x3f80, 0x0180,0x0180,0x3f00,0x0000, // u01e5 0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6780,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u01e6 0x0000,0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x3f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0180,0x0180,0x3f00,0x0000, // u01e7 0x3300,0x1e00,0x0000,0x6180,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7000,0x7800,0x6c00,0x6600,0x6300,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u01e8 0x3300,0x1e00,0x0000,0x6000,0x6000,0x6000,0x6000,0x6180,0x6300,0x6600,0x6c00,0x7800,0x6c00,0x6600,0x6300,0x6180, 0x0000,0x0000,0x0000,0x0000, // u01e9 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0c00,0x1800,0x0e00,0x0000, // u01ea 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0c00,0x1800,0x0e00,0x0000, // u01eb 0x0000,0x3f00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0c00,0x1800,0x0e00,0x0000, // u01ec 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0c00,0x1800,0x0e00,0x0000, // u01ed 0x3300,0x1e00,0x0000,0x7f80,0x0180,0x0300,0x0600,0x0c00,0x1f00,0x0180,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u01ee 0x0000,0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x7f80,0x0180,0x0300,0x0600,0x0c00,0x1f00,0x0180,0x0180,0x0180, 0x6180,0x6180,0x3f00,0x0000, // u01ef 0x0000,0x0000,0x0000,0x0000,0x0cc0,0x0780,0x0000,0x0700,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x3300,0x3300,0x1e00,0x0000, // u01f0 0x0600,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6780,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u01f4 0x0000,0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x3f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0180,0x0180,0x3f00,0x0000, // u01f5 0x0600,0x0c00,0x0000,0x7fc0,0xc600,0xc600,0xc600,0xc600,0xc600,0xffc0,0xc600,0xc600,0xc600,0xc600,0xc600,0xc7c0, 0x0000,0x0000,0x0000,0x0000, // u01fc 0x0000,0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x7b80,0x0cc0,0x0cc0,0x7cc0,0xcfc0,0xcc00,0xcc00,0xccc0,0x7780, 0x0000,0x0000,0x0000,0x0000, // u01fd 0x0600,0x0c00,0x0000,0x3f00,0x6180,0x61c0,0x6180,0x6380,0x6780,0x6d80,0x7980,0x7180,0x6180,0xe180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u01fe 0x0000,0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x3f40,0x6180,0x6380,0x6780,0x6d80,0x7980,0x7180,0x6180,0xbf00, 0x0000,0x0000,0x0000,0x0000, // u01ff 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x3f00,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00, 0x0000,0x0c00,0x0c00,0x1800, // u0218 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6000,0x6000,0x3f00,0x0180,0x0180,0x6180,0x3f00, 0x0000,0x0c00,0x0c00,0x1800, // u0219 0x0000,0x0000,0x0000,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0c00,0x0c00,0x1800, // u021a 0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x7e00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0f00, 0x0000,0x0600,0x0600,0x0c00, // u021b 0x0000,0x3f00,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u0232 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0180,0x0180,0x3f00,0x0000, // u0233 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x3300,0x3300,0x1e00,0x0000, // u0237 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x0180,0x0180,0x0180,0x0180,0x0180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0254 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x0180,0x0180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0258 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x0180,0x0180,0x7f80,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0259 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6000,0x6000,0x3e00,0x6000,0x6000,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u025b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x6000,0x6000,0xc000,0x0000, // u0272 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0180,0x0300,0x0600,0x0c00,0x1f00,0x0180,0x0180,0x0180, 0x6180,0x6180,0x3f00,0x0000, // u0292 0x0600,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u02bb 0x0c00,0x0c00,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u02bc 0x0c00,0x0c00,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u02bd 0x1e00,0x3300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u02c6 0x3300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u02c7 0x3300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u02d8 0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u02d9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0c00,0x1800,0x0e00,0x0000, // u02db 0x3b80,0x6e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u02dc 0x1980,0x3300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u02dd 0x1800,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0300 0x0600,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0301 0x1e00,0x3300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0302 0x3b80,0x6e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0303 0x0000,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0304 0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0305 0x3300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0306 0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0307 0x3300,0x3300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0308 0x1e00,0x3300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u030a 0x1980,0x3300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u030b 0x3300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u030c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0c00,0x0c00,0x0000, // u0329 0x0000,0x6000,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0384 0x0000,0x0600,0x0c00,0x0000,0x3300,0x3300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0385 0x0000,0x6000,0xc000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0386 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0387 0x0000,0x6000,0xc000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u0388 0x0000,0x6000,0xc000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0389 0x0000,0x6000,0xc000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u038a 0x0000,0x6000,0xc000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u038c 0x0000,0x6000,0xc000,0x30c0,0x30c0,0x30c0,0x1980,0x1980,0x1980,0x0f00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0000,0x0000,0x0000,0x0000, // u038e 0x0000,0x6000,0xc000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300,0x3300,0x7380, 0x0000,0x0000,0x0000,0x0000, // u038f 0x0000,0x0600,0x0c00,0x0000,0x3300,0x3300,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0700, 0x0000,0x0000,0x0000,0x0000, // u0390 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0391 0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u0392 0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x0000,0x0000,0x0000,0x0000, // u0393 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x1e00,0x1e00,0x1e00,0x3300,0x3300,0x3300,0x6180,0x6180,0x6180,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u0394 0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u0395 0x0000,0x0000,0x0000,0x7f80,0x0180,0x0180,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x6000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u0396 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0397 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6d80,0x6d80,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0398 0x0000,0x0000,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u0399 0x0000,0x0000,0x0000,0x6180,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7000,0x7800,0x6c00,0x6600,0x6300,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u039a 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x1e00,0x1e00,0x1e00,0x3300,0x3300,0x3300,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u039b 0x0000,0x0000,0x0000,0x8080,0xc180,0xe380,0xf780,0xdd80,0xc980,0xc180,0xc180,0xc180,0xc180,0xc180,0xc180,0xc180, 0x0000,0x0000,0x0000,0x0000, // u039c 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x7180,0x7980,0x6d80,0x6780,0x6380,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u039d 0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u039e 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u039f 0x0000,0x0000,0x0000,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u03a0 0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x0000,0x0000,0x0000,0x0000, // u03a1 0x0000,0x0000,0x0000,0x7f80,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u03a3 0x0000,0x0000,0x0000,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u03a4 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u03a5 0x0000,0x0000,0x0000,0x0c00,0x3f00,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3f00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u03a6 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x1e00,0x3300,0x3300,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u03a7 0x0000,0x0000,0x0000,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3f00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u03a8 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300,0x3300,0x7380, 0x0000,0x0000,0x0000,0x0000, // u03a9 0x3300,0x3300,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u03aa 0x3300,0x3300,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u03ab 0x0000,0x0000,0x0000,0x0000,0x0c00,0x1800,0x0000,0x7d80,0xc700,0xc600,0xc600,0xc600,0xc600,0xc600,0xc700,0x7d80, 0x0000,0x0000,0x0000,0x0000, // u03ac 0x0000,0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x3f00,0x6180,0x6000,0x6000,0x3e00,0x6000,0x6000,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u03ad 0x0000,0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0180,0x0180,0x0180,0x0000, // u03ae 0x0000,0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0700, 0x0000,0x0000,0x0000,0x0000, // u03af 0x0000,0x0600,0x0c00,0x0000,0x3300,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u03b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7d80,0xc700,0xc600,0xc600,0xc600,0xc600,0xc600,0xc700,0x7d80, 0x0000,0x0000,0x0000,0x0000, // u03b1 0x0000,0x0000,0x0000,0x3e00,0x6300,0x6300,0x6300,0x6200,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00, 0x6000,0x6000,0x6000,0x0000, // u03b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x3300,0x1e00,0x1e00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0000, // u03b3 0x0000,0x0000,0x0000,0x3f00,0x1800,0x0c00,0x0600,0x1f00,0x3380,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u03b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6000,0x6000,0x3e00,0x6000,0x6000,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u03b5 0x0000,0x0000,0x0000,0x7f80,0x0300,0x0600,0x0c00,0x1800,0x3000,0x3000,0x6000,0x6000,0x6000,0x6000,0x6000,0x3f00, 0x0180,0x0180,0x0300,0x0000, // u03b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0180,0x0180,0x0180,0x0000, // u03b7 0x0000,0x0000,0x0000,0x3e00,0x6300,0x6300,0x6300,0x6300,0x6300,0x7f00,0x6300,0x6300,0x6300,0x6300,0x6300,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u03b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0700, 0x0000,0x0000,0x0000,0x0000, // u03b9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6300,0x6600,0x6c00,0x7800,0x6c00,0x6600,0x6300,0x6180, 0x0000,0x0000,0x0000,0x0000, // u03ba 0x0000,0x0000,0x0000,0x1800,0x1800,0x0c00,0x0c00,0x0c00,0x1e00,0x1e00,0x3300,0x3300,0x3300,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u03bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6380,0x7d80, 0x6000,0x6000,0x6000,0x0000, // u03bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x3300,0x1e00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u03bd 0x0000,0x0000,0x0000,0x3f80,0x6000,0x6000,0x6000,0x6000,0x3f00,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x3f00, 0x0180,0x0180,0x0300,0x0000, // u03be 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u03bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u03c0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00, 0x6000,0x6000,0x6000,0x0000, // u03c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x3f00, 0x0180,0x0180,0x0300,0x0000, // u03c2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3300,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u03c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0700, 0x0000,0x0000,0x0000,0x0000, // u03c4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u03c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2700,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3f00, 0x0c00,0x0c00,0x0c00,0x0000, // u03c6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x1e00,0x3300, 0x3300,0x6180,0x6180,0x0000, // u03c7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3f00, 0x0c00,0x0c00,0x0c00,0x0000, // u03c8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3300,0x6180,0x6180,0x6d80,0x6d80,0x6d80,0x6d80,0x7f80,0x3300, 0x0000,0x0000,0x0000,0x0000, // u03c9 0x0000,0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0700, 0x0000,0x0000,0x0000,0x0000, // u03ca 0x0000,0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u03cb 0x0000,0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u03cc 0x0000,0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u03cd 0x0000,0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x3300,0x6180,0x6180,0x6d80,0x6d80,0x6d80,0x6d80,0x7f80,0x3300, 0x0000,0x0000,0x0000,0x0000, // u03ce 0x0000,0x0000,0x0000,0x3e00,0x6300,0x6300,0x6300,0x6300,0x3f80,0x0300,0x0300,0xe300,0x6300,0x6300,0x6300,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u03d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x3f00,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3f00, 0x0c00,0x0c00,0x0000,0x0000, // u03d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf0c0,0x1980,0x0b00,0x0e00,0x0c00,0x1c00,0x3400,0x6600,0xc3c0, 0x0000,0x0000,0x0000,0x0000, // u03f0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00, 0x6000,0x6000,0x3f00,0x0000, // u03f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u03f2 0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0700,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x3300,0x3300,0x1e00,0x0000, // u03f3 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u03f4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6000,0xc000,0xc000,0xfe00,0xc000,0xc000,0x6000,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u03f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0x0600,0x0300,0x0300,0x7f00,0x0300,0x0300,0x0600,0xfc00, 0x0000,0x0000,0x0000,0x0000, // u03f6 0x1800,0x0c00,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u0400 0x3300,0x3300,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u0401 0x0000,0x0000,0x0000,0xfc00,0x3000,0x3000,0x3000,0x3f00,0x3180,0x3180,0x3180,0x3180,0x3180,0x3180,0x3180,0x3300, 0x0000,0x0000,0x0000,0x0000, // u0402 0x0600,0x0c00,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x0000,0x0000,0x0000,0x0000, // u0403 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0404 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x3f00,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0405 0x0000,0x0000,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u0406 0x3300,0x3300,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u0407 0x0000,0x0000,0x0000,0x0780,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x6300,0x6300,0x6300,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u0408 0x0000,0x0000,0x0000,0x3c00,0x6c00,0xcc00,0xcc00,0xcc00,0xcf80,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0x8f80, 0x0000,0x0000,0x0000,0x0000, // u0409 0x0000,0x0000,0x0000,0xcc00,0xcc00,0xcc00,0xcc00,0xcc00,0xcf80,0xfcc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xcf80, 0x0000,0x0000,0x0000,0x0000, // u040a 0x0000,0x0000,0x0000,0xfc00,0x3000,0x3000,0x3000,0x3f00,0x3180,0x3180,0x3180,0x3180,0x3180,0x3180,0x3180,0x3180, 0x0000,0x0000,0x0000,0x0000, // u040b 0x0600,0x0c00,0x0000,0x6180,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7000,0x7800,0x6c00,0x6600,0x6300,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u040c 0x1800,0x0c00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6380,0x6780,0x6d80,0x7980,0x7180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u040d 0x3300,0x1e00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180,0x0180,0x0180,0x0180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u040e 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80, 0x0c00,0x0c00,0x0000,0x0000, // u040f 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0410 0x0000,0x0000,0x0000,0x7f00,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u0411 0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u0412 0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x0000,0x0000,0x0000,0x0000, // u0413 0x0000,0x0000,0x0000,0x1f00,0x3300,0x6300,0x6300,0x6300,0x6300,0x6300,0x6300,0x6300,0x6300,0x6300,0x6300,0xff80, 0xc180,0xc180,0x0000,0x0000, // u0414 0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u0415 0x0000,0x0000,0x0000,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3f00,0x1e00,0x3f00,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80, 0x0000,0x0000,0x0000,0x0000, // u0416 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x0180,0x0180,0x0180,0x1f00,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0417 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6380,0x6780,0x6d80,0x7980,0x7180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0418 0x3300,0x1e00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6380,0x6780,0x6d80,0x7980,0x7180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0419 0x0000,0x0000,0x0000,0x6180,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7000,0x7800,0x6c00,0x6600,0x6300,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u041a 0x0000,0x0000,0x0000,0x0f80,0x1980,0x3180,0x3180,0x3180,0x3180,0x3180,0x3180,0x3180,0x3180,0x3180,0x3180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u041b 0x0000,0x0000,0x0000,0x8080,0xc180,0xe380,0xf780,0xdd80,0xc980,0xc180,0xc180,0xc180,0xc180,0xc180,0xc180,0xc180, 0x0000,0x0000,0x0000,0x0000, // u041c 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u041d 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u041e 0x0000,0x0000,0x0000,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u041f 0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x0000,0x0000,0x0000,0x0000, // u0420 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0421 0x0000,0x0000,0x0000,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u0422 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180,0x0180,0x0180,0x0180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0423 0x0000,0x0000,0x0c00,0x3f00,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3f00, 0x0c00,0x0000,0x0000,0x0000, // u0424 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x1e00,0x3300,0x3300,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0425 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3fc0, 0x00c0,0x00c0,0x0000,0x0000, // u0426 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0000,0x0000,0x0000,0x0000, // u0427 0x0000,0x0000,0x0000,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u0428 0x0000,0x0000,0x0000,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3fc0, 0x00c0,0x00c0,0x0000,0x0000, // u0429 0x0000,0x0000,0x0000,0xe000,0xe000,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u042a 0x0000,0x0000,0x0000,0xc180,0xc180,0xc180,0xc180,0xf980,0xcd80,0xcd80,0xcd80,0xcd80,0xcd80,0xcd80,0xcd80,0xf980, 0x0000,0x0000,0x0000,0x0000, // u042b 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u042c 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x0180,0x0180,0x0180,0x1f80,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u042d 0x0000,0x0000,0x0000,0xcf00,0xd980,0xd980,0xd980,0xd980,0xd980,0xf980,0xd980,0xd980,0xd980,0xd980,0xd980,0xcf00, 0x0000,0x0000,0x0000,0x0000, // u042e 0x0000,0x0000,0x0000,0x3f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0780,0x0d80,0x1980,0x3180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u042f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u0430 0x0000,0x0000,0x0000,0x3e00,0x6000,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u0431 0x0000,0x0000,0x0000,0x3e00,0x6300,0x6300,0x6300,0x6200,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u0432 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x0000,0x0000,0x0000,0x0000, // u0433 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0180,0x0180,0x3f00,0x0000, // u0434 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0435 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6d80,0x6d80,0x6d80,0x3f00,0x1e00,0x3f00,0x6d80,0x6d80,0x6d80, 0x0000,0x0000,0x0000,0x0000, // u0436 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x0180,0x0180,0x1f00,0x0180,0x0180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0437 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u0438 0x0000,0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u0439 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6300,0x6600,0x6c00,0x7800,0x6c00,0x6600,0x6300,0x6180, 0x0000,0x0000,0x0000,0x0000, // u043a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f80,0x1980,0x3180,0x3180,0x3180,0x3180,0x3180,0x3180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u043b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x6180,0x7380,0x7f80,0x6d80,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u043c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u043d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u043e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u043f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00, 0x6000,0x6000,0x6000,0x0000, // u0440 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0441 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u0442 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0180,0x0180,0x3f00,0x0000, // u0443 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x3f00,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3f00, 0x0c00,0x0c00,0x0000,0x0000, // u0444 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x3300,0x1e00,0x0c00,0x1e00,0x3300,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u0445 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3fc0, 0x00c0,0x00c0,0x0000,0x0000, // u0446 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180,0x0180,0x0180,0x0180, 0x0000,0x0000,0x0000,0x0000, // u0447 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u0448 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3fc0, 0x00c0,0x00c0,0x0000,0x0000, // u0449 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x3000,0x3000,0x3f00,0x3180,0x3180,0x3180,0x3180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u044a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc180,0xc180,0xc180,0xf980,0xcd80,0xcd80,0xcd80,0xcd80,0xf980, 0x0000,0x0000,0x0000,0x0000, // u044b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x7e00,0x6300,0x6300,0x6300,0x6300,0x7e00, 0x0000,0x0000,0x0000,0x0000, // u044c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x0180,0x0180,0x1f80,0x0180,0x0180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u044d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xcf00,0xd980,0xd980,0xd980,0xf980,0xd980,0xd980,0xd980,0xcf00, 0x0000,0x0000,0x0000,0x0000, // u044e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x6180,0x6180,0x6180,0x3f80,0x0d80,0x1980,0x3180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u044f 0x0000,0x0000,0x0000,0x0000,0x1800,0x0c00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0450 0x0000,0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0451 0x0000,0x0000,0x0000,0x6000,0xfc00,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0180,0x0180,0x0700,0x0000, // u0452 0x0000,0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x0000,0x0000,0x0000,0x0000, // u0453 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0454 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6000,0x6000,0x3f00,0x0180,0x0180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0455 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u0456 0x0000,0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u0457 0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0700,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x3300,0x3300,0x1e00,0x0000, // u0458 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x6c00,0xcc00,0xcf80,0xccc0,0xccc0,0xccc0,0xccc0,0x8f80, 0x0000,0x0000,0x0000,0x0000, // u0459 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xcc00,0xcc00,0xcc00,0xcf80,0xfcc0,0xccc0,0xccc0,0xccc0,0xcf80, 0x0000,0x0000,0x0000,0x0000, // u045a 0x0000,0x0000,0x0000,0x6000,0xfc00,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u045b 0x0000,0x0000,0x0000,0x0000,0x0600,0x0c00,0x0000,0x6180,0x6300,0x6600,0x6c00,0x7800,0x6c00,0x6600,0x6300,0x6180, 0x0000,0x0000,0x0000,0x0000, // u045c 0x0000,0x0000,0x0000,0x0000,0x1800,0x0c00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u045d 0x0000,0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0180,0x0180,0x3f00,0x0000, // u045e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80, 0x0c00,0x0c00,0x0000,0x0000, // u045f 0x0000,0x0000,0x0000,0x6000,0xfc00,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u0462 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0xfc00,0x3000,0x3000,0x3000,0x3f00,0x3180,0x3180,0x3180,0x3180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u0463 0x0000,0x0000,0x0000,0x7f80,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x1e00,0x3f00,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80, 0x0000,0x0000,0x0000,0x0000, // u046a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x6180,0x3300,0x1e00,0x1e00,0x3f00,0x6d80,0x6d80,0x6d80, 0x0000,0x0000,0x0000,0x0000, // u046b 0x0000,0x0180,0x0180,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x0000,0x0000,0x0000,0x0000, // u0490 0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x0000,0x0000,0x0000,0x0000, // u0491 0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0xfc00,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x0000,0x0000,0x0000,0x0000, // u0492 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0xfc00,0x6000,0x6000,0x6000,0x6000, 0x0000,0x0000,0x0000,0x0000, // u0493 0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0180,0x0300,0x0000,0x0000, // u0494 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x7e00,0x6300,0x6300,0x6300,0x6300, 0x0300,0x0600,0x0000,0x0000, // u0495 0x0000,0x0000,0x0000,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3f00,0x1e00,0x3f00,0x6d80,0x6d80,0x6d80,0x6d80,0x6dc0, 0x00c0,0x00c0,0x0000,0x0000, // u0496 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6d80,0x6d80,0x6d80,0x3f00,0x1e00,0x3f00,0x6d80,0x6d80,0x6dc0, 0x00c0,0x00c0,0x0000,0x0000, // u0497 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x0180,0x0180,0x0180,0x1f00,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00, 0x0c00,0x0c00,0x0c00,0x0000, // u0498 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x0180,0x0180,0x1f00,0x0180,0x0180,0x6180,0x3f00, 0x0c00,0x0c00,0x0c00,0x0000, // u0499 0x0000,0x0000,0x0000,0x6180,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7000,0x7800,0x6c00,0x6600,0x6300,0x6180,0x61c0, 0x00c0,0x00c0,0x0000,0x0000, // u049a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6300,0x6600,0x6c00,0x7800,0x6c00,0x6600,0x6300,0x61c0, 0x00c0,0x00c0,0x0000,0x0000, // u049b 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6b00,0x6e00,0x7c00,0x7800,0x7c00,0x6e00,0x6b00,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u049c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6b00,0x6e00,0x6c00,0x7800,0x6c00,0x6e00,0x6b00,0x6180, 0x0000,0x0000,0x0000,0x0000, // u049d 0x0000,0x0000,0x0000,0xe180,0xe180,0x6300,0x6600,0x6c00,0x7800,0x7000,0x7800,0x6c00,0x6600,0x6300,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u04a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xe180,0x6300,0x6600,0x6c00,0x7800,0x6c00,0x6600,0x6300,0x6180, 0x0000,0x0000,0x0000,0x0000, // u04a1 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x61c0, 0x00c0,0x00c0,0x0000,0x0000, // u04a2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x61c0, 0x00c0,0x00c0,0x0000,0x0000, // u04a3 0x0000,0x0000,0x0000,0xc7c0,0xc600,0xc600,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600, 0x0000,0x0000,0x0000,0x0000, // u04a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc7c0,0xc600,0xc600,0xc600,0xfe00,0xc600,0xc600,0xc600,0xc600, 0x0000,0x0000,0x0000,0x0000, // u04a5 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x6180,0x3f00, 0x0c00,0x0c00,0x0c00,0x0000, // u04aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x3f00, 0x0c00,0x0c00,0x0c00,0x0000, // u04ab 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u04ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x3300,0x1e00,0x1e00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0000, // u04af 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x3300,0x1e00,0x0c00,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u04b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x3300,0x1e00,0x1e00,0x0c00, 0x3f00,0x0c00,0x0c00,0x0000, // u04b1 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x1e00,0x3300,0x3300,0x6180,0x6180,0x61c0, 0x00c0,0x00c0,0x0000,0x0000, // u04b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x3300,0x1e00,0x0c00,0x1e00,0x3300,0x6180,0x61c0, 0x00c0,0x00c0,0x0000,0x0000, // u04b3 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180,0x0180,0x0180,0x0180,0x0180,0x01c0, 0x00c0,0x00c0,0x0000,0x0000, // u04b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180,0x0180,0x0180,0x01c0, 0x00c0,0x00c0,0x0000,0x0000, // u04b7 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6d80,0x6d80,0x6d80,0x3f80,0x0d80,0x0d80,0x0d80,0x0180,0x0180,0x0180, 0x0000,0x0000,0x0000,0x0000, // u04b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6d80,0x6d80,0x3f80,0x0d80,0x0d80,0x0180,0x0180, 0x0000,0x0000,0x0000,0x0000, // u04b9 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u04ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u04bb 0x0000,0x0000,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u04c0 0x3300,0x1e00,0x0000,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3f00,0x1e00,0x3f00,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80, 0x0000,0x0000,0x0000,0x0000, // u04c1 0x0000,0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x6d80,0x6d80,0x6d80,0x3f00,0x1e00,0x3f00,0x6d80,0x6d80,0x6d80, 0x0000,0x0000,0x0000,0x0000, // u04c2 0x0000,0x0000,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u04cf 0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u04d0 0x0000,0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u04d1 0x3300,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u04d2 0x0000,0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u04d3 0x0000,0x0000,0x0000,0x7fc0,0xc600,0xc600,0xc600,0xc600,0xc600,0xffc0,0xc600,0xc600,0xc600,0xc600,0xc600,0xc7c0, 0x0000,0x0000,0x0000,0x0000, // u04d4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7b80,0x0cc0,0x0cc0,0x7cc0,0xcfc0,0xcc00,0xcc00,0xccc0,0x7780, 0x0000,0x0000,0x0000,0x0000, // u04d5 0x3300,0x1e00,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u04d6 0x0000,0x0000,0x0000,0x0000,0x3300,0x1e00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u04d7 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x0180,0x0180,0x0180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u04d8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x0180,0x0180,0x7f80,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u04d9 0x3300,0x3300,0x0000,0x3f00,0x6180,0x6180,0x0180,0x0180,0x0180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u04da 0x0000,0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x3f00,0x6180,0x0180,0x0180,0x7f80,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u04db 0x3300,0x3300,0x0000,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x3f00,0x1e00,0x3f00,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80, 0x0000,0x0000,0x0000,0x0000, // u04dc 0x0000,0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x6d80,0x6d80,0x6d80,0x3f00,0x1e00,0x3f00,0x6d80,0x6d80,0x6d80, 0x0000,0x0000,0x0000,0x0000, // u04dd 0x3300,0x3300,0x0000,0x3f00,0x6180,0x6180,0x0180,0x0180,0x0180,0x1f00,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u04de 0x0000,0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x3f00,0x6180,0x0180,0x0180,0x1f00,0x0180,0x0180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u04df 0x0000,0x3f00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6380,0x6780,0x6d80,0x7980,0x7180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u04e2 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u04e3 0x3300,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6380,0x6780,0x6d80,0x7980,0x7180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u04e4 0x0000,0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0000,0x0000,0x0000, // u04e5 0x3300,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u04e6 0x0000,0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u04e7 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u04e8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u04e9 0x3300,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u04ea 0x0000,0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u04eb 0x3300,0x3300,0x0000,0x3f00,0x6180,0x6180,0x0180,0x0180,0x0180,0x1f80,0x0180,0x0180,0x0180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u04ec 0x0000,0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x3f00,0x6180,0x0180,0x0180,0x1f80,0x0180,0x0180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u04ed 0x0000,0x3f00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180,0x0180,0x0180,0x0180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u04ee 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0180,0x0180,0x3f00,0x0000, // u04ef 0x3300,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180,0x0180,0x0180,0x0180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u04f0 0x0000,0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0180,0x0180,0x3f00,0x0000, // u04f1 0x1980,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180,0x0180,0x0180,0x0180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u04f2 0x0000,0x0000,0x0000,0x0000,0x1980,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0180,0x0180,0x3f00,0x0000, // u04f3 0x3300,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0000,0x0000,0x0000,0x0000, // u04f4 0x0000,0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x3f80,0x0180,0x0180,0x0180,0x0180, 0x0000,0x0000,0x0000,0x0000, // u04f5 0x6600,0x6600,0x0000,0xc180,0xc180,0xc180,0xc180,0xf980,0xcd80,0xcd80,0xcd80,0xcd80,0xcd80,0xcd80,0xcd80,0xf980, 0x0000,0x0000,0x0000,0x0000, // u04f8 0x0000,0x0000,0x0000,0x0000,0x3300,0x3300,0x0000,0xc180,0xc180,0xc180,0xf980,0xcd80,0xcd80,0xcd80,0xcd80,0xf980, 0x0000,0x0000,0x0000,0x0000, // u04f9 0x0000,0x0000,0x0000,0x6180,0x6180,0x3180,0x3180,0x1980,0x1b00,0x3e00,0x6c00,0xcc00,0xc600,0xc600,0xc300,0xc300, 0x0000,0x0000,0x0000,0x0000, // u05d0 0x0000,0x0000,0x0000,0x7f00,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x7fc0, 0x0000,0x0000,0x0000,0x0000, // u05d1 0x0000,0x0000,0x0000,0x7c00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0e00,0x1b00,0x3300,0x6180,0xc180, 0x0000,0x0000,0x0000,0x0000, // u05d2 0x0000,0x0000,0x0000,0x7fc0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0000,0x0000,0x0000,0x0000, // u05d3 0x0000,0x0000,0x0000,0x7f00,0x0180,0x0180,0x0180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u05d4 0x0000,0x0000,0x0000,0x3800,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u05d5 0x0000,0x0000,0x0000,0x0000,0x3f00,0x0300,0x0600,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u05d6 0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u05d7 0x0000,0x0000,0x0000,0x6700,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u05d8 0x0000,0x0000,0x0000,0x3800,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u05d9 0x0000,0x0000,0x0000,0x7f00,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0000, // u05da 0x0000,0x0000,0x0000,0x7f00,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u05db 0x0000,0x6000,0x6000,0x7f80,0x0180,0x0180,0x0180,0x0180,0x0180,0x0300,0x0600,0x0c00,0x1800,0x1800,0x1800,0x1800, 0x0000,0x0000,0x0000,0x0000, // u05dc 0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u05dd 0x0000,0x0000,0x0000,0x0000,0xde00,0x7300,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6780, 0x0000,0x0000,0x0000,0x0000, // u05de 0x0000,0x0000,0x0000,0x7c00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0000, // u05df 0x0000,0x0000,0x0000,0x3e00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u05e0 0x0000,0x0000,0x0000,0xff00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u05e1 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x3180,0x3180,0x3180,0x1980,0x1980,0x1b00,0x0f00,0x0e00,0x1c00,0x7000, 0x0000,0x0000,0x0000,0x0000, // u05e2 0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x3980,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0000, // u05e3 0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x3980,0x0180,0x0180,0x0180,0x0180,0x0180,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u05e4 0x0000,0x0000,0x0000,0x6180,0x6180,0x3180,0x3180,0x1980,0x1b00,0x0e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0000, // u05e5 0x0000,0x0000,0x0000,0x6180,0x6180,0x3180,0x3180,0x1980,0x1b00,0x0e00,0x0c00,0x0600,0x0600,0x0300,0x0300,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u05e6 0x0000,0x0000,0x0000,0x7f80,0x0180,0x0180,0x0180,0x6180,0x6180,0x6300,0x6600,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, 0x6000,0x6000,0x6000,0x0000, // u05e7 0x0000,0x0000,0x0000,0x7f00,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0000,0x0000,0x0000,0x0000, // u05e8 0x0000,0x0000,0x0000,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x7980,0x7180,0x6180,0x6180,0x6180,0x6300,0x7e00, 0x0000,0x0000,0x0000,0x0000, // u05e9 0x0000,0x0000,0x0000,0xff00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0xc180, 0x0000,0x0000,0x0000,0x0000, // u05ea 0x0000,0x0000,0x0000,0x7e00,0x6300,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6300,0x7e00, 0x0000,0x1800,0x1800,0x0000, // u1e0c 0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0c00,0x0c00,0x0000, // u1e0d 0x0000,0x0000,0x0000,0x6180,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7000,0x7800,0x6c00,0x6600,0x6300,0x6180,0x6180, 0x0000,0x3f00,0x0000,0x0000, // u1e34 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6180,0x6300,0x6600,0x6c00,0x7800,0x6c00,0x6600,0x6300,0x6180, 0x0000,0x3f00,0x0000,0x0000, // u1e35 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80, 0x0000,0x0c00,0x0c00,0x0000, // u1e36 0x0000,0x0000,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0c00,0x0c00,0x0000, // u1e37 0x0c00,0x0c00,0x0000,0x8080,0xc180,0xe380,0xf780,0xdd80,0xc980,0xc180,0xc180,0xc180,0xc180,0xc180,0xc180,0xc180, 0x0000,0x0000,0x0000,0x0000, // u1e40 0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x7f00,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80, 0x0000,0x0000,0x0000,0x0000, // u1e41 0x0000,0x0000,0x0000,0x8080,0xc180,0xe380,0xf780,0xdd80,0xc980,0xc180,0xc180,0xc180,0xc180,0xc180,0xc180,0xc180, 0x0000,0x0c00,0x0c00,0x0000, // u1e42 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80, 0x0000,0x0c00,0x0c00,0x0000, // u1e43 0x0c00,0x0c00,0x0000,0x6180,0x6180,0x6180,0x6180,0x7180,0x7980,0x6d80,0x6780,0x6380,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u1e44 0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u1e45 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x7180,0x7980,0x6d80,0x6780,0x6380,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0c00,0x0c00,0x0000, // u1e46 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0c00,0x0c00,0x0000, // u1e47 0x0000,0x0000,0x0000,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0c00,0x0c00,0x0000, // u1e6c 0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x7e00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0f00, 0x0000,0x0600,0x0600,0x0000, // u1e6d 0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80, 0x0000,0x0c00,0x0c00,0x0000, // u1eb8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00, 0x0000,0x0c00,0x0c00,0x0000, // u1eb9 0x3b80,0x6e00,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u1ebc 0x0000,0x0000,0x0000,0x0000,0x3b80,0x6e00,0x0000,0x3f00,0x6180,0x6180,0x6180,0x7f80,0x6000,0x6000,0x6180,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u1ebd 0x0000,0x0000,0x0000,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0c00,0x0c00,0x0000, // u1eca 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00, 0x0000,0x0c00,0x0c00,0x0000, // u1ecb 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0c00,0x0c00,0x0000, // u1ecc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0c00,0x0c00,0x0000, // u1ecd 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00, 0x0000,0x0c00,0x0c00,0x0000, // u1ee4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0000,0x0c00,0x0c00,0x0000, // u1ee5 0x3b80,0x6e00,0x0000,0x6180,0x6180,0x6180,0x3300,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u1ef8 0x0000,0x0000,0x0000,0x0000,0x3b80,0x6e00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f80, 0x0180,0x0180,0x3f00,0x0000, // u1ef9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2001 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2002 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2003 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2004 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2005 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2006 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2007 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2008 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2009 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u200a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u200b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u200c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u200d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u200e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u200f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2010 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2011 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2012 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2013 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2014 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2015 0x0000,0x0000,0x0000,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600, 0x0000,0x0000,0x0000,0x0000, // u2016 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x7f80,0x0000,0x7f80, // u2017 0x0000,0x0600,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2018 0x0000,0x0c00,0x0c00,0x0c00,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2019 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00, 0x1800,0x0000,0x0000,0x0000, // u201a 0x0000,0x1800,0x1800,0x1800,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u201b 0x0000,0x1980,0x3300,0x3300,0x3300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u201c 0x0000,0x1980,0x1980,0x1980,0x3300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u201d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3300,0x3300,0x3300, 0x6600,0x0000,0x0000,0x0000, // u201e 0x0000,0x6600,0x6600,0x6600,0x3300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u201f 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u2020 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u2021 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x1e00,0x1e00,0x0c00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2022 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6d80,0x6d80, 0x0000,0x0000,0x0000,0x0000, // u2026 0x0000,0x0000,0x0000,0x0000,0xe600,0xa600,0xec00,0x0c00,0x1800,0x1800,0x3000,0x3000,0x6000,0x6fc0,0xcb40,0xcfc0, 0x0000,0x0000,0x0000,0x0000, // u2030 0x0000,0x0c00,0x0c00,0x0c00,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2032 0x0000,0x3300,0x3300,0x3300,0x2200,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2033 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x1800,0x3000,0x1800,0x0c00,0x0600,0x0300, 0x0000,0x0000,0x0000,0x0000, // u2039 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0600,0x0c00,0x1800,0x3000, 0x0000,0x0000,0x0000,0x0000, // u203a 0x0000,0x0000,0x0000,0x3300,0x3300,0x3300,0x3300,0x3300,0x3300,0x3300,0x3300,0x3300,0x0000,0x0000,0x3300,0x3300, 0x0000,0x0000,0x0000,0x0000, // u203c 0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u203e 0x0000,0x1e00,0x3300,0x3300,0x3300,0x3300,0x3300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2070 0x0c00,0x0c00,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2071 0x0000,0x0300,0x0700,0x0f00,0x1b00,0x3f80,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2074 0x0000,0x3e00,0x3000,0x3000,0x3e00,0x0300,0x0300,0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2075 0x0000,0x1e00,0x3000,0x3000,0x3e00,0x3300,0x3300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2076 0x0000,0x3f00,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2077 0x0000,0x1e00,0x3300,0x3300,0x1e00,0x3300,0x3300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2078 0x0000,0x1e00,0x3300,0x3300,0x1f00,0x0300,0x0300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2079 0x0000,0x0000,0x0c00,0x0c00,0x3f00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u207a 0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u207b 0x0000,0x0000,0x0000,0x3f00,0x0000,0x0000,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u207c 0x0000,0x0600,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u207d 0x0000,0x0c00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u207e 0x0000,0x0000,0x3e00,0x3300,0x3300,0x3300,0x3300,0x3300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u207f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x3300,0x3300,0x3300,0x3300, 0x1e00,0x0000,0x0000,0x0000, // u2080 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x1e00,0x0000,0x0000,0x0000, // u2081 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x3300,0x0600,0x0c00,0x1800, 0x3f00,0x0000,0x0000,0x0000, // u2082 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x0300,0x0e00,0x0300,0x3300, 0x1e00,0x0000,0x0000,0x0000, // u2083 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0700,0x0f00,0x1b00,0x3f80,0x0300, 0x0300,0x0000,0x0000,0x0000, // u2084 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x3000,0x3000,0x3e00,0x0300,0x0300, 0x3e00,0x0000,0x0000,0x0000, // u2085 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3000,0x3000,0x3e00,0x3300,0x3300, 0x1e00,0x0000,0x0000,0x0000, // u2086 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0300,0x0600,0x0600,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000, // u2087 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x3300,0x1e00,0x3300,0x3300, 0x1e00,0x0000,0x0000,0x0000, // u2088 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x3300,0x1f00,0x0300,0x0300, 0x1e00,0x0000,0x0000,0x0000, // u2089 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x3f00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u208a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u208b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x0000,0x3f00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u208c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0600,0x0000,0x0000,0x0000, // u208d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0c00,0x0000,0x0000,0x0000, // u208e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x0300,0x1f00,0x3300,0x3300, 0x1f00,0x0000,0x0000,0x0000, // u2090 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x3f00,0x3000,0x3000, 0x1f00,0x0000,0x0000,0x0000, // u2091 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x3300,0x3300,0x3300, 0x1e00,0x0000,0x0000,0x0000, // u2092 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3300,0x1e00,0x0c00,0x0c00,0x1e00, 0x3300,0x0000,0x0000,0x0000, // u2093 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0300,0x0300,0x3f00,0x3300, 0x1e00,0x0000,0x0000,0x0000, // u2094 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3e00,0x3300,0x3300,0x3300,0x3300, 0x3300,0x0000,0x0000,0x0000, // u2095 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3300,0x3600,0x3c00,0x3c00,0x3600, 0x3300,0x0000,0x0000,0x0000, // u2096 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x1e00,0x0000,0x0000,0x0000, // u2097 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6d80,0x6d80,0x6d80,0x6d80, 0x6d80,0x0000,0x0000,0x0000, // u2098 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x3300,0x3300,0x3300,0x3300, 0x3e00,0x3000,0x3000,0x0000, // u209a 0x0000,0x0000,0x0000,0xf800,0xcc00,0xcc00,0xcc00,0xcc00,0xcc00,0xfb00,0xc300,0xc780,0xc300,0xc300,0xc300,0xc180, 0x0000,0x0000,0x0000,0x0000, // u20a7 0x0000,0x0000,0x0000,0xf880,0x8480,0x8480,0x8480,0x9480,0x9480,0x9480,0x9480,0x9480,0x9080,0x9080,0x9080,0x9f00, 0x0000,0x0000,0x0000,0x0000, // u20aa 0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x6000,0xfe00,0x6000,0x6000,0xfe00,0x6000,0x60c0,0x3180,0x1f00, 0x0000,0x0000,0x0000,0x0000, // u20ac 0x0000,0x0000,0x0000,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0f00,0x3c00,0x0f00,0x3c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u20ae 0x0000,0x0000,0x0000,0x3e00,0x5100,0x5100,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5100,0x5100,0x3e00, 0x0000,0x0000,0x0000,0x0000, // u2102 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u210e 0x0000,0x0000,0x0000,0x6000,0xfc00,0x6000,0x6000,0x7f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u210f 0x0000,0x0000,0x0000,0x4100,0x4100,0x4100,0x6100,0x5100,0x6900,0x5500,0x4b00,0x4500,0x4300,0x4100,0x4100,0x4100, 0x0000,0x0000,0x0000,0x0000, // u2115 0x0000,0x0000,0x0000,0xcc00,0xcdc0,0xcd40,0xed40,0xedc0,0xfc00,0xfc00,0xfdc0,0xddc0,0xdc00,0xcdc0,0xcdc0,0xcc00, 0x0000,0x0000,0x0000,0x0000, // u2116 0x0000,0x0000,0x0000,0x3e00,0x5100,0x5100,0x5100,0x5100,0x5100,0x5100,0x5100,0x5100,0x5100,0x5100,0x5500,0x3e00, 0x0100,0x0080,0x0000,0x0000, // u211a 0x0000,0x0000,0x0000,0x7e00,0x5100,0x5100,0x5100,0x5100,0x5100,0x5e00,0x5800,0x5400,0x5a00,0x5500,0x5280,0x7180, 0x0000,0x0000,0x0000,0x0000, // u211d 0x0000,0x0000,0x0000,0xf440,0x66c0,0x67c0,0x66c0,0x66c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2122 0x0000,0x0000,0x0000,0x7f00,0x0100,0x0100,0x0300,0x0500,0x0a00,0x1400,0x2800,0x5000,0x6000,0x4000,0x4000,0x7f00, 0x0000,0x0000,0x0000,0x0000, // u2124 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300,0x3300,0x7380, 0x0000,0x0000,0x0000,0x0000, // u2126 0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x3180,0x3180,0x18c0,0x3980,0x6f00,0xce00,0xc600,0xc600,0xc300,0x6300, 0x0000,0x0000,0x0000,0x0000, // u2135 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x3000,0x6000,0xff80,0xff80,0x6000,0x3000,0x1000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2190 0x0000,0x0000,0x0000,0x0c00,0x1e00,0x3f00,0x6d80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u2191 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0600,0x0300,0xff80,0xff80,0x0300,0x0600,0x0400,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2192 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x6d80,0x3f00,0x1e00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u2193 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1200,0x3300,0x6180,0xffc0,0xffc0,0x6180,0x3300,0x1200,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2194 0x0000,0x0000,0x0000,0x0c00,0x1e00,0x3f00,0x6d80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x6d80,0x3f00,0x1e00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u2195 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1180,0x3180,0x6180,0xff80,0xff80,0x6180,0x3180,0x1180,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u21a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc400,0xc600,0xc300,0xff80,0xff80,0xc300,0xc600,0xc400,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u21a6 0x0000,0x0000,0x0000,0x0c00,0x1e00,0x3f00,0x6d80,0x0c00,0x0c00,0x0c00,0x0c00,0x6d80,0x3f00,0x1e00,0x0c00,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u21a8 0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0180,0x1180,0x3180,0x6180,0xff80,0xff80,0x6000,0x3000,0x1000, 0x0000,0x0000,0x0000,0x0000, // u21b5 0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0x3800,0x6800,0xc980,0xc180,0xc180,0xc180,0x6300,0x3e00,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u21bb 0x0000,0x0000,0x0000,0x0000,0x1000,0x3000,0x6000,0xff80,0xff80,0x0000,0xff80,0xff80,0x0300,0x0600,0x0400,0x0000, 0x0000,0x0000,0x0000,0x0000, // u21cb 0x0000,0x0000,0x0000,0x0000,0x0400,0x0600,0x0300,0xff80,0xff80,0x0000,0xff80,0xff80,0x6000,0x3000,0x1000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u21cc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1800,0x3f80,0x7f80,0xe000,0x7f80,0x3f80,0x1800,0x0800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u21d0 0x0000,0x0000,0x0000,0x0800,0x1c00,0x3e00,0x7700,0xf780,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600, 0x0000,0x0000,0x0000,0x0000, // u21d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0c00,0xfe00,0xff00,0x0380,0xff00,0xfe00,0x0c00,0x0800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u21d2 0x0000,0x0000,0x0000,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0xf780,0x7700,0x3e00,0x1c00,0x0800, 0x0000,0x0000,0x0000,0x0000, // u21d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x1200,0x3300,0x7f80,0xffc0,0xc0c0,0xffc0,0x7f80,0x3300,0x1200,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u21d4 0x0000,0x0000,0x0000,0x0800,0x1c00,0x3e00,0x7700,0xf780,0x3600,0x3600,0x3600,0xf780,0x7700,0x3e00,0x1c00,0x0800, 0x0000,0x0000,0x0000,0x0000, // u21d5 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x7f80,0x3300,0x3300,0x3300,0x1200,0x1e00,0x1e00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u2200 0x0000,0x0000,0x0000,0x7f80,0x0180,0x0180,0x0180,0x0180,0x0180,0x7f80,0x0180,0x0180,0x0180,0x0180,0x0180,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u2203 0x0000,0x0180,0x0180,0x7f80,0x0380,0x0780,0x0780,0x0d80,0x0d80,0x7f80,0x1980,0x1980,0x3180,0x3180,0x6180,0x7f80, 0xc000,0xc000,0x0000,0x0000, // u2204 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x3f00,0x6780,0x6d80,0x6d80,0x6d80,0x7980,0x3f00,0x3000,0x6000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2205 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x1e00,0x1e00,0x1e00,0x3300,0x3300,0x3300,0x6180,0x6180,0x6180,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u2206 0x0000,0x0000,0x0000,0x7f80,0x6180,0x6180,0x6180,0x3300,0x3300,0x3300,0x1e00,0x1e00,0x1e00,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u2207 0x0000,0x0000,0x0000,0x0f80,0x1800,0x3000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000,0x3000,0x1800,0x0f80, 0x0000,0x0000,0x0000,0x0000, // u2208 0x0000,0x00c0,0x00c0,0x0f80,0x1980,0x3300,0x6300,0x6600,0x6600,0x7f80,0x6c00,0x6c00,0x7800,0x3800,0x3800,0x3f80, 0x6000,0x6000,0x0000,0x0000, // u2209 0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x3000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x3000,0x1f80,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u220a 0x0000,0x0000,0x0000,0x7c00,0x0600,0x0300,0x0180,0x0180,0x0180,0x7f80,0x0180,0x0180,0x0180,0x0300,0x0600,0x7c00, 0x0000,0x0000,0x0000,0x0000, // u220b 0x0000,0x6000,0x6000,0x3e00,0x3300,0x1980,0x18c0,0x0cc0,0x0cc0,0x3fc0,0x06c0,0x06c0,0x03c0,0x0380,0x0380,0x3f80, 0x00c0,0x00c0,0x0000,0x0000, // u220c 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0300,0x0180,0x0180,0x7f80,0x0180,0x0180,0x0300,0x7e00,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u220d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2212 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u2213 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u2214 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0xc000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2215 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2216 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x1c00,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2219 0x0000,0x0380,0x0380,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x6300,0x6300,0x6300,0x3300,0x1b00,0x0f00,0x0700, 0x0000,0x0000,0x0000,0x0000, // u221a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6d80,0x6d80,0x6d80,0x6d80,0x3f00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u221e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u221f 0x0000,0x0000,0x0000,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600, 0x0000,0x0000,0x0000,0x0000, // u2225 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x1e00,0x1e00,0x3300,0x3300,0x3300,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u2227 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x3300,0x3300,0x3300,0x1e00,0x1e00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u2228 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u2229 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u222a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3980,0x6d80,0x6700,0x0000,0x3980,0x6d80,0x6700,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2248 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x7f80,0x0600,0x0c00,0x1800,0x7f80,0x6000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2260 0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2261 0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u2264 0x0000,0x0000,0x0000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x0000,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u2265 0x0000,0x0000,0x0000,0x0000,0x0440,0x0cc0,0x1980,0x3300,0x6600,0xcc00,0x6600,0x3300,0x1980,0x0cc0,0x0440,0x0000, 0x0000,0x0000,0x0000,0x0000, // u226a 0x0000,0x0000,0x0000,0x0000,0x8800,0xcc00,0x6600,0x3300,0x1980,0x0cc0,0x1980,0x3300,0x6600,0xcc00,0x8800,0x0000, 0x0000,0x0000,0x0000,0x0000, // u226b 0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x3000,0x6000,0x6000,0x6000,0x6000,0x6000,0x3000,0x1f80,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2282 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0300,0x0180,0x0180,0x0180,0x0180,0x0180,0x0300,0x7e00,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2283 0x0000,0x0000,0x0000,0x0000,0x1f80,0x3000,0x6000,0x6000,0x6000,0x6000,0x6000,0x3000,0x1f80,0x0000,0x7f80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2286 0x0000,0x0000,0x0000,0x0000,0x7e00,0x0300,0x0180,0x0180,0x0180,0x0180,0x0180,0x0300,0x7e00,0x0000,0x7f80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2287 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u22a5 0x0000,0x0000,0x0000,0x1e00,0x3300,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180, 0x0000,0x0000,0x0000,0x0000, // u22c2 0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u22c3 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x3f00,0x6780,0x6d80,0x6d80,0x6d80,0x7980,0x3f00,0x3000,0x6000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2300 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1c00,0x3600,0x6300,0xc180,0xc180,0xc180,0xc180,0xc180,0xff80, 0x0000,0x0000,0x0000,0x0000, // u2302 0x0000,0x0000,0x0000,0x1e00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, 0x0000,0x0000,0x0000,0x0000, // u2308 0x0000,0x0000,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0000,0x0000,0x0000,0x0000, // u2309 0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u230a 0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x1e00, 0x0000,0x0000,0x0000,0x0000, // u230b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2310 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2319 0x0000,0x0000,0x0000,0x0700,0x0d80,0x0d80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2320 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x6c00,0x6c00,0x3800, 0x0000,0x0000,0x0000,0x0000, // u2321 0x0300,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x1800,0x3000,0x3000,0x3000,0x3000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000, // u239b 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000, // u239c 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x3000,0x3000,0x3000,0x3000,0x1800,0x1800,0x1800, 0x0c00,0x0c00,0x0600,0x0300, // u239d 0x6000,0x3000,0x1800,0x1800,0x0c00,0x0c00,0x0c00,0x0600,0x0600,0x0600,0x0600,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300, // u239e 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300, // u239f 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0600,0x0600,0x0600,0x0600,0x0c00,0x0c00,0x0c00, 0x1800,0x1800,0x3000,0x6000, // u23a0 0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000, // u23a1 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000, // u23a2 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x7f00, // u23a3 0x7f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300, // u23a4 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300, // u23a5 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x7f00, // u23a6 0x03c0,0x0e00,0x0c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, 0x1800,0x1800,0x1800,0x1800, // u23a7 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3000,0xe000,0xe000,0x3000,0x1800,0x1800,0x1800,0x1800, 0x1800,0x1800,0x1800,0x1800, // u23a8 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, 0x1800,0x0c00,0x0e00,0x03c0, // u23a9 0xf000,0x1c00,0x0c00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600, // u23ab 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0300,0x01c0,0x01c0,0x0300,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600, // u23ac 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0c00,0x1c00,0xf000, // u23ad 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u23ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u23af 0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u23ba 0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u23bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x0000, 0x0000,0x0000,0x0000,0x0000, // u23bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0xffc0,0xffc0, // u23bd 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u23d0 0x0000,0x0000,0xcc00,0xcc00,0xcc00,0xfc00,0xcc00,0xcc00,0xcc00,0x0000,0x1f80,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0000,0x0000,0x0000, // u2409 0x0000,0x0000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xfc00,0x0000,0x1f80,0x1800,0x1800,0x1e00,0x1800,0x1800, 0x1800,0x0000,0x0000,0x0000, // u240a 0x0000,0x0000,0xcc00,0xcc00,0xcc00,0xcc00,0xcc00,0x7800,0x3000,0x0000,0x1f80,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0000,0x0000,0x0000, // u240b 0x0000,0x0000,0xfc00,0xc000,0xc000,0xf000,0xc000,0xc000,0xc000,0x0000,0x1f80,0x1800,0x1800,0x1e00,0x1800,0x1800, 0x1800,0x0000,0x0000,0x0000, // u240c 0x0000,0x0000,0x7800,0xcc00,0xc000,0xc000,0xc000,0xcc00,0x7800,0x0000,0x1f00,0x1980,0x1980,0x1f00,0x1e00,0x1b00, 0x1980,0x0000,0x0000,0x0000, // u240d 0x0000,0x0000,0xcc00,0xcc00,0xec00,0xfc00,0xdc00,0xcc00,0xcc00,0x0000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, 0x1f80,0x0000,0x0000,0x0000, // u2424 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2500 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2501 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2502 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00,0x1c00,0x1c00, // u2503 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xd680,0xd680,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2508 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xd680,0xd680,0xd680,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2509 0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0c00, 0x0c00,0x0c00,0x0c00,0x0000, // u250a 0x1c00,0x1c00,0x1c00,0x1c00,0x0000,0x1c00,0x1c00,0x1c00,0x1c00,0x0000,0x1c00,0x1c00,0x1c00,0x1c00,0x0000,0x1c00, 0x1c00,0x1c00,0x1c00,0x0000, // u250b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u250c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0fc0,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u250d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x1fc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00,0x1c00,0x1c00, // u250e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x1fc0,0x1fc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00,0x1c00,0x1c00, // u250f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2510 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2511 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00,0x1c00,0x1c00, // u2512 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0xfc00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00,0x1c00,0x1c00, // u2513 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2514 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2515 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1fc0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2516 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1fc0,0x1fc0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2517 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2518 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2519 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u251a 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xfc00,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u251b 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u251c 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0x0fc0,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u251d 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1fc0,0x1fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u251e 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1fc0,0x1fc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00,0x1c00,0x1c00, // u251f 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1fc0,0x1fc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00,0x1c00,0x1c00, // u2520 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1fc0,0x1fc0,0x1fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2521 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1fc0,0x1fc0,0x1fc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00,0x1c00,0x1c00, // u2522 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1fc0,0x1fc0,0x1fc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00,0x1c00,0x1c00, // u2523 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2524 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2525 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2526 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00,0x1c00,0x1c00, // u2527 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xfc00,0xfc00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00,0x1c00,0x1c00, // u2528 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xfc00,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2529 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0xfc00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00,0x1c00,0x1c00, // u252a 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xfc00,0xfc00,0xfc00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00,0x1c00,0x1c00, // u252b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u252c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u252d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u252e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u252f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00,0x1c00,0x1c00, // u2530 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xffc0,0xffc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00,0x1c00,0x1c00, // u2531 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0xffc0,0xffc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00,0x1c00,0x1c00, // u2532 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0xffc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00,0x1c00,0x1c00, // u2533 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2534 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2535 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2536 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2537 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2538 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xfc00,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2539 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1fc0,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u253a 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xffc0,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u253b 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u253c 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u253d 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u253e 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u253f 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2540 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0xffc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00,0x1c00,0x1c00, // u2541 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xffc0,0xffc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00,0x1c00,0x1c00, // u2542 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xfc00,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2543 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1fc0,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2544 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xffc0,0xffc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00,0x1c00,0x1c00, // u2545 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0xffc0,0xffc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00,0x1c00,0x1c00, // u2546 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xffc0,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2547 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0xffc0,0xffc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00,0x1c00,0x1c00, // u2548 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xfc00,0xffc0,0xffc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00,0x1c00,0x1c00, // u2549 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1fc0,0xffc0,0xffc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00,0x1c00,0x1c00, // u254a 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0xffc0,0xffc0,0xffc0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00,0x1c00,0x1c00, // u254b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x0000,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2550 0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600, 0x3600,0x3600,0x3600,0x3600, // u2551 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0fc0,0x0c00,0x0fc0,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2552 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x3fc0,0x3600,0x3600,0x3600,0x3600,0x3600, 0x3600,0x3600,0x3600,0x3600, // u2553 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x3fc0,0x3000,0x37c0,0x37c0,0x3600,0x3600,0x3600,0x3600, 0x3600,0x3600,0x3600,0x3600, // u2554 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0x0c00,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2555 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xfe00,0x3600,0x3600,0x3600,0x3600,0x3600, 0x3600,0x3600,0x3600,0x3600, // u2556 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xfe00,0x0600,0xf600,0xf600,0x3600,0x3600,0x3600,0x3600, 0x3600,0x3600,0x3600,0x3600, // u2557 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0x0fc0,0x0c00,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2558 0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3fc0,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2559 0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x37c0,0x37c0,0x3000,0x3fc0,0x3fc0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u255a 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0x0c00,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u255b 0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0xfe00,0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u255c 0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0xf600,0xf600,0x0600,0xfe00,0xfe00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u255d 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0x0fc0,0x0c00,0x0fc0,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u255e 0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x37c0,0x37c0,0x3600,0x3600,0x3600,0x3600,0x3600, 0x3600,0x3600,0x3600,0x3600, // u255f 0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x37c0,0x37c0,0x3000,0x37c0,0x37c0,0x3600,0x3600,0x3600,0x3600, 0x3600,0x3600,0x3600,0x3600, // u2560 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0x0c00,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2561 0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0xf600,0xf600,0x3600,0x3600,0x3600,0x3600,0x3600, 0x3600,0x3600,0x3600,0x3600, // u2562 0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0xf600,0xf600,0x0600,0xf600,0xf600,0x3600,0x3600,0x3600,0x3600, 0x3600,0x3600,0x3600,0x3600, // u2563 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x0000,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2564 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x3600,0x3600,0x3600,0x3600,0x3600, 0x3600,0x3600,0x3600,0x3600, // u2565 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x0000,0xf7c0,0xf7c0,0x3600,0x3600,0x3600,0x3600, 0x3600,0x3600,0x3600,0x3600, // u2566 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0xffc0,0x0000,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2567 0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2568 0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0xf7c0,0xf7c0,0x0000,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2569 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0xffc0,0x0c00,0xffc0,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u256a 0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0xffc0,0xffc0,0x3600,0x3600,0x3600,0x3600,0x3600, 0x3600,0x3600,0x3600,0x3600, // u256b 0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0x3600,0xf7c0,0xf7c0,0x0000,0xf7c0,0xf7c0,0x3600,0x3600,0x3600,0x3600, 0x3600,0x3600,0x3600,0x3600, // u256c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x03c0,0x0700,0x0e00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u256d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xe000,0xf000,0x3800,0x1c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u256e 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1c00,0x3800,0xf000,0xe000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u256f 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0e00,0x0700,0x03c0,0x01c0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2570 0x0040,0x0040,0x00c0,0x0080,0x0180,0x0100,0x0300,0x0200,0x0600,0x0400,0x0c00,0x0800,0x1800,0x1000,0x3000,0x2000, 0x6000,0x4000,0xc000,0x8000, // u2571 0x8000,0xc000,0x4000,0x6000,0x2000,0x3000,0x1000,0x1800,0x0800,0x0c00,0x0400,0x0600,0x0200,0x0300,0x0100,0x0180, 0x0080,0x00c0,0x0040,0x0040, // u2572 0x8040,0xc040,0x40c0,0x6080,0x2180,0x3100,0x1300,0x1a00,0x0e00,0x0c00,0x0c00,0x0e00,0x1a00,0x1300,0x3100,0x2180, 0x6080,0x40c0,0xc040,0x8040, // u2573 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2574 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2575 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2576 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u2577 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2578 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2579 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u257a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00,0x1c00,0x1c00, // u257b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u257c 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00, 0x1c00,0x1c00,0x1c00,0x1c00, // u257d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u257e 0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00, // u257f 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2580 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0xffc0,0xffc0,0xffc0, // u2581 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0, 0xffc0,0xffc0,0xffc0,0xffc0, // u2582 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0xffc0,0xffc0, // u2583 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0xffc0,0xffc0, // u2584 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0xffc0,0xffc0, // u2585 0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0xffc0,0xffc0, // u2586 0x0000,0x0000,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0xffc0,0xffc0, // u2587 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0xffc0,0xffc0, // u2588 0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80, 0xff80,0xff80,0xff80,0xff80, // u2589 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, 0xff00,0xff00,0xff00,0xff00, // u258a 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, 0xfc00,0xfc00,0xfc00,0xfc00, // u258b 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, 0xf800,0xf800,0xf800,0xf800, // u258c 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, 0xf000,0xf000,0xf000,0xf000, // u258d 0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000, 0xe000,0xe000,0xe000,0xe000, // u258e 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, 0x8000,0x8000,0x8000,0x8000, // u258f 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, 0x07c0,0x07c0,0x07c0,0x07c0, // u2590 0xaa80,0x0000,0xaa80,0x0000,0xaa80,0x0000,0xaa80,0x0000,0xaa80,0x0000,0xaa80,0x0000,0xaa80,0x0000,0xaa80,0x0000, 0xaa80,0x0000,0xaa80,0x0000, // u2591 0xaa80,0x5540,0xaa80,0x5540,0xaa80,0x5540,0xaa80,0x5540,0xaa80,0x5540,0xaa80,0x5540,0xaa80,0x5540,0xaa80,0x5540, 0xaa80,0x5540,0xaa80,0x5540, // u2592 0xffc0,0xaa80,0xffc0,0xaa80,0xffc0,0xaa80,0xffc0,0xaa80,0xffc0,0xaa80,0xffc0,0xaa80,0xffc0,0xaa80,0xffc0,0xaa80, 0xffc0,0xaa80,0xffc0,0xaa80, // u2593 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, 0xf800,0xf800,0xf800,0xf800, // u2596 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, 0x07c0,0x07c0,0x07c0,0x07c0, // u2597 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2598 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0xffc0,0xffc0, // u2599 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, 0x07c0,0x07c0,0x07c0,0x07c0, // u259a 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, 0xf800,0xf800,0xf800,0xf800, // u259b 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, 0x07c0,0x07c0,0x07c0,0x07c0, // u259c 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u259d 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, 0xf800,0xf800,0xf800,0xf800, // u259e 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0xffc0,0xffc0, // u259f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x3f00,0x3f00,0x3f00,0x3f00,0x3f00,0x3f00,0x3f00,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u25a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff80,0xff80,0xff80,0xff80,0xff80, 0x0000,0x0000,0x0000,0x0000, // u25ac 0x0000,0x0000,0x0000,0x7f80,0x7f80,0x7f80,0x7f80,0x7f80,0x7f80,0x7f80,0x7f80,0x7f80,0x7f80,0x7f80,0x7f80,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u25ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x1e00,0x1e00,0x3f00,0x3f00,0x7f80,0x7f80,0xffc0,0xffc0,0x0000, 0x0000,0x0000,0x0000,0x0000, // u25b2 0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xffc0,0xffc0,0xff00,0xfc00,0xf000,0xc000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u25b6 0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xffc0,0xffc0,0xff00,0xfc00,0xf000,0xc000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u25ba 0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x7f80,0x7f80,0x3f00,0x3f00,0x1e00,0x1e00,0x0c00,0x0c00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u25bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x03c0,0x0fc0,0x3fc0,0xffc0,0xffc0,0x3fc0,0x0fc0,0x03c0,0x00c0,0x0000, 0x0000,0x0000,0x0000,0x0000, // u25c0 0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x03c0,0x0fc0,0x3fc0,0xffc0,0xffc0,0x3fc0,0x0fc0,0x03c0,0x00c0,0x0000, 0x0000,0x0000,0x0000,0x0000, // u25c4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x1e00,0x3f00,0x7f80,0xffc0,0xffc0,0x7f80,0x3f00,0x1e00,0x0c00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u25c6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x1e00,0x3300,0x6180,0xc0c0,0xc0c0,0x6180,0x3300,0x1e00,0x0c00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u25ca 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x2100,0x2100,0x3300,0x1e00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u25cb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3f00,0x3f00,0x3f00,0x3f00,0x1e00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u25cf 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xf3c0,0xe1c0,0xe1c0,0xf3c0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0xffc0,0xffc0, // u25d8 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xe1c0,0xccc0,0xdec0,0xdec0,0xccc0,0xe1c0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0xffc0,0xffc0, // u25d9 0x0000,0x0000,0x0000,0x7f80,0x8040,0x8040,0xb340,0xb340,0x8040,0x8040,0xbf40,0x9e40,0x8040,0x8040,0x8040,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u263a 0x0000,0x0000,0x0000,0x7f80,0xffc0,0xffc0,0xccc0,0xccc0,0xffc0,0xffc0,0xc0c0,0xe1c0,0xffc0,0xffc0,0xffc0,0x7f80, 0x0000,0x0000,0x0000,0x0000, // u263b 0x0000,0x0000,0x0000,0x0c00,0x0c00,0xccc0,0x6d80,0x3f00,0x1e00,0xf3c0,0x1e00,0x3f00,0x6d80,0xccc0,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u263c 0x0000,0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000, // u2640 0x0000,0x0000,0x0000,0x0f80,0x0380,0x0680,0x0c80,0x1880,0x7e00,0xc300,0xc300,0xc300,0xc300,0xc300,0xc300,0x7e00, 0x0000,0x0000,0x0000,0x0000, // u2642 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x1e00,0x3f00,0x7f80,0xffc0,0xffc0,0xffc0,0xffc0,0x6d80,0x0c00,0x0c00,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u2660 0x0000,0x0000,0x0000,0x1e00,0x3f00,0x3f00,0x1e00,0x0c00,0x6d80,0xffc0,0xffc0,0xffc0,0xffc0,0x6d80,0x0c00,0x3f00, 0x0000,0x0000,0x0000,0x0000, // u2663 0x0000,0x0000,0x0000,0x0000,0x0000,0x7380,0xf3c0,0xffc0,0xffc0,0xffc0,0xffc0,0x7f80,0x3f00,0x1e00,0x0c00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2665 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x1e00,0x3f00,0x7f80,0xffc0,0xffc0,0x7f80,0x3f00,0x1e00,0x0c00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2666 0x0000,0x0000,0x0000,0x3f80,0x3180,0x3180,0x3f80,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0xf000,0xe000, 0x0000,0x0000,0x0000,0x0000, // u266a 0x0000,0x0000,0x0000,0x7f80,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6380,0xe300,0xc000, 0x0000,0x0000,0x0000,0x0000, // u266b 0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x0180,0x0180,0xc300,0xc300,0x6600,0x6600,0x3c00,0x3c00,0x1800,0x1800, 0x0000,0x0000,0x0000,0x0000, // u2713 0x0000,0x0000,0x0000,0x0000,0x01c0,0x01c0,0x0380,0x0380,0xe700,0xe700,0x7e00,0x7e00,0x3c00,0x3c00,0x1800,0x1800, 0x0000,0x0000,0x0000,0x0000, // u2714 0x0000,0x0000,0x0000,0x0000,0x0300,0x6300,0x3600,0x1e00,0x0c00,0x0e00,0x1b00,0x1980,0x3000,0x3000,0x6000,0x6000, 0x0000,0x0000,0x0000,0x0000, // u2717 0x0000,0x0000,0x0000,0x0000,0x0700,0xe700,0x7e00,0x3e00,0x1c00,0x1e00,0x3f00,0x3b80,0x7180,0x7000,0xe000,0xe000, 0x0000,0x0000,0x0000,0x0000, // u2718 0x0000,0x0000,0x0000,0x0600,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x3000,0x1800,0x1800,0x0c00,0x0c00,0x0600,0x0600, 0x0000,0x0000,0x0000,0x0000, // u27e8 0x0000,0x0000,0x0000,0x3000,0x3000,0x1800,0x1800,0x0c00,0x0c00,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x3000,0x3000, 0x0000,0x0000,0x0000,0x0000, // u27e9 0x0000,0x0000,0x0000,0x1980,0x1980,0x3300,0x3300,0x6600,0x6600,0xcc00,0x6600,0x6600,0x3300,0x3300,0x1980,0x1980, 0x0000,0x0000,0x0000,0x0000, // u27ea 0x0000,0x0000,0x0000,0xcc00,0xcc00,0x6600,0x6600,0x3300,0x3300,0x1980,0x3300,0x3300,0x6600,0x6600,0xcc00,0xcc00, 0x0000,0x0000,0x0000,0x0000, // u27eb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2800 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2801 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2802 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2803 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2804 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2805 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2806 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2807 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2808 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2809 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u280a 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u280b 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u280c 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u280d 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u280e 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u280f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2810 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2811 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2812 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2813 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2814 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2815 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2816 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2817 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2818 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2819 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u281a 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u281b 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u281c 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u281d 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u281e 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u281f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2820 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2821 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2822 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2823 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2824 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2825 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2826 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2827 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2828 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2829 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u282a 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u282b 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u282c 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u282d 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u282e 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u282f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2830 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2831 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2832 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2833 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2834 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2835 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2836 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2837 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2838 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2839 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u283a 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u283b 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u283c 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u283d 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u283e 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u283f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2840 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2841 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2842 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2843 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2844 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2845 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2846 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2847 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2848 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2849 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u284a 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u284b 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u284c 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u284d 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u284e 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u284f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2850 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2851 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2852 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2853 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2854 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2855 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2856 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2857 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2858 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2859 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u285a 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u285b 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u285c 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u285d 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u285e 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u285f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2860 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2861 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2862 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2863 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2864 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2865 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2866 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2867 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2868 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2869 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u286a 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u286b 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u286c 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u286d 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u286e 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u286f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2870 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2871 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2872 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2873 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2874 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2875 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2876 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2877 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2878 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u2879 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u287a 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u287b 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u287c 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u287d 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u287e 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6000,0x6000,0x0000,0x0000, // u287f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u2880 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u2881 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u2882 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u2883 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u2884 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u2885 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u2886 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u2887 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u2888 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u2889 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u288a 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u288b 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u288c 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u288d 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u288e 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u288f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u2890 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u2891 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u2892 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u2893 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u2894 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u2895 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u2896 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u2897 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u2898 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u2899 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u289a 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u289b 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u289c 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u289d 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u289e 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u289f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28a0 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28a1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28a2 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28a4 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28a5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28a6 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28a7 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28a8 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28a9 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28aa 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28ab 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28ac 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28ad 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28ae 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28af 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28b0 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28b1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28b2 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28b4 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28b6 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28b7 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28b8 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28b9 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28ba 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28bb 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28bc 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28bd 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28be 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0000,0x0000, // u28bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28c0 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28c2 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28c4 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28c6 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28c7 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28c8 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28c9 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28ca 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28cb 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28cc 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28cd 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28ce 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28cf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28d0 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28d2 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28d4 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28d6 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28d7 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28d8 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28d9 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28da 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28db 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28dc 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28dd 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28de 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28df 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28e0 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28e1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28e2 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28e3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28e4 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28e6 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28e7 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28e8 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28e9 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28ea 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28eb 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28ec 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28ed 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28ee 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28ef 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28f0 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28f2 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28f3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28f4 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28f6 0x0000,0x6000,0x6000,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28f7 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28f8 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28f9 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28fa 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28fb 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28fc 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28fd 0x0000,0x0300,0x0300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28fe 0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000,0x6300,0x6300,0x0000,0x0000,0x0000, 0x6300,0x6300,0x0000,0x0000, // u28ff 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x0000, 0x0000,0x0000,0x0000,0x0000, // u2e2c 0xc000,0xc000,0xc600,0xcf00,0xdf80,0xf6c0,0xc600,0xc600,0xc600,0xc600,0x8c00,0x1800,0x3000,0x6000,0xc000,0xc000, 0xc000,0xc000,0xc000,0xc000, // ue0a0 0x0000,0x0000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xfc00,0x0000,0x1980,0x1980,0x1d80,0x1f80,0x1b80,0x1980, 0x1980,0x0000,0x0000,0x0000, // ue0a1 0x0000,0x0000,0x0000,0x3e00,0x6300,0x6300,0x6300,0x6300,0x6300,0xff80,0xff80,0xf780,0xe380,0xe380,0xf780,0xff80, 0xff80,0x0000,0x0000,0x0000, // ue0a2 0x8000,0xc000,0xe000,0xf000,0xf800,0xfc00,0xfe00,0xff00,0xff80,0xffc0,0xffc0,0xff80,0xff00,0xfe00,0xfc00,0xf800, 0xf000,0xe000,0xc000,0x8000, // ue0b0 0x8000,0xc000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180,0x00c0,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800, 0x3000,0x6000,0xc000,0x8000, // ue0b1 0x0040,0x00c0,0x01c0,0x03c0,0x07c0,0x0fc0,0x1fc0,0x3fc0,0x7fc0,0xffc0,0xffc0,0x7fc0,0x3fc0,0x1fc0,0x0fc0,0x07c0, 0x03c0,0x01c0,0x00c0,0x0040, // ue0b2 0x0040,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0xc000,0xc000,0x6000,0x3000,0x1800,0x0c00,0x0600, 0x0300,0x0180,0x00c0,0x0040, // ue0b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x3300,0x3300,0x1e00,0x0000, // uf6be 0x0000,0x0000,0x0000,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80, 0x0000,0x0000,0x0000,0x0000 // ufffd }; // codepoints array constexpr std::array fixedfont_codepoints = { 0x0000,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e, 0x002f,0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e, 0x003f,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e, 0x004f,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e, 0x005f,0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e, 0x006f,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e, 0x00a0,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af, 0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf, 0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf, 0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df, 0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef, 0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff, 0x0100,0x0101,0x0102,0x0103,0x0104,0x0105,0x0106,0x0107,0x0108,0x0109,0x010a,0x010b,0x010c,0x010d,0x010e,0x010f, 0x0110,0x0111,0x0112,0x0113,0x0114,0x0115,0x0116,0x0117,0x0118,0x0119,0x011a,0x011b,0x011c,0x011d,0x011e,0x011f, 0x0120,0x0121,0x0122,0x0123,0x0124,0x0125,0x0126,0x0127,0x0128,0x0129,0x012a,0x012b,0x012c,0x012d,0x012e,0x012f, 0x0130,0x0131,0x0132,0x0133,0x0134,0x0135,0x0136,0x0137,0x0138,0x0139,0x013a,0x013b,0x013c,0x013d,0x013e,0x013f, 0x0140,0x0141,0x0142,0x0143,0x0144,0x0145,0x0146,0x0147,0x0148,0x0149,0x014a,0x014b,0x014c,0x014d,0x014e,0x014f, 0x0150,0x0151,0x0152,0x0153,0x0154,0x0155,0x0156,0x0157,0x0158,0x0159,0x015a,0x015b,0x015c,0x015d,0x015e,0x015f, 0x0160,0x0161,0x0162,0x0163,0x0164,0x0165,0x0166,0x0167,0x0168,0x0169,0x016a,0x016b,0x016c,0x016d,0x016e,0x016f, 0x0170,0x0171,0x0172,0x0173,0x0174,0x0175,0x0176,0x0177,0x0178,0x0179,0x017a,0x017b,0x017c,0x017d,0x017e,0x017f, 0x0186,0x018e,0x018f,0x0190,0x0192,0x019d,0x019e,0x01b5,0x01b6,0x01b7,0x01cd,0x01ce,0x01cf,0x01d0,0x01d1,0x01d2, 0x01d3,0x01d4,0x01e2,0x01e3,0x01e4,0x01e5,0x01e6,0x01e7,0x01e8,0x01e9,0x01ea,0x01eb,0x01ec,0x01ed,0x01ee,0x01ef, 0x01f0,0x01f4,0x01f5,0x01fc,0x01fd,0x01fe,0x01ff,0x0218,0x0219,0x021a,0x021b,0x0232,0x0233,0x0237,0x0254,0x0258, 0x0259,0x025b,0x0272,0x0292,0x02bb,0x02bc,0x02bd,0x02c6,0x02c7,0x02d8,0x02d9,0x02db,0x02dc,0x02dd,0x0300,0x0301, 0x0302,0x0303,0x0304,0x0305,0x0306,0x0307,0x0308,0x030a,0x030b,0x030c,0x0329,0x0384,0x0385,0x0386,0x0387,0x0388, 0x0389,0x038a,0x038c,0x038e,0x038f,0x0390,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039a, 0x039b,0x039c,0x039d,0x039e,0x039f,0x03a0,0x03a1,0x03a3,0x03a4,0x03a5,0x03a6,0x03a7,0x03a8,0x03a9,0x03aa,0x03ab, 0x03ac,0x03ad,0x03ae,0x03af,0x03b0,0x03b1,0x03b2,0x03b3,0x03b4,0x03b5,0x03b6,0x03b7,0x03b8,0x03b9,0x03ba,0x03bb, 0x03bc,0x03bd,0x03be,0x03bf,0x03c0,0x03c1,0x03c2,0x03c3,0x03c4,0x03c5,0x03c6,0x03c7,0x03c8,0x03c9,0x03ca,0x03cb, 0x03cc,0x03cd,0x03ce,0x03d1,0x03d5,0x03f0,0x03f1,0x03f2,0x03f3,0x03f4,0x03f5,0x03f6,0x0400,0x0401,0x0402,0x0403, 0x0404,0x0405,0x0406,0x0407,0x0408,0x0409,0x040a,0x040b,0x040c,0x040d,0x040e,0x040f,0x0410,0x0411,0x0412,0x0413, 0x0414,0x0415,0x0416,0x0417,0x0418,0x0419,0x041a,0x041b,0x041c,0x041d,0x041e,0x041f,0x0420,0x0421,0x0422,0x0423, 0x0424,0x0425,0x0426,0x0427,0x0428,0x0429,0x042a,0x042b,0x042c,0x042d,0x042e,0x042f,0x0430,0x0431,0x0432,0x0433, 0x0434,0x0435,0x0436,0x0437,0x0438,0x0439,0x043a,0x043b,0x043c,0x043d,0x043e,0x043f,0x0440,0x0441,0x0442,0x0443, 0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,0x044a,0x044b,0x044c,0x044d,0x044e,0x044f,0x0450,0x0451,0x0452,0x0453, 0x0454,0x0455,0x0456,0x0457,0x0458,0x0459,0x045a,0x045b,0x045c,0x045d,0x045e,0x045f,0x0462,0x0463,0x046a,0x046b, 0x0490,0x0491,0x0492,0x0493,0x0494,0x0495,0x0496,0x0497,0x0498,0x0499,0x049a,0x049b,0x049c,0x049d,0x04a0,0x04a1, 0x04a2,0x04a3,0x04a4,0x04a5,0x04aa,0x04ab,0x04ae,0x04af,0x04b0,0x04b1,0x04b2,0x04b3,0x04b6,0x04b7,0x04b8,0x04b9, 0x04ba,0x04bb,0x04c0,0x04c1,0x04c2,0x04cf,0x04d0,0x04d1,0x04d2,0x04d3,0x04d4,0x04d5,0x04d6,0x04d7,0x04d8,0x04d9, 0x04da,0x04db,0x04dc,0x04dd,0x04de,0x04df,0x04e2,0x04e3,0x04e4,0x04e5,0x04e6,0x04e7,0x04e8,0x04e9,0x04ea,0x04eb, 0x04ec,0x04ed,0x04ee,0x04ef,0x04f0,0x04f1,0x04f2,0x04f3,0x04f4,0x04f5,0x04f8,0x04f9,0x05d0,0x05d1,0x05d2,0x05d3, 0x05d4,0x05d5,0x05d6,0x05d7,0x05d8,0x05d9,0x05da,0x05db,0x05dc,0x05dd,0x05de,0x05df,0x05e0,0x05e1,0x05e2,0x05e3, 0x05e4,0x05e5,0x05e6,0x05e7,0x05e8,0x05e9,0x05ea,0x1e0c,0x1e0d,0x1e34,0x1e35,0x1e36,0x1e37,0x1e40,0x1e41,0x1e42, 0x1e43,0x1e44,0x1e45,0x1e46,0x1e47,0x1e6c,0x1e6d,0x1eb8,0x1eb9,0x1ebc,0x1ebd,0x1eca,0x1ecb,0x1ecc,0x1ecd,0x1ee4, 0x1ee5,0x1ef8,0x1ef9,0x2000,0x2001,0x2002,0x2003,0x2004,0x2005,0x2006,0x2007,0x2008,0x2009,0x200a,0x200b,0x200c, 0x200d,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x2015,0x2016,0x2017,0x2018,0x2019,0x201a,0x201b,0x201c, 0x201d,0x201e,0x201f,0x2020,0x2021,0x2022,0x2026,0x2030,0x2032,0x2033,0x2039,0x203a,0x203c,0x203e,0x2070,0x2071, 0x2074,0x2075,0x2076,0x2077,0x2078,0x2079,0x207a,0x207b,0x207c,0x207d,0x207e,0x207f,0x2080,0x2081,0x2082,0x2083, 0x2084,0x2085,0x2086,0x2087,0x2088,0x2089,0x208a,0x208b,0x208c,0x208d,0x208e,0x2090,0x2091,0x2092,0x2093,0x2094, 0x2095,0x2096,0x2097,0x2098,0x209a,0x20a7,0x20aa,0x20ac,0x20ae,0x2102,0x210e,0x210f,0x2115,0x2116,0x211a,0x211d, 0x2122,0x2124,0x2126,0x2135,0x2190,0x2191,0x2192,0x2193,0x2194,0x2195,0x21a4,0x21a6,0x21a8,0x21b5,0x21bb,0x21cb, 0x21cc,0x21d0,0x21d1,0x21d2,0x21d3,0x21d4,0x21d5,0x2200,0x2203,0x2204,0x2205,0x2206,0x2207,0x2208,0x2209,0x220a, 0x220b,0x220c,0x220d,0x2212,0x2213,0x2214,0x2215,0x2216,0x2219,0x221a,0x221e,0x221f,0x2225,0x2227,0x2228,0x2229, 0x222a,0x2248,0x2260,0x2261,0x2264,0x2265,0x226a,0x226b,0x2282,0x2283,0x2286,0x2287,0x22a5,0x22c2,0x22c3,0x2300, 0x2302,0x2308,0x2309,0x230a,0x230b,0x2310,0x2319,0x2320,0x2321,0x239b,0x239c,0x239d,0x239e,0x239f,0x23a0,0x23a1, 0x23a2,0x23a3,0x23a4,0x23a5,0x23a6,0x23a7,0x23a8,0x23a9,0x23ab,0x23ac,0x23ad,0x23ae,0x23af,0x23ba,0x23bb,0x23bc, 0x23bd,0x23d0,0x2409,0x240a,0x240b,0x240c,0x240d,0x2424,0x2500,0x2501,0x2502,0x2503,0x2508,0x2509,0x250a,0x250b, 0x250c,0x250d,0x250e,0x250f,0x2510,0x2511,0x2512,0x2513,0x2514,0x2515,0x2516,0x2517,0x2518,0x2519,0x251a,0x251b, 0x251c,0x251d,0x251e,0x251f,0x2520,0x2521,0x2522,0x2523,0x2524,0x2525,0x2526,0x2527,0x2528,0x2529,0x252a,0x252b, 0x252c,0x252d,0x252e,0x252f,0x2530,0x2531,0x2532,0x2533,0x2534,0x2535,0x2536,0x2537,0x2538,0x2539,0x253a,0x253b, 0x253c,0x253d,0x253e,0x253f,0x2540,0x2541,0x2542,0x2543,0x2544,0x2545,0x2546,0x2547,0x2548,0x2549,0x254a,0x254b, 0x2550,0x2551,0x2552,0x2553,0x2554,0x2555,0x2556,0x2557,0x2558,0x2559,0x255a,0x255b,0x255c,0x255d,0x255e,0x255f, 0x2560,0x2561,0x2562,0x2563,0x2564,0x2565,0x2566,0x2567,0x2568,0x2569,0x256a,0x256b,0x256c,0x256d,0x256e,0x256f, 0x2570,0x2571,0x2572,0x2573,0x2574,0x2575,0x2576,0x2577,0x2578,0x2579,0x257a,0x257b,0x257c,0x257d,0x257e,0x257f, 0x2580,0x2581,0x2582,0x2583,0x2584,0x2585,0x2586,0x2587,0x2588,0x2589,0x258a,0x258b,0x258c,0x258d,0x258e,0x258f, 0x2590,0x2591,0x2592,0x2593,0x2596,0x2597,0x2598,0x2599,0x259a,0x259b,0x259c,0x259d,0x259e,0x259f,0x25a0,0x25ac, 0x25ae,0x25b2,0x25b6,0x25ba,0x25bc,0x25c0,0x25c4,0x25c6,0x25ca,0x25cb,0x25cf,0x25d8,0x25d9,0x263a,0x263b,0x263c, 0x2640,0x2642,0x2660,0x2663,0x2665,0x2666,0x266a,0x266b,0x2713,0x2714,0x2717,0x2718,0x27e8,0x27e9,0x27ea,0x27eb, 0x2800,0x2801,0x2802,0x2803,0x2804,0x2805,0x2806,0x2807,0x2808,0x2809,0x280a,0x280b,0x280c,0x280d,0x280e,0x280f, 0x2810,0x2811,0x2812,0x2813,0x2814,0x2815,0x2816,0x2817,0x2818,0x2819,0x281a,0x281b,0x281c,0x281d,0x281e,0x281f, 0x2820,0x2821,0x2822,0x2823,0x2824,0x2825,0x2826,0x2827,0x2828,0x2829,0x282a,0x282b,0x282c,0x282d,0x282e,0x282f, 0x2830,0x2831,0x2832,0x2833,0x2834,0x2835,0x2836,0x2837,0x2838,0x2839,0x283a,0x283b,0x283c,0x283d,0x283e,0x283f, 0x2840,0x2841,0x2842,0x2843,0x2844,0x2845,0x2846,0x2847,0x2848,0x2849,0x284a,0x284b,0x284c,0x284d,0x284e,0x284f, 0x2850,0x2851,0x2852,0x2853,0x2854,0x2855,0x2856,0x2857,0x2858,0x2859,0x285a,0x285b,0x285c,0x285d,0x285e,0x285f, 0x2860,0x2861,0x2862,0x2863,0x2864,0x2865,0x2866,0x2867,0x2868,0x2869,0x286a,0x286b,0x286c,0x286d,0x286e,0x286f, 0x2870,0x2871,0x2872,0x2873,0x2874,0x2875,0x2876,0x2877,0x2878,0x2879,0x287a,0x287b,0x287c,0x287d,0x287e,0x287f, 0x2880,0x2881,0x2882,0x2883,0x2884,0x2885,0x2886,0x2887,0x2888,0x2889,0x288a,0x288b,0x288c,0x288d,0x288e,0x288f, 0x2890,0x2891,0x2892,0x2893,0x2894,0x2895,0x2896,0x2897,0x2898,0x2899,0x289a,0x289b,0x289c,0x289d,0x289e,0x289f, 0x28a0,0x28a1,0x28a2,0x28a3,0x28a4,0x28a5,0x28a6,0x28a7,0x28a8,0x28a9,0x28aa,0x28ab,0x28ac,0x28ad,0x28ae,0x28af, 0x28b0,0x28b1,0x28b2,0x28b3,0x28b4,0x28b5,0x28b6,0x28b7,0x28b8,0x28b9,0x28ba,0x28bb,0x28bc,0x28bd,0x28be,0x28bf, 0x28c0,0x28c1,0x28c2,0x28c3,0x28c4,0x28c5,0x28c6,0x28c7,0x28c8,0x28c9,0x28ca,0x28cb,0x28cc,0x28cd,0x28ce,0x28cf, 0x28d0,0x28d1,0x28d2,0x28d3,0x28d4,0x28d5,0x28d6,0x28d7,0x28d8,0x28d9,0x28da,0x28db,0x28dc,0x28dd,0x28de,0x28df, 0x28e0,0x28e1,0x28e2,0x28e3,0x28e4,0x28e5,0x28e6,0x28e7,0x28e8,0x28e9,0x28ea,0x28eb,0x28ec,0x28ed,0x28ee,0x28ef, 0x28f0,0x28f1,0x28f2,0x28f3,0x28f4,0x28f5,0x28f6,0x28f7,0x28f8,0x28f9,0x28fa,0x28fb,0x28fc,0x28fd,0x28fe,0x28ff, 0x2e2c,0xe0a0,0xe0a1,0xe0a2,0xe0b0,0xe0b1,0xe0b2,0xe0b3,0xf6be,0xfffd }; } // namespace // -- end of autogenerated text --- namespace fixed_font_22n { // -- start of autogenerated text --- // definition section for font: ter-u22n.bdf constexpr int CHARCOUNT = 1354; constexpr int WIDTH = 11; constexpr int HEIGHT = 22; constexpr int OFFSET_X = 0; constexpr int OFFSET_Y = 0; constexpr FixedFont_info_t fixedfont_info = { "Terminus", // font name "ter-u22n.bdf", // font name internal CHARCOUNT, // num of chars WIDTH, HEIGHT, OFFSET_X, OFFSET_Y, false // bold }; // font bitmap definitions constexpr std::array fixedfont_bitmap = { 0x0000,0x0000,0x0000,0x7380,0x4080,0x4080,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x0000,0x0000,0x4080,0x4080, 0x7380,0x0000,0x0000,0x0000,0x0000,0x0000, // u0000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0020 0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u0021 0x0000,0x1100,0x1100,0x1100,0x1100,0x1100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0022 0x0000,0x0000,0x0000,0x1100,0x1100,0x1100,0x1100,0x7fc0,0x1100,0x1100,0x1100,0x1100,0x7fc0,0x1100,0x1100,0x1100, 0x1100,0x0000,0x0000,0x0000,0x0000,0x0000, // u0023 0x0000,0x0000,0x0400,0x0400,0x1f00,0x2480,0x4440,0x4400,0x4400,0x2400,0x1f00,0x0480,0x0440,0x0440,0x4440,0x2480, 0x1f00,0x0400,0x0400,0x0000,0x0000,0x0000, // u0024 0x0000,0x0000,0x0000,0x3080,0x4880,0x4900,0x3100,0x0200,0x0200,0x0400,0x0400,0x0800,0x0800,0x1180,0x1240,0x2240, 0x2180,0x0000,0x0000,0x0000,0x0000,0x0000, // u0025 0x0000,0x0000,0x0000,0x1e00,0x2100,0x2100,0x2100,0x1200,0x0c00,0x1400,0x2240,0x4140,0x4080,0x4080,0x4080,0x2140, 0x1e40,0x0000,0x0000,0x0000,0x0000,0x0000, // u0026 0x0000,0x0400,0x0400,0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0027 0x0000,0x0000,0x0000,0x0200,0x0400,0x0800,0x0800,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0800,0x0800,0x0400, 0x0200,0x0000,0x0000,0x0000,0x0000,0x0000, // u0028 0x0000,0x0000,0x0000,0x1000,0x0800,0x0400,0x0400,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0400,0x0400,0x0800, 0x1000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0029 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x1100,0x0a00,0x0400,0x7fc0,0x0400,0x0a00,0x1100,0x2080,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x7fc0,0x0400,0x0400,0x0400,0x0400,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400, 0x0400,0x0800,0x0000,0x0000,0x0000,0x0000, // u002c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u002e 0x0000,0x0000,0x0000,0x0080,0x0080,0x0100,0x0100,0x0200,0x0200,0x0400,0x0400,0x0800,0x0800,0x1000,0x1000,0x2000, 0x2000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002f 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4180,0x4280,0x4480,0x4880,0x5080,0x6080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0030 0x0000,0x0000,0x0000,0x0400,0x0c00,0x1400,0x2400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0031 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0032 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x0080,0x0080,0x0100,0x1e00,0x0100,0x0080,0x0080,0x0080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0033 0x0000,0x0000,0x0000,0x0080,0x0180,0x0280,0x0480,0x0880,0x1080,0x2080,0x4080,0x4080,0x4080,0x7f80,0x0080,0x0080, 0x0080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0034 0x0000,0x0000,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x7e00,0x0100,0x0080,0x0080,0x0080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0035 0x0000,0x0000,0x0000,0x1f00,0x2000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0036 0x0000,0x0000,0x0000,0x7f80,0x4080,0x4080,0x0080,0x0100,0x0100,0x0200,0x0200,0x0400,0x0400,0x0800,0x0800,0x0800, 0x0800,0x0000,0x0000,0x0000,0x0000,0x0000, // u0037 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x2100,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0038 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080,0x1f80,0x0080,0x0080,0x0080,0x0100, 0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0039 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400, 0x0400,0x0800,0x0000,0x0000,0x0000,0x0000, // u003b 0x0000,0x0000,0x0000,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0100, 0x0080,0x0000,0x0000,0x0000,0x0000,0x0000, // u003c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003d 0x0000,0x0000,0x0000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0100,0x0080,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000, 0x2000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003e 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x0080,0x0100,0x0200,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u003f 0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x43c0,0x4440,0x4840,0x4840,0x4840,0x4840,0x4440,0x43c0,0x4000,0x2000, 0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0040 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0041 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4100,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4100, 0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0042 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0043 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4100, 0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0044 0x0000,0x0000,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0045 0x0000,0x0000,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0046 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4000,0x4000,0x4000,0x4780,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0047 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0048 0x0000,0x0000,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0049 0x0000,0x0000,0x0000,0x07c0,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x4100,0x4100,0x4100,0x2200, 0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u004a 0x0000,0x0000,0x0000,0x4080,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u004b 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u004c 0x0000,0x0000,0x0000,0x4040,0x60c0,0x5140,0x5140,0x4a40,0x4440,0x4440,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u004d 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x6080,0x5080,0x4880,0x4480,0x4280,0x4180,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u004e 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u004f 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4100,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0050 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4880,0x2500, 0x1e00,0x0100,0x0080,0x0000,0x0000,0x0000, // u0051 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4100,0x7e00,0x5000,0x4800,0x4400,0x4200,0x4100, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0052 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4000,0x4000,0x2000,0x1e00,0x0100,0x0080,0x0080,0x0080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0053 0x0000,0x0000,0x0000,0x7fc0,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u0054 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0055 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100,0x2100,0x2100,0x2100,0x1200,0x1200,0x1200,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0056 0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4440,0x4440,0x4a40,0x5140,0x5140,0x60c0, 0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0057 0x0000,0x0000,0x0000,0x4080,0x4080,0x2100,0x2100,0x1200,0x1200,0x0c00,0x0c00,0x1200,0x1200,0x2100,0x2100,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0058 0x0000,0x0000,0x0000,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0a00,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u0059 0x0000,0x0000,0x0000,0x7f80,0x0080,0x0080,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u005a 0x0000,0x0000,0x0000,0x1e00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u005b 0x0000,0x0000,0x0000,0x2000,0x2000,0x1000,0x1000,0x0800,0x0800,0x0400,0x0400,0x0200,0x0200,0x0100,0x0100,0x0080, 0x0080,0x0000,0x0000,0x0000,0x0000,0x0000, // u005c 0x0000,0x0000,0x0000,0x1e00,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u005d 0x0000,0x0400,0x0a00,0x1100,0x2080,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000, // u005f 0x1000,0x0800,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0060 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0100,0x0080,0x0080,0x3f80,0x4080,0x4080,0x4080,0x4080, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0061 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4100, 0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0062 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4000,0x4000,0x4000,0x4000,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0063 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0080,0x1f80,0x2080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0064 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x7f80,0x4000,0x4000,0x4000,0x2080, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0065 0x0000,0x0000,0x0000,0x0780,0x0800,0x0800,0x0800,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0000,0x0000,0x0000,0x0000,0x0000, // u0066 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x2080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0080,0x0080,0x0100,0x3e00,0x0000, // u0067 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0068 0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0069 0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0700,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0100,0x2100,0x2100,0x2100,0x1e00,0x0000, // u006a 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x2000,0x2080,0x2100,0x2200,0x2400,0x3800,0x3800,0x2400,0x2200,0x2100, 0x2080,0x0000,0x0000,0x0000,0x0000,0x0000, // u006b 0x0000,0x0000,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u006c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x4480,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440, 0x4440,0x0000,0x0000,0x0000,0x0000,0x0000, // u006d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u006e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u006f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4100, 0x7e00,0x4000,0x4000,0x4000,0x4000,0x0000, // u0070 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x2080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0080,0x0080,0x0080,0x0080,0x0000, // u0071 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4f80,0x5000,0x6000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0072 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x4080,0x4000,0x4000,0x3f00,0x0080,0x0080,0x0080,0x4080, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0073 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0780,0x0000,0x0000,0x0000,0x0000,0x0000, // u0074 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0075 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x2100,0x2100,0x2100,0x1200,0x1200,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0076 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0077 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x4080,0x2100,0x1200,0x0c00,0x0c00,0x1200,0x2100,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0078 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0080,0x0080,0x0100,0x3e00,0x0000, // u0079 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u007a 0x0000,0x0000,0x0000,0x0300,0x0400,0x0800,0x0800,0x0800,0x0800,0x3000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0400, 0x0300,0x0000,0x0000,0x0000,0x0000,0x0000, // u007b 0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u007c 0x0000,0x0000,0x0000,0x3000,0x0800,0x0400,0x0400,0x0400,0x0400,0x0300,0x0400,0x0400,0x0400,0x0400,0x0400,0x0800, 0x3000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007d 0x0000,0x3080,0x4880,0x4480,0x4300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a0 0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x1f00,0x2480,0x4440,0x4400,0x4400,0x4400,0x4400,0x4440,0x2480, 0x1f00,0x0400,0x0400,0x0000,0x0000,0x0000, // u00a2 0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x2100,0x2000,0x2000,0x2000,0x7c00,0x2000,0x2000,0x2000,0x2000,0x2080, 0x2080,0x7f80,0x0000,0x0000,0x0000,0x0000, // u00a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x2080,0x1f00,0x2080,0x2080,0x2080,0x2080,0x2080,0x1f00,0x2080,0x4040, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a4 0x0000,0x0000,0x0000,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0400,0x3f80,0x0400,0x0400,0x3f80,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a5 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a6 0x0000,0x0000,0x1e00,0x2100,0x2000,0x2000,0x1c00,0x2200,0x2100,0x2100,0x2100,0x2100,0x1100,0x0e00,0x0100,0x0100, 0x2100,0x1e00,0x0000,0x0000,0x0000,0x0000, // u00a7 0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a8 0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4e40,0x5140,0x5040,0x5040,0x5040,0x5140,0x4e40,0x2080,0x1f00, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a9 0x0000,0x1f00,0x0080,0x0080,0x1f80,0x2080,0x2080,0x2080,0x1f80,0x0000,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0440,0x0880,0x1100,0x2200,0x4400,0x4400,0x2200,0x1100,0x0880, 0x0440,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ab 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0080,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ac 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ad 0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x5e40,0x5140,0x5140,0x5e40,0x5440,0x5240,0x5140,0x2080,0x1f00, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ae 0x0000,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00af 0x0000,0x0e00,0x1100,0x1100,0x1100,0x0e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x7fc0,0x0400,0x0400,0x0400,0x0400,0x0000,0x0000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b1 0x0000,0x0e00,0x1100,0x1100,0x0100,0x0200,0x0400,0x0800,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b2 0x0000,0x0e00,0x1100,0x0100,0x0600,0x0100,0x0100,0x1100,0x0e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b3 0x0200,0x0400,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4180,0x4280, 0x7c80,0x4000,0x4000,0x4000,0x4000,0x0000, // u00b5 0x0000,0x0000,0x0000,0x3fc0,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x3c40,0x0440,0x0440,0x0440,0x0440,0x0440, 0x0440,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0400,0x0400,0x0400,0x0800,0x0000, // u00b8 0x0000,0x0400,0x0c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b9 0x0000,0x1f00,0x2080,0x2080,0x2080,0x2080,0x2080,0x2080,0x1f00,0x0000,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x2200,0x1100,0x0880,0x0440,0x0440,0x0880,0x1100,0x2200, 0x4400,0x0000,0x0000,0x0000,0x0000,0x0000, // u00bb 0x0000,0x0000,0x1000,0x3000,0x5000,0x1040,0x1080,0x1100,0x1200,0x0400,0x0880,0x1180,0x2280,0x4480,0x0880,0x0f80, 0x0080,0x0080,0x0000,0x0000,0x0000,0x0000, // u00bc 0x0000,0x0000,0x1000,0x3000,0x5000,0x1040,0x1080,0x1100,0x1200,0x0400,0x0800,0x1380,0x2440,0x4440,0x0080,0x0100, 0x0200,0x07c0,0x0000,0x0000,0x0000,0x0000, // u00bd 0x0000,0x0000,0x3800,0x4400,0x0400,0x1800,0x0440,0x4480,0x3900,0x0200,0x0480,0x0980,0x1280,0x2480,0x4880,0x0f80, 0x0080,0x0080,0x0000,0x0000,0x0000,0x0000, // u00be 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0000,0x0000,0x0800,0x0800,0x1000,0x2000,0x4000,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00bf 0x1000,0x0800,0x0400,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c0 0x0200,0x0400,0x0800,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c1 0x0c00,0x1200,0x2100,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c2 0x1880,0x2480,0x2300,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c3 0x2100,0x2100,0x2100,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c4 0x0c00,0x1200,0x1200,0x0c00,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c5 0x0000,0x0000,0x0000,0x3fc0,0x4400,0x8400,0x8400,0x8400,0x8400,0xffc0,0x8400,0x8400,0x8400,0x8400,0x8400,0x8400, 0x87c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c6 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4080,0x4080,0x2100, 0x1e00,0x0400,0x0400,0x0400,0x0800,0x0000, // u00c7 0x1000,0x0800,0x0400,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c8 0x0200,0x0400,0x0800,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c9 0x0c00,0x1200,0x2100,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ca 0x2100,0x2100,0x2100,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cb 0x1000,0x0800,0x0400,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cc 0x0100,0x0200,0x0400,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cd 0x0c00,0x1200,0x2100,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ce 0x2100,0x2100,0x2100,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cf 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0xf880,0x4080,0x4080,0x4080,0x4080,0x4080,0x4100, 0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d0 0x1880,0x2480,0x2300,0x0000,0x4080,0x4080,0x4080,0x6080,0x5080,0x4880,0x4480,0x4280,0x4180,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d1 0x1000,0x0800,0x0400,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d2 0x0200,0x0400,0x0800,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d3 0x0c00,0x1200,0x2100,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d4 0x1880,0x2480,0x2300,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d5 0x2100,0x2100,0x2100,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x2100,0x1200,0x0c00,0x0c00,0x1200,0x2100,0x4080,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d7 0x0000,0x0000,0x0000,0x1e00,0x2100,0x40c0,0x4080,0x4180,0x4280,0x4480,0x4880,0x5080,0x6080,0x4080,0xc080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d8 0x1000,0x0800,0x0400,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d9 0x0200,0x0400,0x0800,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00da 0x0c00,0x1200,0x2100,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00db 0x2100,0x2100,0x2100,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00dc 0x0100,0x0200,0x0400,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0a00,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u00dd 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4100, 0x7e00,0x4000,0x4000,0x4000,0x4000,0x0000, // u00de 0x0000,0x0000,0x0000,0x3c00,0x4200,0x4100,0x4100,0x4100,0x4200,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x6100, 0x5e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00df 0x0000,0x0000,0x0000,0x1000,0x0800,0x0400,0x0000,0x3e00,0x0100,0x0080,0x0080,0x3f80,0x4080,0x4080,0x4080,0x4080, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e0 0x0000,0x0000,0x0000,0x0200,0x0400,0x0800,0x0000,0x3e00,0x0100,0x0080,0x0080,0x3f80,0x4080,0x4080,0x4080,0x4080, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e1 0x0000,0x0000,0x0000,0x0c00,0x1200,0x2100,0x0000,0x3e00,0x0100,0x0080,0x0080,0x3f80,0x4080,0x4080,0x4080,0x4080, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e2 0x0000,0x0000,0x0000,0x1880,0x2480,0x2300,0x0000,0x3e00,0x0100,0x0080,0x0080,0x3f80,0x4080,0x4080,0x4080,0x4080, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e3 0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x3e00,0x0100,0x0080,0x0080,0x3f80,0x4080,0x4080,0x4080,0x4080, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e4 0x0000,0x0000,0x0000,0x0c00,0x1200,0x1200,0x0c00,0x3e00,0x0100,0x0080,0x0080,0x3f80,0x4080,0x4080,0x4080,0x4080, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3b80,0x0440,0x0440,0x0440,0x3fc0,0x4400,0x4400,0x4400,0x4440, 0x3b80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4000,0x4000,0x4000,0x4000,0x4080,0x2100, 0x1e00,0x0400,0x0400,0x0400,0x0800,0x0000, // u00e7 0x0000,0x0000,0x0000,0x1000,0x0800,0x0400,0x0000,0x1e00,0x2100,0x4080,0x4080,0x7f80,0x4000,0x4000,0x4000,0x2080, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e8 0x0000,0x0000,0x0000,0x0200,0x0400,0x0800,0x0000,0x1e00,0x2100,0x4080,0x4080,0x7f80,0x4000,0x4000,0x4000,0x2080, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e9 0x0000,0x0000,0x0000,0x0c00,0x1200,0x2100,0x0000,0x1e00,0x2100,0x4080,0x4080,0x7f80,0x4000,0x4000,0x4000,0x2080, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ea 0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x1e00,0x2100,0x4080,0x4080,0x7f80,0x4000,0x4000,0x4000,0x2080, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00eb 0x0000,0x0000,0x0000,0x1000,0x0800,0x0400,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ec 0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ed 0x0000,0x0000,0x0000,0x0c00,0x1200,0x2100,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ee 0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ef 0x0000,0x0000,0x0000,0x2c00,0x1000,0x6800,0x0400,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f0 0x0000,0x0000,0x0000,0x3100,0x4900,0x4600,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f1 0x0000,0x0000,0x0000,0x1000,0x0800,0x0400,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f2 0x0000,0x0000,0x0000,0x0200,0x0400,0x0800,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f3 0x0000,0x0000,0x0000,0x0c00,0x1200,0x2100,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f4 0x0000,0x0000,0x0000,0x1880,0x2480,0x2300,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f5 0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0400,0x0400,0x0400, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e40,0x2180,0x4180,0x4280,0x4480,0x4880,0x5080,0x6080,0x6100, 0x9e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f8 0x0000,0x0000,0x0000,0x1000,0x0800,0x0400,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f9 0x0000,0x0000,0x0000,0x0200,0x0400,0x0800,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00fa 0x0000,0x0000,0x0000,0x0c00,0x1200,0x2100,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00fb 0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00fc 0x0000,0x0000,0x0000,0x0200,0x0400,0x0800,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0080,0x0080,0x0100,0x3e00,0x0000, // u00fd 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4100, 0x7e00,0x4000,0x4000,0x4000,0x4000,0x0000, // u00fe 0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0080,0x0080,0x0100,0x3e00,0x0000, // u00ff 0x0000,0x3f00,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0100 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x3e00,0x0100,0x0080,0x0080,0x3f80,0x4080,0x4080,0x4080,0x4080, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0101 0x2100,0x2100,0x1e00,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0102 0x0000,0x0000,0x0000,0x2100,0x2100,0x1e00,0x0000,0x3e00,0x0100,0x0080,0x0080,0x3f80,0x4080,0x4080,0x4080,0x4080, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0103 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0100,0x0200,0x0200,0x01c0,0x0000, // u0104 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0100,0x0080,0x0080,0x3f80,0x4080,0x4080,0x4080,0x4080, 0x3f80,0x0100,0x0200,0x0200,0x01c0,0x0000, // u0105 0x0200,0x0400,0x0800,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4000,0x4000,0x4000,0x4000,0x4000,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0106 0x0000,0x0000,0x0000,0x0200,0x0400,0x0800,0x0000,0x1e00,0x2100,0x4080,0x4000,0x4000,0x4000,0x4000,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0107 0x0c00,0x1200,0x2100,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4000,0x4000,0x4000,0x4000,0x4000,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0108 0x0000,0x0000,0x0000,0x0c00,0x1200,0x2100,0x0000,0x1e00,0x2100,0x4080,0x4000,0x4000,0x4000,0x4000,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0109 0x0400,0x0400,0x0400,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4000,0x4000,0x4000,0x4000,0x4000,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u010a 0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x1e00,0x2100,0x4080,0x4000,0x4000,0x4000,0x4000,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u010b 0x2100,0x1200,0x0c00,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4000,0x4000,0x4000,0x4000,0x4000,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u010c 0x0000,0x0000,0x0000,0x2100,0x1200,0x0c00,0x0000,0x1e00,0x2100,0x4080,0x4000,0x4000,0x4000,0x4000,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u010d 0x2100,0x1200,0x0c00,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4100, 0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u010e 0x2100,0x1200,0x0c00,0x0080,0x0080,0x0080,0x0080,0x1f80,0x2080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u010f 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0xf880,0x4080,0x4080,0x4080,0x4080,0x4080,0x4100, 0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0110 0x0000,0x0000,0x0000,0x0080,0x0fc0,0x0080,0x0080,0x1f80,0x2080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0111 0x0000,0x3f00,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0112 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x1e00,0x2100,0x4080,0x4080,0x7f80,0x4000,0x4000,0x4000,0x2080, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0113 0x2100,0x2100,0x1e00,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0114 0x0000,0x0000,0x0000,0x2100,0x2100,0x1e00,0x0000,0x1e00,0x2100,0x4080,0x4080,0x7f80,0x4000,0x4000,0x4000,0x2080, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0115 0x0400,0x0400,0x0400,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0116 0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x1e00,0x2100,0x4080,0x4080,0x7f80,0x4000,0x4000,0x4000,0x2080, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0117 0x0000,0x0000,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x7f80,0x0100,0x0200,0x0200,0x01c0,0x0000, // u0118 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x7f80,0x4000,0x4000,0x4000,0x2080, 0x1f00,0x0400,0x0800,0x0800,0x0700,0x0000, // u0119 0x2100,0x1200,0x0c00,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u011a 0x0000,0x0000,0x0000,0x2100,0x1200,0x0c00,0x0000,0x1e00,0x2100,0x4080,0x4080,0x7f80,0x4000,0x4000,0x4000,0x2080, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u011b 0x0c00,0x1200,0x2100,0x0000,0x1e00,0x2100,0x4180,0x4000,0x4000,0x4000,0x4780,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u011c 0x0000,0x0000,0x0000,0x0c00,0x1200,0x2100,0x0000,0x1f80,0x2080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0080,0x0080,0x0100,0x3e00,0x0000, // u011d 0x2100,0x2100,0x1e00,0x0000,0x1e00,0x2100,0x4180,0x4000,0x4000,0x4000,0x4780,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u011e 0x0000,0x0000,0x0000,0x2100,0x2100,0x1e00,0x0000,0x1f80,0x2080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0080,0x0080,0x0100,0x3e00,0x0000, // u011f 0x0400,0x0400,0x0400,0x0000,0x1e00,0x2100,0x4180,0x4000,0x4000,0x4000,0x4780,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0120 0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x1f80,0x2080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0080,0x0080,0x0100,0x3e00,0x0000, // u0121 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4000,0x4000,0x4000,0x4780,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0400,0x0400,0x0400,0x0800, // u0122 0x0000,0x0000,0x0200,0x0400,0x0400,0x0400,0x0000,0x1f80,0x2080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0080,0x0080,0x0100,0x3e00,0x0000, // u0123 0x0c00,0x1200,0x2100,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0124 0x0600,0x0900,0x1080,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0125 0x0000,0x0000,0x0000,0x4080,0x4080,0xffc0,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0126 0x0000,0x0000,0x0000,0x4000,0xfc00,0x4000,0x4000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0127 0x1880,0x2480,0x2300,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0128 0x0000,0x0000,0x0000,0x1880,0x2480,0x2300,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0129 0x0000,0x3f00,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u012a 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u012b 0x2100,0x2100,0x1e00,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u012c 0x0000,0x0000,0x0000,0x2100,0x2100,0x1e00,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u012d 0x0000,0x0000,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0400,0x0800,0x0800,0x0700,0x0000, // u012e 0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0400,0x0800,0x0800,0x0700,0x0000, // u012f 0x0400,0x0400,0x0400,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0130 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0131 0x0000,0x0000,0x0000,0xe1c0,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4880,0x4880,0x4880,0x4880, 0xe700,0x0000,0x0000,0x0000,0x0000,0x0000, // u0132 0x0000,0x0000,0x0000,0x2040,0x2040,0x2040,0x0000,0x60c0,0x2040,0x2040,0x2040,0x2040,0x2040,0x2040,0x2040,0x2040, 0x7040,0x0440,0x0440,0x0440,0x0380,0x0000, // u0133 0x0300,0x0480,0x0840,0x0000,0x07c0,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x4100,0x4100,0x4100,0x2200, 0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0134 0x0000,0x0000,0x0000,0x0300,0x0480,0x0840,0x0000,0x0700,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0100,0x2100,0x2100,0x2100,0x1e00,0x0000, // u0135 0x0000,0x0000,0x0000,0x4080,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100, 0x4080,0x0000,0x0400,0x0400,0x0400,0x0800, // u0136 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x2000,0x2080,0x2100,0x2200,0x2400,0x3800,0x3800,0x2400,0x2200,0x2100, 0x2080,0x0000,0x0400,0x0400,0x0400,0x0800, // u0137 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2100,0x2200,0x2400,0x3800,0x3800,0x2400,0x2200,0x2100, 0x2080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0138 0x1000,0x2000,0x4000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0139 0x0100,0x0200,0x0400,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u013a 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0400,0x0400,0x0400,0x0800, // u013b 0x0000,0x0000,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0400,0x0400,0x0400,0x0800, // u013c 0x2100,0x1200,0x0c00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u013d 0x2100,0x1200,0x0c00,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u013e 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4200,0x4200,0x4200,0x4000,0x4000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u013f 0x0000,0x0000,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0420,0x0420,0x0420,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0140 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x2000,0x2800,0x3000,0x2000,0x6000,0xa000,0x2000,0x2000,0x2000,0x2000, 0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0141 0x0000,0x0000,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0500,0x0600,0x0400,0x0c00,0x1400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0142 0x0200,0x0400,0x0800,0x4080,0x4080,0x4080,0x4080,0x6080,0x5080,0x4880,0x4480,0x4280,0x4180,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0143 0x0000,0x0000,0x0000,0x0200,0x0400,0x0800,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0144 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x6080,0x5080,0x4880,0x4480,0x4280,0x4180,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0400,0x0400,0x0400,0x0800, // u0145 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0400,0x0400,0x0400,0x0800, // u0146 0x2100,0x1200,0x0c00,0x4080,0x4080,0x4080,0x4080,0x6080,0x5080,0x4880,0x4480,0x4280,0x4180,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0147 0x0000,0x0000,0x0000,0x2100,0x1200,0x0c00,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0148 0x0000,0x4000,0x4000,0x4000,0x4000,0x8000,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0149 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x6080,0x5080,0x4880,0x4480,0x4280,0x4180,0x4080,0x4080,0x4080, 0x4080,0x0080,0x0080,0x0100,0x0600,0x0000, // u014a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0080,0x0080,0x0100,0x0600,0x0000, // u014b 0x0000,0x3f00,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u014c 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u014d 0x2100,0x2100,0x1e00,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u014e 0x0000,0x0000,0x0000,0x2100,0x2100,0x1e00,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u014f 0x0440,0x0880,0x1100,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0150 0x0000,0x0000,0x0000,0x0440,0x0880,0x1100,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0151 0x0000,0x0000,0x0000,0x3fc0,0x4400,0x8400,0x8400,0x8400,0x8400,0x87c0,0x8400,0x8400,0x8400,0x8400,0x8400,0x4400, 0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0152 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x4440,0x4440,0x4440,0x47c0,0x4400,0x4400,0x4400,0x4440, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0153 0x0200,0x0400,0x0800,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4100,0x7e00,0x5000,0x4800,0x4400,0x4200,0x4100, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0154 0x0000,0x0000,0x0000,0x0200,0x0400,0x0800,0x0000,0x4f80,0x5000,0x6000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0155 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4100,0x7e00,0x5000,0x4800,0x4400,0x4200,0x4100, 0x4080,0x0000,0x0400,0x0400,0x0400,0x0800, // u0156 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4f80,0x5000,0x6000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x0000,0x4000,0x4000,0x4000,0x8000, // u0157 0x2100,0x1200,0x0c00,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4100,0x7e00,0x5000,0x4800,0x4400,0x4200,0x4100, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0158 0x0000,0x0000,0x0000,0x2100,0x1200,0x0c00,0x0000,0x4f80,0x5000,0x6000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0159 0x0200,0x0400,0x0800,0x0000,0x1e00,0x2100,0x4080,0x4000,0x4000,0x2000,0x1e00,0x0100,0x0080,0x0080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u015a 0x0000,0x0000,0x0000,0x0200,0x0400,0x0800,0x0000,0x3f00,0x4080,0x4000,0x4000,0x3f00,0x0080,0x0080,0x0080,0x4080, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u015b 0x0c00,0x1200,0x2100,0x0000,0x1e00,0x2100,0x4080,0x4000,0x4000,0x2000,0x1e00,0x0100,0x0080,0x0080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u015c 0x0000,0x0000,0x0000,0x0c00,0x1200,0x2100,0x0000,0x3f00,0x4080,0x4000,0x4000,0x3f00,0x0080,0x0080,0x0080,0x4080, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u015d 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4000,0x4000,0x2000,0x1e00,0x0100,0x0080,0x0080,0x0080,0x4080,0x2100, 0x1e00,0x0400,0x0400,0x0400,0x0800,0x0000, // u015e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x4080,0x4000,0x4000,0x3f00,0x0080,0x0080,0x0080,0x4080, 0x3f00,0x0400,0x0400,0x0400,0x0800,0x0000, // u015f 0x2100,0x1200,0x0c00,0x0000,0x1e00,0x2100,0x4080,0x4000,0x4000,0x2000,0x1e00,0x0100,0x0080,0x0080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0160 0x0000,0x0000,0x0000,0x2100,0x1200,0x0c00,0x0000,0x3f00,0x4080,0x4000,0x4000,0x3f00,0x0080,0x0080,0x0080,0x4080, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0161 0x0000,0x0000,0x0000,0x7fc0,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0200,0x0200,0x0200,0x0400,0x0000, // u0162 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0780,0x0200,0x0200,0x0200,0x0400,0x0000, // u0163 0x2100,0x1200,0x0c00,0x0000,0x7fc0,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u0164 0x2200,0x1400,0x0800,0x0000,0x0800,0x0800,0x0800,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0780,0x0000,0x0000,0x0000,0x0000,0x0000, // u0165 0x0000,0x0000,0x0000,0x7fc0,0x0400,0x0400,0x0400,0x0400,0x0400,0x3f80,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u0166 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x7f00,0x0800,0x0800,0x3e00,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0780,0x0000,0x0000,0x0000,0x0000,0x0000, // u0167 0x1880,0x2480,0x2300,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0168 0x0000,0x0000,0x0000,0x1880,0x2480,0x2300,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0169 0x0000,0x3f00,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u016a 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u016b 0x2100,0x2100,0x1e00,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u016c 0x0000,0x0000,0x0000,0x2100,0x2100,0x1e00,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u016d 0x0c00,0x1200,0x1200,0x0c00,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u016e 0x0000,0x0000,0x0000,0x0c00,0x1200,0x1200,0x0c00,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u016f 0x0440,0x0880,0x1100,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0170 0x0000,0x0000,0x0000,0x0440,0x0880,0x1100,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0171 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0400,0x0800,0x0800,0x0700,0x0000, // u0172 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0100,0x0200,0x0200,0x01c0,0x0000, // u0173 0x0c00,0x1200,0x2100,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4440,0x4a40,0x5140,0x60c0, 0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0174 0x0000,0x0000,0x0000,0x0c00,0x1200,0x2100,0x0000,0x4040,0x4040,0x4040,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0175 0x0c00,0x1200,0x2100,0x0000,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u0176 0x0000,0x0000,0x0000,0x0c00,0x1200,0x2100,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0080,0x0080,0x0100,0x3e00,0x0000, // u0177 0x2100,0x2100,0x2100,0x0000,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u0178 0x0200,0x0400,0x0800,0x0000,0x7f80,0x0080,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0179 0x0000,0x0000,0x0000,0x0200,0x0400,0x0800,0x0000,0x7f80,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u017a 0x0400,0x0400,0x0400,0x0000,0x7f80,0x0080,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u017b 0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x7f80,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u017c 0x2100,0x1200,0x0c00,0x0000,0x7f80,0x0080,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u017d 0x0000,0x0000,0x0000,0x2100,0x1200,0x0c00,0x0000,0x7f80,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u017e 0x0000,0x0000,0x0000,0x0780,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0000,0x0000,0x0000,0x0000,0x0000, // u017f 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0186 0x0000,0x0000,0x0000,0x7f80,0x0080,0x0080,0x0080,0x0080,0x0080,0x1f80,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u018e 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x0080,0x0080,0x0080,0x7f80,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u018f 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4000,0x4000,0x2000,0x1e00,0x2000,0x4000,0x4000,0x4000,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0190 0x0000,0x0000,0x0000,0x0380,0x0440,0x0440,0x0400,0x0400,0x0400,0x3f80,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x4400,0x4400,0x3800,0x0000, // u0192 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x6080,0x5080,0x4880,0x4480,0x4280,0x4180,0x4080,0x4080,0x4080, 0x4080,0x4000,0x4000,0x4000,0x8000,0x0000, // u019d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0080,0x0080,0x0080,0x0080,0x0000, // u019e 0x0000,0x0000,0x0000,0x7f80,0x0080,0x0080,0x0100,0x0200,0x0400,0x7f80,0x0800,0x1000,0x2000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u01b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0100,0x0200,0x0400,0x7f80,0x0800,0x1000,0x2000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u01b6 0x0000,0x0000,0x0000,0x7f80,0x0100,0x0200,0x0400,0x0800,0x1e00,0x0100,0x0080,0x0080,0x0080,0x0080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01b7 0x2100,0x1200,0x0c00,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u01cd 0x0000,0x0000,0x0000,0x2100,0x1200,0x0c00,0x0000,0x3e00,0x0100,0x0080,0x0080,0x3f80,0x4080,0x4080,0x4080,0x4080, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u01ce 0x2100,0x1200,0x0c00,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01cf 0x0000,0x0000,0x0000,0x2100,0x1200,0x0c00,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d0 0x2100,0x1200,0x0c00,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d1 0x0000,0x0000,0x0000,0x2100,0x1200,0x0c00,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d2 0x2100,0x1200,0x0c00,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d3 0x0000,0x0000,0x0000,0x2100,0x1200,0x0c00,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d4 0x0000,0x3f80,0x0000,0x3fc0,0x4400,0x8400,0x8400,0x8400,0x8400,0xffc0,0x8400,0x8400,0x8400,0x8400,0x8400,0x8400, 0x87c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e2 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x3b80,0x0440,0x0440,0x0440,0x3fc0,0x4400,0x4400,0x4400,0x4440, 0x3b80,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e3 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4000,0x4000,0x4000,0x4780,0x4080,0x4080,0x47c0,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x2080,0x4080,0x4080,0x47c0,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0080,0x0080,0x0100,0x3e00,0x0000, // u01e5 0x2100,0x1200,0x0c00,0x0000,0x1e00,0x2100,0x4180,0x4000,0x4000,0x4000,0x4780,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e6 0x0000,0x0000,0x0000,0x2100,0x1200,0x0c00,0x0000,0x1f80,0x2080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0080,0x0080,0x0100,0x3e00,0x0000, // u01e7 0x2100,0x1200,0x0c00,0x4080,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e8 0x1080,0x0900,0x0600,0x2000,0x2000,0x2000,0x2000,0x2080,0x2100,0x2200,0x2400,0x3800,0x3800,0x2400,0x2200,0x2100, 0x2080,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e9 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0400,0x0800,0x0800,0x0700,0x0000, // u01ea 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0400,0x0800,0x0800,0x0700,0x0000, // u01eb 0x0000,0x3f00,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0400,0x0800,0x0800,0x0700,0x0000, // u01ec 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0400,0x0800,0x0800,0x0700,0x0000, // u01ed 0x2100,0x1200,0x0c00,0x0000,0x7f80,0x0100,0x0200,0x0400,0x0800,0x1e00,0x0100,0x0080,0x0080,0x0080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01ee 0x0000,0x0000,0x0000,0x2100,0x1200,0x0c00,0x0000,0x7f80,0x0100,0x0200,0x0400,0x0800,0x1e00,0x0100,0x0080,0x0080, 0x0080,0x0080,0x4080,0x2100,0x1e00,0x0000, // u01ef 0x0000,0x0000,0x0000,0x0840,0x0480,0x0300,0x0000,0x0700,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0100,0x2100,0x2100,0x2100,0x1e00,0x0000, // u01f0 0x0200,0x0400,0x0800,0x0000,0x1e00,0x2100,0x4180,0x4000,0x4000,0x4000,0x4780,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01f4 0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0000,0x1f80,0x2080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0080,0x0080,0x0100,0x3e00,0x0000, // u01f5 0x0100,0x0200,0x0400,0x0000,0x3fc0,0x4400,0x8400,0x8400,0x8400,0x8400,0xffc0,0x8400,0x8400,0x8400,0x8400,0x8400, 0x87c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u01fc 0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0000,0x3b80,0x0440,0x0440,0x0440,0x3fc0,0x4400,0x4400,0x4400,0x4440, 0x3b80,0x0000,0x0000,0x0000,0x0000,0x0000, // u01fd 0x0200,0x0400,0x0800,0x0000,0x1e00,0x2140,0x4080,0x4180,0x4280,0x4480,0x4880,0x5080,0x6080,0x4080,0xc080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01fe 0x0000,0x0000,0x0000,0x0200,0x0400,0x0800,0x0000,0x1e40,0x2180,0x4180,0x4280,0x4480,0x4880,0x5080,0x6080,0x6100, 0x9e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01ff 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4000,0x4000,0x2000,0x1e00,0x0100,0x0080,0x0080,0x0080,0x4080,0x2100, 0x1e00,0x0000,0x0400,0x0400,0x0400,0x0800, // u0218 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x4080,0x4000,0x4000,0x3f00,0x0080,0x0080,0x0080,0x4080, 0x3f00,0x0000,0x0400,0x0400,0x0400,0x0800, // u0219 0x0000,0x0000,0x0000,0x7fc0,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0000,0x0400,0x0400,0x0400,0x0800, // u021a 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0780,0x0000,0x0200,0x0200,0x0200,0x0400, // u021b 0x0000,0x3f00,0x0000,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0a00,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u0232 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0080,0x0080,0x0100,0x3e00,0x0000, // u0233 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0100,0x2100,0x2100,0x2100,0x1e00,0x0000, // u0237 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x0080,0x0080,0x0080,0x0080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0254 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x7f80,0x0080,0x0080,0x0080,0x4100, 0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0258 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x0080,0x0080,0x0080,0x7f80,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0259 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x4080,0x4000,0x4000,0x3c00,0x4000,0x4000,0x4000,0x4080, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u025b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x4000,0x4000,0x4000,0x8000,0x0000, // u0272 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0100,0x0200,0x0400,0x0800,0x1e00,0x0100,0x0080,0x0080, 0x0080,0x0080,0x4080,0x2100,0x1e00,0x0000, // u0292 0x0200,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bb 0x0400,0x0400,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bc 0x0400,0x0400,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bd 0x0c00,0x1200,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02c6 0x2100,0x1200,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02c7 0x2100,0x2100,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02d8 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02d9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0400,0x0800,0x0800,0x0700,0x0000, // u02db 0x1880,0x2480,0x2300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02dc 0x0440,0x0880,0x1100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02dd 0x1000,0x0800,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0300 0x0200,0x0400,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0301 0x0c00,0x1200,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0302 0x1880,0x2480,0x2300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0303 0x0000,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0304 0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0305 0x2100,0x2100,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0306 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0307 0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0308 0x0c00,0x1200,0x1200,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030a 0x0440,0x0880,0x1100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030b 0x2100,0x1200,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0400,0x0400,0x0400,0x0000, // u0329 0x2000,0x4000,0x8000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0384 0x0200,0x0400,0x0800,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0385 0x2000,0x4000,0x8000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0386 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0387 0x2000,0x4000,0x8000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0388 0x2000,0x4000,0x8000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0389 0x2000,0x4000,0x8000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u038a 0x2000,0x4000,0x8000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u038c 0x2000,0x4000,0x8000,0x0000,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u038e 0x2000,0x4000,0x8000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100,0x1200,0x1200, 0x7380,0x0000,0x0000,0x0000,0x0000,0x0000, // u038f 0x0200,0x0400,0x0800,0x4200,0x4200,0x4200,0x0000,0x3800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0700,0x0000,0x0000,0x0000,0x0000,0x0000, // u0390 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0391 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4100,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4100, 0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0392 0x0000,0x0000,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0393 0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0a00,0x0a00,0x1100,0x1100,0x1100,0x2080,0x2080,0x2080,0x4040,0x4040, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0394 0x0000,0x0000,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0395 0x0000,0x0000,0x0000,0x7f80,0x0080,0x0080,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0396 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0397 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x5e80,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0398 0x0000,0x0000,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0399 0x0000,0x0000,0x0000,0x4080,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u039a 0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0a00,0x0a00,0x1100,0x1100,0x1100,0x2080,0x2080,0x2080,0x4040,0x4040, 0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u039b 0x0000,0x0000,0x0000,0x4040,0x60c0,0x5140,0x5140,0x4a40,0x4440,0x4440,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u039c 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x6080,0x5080,0x4880,0x4480,0x4280,0x4180,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u039d 0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u039e 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u039f 0x0000,0x0000,0x0000,0x7f80,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a0 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4100,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a1 0x0000,0x0000,0x0000,0x7f80,0x4000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a3 0x0000,0x0000,0x0000,0x7fc0,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a4 0x0000,0x0000,0x0000,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0a00,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a5 0x0000,0x0000,0x0000,0x0400,0x1f00,0x2480,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x2480,0x1f00, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a6 0x0000,0x0000,0x0000,0x4080,0x4080,0x2100,0x2100,0x1200,0x1200,0x0c00,0x0c00,0x1200,0x1200,0x2100,0x2100,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a7 0x0000,0x0000,0x0000,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x2480,0x1f00,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a8 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100,0x1200,0x1200, 0x7380,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a9 0x2100,0x2100,0x2100,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03aa 0x2100,0x2100,0x2100,0x0000,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ab 0x0000,0x0000,0x0000,0x0200,0x0400,0x0800,0x0000,0x1cc0,0x2380,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x2380, 0x1cc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ac 0x0000,0x0000,0x0000,0x0200,0x0400,0x0800,0x0000,0x3f00,0x4080,0x4000,0x4000,0x3c00,0x4000,0x4000,0x4000,0x4080, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ad 0x0000,0x0000,0x0000,0x0200,0x0400,0x0800,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0080,0x0080,0x0080,0x0080,0x0000, // u03ae 0x0000,0x0000,0x0000,0x0200,0x0400,0x0800,0x0000,0x3800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0700,0x0000,0x0000,0x0000,0x0000,0x0000, // u03af 0x0200,0x0400,0x0800,0x2100,0x2100,0x2100,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1cc0,0x2380,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x2380, 0x1cc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b1 0x0000,0x0000,0x0000,0x3c00,0x4200,0x4100,0x4100,0x4100,0x4200,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4100, 0x7e00,0x4000,0x4000,0x4000,0x4000,0x0000, // u03b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0a00, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0000, // u03b3 0x0000,0x0000,0x0000,0x3f00,0x1000,0x0800,0x0400,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x4080,0x4000,0x4000,0x3c00,0x4000,0x4000,0x4000,0x4080, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b5 0x0000,0x0000,0x0000,0x7f80,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x2000,0x4000,0x4000,0x4000,0x4000,0x2000, 0x1f00,0x0080,0x0080,0x0080,0x0300,0x0000, // u03b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0080,0x0080,0x0080,0x0080,0x0000, // u03b7 0x0000,0x0000,0x0000,0x0e00,0x1100,0x2080,0x2080,0x2080,0x2080,0x3f80,0x2080,0x2080,0x2080,0x2080,0x2080,0x1100, 0x0e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0700,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2100,0x2200,0x2400,0x3800,0x3800,0x2400,0x2200,0x2100, 0x2080,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ba 0x0000,0x0000,0x0000,0x1000,0x1000,0x0800,0x0800,0x0c00,0x0c00,0x1200,0x1200,0x2100,0x2100,0x2100,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u03bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4180,0x4280, 0x7c80,0x4000,0x4000,0x4000,0x4000,0x0000, // u03bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x2100,0x2100,0x2100,0x1200,0x1200,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03bd 0x0000,0x0000,0x0000,0x1f80,0x2000,0x4000,0x4000,0x4000,0x2000,0x1f00,0x2000,0x4000,0x4000,0x4000,0x4000,0x2000, 0x1f00,0x0080,0x0080,0x0080,0x0300,0x0000, // u03be 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4100, 0x7e00,0x4000,0x4000,0x4000,0x4000,0x0000, // u03c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4000,0x4000,0x4000,0x4000,0x4000,0x2000, 0x1f00,0x0080,0x0080,0x0080,0x0300,0x0000, // u03c2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x2200,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0380,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2380,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x2480, 0x1f00,0x0400,0x0400,0x0400,0x0400,0x0000, // u03c6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x4080,0x2100,0x2100,0x1200,0x1200,0x0c00,0x0c00,0x1200, 0x1200,0x2100,0x2100,0x4080,0x4080,0x0000, // u03c7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x2480, 0x1f00,0x0400,0x0400,0x0400,0x0400,0x0000, // u03c8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x4040,0x4040,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440, 0x3b80,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c9 0x0000,0x0000,0x0000,0x4200,0x4200,0x4200,0x0000,0x3800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0700,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ca 0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03cb 0x0000,0x0000,0x0000,0x0200,0x0400,0x0800,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03cc 0x0000,0x0000,0x0000,0x0200,0x0400,0x0800,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03cd 0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0000,0x2080,0x4040,0x4040,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440, 0x3b80,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ce 0x0000,0x0000,0x0000,0x0e00,0x1100,0x2080,0x2080,0x2080,0x1080,0x0fc0,0x0080,0x6080,0x2080,0x2080,0x2080,0x1100, 0x0e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x1f00,0x2480,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x2480, 0x1f00,0x0400,0x0400,0x0000,0x0000,0x0000, // u03d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xe040,0x1080,0x0900,0x0a00,0x0c00,0x0c00,0x1400,0x2400,0x4200, 0x81c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4100, 0x7e00,0x4000,0x4000,0x2000,0x1f00,0x0000, // u03f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4000,0x4000,0x4000,0x4000,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f2 0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0700,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0100,0x2100,0x2100,0x2100,0x1e00,0x0000, // u03f3 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x2000,0x4000,0x4000,0x7e00,0x4000,0x4000,0x4000,0x2000, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0100,0x0080,0x0080,0x1f80,0x0080,0x0080,0x0080,0x0100, 0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f6 0x1000,0x0800,0x0400,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0400 0x2100,0x2100,0x2100,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0401 0x0000,0x0000,0x0000,0xf800,0x2000,0x2000,0x2000,0x3e00,0x2100,0x2080,0x2080,0x2080,0x2080,0x2080,0x2080,0x2100, 0x2200,0x0000,0x0000,0x0000,0x0000,0x0000, // u0402 0x0200,0x0400,0x0800,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0403 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4000,0x4000,0x4000,0x7c00,0x4000,0x4000,0x4000,0x4000,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0404 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4000,0x4000,0x2000,0x1e00,0x0100,0x0080,0x0080,0x0080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0405 0x0000,0x0000,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0406 0x2100,0x2100,0x2100,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0407 0x0000,0x0000,0x0000,0x07c0,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x4100,0x4100,0x4100,0x2200, 0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0408 0x0000,0x0000,0x0000,0x3800,0x4800,0x8800,0x8800,0x8800,0x8f00,0x8880,0x8840,0x8840,0x8840,0x8840,0x8840,0x8880, 0x8f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0409 0x0000,0x0000,0x0000,0x8800,0x8800,0x8800,0x8800,0x8800,0x8f00,0xf880,0x8840,0x8840,0x8840,0x8840,0x8840,0x8880, 0x8f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u040a 0x0000,0x0000,0x0000,0xf800,0x2000,0x2000,0x2000,0x3e00,0x2100,0x2080,0x2080,0x2080,0x2080,0x2080,0x2080,0x2080, 0x2080,0x0000,0x0000,0x0000,0x0000,0x0000, // u040b 0x0200,0x0400,0x0800,0x4080,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u040c 0x1000,0x0800,0x0400,0x4080,0x4080,0x4080,0x4080,0x4180,0x4280,0x4480,0x4880,0x5080,0x6080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u040d 0x2100,0x2100,0x1e00,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080,0x1f80,0x0080,0x0080,0x0080,0x0080,0x0100, 0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u040e 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x7f80,0x0c00,0x0c00,0x0c00,0x0000,0x0000, // u040f 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0410 0x0000,0x0000,0x0000,0x7f00,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4100, 0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0411 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4100,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4100, 0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0412 0x0000,0x0000,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0413 0x0000,0x0000,0x0000,0x0f80,0x1080,0x2080,0x2080,0x2080,0x2080,0x2080,0x2080,0x2080,0x2080,0x2080,0x2080,0x4080, 0xffc0,0x8040,0x8040,0x0000,0x0000,0x0000, // u0414 0x0000,0x0000,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0415 0x0000,0x0000,0x0000,0x4440,0x4440,0x4440,0x4440,0x2480,0x1500,0x0e00,0x1500,0x2480,0x4440,0x4440,0x4440,0x4440, 0x4440,0x0000,0x0000,0x0000,0x0000,0x0000, // u0416 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x0080,0x0080,0x0100,0x1e00,0x0100,0x0080,0x0080,0x0080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0417 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4180,0x4280,0x4480,0x4880,0x5080,0x6080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0418 0x2100,0x2100,0x1e00,0x4080,0x4080,0x4080,0x4080,0x4180,0x4280,0x4480,0x4880,0x5080,0x6080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0419 0x0000,0x0000,0x0000,0x4080,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u041a 0x0000,0x0000,0x0000,0x0f80,0x1080,0x2080,0x2080,0x2080,0x2080,0x2080,0x2080,0x2080,0x2080,0x2080,0x2080,0x4080, 0x8080,0x0000,0x0000,0x0000,0x0000,0x0000, // u041b 0x0000,0x0000,0x0000,0x4040,0x60c0,0x5140,0x5140,0x4a40,0x4440,0x4440,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u041c 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u041d 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u041e 0x0000,0x0000,0x0000,0x7f80,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u041f 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4100,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0420 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0421 0x0000,0x0000,0x0000,0x7fc0,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u0422 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080,0x1f80,0x0080,0x0080,0x0080,0x0080,0x0100, 0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0423 0x0000,0x0000,0x0400,0x1f00,0x2480,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x2480, 0x1f00,0x0400,0x0000,0x0000,0x0000,0x0000, // u0424 0x0000,0x0000,0x0000,0x4080,0x4080,0x2100,0x2100,0x1200,0x1200,0x0c00,0x0c00,0x1200,0x1200,0x2100,0x2100,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0425 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1fc0,0x0040,0x0040,0x0040,0x0000,0x0000, // u0426 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080,0x1f80,0x0080,0x0080,0x0080,0x0080,0x0080, 0x0080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0427 0x0000,0x0000,0x0000,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x2440, 0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0428 0x0000,0x0000,0x0000,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x2440, 0x1fe0,0x0020,0x0020,0x0020,0x0000,0x0000, // u0429 0x0000,0x0000,0x0000,0xc000,0xc000,0x4000,0x4000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4100, 0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u042a 0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x7840,0x4440,0x4240,0x4240,0x4240,0x4240,0x4240,0x4240,0x4440, 0x7840,0x0000,0x0000,0x0000,0x0000,0x0000, // u042b 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4100, 0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u042c 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x0080,0x0080,0x0080,0x0f80,0x0080,0x0080,0x0080,0x0080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u042d 0x0000,0x0000,0x0000,0x4780,0x4840,0x4840,0x4840,0x4840,0x4840,0x7840,0x4840,0x4840,0x4840,0x4840,0x4840,0x4840, 0x4780,0x0000,0x0000,0x0000,0x0000,0x0000, // u042e 0x0000,0x0000,0x0000,0x1f80,0x2080,0x4080,0x4080,0x4080,0x4080,0x2080,0x1f80,0x0280,0x0480,0x0880,0x1080,0x2080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u042f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x0100,0x0080,0x0080,0x3f80,0x4080,0x4080,0x4080,0x4080, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0430 0x0000,0x0000,0x0000,0x1f00,0x2000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4100, 0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0431 0x0000,0x0000,0x0000,0x3c00,0x4200,0x4100,0x4100,0x4100,0x4200,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4100, 0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0432 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0433 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x2080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0080,0x0080,0x0100,0x3e00,0x0000, // u0434 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x7f80,0x4000,0x4000,0x4000,0x2080, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0435 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4440,0x4440,0x2480,0x1500,0x0e00,0x1500,0x2480,0x4440,0x4440, 0x4440,0x0000,0x0000,0x0000,0x0000,0x0000, // u0436 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x4080,0x0080,0x0080,0x0f00,0x0080,0x0080,0x0080,0x4080, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0437 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0438 0x0000,0x0000,0x0000,0x2100,0x2100,0x1e00,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0439 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2100,0x2200,0x2400,0x3800,0x3800,0x2400,0x2200,0x2100, 0x2080,0x0000,0x0000,0x0000,0x0000,0x0000, // u043a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f80,0x1080,0x2080,0x2080,0x2080,0x2080,0x2080,0x2080,0x2080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u043b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x60c0,0x5140,0x4a40,0x4440,0x4040,0x4040,0x4040,0x4040, 0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u043c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u043d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u043e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u043f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4100, 0x7e00,0x4000,0x4000,0x4000,0x4000,0x0000, // u0440 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4000,0x4000,0x4000,0x4000,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0441 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u0442 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0080,0x0080,0x0100,0x3e00,0x0000, // u0443 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x1f00,0x2480,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x2480, 0x1f00,0x0400,0x0400,0x0000,0x0000,0x0000, // u0444 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x4080,0x2100,0x1200,0x0c00,0x0c00,0x1200,0x2100,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0445 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1fc0,0x0040,0x0040,0x0040,0x0000,0x0000, // u0446 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x2080,0x1f80,0x0080,0x0080,0x0080, 0x0080,0x0000,0x0000,0x0000,0x0000,0x0000, // u0447 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x2440, 0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0448 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x2440, 0x1fe0,0x0020,0x0020,0x0020,0x0000,0x0000, // u0449 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xe000,0x2000,0x2000,0x3e00,0x2100,0x2080,0x2080,0x2080,0x2100, 0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u044a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x7840,0x4440,0x4240,0x4240,0x4240,0x4440, 0x7840,0x0000,0x0000,0x0000,0x0000,0x0000, // u044b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x3e00,0x2100,0x2080,0x2080,0x2080,0x2100, 0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u044c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x0080,0x0f80,0x0080,0x0080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u044d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4780,0x4840,0x4840,0x4840,0x7840,0x4840,0x4840,0x4840,0x4840, 0x4780,0x0000,0x0000,0x0000,0x0000,0x0000, // u044e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x4080,0x4080,0x4080,0x4080,0x3f80,0x0480,0x0880,0x1080, 0x2080,0x0000,0x0000,0x0000,0x0000,0x0000, // u044f 0x0000,0x0000,0x0000,0x1000,0x0800,0x0400,0x0000,0x1e00,0x2100,0x4080,0x4080,0x7f80,0x4000,0x4000,0x4000,0x2080, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0450 0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x1e00,0x2100,0x4080,0x4080,0x7f80,0x4000,0x4000,0x4000,0x2080, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0451 0x0000,0x0000,0x0000,0x4000,0xfc00,0x4000,0x4000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0080,0x0080,0x0100,0x0600,0x0000, // u0452 0x0000,0x0000,0x0000,0x0200,0x0400,0x0800,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0453 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4000,0x7c00,0x4000,0x4000,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0454 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x4080,0x4000,0x4000,0x3f00,0x0080,0x0080,0x0080,0x4080, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0455 0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0456 0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0457 0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0700,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0100,0x2100,0x2100,0x2100,0x1e00,0x0000, // u0458 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x4800,0x8800,0x8f00,0x8880,0x8840,0x8840,0x8840,0x8880, 0x8f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0459 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8800,0x8800,0x8800,0x8f00,0xf880,0x8840,0x8840,0x8840,0x8880, 0x8f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u045a 0x0000,0x0000,0x0000,0x4000,0xfc00,0x4000,0x4000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u045b 0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0000,0x2080,0x2100,0x2200,0x2400,0x3800,0x3800,0x2400,0x2200,0x2100, 0x2080,0x0000,0x0000,0x0000,0x0000,0x0000, // u045c 0x0000,0x0000,0x0000,0x1000,0x0800,0x0400,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u045d 0x0000,0x0000,0x0000,0x2100,0x2100,0x1e00,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0080,0x0080,0x0100,0x3e00,0x0000, // u045e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x7f80,0x0c00,0x0c00,0x0c00,0x0000,0x0000, // u045f 0x0000,0x0000,0x0000,0x4000,0x4000,0xfc00,0x4000,0x4000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4100, 0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0462 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0xfc00,0x2000,0x2000,0x2000,0x3e00,0x2100,0x2080,0x2080,0x2080,0x2100, 0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0463 0x0000,0x0000,0x0000,0x7fc0,0x4040,0x2080,0x2080,0x1100,0x1100,0x0e00,0x1500,0x2480,0x4440,0x4440,0x4440,0x4440, 0x4440,0x0000,0x0000,0x0000,0x0000,0x0000, // u046a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x4040,0x2080,0x1100,0x0e00,0x1500,0x2480,0x4440,0x4440, 0x4440,0x0000,0x0000,0x0000,0x0000,0x0000, // u046b 0x0080,0x0080,0x0080,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0490 0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0491 0x0000,0x0000,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0xfc00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0492 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0xfc00,0x4000,0x4000,0x4000, 0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0493 0x0000,0x0000,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0080,0x0100,0x0200,0x0000,0x0000, // u0494 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x7c00,0x4200,0x4100,0x4100, 0x4100,0x0100,0x0200,0x0400,0x0000,0x0000, // u0495 0x0000,0x0000,0x0000,0x4440,0x4440,0x4440,0x4440,0x2480,0x1500,0x0e00,0x1500,0x2480,0x4440,0x4440,0x4440,0x4440, 0x4460,0x0020,0x0020,0x0020,0x0000,0x0000, // u0496 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4440,0x4440,0x2480,0x1500,0x0e00,0x1500,0x2480,0x4440,0x4440, 0x4460,0x0020,0x0020,0x0020,0x0000,0x0000, // u0497 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x0080,0x0080,0x0100,0x1e00,0x0100,0x0080,0x0080,0x0080,0x4080,0x2100, 0x1e00,0x0400,0x0400,0x0400,0x0400,0x0000, // u0498 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x4080,0x0080,0x0080,0x0f00,0x0080,0x0080,0x0080,0x4080, 0x3f00,0x0400,0x0400,0x0400,0x0400,0x0000, // u0499 0x0000,0x0000,0x0000,0x4080,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100, 0x40c0,0x0040,0x0040,0x0040,0x0000,0x0000, // u049a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2100,0x2200,0x2400,0x3800,0x3800,0x2400,0x2200,0x2100, 0x20c0,0x0040,0x0040,0x0040,0x0000,0x0000, // u049b 0x0000,0x0000,0x0000,0x4080,0x4080,0x4100,0x5200,0x5400,0x5800,0x7000,0x7000,0x5800,0x5400,0x5200,0x4100,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u049c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2900,0x2a00,0x2c00,0x3800,0x3800,0x2c00,0x2a00,0x2900, 0x2080,0x0000,0x0000,0x0000,0x0000,0x0000, // u049d 0x0000,0x0000,0x0000,0xc080,0xc100,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xe080,0x2100,0x2200,0x2400,0x3800,0x3800,0x2400,0x2200,0x2100, 0x2080,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a1 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x40c0,0x0040,0x0040,0x0040,0x0000,0x0000, // u04a2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080, 0x40c0,0x0040,0x0040,0x0040,0x0000,0x0000, // u04a3 0x0000,0x0000,0x0000,0x43c0,0x4200,0x4200,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200,0x4200,0x4200, 0x4200,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x43c0,0x4200,0x4200,0x4200,0x7e00,0x4200,0x4200,0x4200,0x4200, 0x4200,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a5 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4080,0x4080,0x2100, 0x1e00,0x0400,0x0400,0x0400,0x0400,0x0000, // u04aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4000,0x4000,0x4000,0x4000,0x4080,0x2100, 0x1e00,0x0400,0x0400,0x0400,0x0400,0x0000, // u04ab 0x0000,0x0000,0x0000,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0a00,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0a00, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0000, // u04af 0x0000,0x0000,0x0000,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0a00,0x0400,0x3f80,0x0400,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u04b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0a00, 0x0400,0x3f80,0x0400,0x0400,0x0400,0x0000, // u04b1 0x0000,0x0000,0x0000,0x4080,0x4080,0x2100,0x2100,0x1200,0x1200,0x0c00,0x0c00,0x1200,0x1200,0x2100,0x2100,0x4080, 0x40c0,0x0040,0x0040,0x0040,0x0000,0x0000, // u04b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x4080,0x2100,0x1200,0x0c00,0x0c00,0x1200,0x2100,0x4080, 0x40c0,0x0040,0x0040,0x0040,0x0000,0x0000, // u04b3 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080,0x1f80,0x0080,0x0080,0x0080,0x0080,0x0080, 0x00c0,0x0040,0x0040,0x0040,0x0000,0x0000, // u04b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x2080,0x1f80,0x0080,0x0080,0x0080, 0x00c0,0x0040,0x0040,0x0040,0x0000,0x0000, // u04b7 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4480,0x4480,0x2480,0x1f80,0x0480,0x0480,0x0480,0x0080,0x0080, 0x0080,0x0000,0x0000,0x0000,0x0000,0x0000, // u04b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x4080,0x4480,0x4480,0x2480,0x1f80,0x0480,0x0480,0x0080, 0x0080,0x0000,0x0000,0x0000,0x0000,0x0000, // u04b9 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u04bb 0x0000,0x0000,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04c0 0x2100,0x2100,0x1e00,0x0000,0x4440,0x4440,0x4440,0x4440,0x2480,0x1500,0x0e00,0x1500,0x2480,0x4440,0x4440,0x4440, 0x4440,0x0000,0x0000,0x0000,0x0000,0x0000, // u04c1 0x0000,0x0000,0x0000,0x2100,0x2100,0x1e00,0x0000,0x4440,0x4440,0x2480,0x1500,0x0e00,0x1500,0x2480,0x4440,0x4440, 0x4440,0x0000,0x0000,0x0000,0x0000,0x0000, // u04c2 0x0000,0x0000,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04cf 0x2100,0x2100,0x1e00,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d0 0x0000,0x0000,0x0000,0x2100,0x2100,0x1e00,0x0000,0x3e00,0x0100,0x0080,0x0080,0x3f80,0x4080,0x4080,0x4080,0x4080, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d1 0x2100,0x2100,0x2100,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d2 0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x3e00,0x0100,0x0080,0x0080,0x3f80,0x4080,0x4080,0x4080,0x4080, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d3 0x0000,0x0000,0x0000,0x3fc0,0x4400,0x8400,0x8400,0x8400,0x8400,0xffc0,0x8400,0x8400,0x8400,0x8400,0x8400,0x8400, 0x87c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3b80,0x0440,0x0440,0x0440,0x3fc0,0x4400,0x4400,0x4400,0x4440, 0x3b80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d5 0x2100,0x2100,0x1e00,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d6 0x0000,0x0000,0x0000,0x2100,0x2100,0x1e00,0x0000,0x1e00,0x2100,0x4080,0x4080,0x7f80,0x4000,0x4000,0x4000,0x2080, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d7 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x0080,0x0080,0x0080,0x7f80,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x0080,0x0080,0x0080,0x7f80,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d9 0x2100,0x2100,0x2100,0x0000,0x1e00,0x2100,0x4080,0x0080,0x0080,0x0080,0x7f80,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04da 0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x3e00,0x4100,0x0080,0x0080,0x0080,0x7f80,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04db 0x1100,0x1100,0x1100,0x0000,0x4440,0x4440,0x4440,0x4440,0x2480,0x1500,0x0e00,0x1500,0x2480,0x4440,0x4440,0x4440, 0x4440,0x0000,0x0000,0x0000,0x0000,0x0000, // u04dc 0x0000,0x0000,0x0000,0x1100,0x1100,0x1100,0x0000,0x4440,0x4440,0x2480,0x1500,0x0e00,0x1500,0x2480,0x4440,0x4440, 0x4440,0x0000,0x0000,0x0000,0x0000,0x0000, // u04dd 0x2100,0x2100,0x2100,0x0000,0x1e00,0x2100,0x4080,0x0080,0x0080,0x0100,0x1e00,0x0100,0x0080,0x0080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04de 0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x3f00,0x4080,0x0080,0x0080,0x0f00,0x0080,0x0080,0x0080,0x4080, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04df 0x0000,0x3f00,0x0000,0x4080,0x4080,0x4080,0x4080,0x4180,0x4280,0x4480,0x4880,0x5080,0x6080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e2 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e3 0x2100,0x2100,0x2100,0x0000,0x4080,0x4080,0x4080,0x4180,0x4280,0x4480,0x4880,0x5080,0x6080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e4 0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e5 0x2100,0x2100,0x2100,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e6 0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e7 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e9 0x2100,0x2100,0x2100,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ea 0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x1e00,0x2100,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04eb 0x2100,0x2100,0x2100,0x0000,0x1e00,0x2100,0x4080,0x0080,0x0080,0x0080,0x0f80,0x0080,0x0080,0x0080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ec 0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x1e00,0x2100,0x4080,0x0080,0x0f80,0x0080,0x0080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ed 0x0000,0x3f00,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080,0x1f80,0x0080,0x0080,0x0080,0x0080,0x0100, 0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ee 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0080,0x0080,0x0100,0x3e00,0x0000, // u04ef 0x2100,0x2100,0x2100,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080,0x1f80,0x0080,0x0080,0x0080,0x0100, 0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f0 0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0080,0x0080,0x0100,0x3e00,0x0000, // u04f1 0x0440,0x0880,0x1100,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080,0x1f80,0x0080,0x0080,0x0080,0x0100, 0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f2 0x0000,0x0000,0x0000,0x0440,0x0880,0x1100,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0080,0x0080,0x0100,0x3e00,0x0000, // u04f3 0x2100,0x2100,0x2100,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080,0x1f80,0x0080,0x0080,0x0080,0x0080,0x0080, 0x0080,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f4 0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x4080,0x4080,0x4080,0x4080,0x2080,0x1f80,0x0080,0x0080,0x0080, 0x0080,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f5 0x2100,0x2100,0x2100,0x0000,0x4040,0x4040,0x4040,0x4040,0x7840,0x4440,0x4240,0x4240,0x4240,0x4240,0x4240,0x4440, 0x7840,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f8 0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x4040,0x4040,0x4040,0x7840,0x4440,0x4240,0x4240,0x4240,0x4440, 0x7840,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f9 0x0000,0x0000,0x0000,0x2040,0x2040,0x1040,0x1040,0x0840,0x0840,0x1480,0x2500,0x4200,0x4200,0x4100,0x4100,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d0 0x0000,0x0000,0x0000,0xfc00,0x0200,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d1 0x0000,0x0000,0x0000,0x7800,0x0400,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0600,0x0a00,0x1100,0x2100,0x4080, 0x8080,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d2 0x0000,0x0000,0x0000,0xffc0,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0100,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d3 0x0000,0x0000,0x0000,0x7e00,0x0100,0x0080,0x0080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d4 0x0000,0x0000,0x0000,0x3000,0x0800,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d5 0x0000,0x0000,0x0000,0x3f80,0x0100,0x0200,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d6 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d7 0x0000,0x0000,0x0000,0x4600,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d8 0x0000,0x0000,0x0000,0x3000,0x0800,0x0400,0x0400,0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d9 0x0000,0x0000,0x0000,0x7e00,0x0100,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080, 0x0080,0x0080,0x0080,0x0080,0x0080,0x0000, // u05da 0x0000,0x0000,0x0000,0x7e00,0x0100,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0100, 0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u05db 0x4000,0x4000,0x4000,0x7f80,0x0080,0x0080,0x0080,0x0080,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x1000,0x1000, 0x1000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05dc 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u05dd 0x0000,0x0000,0x0000,0xef00,0x3080,0x2040,0x2040,0x2040,0x2040,0x2040,0x2040,0x2040,0x2040,0x2040,0x2040,0x2040, 0x23c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u05de 0x0000,0x0000,0x0000,0x7800,0x0400,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200, 0x0200,0x0200,0x0200,0x0200,0x0200,0x0000, // u05df 0x0000,0x0000,0x0000,0x3c00,0x0200,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e0 0x0000,0x0000,0x0000,0xff00,0x2080,0x2040,0x2040,0x2040,0x2040,0x2040,0x2040,0x2040,0x2040,0x2040,0x2040,0x1080, 0x0f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e1 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x2080,0x2080,0x2080,0x1080,0x1100,0x0900,0x0900,0x0600,0x0c00,0x1800, 0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e2 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x2080,0x1880,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080, 0x0080,0x0080,0x0080,0x0080,0x0080,0x0000, // u05e3 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x2080,0x1880,0x0080,0x0080,0x0080,0x0080,0x0080,0x0100, 0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e4 0x0000,0x0000,0x0000,0x4080,0x4080,0x2080,0x2080,0x1100,0x1200,0x0c00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800,0x0800,0x0000, // u05e5 0x0000,0x0000,0x0000,0x4080,0x4080,0x2080,0x2080,0x1100,0x1200,0x0c00,0x0800,0x0400,0x0400,0x0200,0x0200,0x0100, 0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e6 0x0000,0x0000,0x0000,0x7f80,0x0080,0x0080,0x0080,0x4080,0x4080,0x4100,0x4200,0x4400,0x4800,0x4800,0x4800,0x4800, 0x4800,0x4000,0x4000,0x4000,0x4000,0x0000, // u05e7 0x0000,0x0000,0x0000,0x7e00,0x0100,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080, 0x0080,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e8 0x0000,0x0000,0x0000,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4840,0x7040,0x4040,0x4040,0x4040,0x4080, 0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e9 0x0000,0x0000,0x0000,0xff00,0x2080,0x2040,0x2040,0x2040,0x2040,0x2040,0x2040,0x2040,0x2040,0x2040,0x2040,0x2040, 0xc040,0x0000,0x0000,0x0000,0x0000,0x0000, // u05ea 0x0000,0x0000,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4100, 0x7e00,0x0000,0x0800,0x0800,0x0800,0x0000, // u1e0c 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0080,0x1f80,0x2080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0000,0x0400,0x0400,0x0400,0x0000, // u1e0d 0x0000,0x0000,0x0000,0x4080,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x6000,0x5000,0x4800,0x4400,0x4200,0x4100, 0x4080,0x0000,0x3f00,0x0000,0x0000,0x0000, // u1e34 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x2000,0x2080,0x2100,0x2200,0x2400,0x3800,0x3800,0x2400,0x2200,0x2100, 0x2080,0x0000,0x1f00,0x0000,0x0000,0x0000, // u1e35 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0400,0x0400,0x0400,0x0000, // u1e36 0x0000,0x0000,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0400,0x0400,0x0400,0x0000, // u1e37 0x0400,0x0400,0x0400,0x4040,0x60c0,0x5140,0x5140,0x4a40,0x4440,0x4440,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e40 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0000,0x7f00,0x4480,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440, 0x4440,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e41 0x0000,0x0000,0x0000,0x4040,0x60c0,0x5140,0x5140,0x4a40,0x4440,0x4440,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x0000,0x0400,0x0400,0x0400,0x0000, // u1e42 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x4480,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440, 0x4440,0x0000,0x0400,0x0400,0x0400,0x0000, // u1e43 0x0400,0x0400,0x0400,0x4080,0x4080,0x4080,0x4080,0x6080,0x5080,0x4880,0x4480,0x4280,0x4180,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e44 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e45 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x6080,0x5080,0x4880,0x4480,0x4280,0x4180,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0400,0x0400,0x0400,0x0000, // u1e46 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0400,0x0400,0x0400,0x0000, // u1e47 0x0000,0x0000,0x0000,0x7fc0,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0000,0x0400,0x0400,0x0400,0x0000, // u1e6c 0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x7f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0780,0x0000,0x0200,0x0200,0x0200,0x0000, // u1e6d 0x0000,0x0000,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0400,0x0400,0x0400,0x0000, // u1eb8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x7f80,0x4000,0x4000,0x4000,0x2080, 0x1f00,0x0000,0x0400,0x0400,0x0400,0x0000, // u1eb9 0x1880,0x2480,0x2300,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4000,0x4000,0x4000,0x4000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u1ebc 0x0000,0x0000,0x0000,0x1880,0x2480,0x2300,0x0000,0x1e00,0x2100,0x4080,0x4080,0x7f80,0x4000,0x4000,0x4000,0x2080, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u1ebd 0x0000,0x0000,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0400,0x0400,0x0400,0x0000, // u1eca 0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x1f00,0x0000,0x0400,0x0400,0x0400,0x0000, // u1ecb 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0400,0x0400,0x0400,0x0000, // u1ecc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0400,0x0400,0x0400,0x0000, // u1ecd 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0400,0x0400,0x0400,0x0000, // u1ee4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0000,0x0400,0x0400,0x0400,0x0000, // u1ee5 0x1880,0x2480,0x2300,0x0000,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u1ef8 0x0000,0x0000,0x0000,0x1880,0x2480,0x2300,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2080, 0x1f80,0x0080,0x0080,0x0100,0x3e00,0x0000, // u1ef9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2001 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2002 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2003 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2004 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2005 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2006 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2007 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2008 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2009 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2010 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2011 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2012 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2013 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2014 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2015 0x0000,0x0000,0x0000,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, 0x1200,0x0000,0x0000,0x0000,0x0000,0x0000, // u2016 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x7f80,0x0000,0x0000,0x7f80, // u2017 0x0000,0x0200,0x0400,0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2018 0x0000,0x0400,0x0400,0x0400,0x0400,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2019 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400, 0x0400,0x0800,0x0000,0x0000,0x0000,0x0000, // u201a 0x0000,0x0400,0x0400,0x0400,0x0400,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201b 0x0000,0x0880,0x1100,0x1100,0x1100,0x1100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201c 0x0000,0x1100,0x1100,0x1100,0x1100,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1100,0x1100,0x1100, 0x1100,0x2200,0x0000,0x0000,0x0000,0x0000, // u201e 0x0000,0x2200,0x2200,0x2200,0x2200,0x1100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201f 0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x3f80,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2020 0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x3f80,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x3f80,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2021 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x1f00,0x1f00,0x1f00,0x0e00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2022 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4440,0x4440, 0x4440,0x0000,0x0000,0x0000,0x0000,0x0000, // u2026 0x0000,0x0000,0x0000,0x6200,0x9200,0x9400,0x6400,0x0800,0x0800,0x1000,0x1000,0x2000,0x2000,0x4d80,0x5240,0x9240, 0x8d80,0x0000,0x0000,0x0000,0x0000,0x0000, // u2030 0x0000,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2032 0x0000,0x1100,0x1100,0x1100,0x1100,0x1100,0x1100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2033 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0800,0x1000,0x1000,0x0800,0x0400,0x0200, 0x0100,0x0000,0x0000,0x0000,0x0000,0x0000, // u2039 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x0800,0x0400,0x0200,0x0100,0x0100,0x0200,0x0400,0x0800, 0x1000,0x0000,0x0000,0x0000,0x0000,0x0000, // u203a 0x0000,0x0000,0x0000,0x1100,0x1100,0x1100,0x1100,0x1100,0x1100,0x1100,0x1100,0x1100,0x0000,0x0000,0x1100,0x1100, 0x1100,0x0000,0x0000,0x0000,0x0000,0x0000, // u203c 0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u203e 0x0000,0x0e00,0x1100,0x1100,0x1100,0x1100,0x1100,0x1100,0x0e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2070 0x0400,0x0400,0x0000,0x0c00,0x0400,0x0400,0x0400,0x0400,0x0e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2071 0x0000,0x0100,0x0300,0x0500,0x0900,0x1100,0x1f00,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2074 0x0000,0x1f00,0x1000,0x1000,0x1e00,0x0100,0x0100,0x1100,0x0e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2075 0x0000,0x0e00,0x1000,0x1000,0x1e00,0x1100,0x1100,0x1100,0x0e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2076 0x0000,0x1f00,0x0100,0x0100,0x0200,0x0200,0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2077 0x0000,0x0e00,0x1100,0x1100,0x0e00,0x1100,0x1100,0x1100,0x0e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2078 0x0000,0x0e00,0x1100,0x1100,0x1100,0x0f00,0x0100,0x0100,0x0e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2079 0x0000,0x0000,0x0400,0x0400,0x0400,0x3f80,0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207a 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207b 0x0000,0x0000,0x0000,0x3f00,0x0000,0x0000,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207c 0x0000,0x0200,0x0400,0x0800,0x0800,0x0800,0x0800,0x0400,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207d 0x0000,0x0800,0x0400,0x0200,0x0200,0x0200,0x0200,0x0400,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207e 0x0000,0x0000,0x3e00,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x1100,0x1100,0x1100,0x1100, 0x1100,0x1100,0x0e00,0x0000,0x0000,0x0000, // u2080 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0c00,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0e00,0x0000,0x0000,0x0000, // u2081 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x1100,0x1100,0x0100,0x0200, 0x0400,0x0800,0x1f00,0x0000,0x0000,0x0000, // u2082 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x1100,0x0100,0x0600,0x0100, 0x0100,0x1100,0x0e00,0x0000,0x0000,0x0000, // u2083 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0300,0x0500,0x0900,0x1100, 0x1f00,0x0100,0x0100,0x0000,0x0000,0x0000, // u2084 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x1000,0x1000,0x1e00,0x0100, 0x0100,0x1100,0x0e00,0x0000,0x0000,0x0000, // u2085 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x1000,0x1000,0x1e00,0x1100, 0x1100,0x1100,0x0e00,0x0000,0x0000,0x0000, // u2086 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x0100,0x0100,0x0200,0x0200, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000, // u2087 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x1100,0x1100,0x0e00,0x1100, 0x1100,0x1100,0x0e00,0x0000,0x0000,0x0000, // u2088 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x1100,0x1100,0x1100,0x0f00, 0x0100,0x0100,0x0e00,0x0000,0x0000,0x0000, // u2089 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x3f80, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000, // u208a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u208b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0000,0x0000, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u208c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0200,0x0400,0x0800,0x0800,0x0800, 0x0800,0x0400,0x0200,0x0000,0x0000,0x0000, // u208d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0400,0x0200,0x0200,0x0200, 0x0200,0x0400,0x0800,0x0000,0x0000,0x0000, // u208e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x0100,0x1f00,0x2100, 0x2100,0x2100,0x1f00,0x0000,0x0000,0x0000, // u2090 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x2100,0x3f00, 0x2000,0x2000,0x1e00,0x0000,0x0000,0x0000, // u2091 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x2100,0x2100, 0x2100,0x2100,0x1e00,0x0000,0x0000,0x0000, // u2092 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x1200,0x0c00, 0x1200,0x2100,0x2100,0x0000,0x0000,0x0000, // u2093 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x0100,0x0100,0x3f00, 0x2100,0x2100,0x1e00,0x0000,0x0000,0x0000, // u2094 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x3e00,0x2100,0x2100,0x2100, 0x2100,0x2100,0x2100,0x0000,0x0000,0x0000, // u2095 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x2100,0x2200,0x2400,0x3800, 0x2400,0x2200,0x2100,0x0000,0x0000,0x0000, // u2096 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0e00,0x0000,0x0000,0x0000, // u2097 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x2480,0x2480,0x2480, 0x2480,0x2480,0x2480,0x0000,0x0000,0x0000, // u2098 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x2100,0x2100,0x2100, 0x2100,0x2100,0x3e00,0x2000,0x2000,0x2000, // u209a 0x0000,0x0000,0x0000,0x7800,0x4400,0x4200,0x4200,0x4200,0x4200,0x4400,0x7900,0x4100,0x47c0,0x4100,0x4100,0x4100, 0x40c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u20a7 0x0000,0x0000,0x0000,0x7840,0x4440,0x4240,0x4240,0x4a40,0x4a40,0x4a40,0x4a40,0x4a40,0x4a40,0x4840,0x4840,0x4880, 0x4f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u20aa 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4000,0x4000,0xfc00,0x4000,0x4000,0xfc00,0x4000,0x4000,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u20ac 0x0000,0x0000,0x0000,0x7fc0,0x0400,0x0400,0x0400,0x0580,0x0600,0x0c00,0x3580,0x0600,0x0c00,0x3400,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u20ae 0x0000,0x0000,0x0000,0x1e00,0x3100,0x5080,0x5080,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5080,0x5080,0x3100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2102 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u210e 0x0000,0x0000,0x0000,0x4000,0xfc00,0x4000,0x4000,0x7e00,0x4100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u210f 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x6080,0x5080,0x6880,0x5480,0x4a80,0x4580,0x4280,0x4180,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u2115 0x0000,0x0000,0x0000,0x8400,0x84c0,0x8520,0xc520,0xc4c0,0xa400,0xa400,0x9400,0x95e0,0x8c00,0x8c00,0x85e0,0x8400, 0x8400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2116 0x0000,0x0000,0x0000,0x1e00,0x3100,0x5080,0x5080,0x5080,0x5080,0x5080,0x5080,0x5080,0x5080,0x5080,0x5480,0x3300, 0x1f00,0x0080,0x0040,0x0000,0x0000,0x0000, // u211a 0x0000,0x0000,0x0000,0x7e00,0x5100,0x5080,0x5080,0x5080,0x5080,0x5100,0x5e00,0x5400,0x5a00,0x5500,0x5280,0x5140, 0x70c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u211d 0x0000,0x0000,0x0000,0xfc40,0x26c0,0x2540,0x2440,0x2440,0x2440,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2122 0x0000,0x0000,0x0000,0x7f80,0x0080,0x0080,0x0180,0x0280,0x0500,0x0a00,0x1400,0x2800,0x5000,0x6000,0x4000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u2124 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100,0x1200,0x1200, 0x7380,0x0000,0x0000,0x0000,0x0000,0x0000, // u2126 0x0000,0x0000,0x0000,0x4200,0x4200,0x2100,0x2100,0x1080,0x1040,0x2880,0x4900,0x8600,0x8400,0x8200,0x8200,0x4100, 0x2100,0x0000,0x0000,0x0000,0x0000,0x0000, // u2135 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x2000,0x4000,0xffc0,0x4000,0x2000,0x1000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2190 0x0000,0x0000,0x0000,0x0400,0x0e00,0x1500,0x2480,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2191 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0200,0x0100,0x0080,0xffc0,0x0080,0x0100,0x0200,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2192 0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x2480,0x1500,0x0e00, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2193 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1100,0x2080,0x4040,0xffe0,0x4040,0x2080,0x1100,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2194 0x0000,0x0000,0x0000,0x0400,0x0e00,0x1500,0x2480,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x2480,0x1500,0x0e00, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2195 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1040,0x2040,0x4040,0xffc0,0x4040,0x2040,0x1040,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8200,0x8100,0x8080,0xffc0,0x8080,0x8100,0x8200,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a6 0x0000,0x0000,0x0000,0x0400,0x0e00,0x1500,0x2480,0x0400,0x0400,0x0400,0x0400,0x0400,0x2480,0x1500,0x0e00,0x0400, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a8 0x0000,0x0000,0x0000,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x1040,0x2040,0x4040,0xffc0,0x4000,0x2000, 0x1000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x7800,0x1800,0x2880,0x4840,0x4040,0x4040,0x4040,0x4040,0x2080,0x1f00,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x2000,0x4000,0xffc0,0x0000,0x0000,0xffc0,0x0080,0x0100,0x0200, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21cb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0200,0x0100,0x0080,0xffc0,0x0000,0x0000,0xffc0,0x4000,0x2000,0x1000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21cc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x2000,0x7fc0,0xc000,0xc000,0x7fc0,0x2000,0x1000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d0 0x0000,0x0000,0x0000,0x0c00,0x1e00,0x3300,0x5280,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, 0x1200,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0200,0x0100,0xff80,0x00c0,0x00c0,0xff80,0x0100,0x0200,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d2 0x0000,0x0000,0x0000,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x5280,0x3300,0x1e00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1100,0x2080,0x7fc0,0xc060,0xc060,0x7fc0,0x2080,0x1100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d4 0x0000,0x0000,0x0000,0x0c00,0x1e00,0x3300,0x5280,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x5280,0x3300,0x1e00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d5 0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x2080,0x3f80,0x2080,0x1100,0x1100,0x1100,0x0a00,0x0a00,0x0a00,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2200 0x0000,0x0000,0x0000,0x0000,0x7f80,0x0080,0x0080,0x0080,0x0080,0x0080,0x7f80,0x0080,0x0080,0x0080,0x0080,0x0080, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u2203 0x0000,0x0000,0x0080,0x0080,0x7f80,0x0180,0x0280,0x0280,0x0480,0x0480,0x7f80,0x0880,0x0880,0x1080,0x1080,0x2080, 0x7f80,0x4000,0x4000,0x0000,0x0000,0x0000, // u2204 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0040,0x1e80,0x2100,0x4280,0x4480,0x4880,0x5080,0x2100,0x5e00,0x8000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2205 0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0a00,0x0a00,0x1100,0x1100,0x1100,0x2080,0x2080,0x2080,0x4040,0x4040, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2206 0x0000,0x0000,0x0000,0x7fc0,0x4040,0x4040,0x2080,0x2080,0x2080,0x1100,0x1100,0x1100,0x0a00,0x0a00,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2207 0x0000,0x0000,0x0000,0x0000,0x0f80,0x1000,0x2000,0x4000,0x4000,0x4000,0x7f80,0x4000,0x4000,0x4000,0x2000,0x1000, 0x0f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u2208 0x0000,0x0000,0x0080,0x0080,0x0f80,0x1100,0x2100,0x4200,0x4200,0x4400,0x7f80,0x4400,0x4800,0x4800,0x3000,0x1000, 0x2f80,0x2000,0x2000,0x0000,0x0000,0x0000, // u2209 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x2000,0x4000,0x4000,0x7f80,0x4000,0x4000,0x2000,0x1f80,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u220a 0x0000,0x0000,0x0000,0x0000,0x7c00,0x0200,0x0100,0x0080,0x0080,0x0080,0x7f80,0x0080,0x0080,0x0080,0x0100,0x0200, 0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u220b 0x0000,0x0000,0x4000,0x4000,0x7c00,0x2200,0x2100,0x1080,0x1080,0x0880,0x7f80,0x0880,0x0480,0x0480,0x0300,0x0200, 0x7d00,0x0100,0x0100,0x0000,0x0000,0x0000, // u220c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0100,0x0080,0x0080,0x7f80,0x0080,0x0080,0x0100,0x7e00,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u220d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2212 0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x7fc0,0x0400,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2213 0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x7fc0,0x0400,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2214 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2215 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0100,0x0080,0x0040,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2216 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x0e00,0x0e00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2219 0x0000,0x01c0,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x4100,0x4100,0x4100,0x2100,0x1100,0x0900,0x0500, 0x0300,0x0000,0x0000,0x0000,0x0000,0x0000, // u221a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3b80,0x4440,0x4440,0x4440,0x4440,0x4440,0x3b80,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u221e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f80,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u221f 0x0000,0x0000,0x0000,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, 0x1200,0x0000,0x0000,0x0000,0x0000,0x0000, // u2225 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0a00,0x0a00,0x1100,0x1100,0x2080,0x2080,0x4040, 0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u2227 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0a00,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2228 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u2229 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u222a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3080,0x4c80,0x4300,0x0000,0x3080,0x4c80,0x4300,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2248 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x7f80,0x0200,0x0400,0x0800,0x1000,0x7f80,0x4000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2260 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x7f80,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2261 0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0100,0x0000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u2264 0x0000,0x0000,0x0000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0100,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x0000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u2265 0x0000,0x0000,0x0000,0x0000,0x0440,0x0880,0x1100,0x2200,0x4400,0x8800,0x8800,0x4400,0x2200,0x1100,0x0880,0x0440, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u226a 0x0000,0x0000,0x0000,0x0000,0x8800,0x4400,0x2200,0x1100,0x0880,0x0440,0x0440,0x0880,0x1100,0x2200,0x4400,0x8800, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u226b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x1000,0x2000,0x4000,0x4000,0x4000,0x4000,0x2000,0x1000,0x0fc0,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2282 0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0100,0x0080,0x0040,0x0040,0x0040,0x0040,0x0080,0x0100,0x7e00,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2283 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x1000,0x2000,0x4000,0x4000,0x4000,0x4000,0x2000,0x1000,0x0fc0,0x0000,0x0000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2286 0x0000,0x0000,0x0000,0x0000,0x7e00,0x0100,0x0080,0x0040,0x0040,0x0040,0x0040,0x0080,0x0100,0x7e00,0x0000,0x0000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2287 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u22a5 0x0000,0x0000,0x0000,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u22c2 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u22c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0040,0x1e80,0x2100,0x4280,0x4480,0x4880,0x5080,0x2100,0x5e00,0x8000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2300 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x1200,0x2100,0x4080,0x8040,0x8040,0x8040,0x8040,0x8040,0x8040, 0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2302 0x0000,0x0000,0x0000,0x1e00,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, 0x1000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2308 0x0000,0x0000,0x0000,0x1e00,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200, 0x0200,0x0000,0x0000,0x0000,0x0000,0x0000, // u2309 0x0000,0x0000,0x0000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u230a 0x0000,0x0000,0x0000,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u230b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2310 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x7f80,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2319 0x0000,0x0000,0x0000,0x0380,0x0440,0x0440,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2320 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x4400,0x4400, 0x3800,0x0000,0x0000,0x0000,0x0000,0x0000, // u2321 0x0080,0x0100,0x0200,0x0400,0x0400,0x0800,0x0800,0x0800,0x1000,0x1000,0x1000,0x1000,0x2000,0x2000,0x2000,0x2000, 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u239b 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u239c 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x1000,0x1000,0x1000,0x1000,0x0800,0x0800, 0x0800,0x0400,0x0400,0x0200,0x0100,0x0080, // u239d 0x2000,0x1000,0x0800,0x0400,0x0400,0x0200,0x0200,0x0200,0x0100,0x0100,0x0100,0x0100,0x0080,0x0080,0x0080,0x0080, 0x0080,0x0080,0x0080,0x0080,0x0080,0x0080, // u239e 0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080, 0x0080,0x0080,0x0080,0x0080,0x0080,0x0080, // u239f 0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0100,0x0100,0x0100,0x0100,0x0200,0x0200, 0x0200,0x0400,0x0400,0x0800,0x1000,0x2000, // u23a0 0x3f80,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u23a1 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u23a2 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, 0x2000,0x2000,0x2000,0x2000,0x2000,0x3f80, // u23a3 0x3f80,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080, 0x0080,0x0080,0x0080,0x0080,0x0080,0x0080, // u23a4 0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080, 0x0080,0x0080,0x0080,0x0080,0x0080,0x0080, // u23a5 0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080, 0x0080,0x0080,0x0080,0x0080,0x0080,0x3f80, // u23a6 0x01c0,0x0600,0x0400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, // u23a7 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1000,0x6000,0x6000,0x1000,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, // u23a8 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0400,0x0600,0x01c0, // u23a9 0x7000,0x0c00,0x0400,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200, 0x0200,0x0200,0x0200,0x0200,0x0200,0x0200, // u23ab 0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0100,0x00c0,0x00c0,0x0100,0x0200,0x0200,0x0200, 0x0200,0x0200,0x0200,0x0200,0x0200,0x0200, // u23ac 0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200, 0x0200,0x0200,0x0200,0x0400,0x0c00,0x7000, // u23ad 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u23ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23af 0xffe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23ba 0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0xffe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u23bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0, // u23bd 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u23d0 0x0000,0x0000,0x4400,0x4400,0x4400,0x7c00,0x4400,0x4400,0x4400,0x0000,0x0f80,0x0200,0x0200,0x0200,0x0200,0x0200, 0x0200,0x0000,0x0000,0x0000,0x0000,0x0000, // u2409 0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7c00,0x0000,0x0f80,0x0800,0x0800,0x0e00,0x0800,0x0800, 0x0800,0x0000,0x0000,0x0000,0x0000,0x0000, // u240a 0x0000,0x0000,0x4400,0x4400,0x4400,0x2800,0x2800,0x1000,0x1000,0x0000,0x0f80,0x0200,0x0200,0x0200,0x0200,0x0200, 0x0200,0x0000,0x0000,0x0000,0x0000,0x0000, // u240b 0x0000,0x0000,0x7c00,0x4000,0x4000,0x7000,0x4000,0x4000,0x4000,0x0000,0x0f80,0x0800,0x0800,0x0e00,0x0800,0x0800, 0x0800,0x0000,0x0000,0x0000,0x0000,0x0000, // u240c 0x0000,0x0000,0x3800,0x4400,0x4000,0x4000,0x4000,0x4400,0x3800,0x0000,0x0f00,0x0880,0x0880,0x0f00,0x0a00,0x0900, 0x0880,0x0000,0x0000,0x0000,0x0000,0x0000, // u240d 0x0000,0x0000,0x4400,0x4400,0x6400,0x5400,0x4c00,0x4400,0x4400,0x0000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u2424 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2500 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xffe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2501 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2502 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2503 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xd6c0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2508 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xd6c0,0xd6c0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2509 0x0400,0x0400,0x0400,0x0400,0x0400,0x0000,0x0400,0x0400,0x0400,0x0400,0x0000,0x0400,0x0400,0x0400,0x0400,0x0000, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0000, // u250a 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, // u250b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07e0,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u250c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07e0,0x07e0,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u250d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u250e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0x0fe0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u250f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2510 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2511 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2512 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2513 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2514 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2515 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2516 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2517 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2518 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2519 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u251a 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u251b 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x07e0,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u251c 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x07e0,0x07e0,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u251d 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fe0,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u251e 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0fe0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u251f 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fe0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2520 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fe0,0x0fe0,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2521 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0fe0,0x0fe0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2522 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fe0,0x0fe0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2523 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfc00,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2524 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfc00,0xfc00,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2525 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2526 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2527 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2528 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2529 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u252a 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u252b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u252c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xfc00,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u252d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0x07e0,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u252e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xffe0,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u252f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2530 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2531 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0x0fe0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2532 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xffe0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2533 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xffe0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2534 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xffe0,0xfc00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2535 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xffe0,0x07e0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2536 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xffe0,0xffe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2537 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffe0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2538 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffe0,0xfc00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2539 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffe0,0x0fe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u253a 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffe0,0xffe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u253b 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xffe0,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u253c 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xffe0,0xfc00,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u253d 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xffe0,0x07e0,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u253e 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xffe0,0xffe0,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u253f 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffe0,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2540 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xffe0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2541 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffe0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2542 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffe0,0xfc00,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2543 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffe0,0x07e0,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2544 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xffe0,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2545 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xffe0,0x0fe0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2546 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffe0,0xffe0,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2547 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xffe0,0xffe0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2548 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffe0,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2549 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffe0,0x0fe0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u254a 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffe0,0xffe0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u254b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0x0000,0x0000,0xffe0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2550 0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, 0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, // u2551 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07e0,0x0400,0x0400,0x07e0,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2552 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fe0,0x1200,0x1200,0x1200,0x1200,0x1200, 0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, // u2553 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fe0,0x1000,0x1000,0x13e0,0x1200,0x1200,0x1200, 0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, // u2554 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0x0400,0x0400,0xfc00,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2555 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x1200,0x1200,0x1200,0x1200,0x1200, 0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, // u2556 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0200,0x0200,0xf200,0x1200,0x1200,0x1200, 0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, // u2557 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x07e0,0x0400,0x0400,0x07e0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2558 0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2559 0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x13e0,0x1000,0x1000,0x1fe0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255a 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfc00,0x0400,0x0400,0xfc00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255b 0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0xfe00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255c 0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0xf200,0x0200,0x0200,0xfe00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255d 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x07e0,0x0400,0x0400,0x07e0,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u255e 0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1fe0,0x1200,0x1200,0x1200,0x1200,0x1200, 0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, // u255f 0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x13e0,0x1000,0x1000,0x13e0,0x1200,0x1200,0x1200, 0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, // u2560 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfc00,0x0400,0x0400,0xfc00,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2561 0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0xfe00,0x1200,0x1200,0x1200,0x1200,0x1200, 0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, // u2562 0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0xf200,0x0200,0x0200,0xf200,0x1200,0x1200,0x1200, 0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, // u2563 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0x0000,0x0000,0xffe0,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2564 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0x1200,0x1200,0x1200,0x1200,0x1200, 0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, // u2565 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0x0000,0x0000,0xf3e0,0x1200,0x1200,0x1200, 0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, // u2566 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xffe0,0x0000,0x0000,0xffe0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2567 0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0xffe0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2568 0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0xf3e0,0x0000,0x0000,0xffe0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2569 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xffe0,0x0400,0x0400,0xffe0,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u256a 0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0xffe0,0x1200,0x1200,0x1200,0x1200,0x1200, 0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, // u256b 0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0xf3e0,0x0000,0x0000,0xf3e0,0x1200,0x1200,0x1200, 0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, // u256c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0180,0x0200,0x0200,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u256d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0x3000,0x0800,0x0800,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u256e 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0800,0x0800,0x3000,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u256f 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0200,0x0200,0x0180,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2570 0x0020,0x0020,0x0040,0x0040,0x0080,0x0080,0x0100,0x0100,0x0200,0x0200,0x0400,0x0400,0x0800,0x0800,0x1000,0x1000, 0x2000,0x2000,0x4000,0x4000,0x8000,0x8000, // u2571 0x8000,0x8000,0x4000,0x4000,0x2000,0x2000,0x1000,0x1000,0x0800,0x0800,0x0400,0x0400,0x0200,0x0200,0x0100,0x0100, 0x0080,0x0080,0x0040,0x0040,0x0020,0x0020, // u2572 0x8020,0x8020,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0a00,0x0400,0x0400,0x0a00,0x0a00,0x1100,0x1100, 0x2080,0x2080,0x4040,0x4040,0x8020,0x8020, // u2573 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2574 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2575 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2576 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2577 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2578 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2579 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u257b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0x07e0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257c 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u257d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xfc00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257e 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u257f 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2580 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0xffe0,0xffe0,0xffe0, // u2581 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, // u2582 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xffe0, 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, // u2583 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, // u2584 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, // u2585 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, // u2586 0x0000,0x0000,0x0000,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, // u2587 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, // u2588 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, // u2589 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u258a 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, // u258b 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, // u258c 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, // u258d 0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000, 0xe000,0xe000,0xe000,0xe000,0xe000,0xe000, // u258e 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, // u258f 0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0, 0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0, // u2590 0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000, 0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000, // u2591 0xaaa0,0x5540,0xaaa0,0x5540,0xaaa0,0x5540,0xaaa0,0x5540,0xaaa0,0x5540,0xaaa0,0x5540,0xaaa0,0x5540,0xaaa0,0x5540, 0xaaa0,0x5540,0xaaa0,0x5540,0xaaa0,0x5540, // u2592 0xffe0,0xaaa0,0xffe0,0xaaa0,0xffe0,0xaaa0,0xffe0,0xaaa0,0xffe0,0xaaa0,0xffe0,0xaaa0,0xffe0,0xaaa0,0xffe0,0xaaa0, 0xffe0,0xaaa0,0xffe0,0xaaa0,0xffe0,0xaaa0, // u2593 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0xf800,0xf800,0xf800, 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, // u2596 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0, 0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0, // u2597 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2598 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, // u2599 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0, 0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0, // u259a 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xf800,0xf800,0xf800,0xf800,0xf800, 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, // u259b 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0, 0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0, // u259c 0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u259d 0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0xf800,0xf800,0xf800,0xf800,0xf800, 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, // u259e 0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, // u259f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x3f00,0x3f00,0x3f00,0x3f00,0x3f00,0x3f00,0x3f00,0x3f00,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7fc0,0x7fc0,0x7fc0,0x7fc0, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ac 0x0000,0x0000,0x0000,0x7f80,0x7f80,0x7f80,0x7f80,0x7f80,0x7f80,0x7f80,0x7f80,0x7f80,0x7f80,0x7f80,0x7f80,0x7f80, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x1e00,0x1e00,0x3f00,0x3f00,0x7f80,0x7f80,0xffc0,0xffc0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xffc0,0xffc0,0xff00,0xfc00,0xf000,0xc000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xffc0,0xffc0,0xff00,0xfc00,0xf000,0xc000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x7f80,0x7f80,0x3f00,0x3f00,0x1e00,0x1e00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x01e0,0x07e0,0x1fe0,0x7fe0,0x7fe0,0x1fe0,0x07e0,0x01e0,0x0060, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25c0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x01e0,0x07e0,0x1fe0,0x7fe0,0x7fe0,0x1fe0,0x07e0,0x01e0,0x0060, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25c4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0e00,0x1f00,0x3f80,0x7fc0,0x3f80,0x1f00,0x0e00,0x0400,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25c6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0a00,0x1100,0x2080,0x4040,0x2080,0x1100,0x0a00,0x0400,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ca 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x1100,0x1100,0x1100,0x0e00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25cb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x1f00,0x1f00,0x1f00,0x0e00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25cf 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xf1e0,0xe0e0,0xe0e0,0xe0e0,0xf1e0,0xffe0,0xffe0,0xffe0, 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, // u25d8 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xf1e0,0xeee0,0xeee0,0xeee0,0xf1e0,0xffe0,0xffe0,0xffe0, 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, // u25d9 0x0000,0x0000,0x0000,0x3f00,0x4080,0x8040,0xb340,0xb340,0x8040,0x8040,0x8040,0xbf40,0x9e40,0x8040,0x8040,0x4080, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u263a 0x0000,0x0000,0x0000,0x3f00,0x7f80,0xffc0,0xccc0,0xccc0,0xffc0,0xffc0,0xffc0,0xc0c0,0xe1c0,0xffc0,0xffc0,0x7f80, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u263b 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x4440,0x2480,0x1500,0x0e00,0x7bc0,0x0e00,0x1500,0x2480,0x4440,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u263c 0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x2080,0x1f00,0x0400,0x0400,0x7fc0,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2640 0x0000,0x0000,0x0000,0x07c0,0x00c0,0x0140,0x0240,0x0440,0x1e00,0x2100,0x4080,0x4080,0x4080,0x4080,0x4080,0x2100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2642 0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0e00,0x1f00,0x3f80,0x7fc0,0x7fc0,0x7fc0,0x7fc0,0x3580,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2660 0x0000,0x0000,0x0000,0x0e00,0x1f00,0x1f00,0x0e00,0x0400,0x0400,0x3580,0x7fc0,0x7fc0,0x7fc0,0x3580,0x0400,0x0400, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2663 0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x7bc0,0x7fc0,0x7fc0,0x7fc0,0x7fc0,0x7fc0,0x3f80,0x1f00,0x0e00,0x0400, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2665 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0e00,0x1f00,0x3f80,0x7fc0,0x3f80,0x1f00,0x0e00,0x0400,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2666 0x0000,0x0000,0x0000,0x1fc0,0x1040,0x1040,0x1040,0x1fc0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, 0xe000,0x0000,0x0000,0x0000,0x0000,0x0000, // u266a 0x0000,0x0000,0x0000,0x7f80,0x4080,0x4080,0x4080,0x7f80,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4100, 0x8000,0x0000,0x0000,0x0000,0x0000,0x0000, // u266b 0x0000,0x0000,0x0000,0x0040,0x0040,0x0080,0x0080,0x0100,0x0100,0x8200,0x8200,0x4400,0x4400,0x2800,0x2800,0x1000, 0x1000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2713 0x0000,0x0000,0x0000,0x0060,0x0060,0x00c0,0x00c0,0x0180,0x0180,0xc300,0xc300,0x6600,0x6600,0x3c00,0x3c00,0x1800, 0x1800,0x0000,0x0000,0x0000,0x0000,0x0000, // u2714 0x0000,0x0000,0x0000,0x0100,0x0100,0x4200,0x2200,0x1400,0x0c00,0x0c00,0x0a00,0x1100,0x1080,0x2000,0x2000,0x4000, 0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2717 0x0000,0x0000,0x0000,0x0180,0x0180,0x6300,0x3300,0x1e00,0x0e00,0x0e00,0x0f00,0x1980,0x18c0,0x3000,0x3000,0x6000, 0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2718 0x0000,0x0000,0x0000,0x0200,0x0200,0x0400,0x0400,0x0800,0x0800,0x1000,0x1000,0x0800,0x0800,0x0400,0x0400,0x0200, 0x0200,0x0000,0x0000,0x0000,0x0000,0x0000, // u27e8 0x0000,0x0000,0x0000,0x1000,0x1000,0x0800,0x0800,0x0400,0x0400,0x0200,0x0200,0x0400,0x0400,0x0800,0x0800,0x1000, 0x1000,0x0000,0x0000,0x0000,0x0000,0x0000, // u27e9 0x0000,0x0000,0x0000,0x0880,0x0880,0x1100,0x1100,0x2200,0x2200,0x4400,0x4400,0x2200,0x2200,0x1100,0x1100,0x0880, 0x0880,0x0000,0x0000,0x0000,0x0000,0x0000, // u27ea 0x0000,0x0000,0x0000,0x4400,0x4400,0x2200,0x2200,0x1100,0x1100,0x0880,0x0880,0x1100,0x1100,0x2200,0x2200,0x4400, 0x4400,0x0000,0x0000,0x0000,0x0000,0x0000, // u27eb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2800 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2801 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2802 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2803 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2804 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2805 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2806 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2807 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2808 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2809 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280a 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280b 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280c 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280d 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280e 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2810 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2811 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2812 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2813 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2814 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2815 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2816 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2817 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2818 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2819 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281a 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281b 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281c 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281d 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281e 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2820 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2821 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2822 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2823 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2824 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2825 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2826 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2827 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2828 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2829 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282a 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282b 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282c 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282d 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282e 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2830 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2831 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2832 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2833 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2834 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2835 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2836 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2837 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2838 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2839 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283a 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283b 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283c 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283d 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283e 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2840 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2841 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2842 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2843 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2844 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2845 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2846 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2847 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2848 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2849 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u284a 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u284b 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u284c 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u284d 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u284e 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u284f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2850 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2851 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2852 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2853 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2854 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2855 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2856 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2857 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2858 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2859 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u285a 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u285b 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u285c 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u285d 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u285e 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u285f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2860 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2861 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2862 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2863 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2864 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2865 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2866 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2867 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2868 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2869 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u286a 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u286b 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u286c 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u286d 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u286e 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u286f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2870 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2871 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2872 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2873 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2874 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2875 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2876 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2877 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2878 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2879 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u287a 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u287b 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u287c 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u287d 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u287e 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u287f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u2880 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u2881 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u2882 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u2883 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u2884 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u2885 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u2886 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u2887 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u2888 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u2889 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u288a 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u288b 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u288c 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u288d 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u288e 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u288f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u2890 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u2891 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u2892 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u2893 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u2894 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u2895 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u2896 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u2897 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u2898 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u2899 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u289a 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u289b 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u289c 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u289d 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u289e 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u289f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28a0 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28a1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28a2 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28a4 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28a5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28a6 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28a7 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28a8 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28a9 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28aa 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28ab 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28ac 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28ad 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28ae 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28af 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28b0 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28b1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28b2 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28b4 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28b6 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28b7 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28b8 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28b9 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28ba 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28bb 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28bc 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28bd 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28be 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000, // u28bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28c0 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28c2 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28c4 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28c6 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28c7 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28c8 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28c9 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28ca 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28cb 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28cc 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28cd 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28ce 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28cf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28d0 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28d2 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28d4 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28d6 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28d7 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28d8 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28d9 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28da 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28db 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28dc 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28dd 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28de 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28df 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28e0 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28e1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28e2 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28e3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28e4 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28e6 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28e7 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28e8 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28e9 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28ea 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28eb 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28ec 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28ed 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28ee 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28ef 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28f0 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28f2 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28f3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28f4 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28f6 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28f7 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28f8 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28f9 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28fa 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28fb 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28fc 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28fd 0x0000,0x0100,0x0100,0x0100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28fe 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000,0x0000,0x0000,0x2100,0x2100,0x2100,0x0000, 0x0000,0x2100,0x2100,0x2100,0x0000,0x0000, // u28ff 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x0000,0x0000,0x0000,0x0000,0x4080,0x4080,0x4080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2e2c 0x8000,0x8000,0x8200,0x8700,0x8a80,0x9240,0x8200,0x8200,0x8200,0x8200,0x8400,0x0800,0x1000,0x2000,0x4000,0x8000, 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, // ue0a0 0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0840,0x0840,0x0c40,0x0a40, 0x0940,0x08c0,0x0840,0x0840,0x0000,0x0000, // ue0a1 0x0000,0x0000,0x1f00,0x2080,0x2080,0x2080,0x2080,0x2080,0x2080,0x7fc0,0x7fc0,0x7fc0,0x7bc0,0x71c0,0x71c0,0x7bc0, 0x7fc0,0x7fc0,0x7fc0,0x0000,0x0000,0x0000, // ue0a2 0x8000,0xc000,0xe000,0xf000,0xf800,0xfc00,0xfe00,0xff00,0xff80,0xffc0,0xffe0,0xffe0,0xffc0,0xff80,0xff00,0xfe00, 0xfc00,0xf800,0xf000,0xe000,0xc000,0x8000, // ue0b0 0x8000,0x4000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0100,0x0080,0x0040,0x0020,0x0020,0x0040,0x0080,0x0100,0x0200, 0x0400,0x0800,0x1000,0x2000,0x4000,0x8000, // ue0b1 0x0020,0x0060,0x00e0,0x01e0,0x03e0,0x07e0,0x0fe0,0x1fe0,0x3fe0,0x7fe0,0xffe0,0xffe0,0x7fe0,0x3fe0,0x1fe0,0x0fe0, 0x07e0,0x03e0,0x01e0,0x00e0,0x0060,0x0020, // ue0b2 0x0020,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000,0x8000,0x4000,0x2000,0x1000,0x0800, 0x0400,0x0200,0x0100,0x0080,0x0040,0x0020, // ue0b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0100,0x2100,0x2100,0x2100,0x1e00,0x0000, // uf6be 0x0000,0x0000,0x0000,0x7f80,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000 // ufffd }; // codepoints array constexpr std::array fixedfont_codepoints = { 0x0000,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e, 0x002f,0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e, 0x003f,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e, 0x004f,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e, 0x005f,0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e, 0x006f,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e, 0x00a0,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af, 0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf, 0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf, 0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df, 0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef, 0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff, 0x0100,0x0101,0x0102,0x0103,0x0104,0x0105,0x0106,0x0107,0x0108,0x0109,0x010a,0x010b,0x010c,0x010d,0x010e,0x010f, 0x0110,0x0111,0x0112,0x0113,0x0114,0x0115,0x0116,0x0117,0x0118,0x0119,0x011a,0x011b,0x011c,0x011d,0x011e,0x011f, 0x0120,0x0121,0x0122,0x0123,0x0124,0x0125,0x0126,0x0127,0x0128,0x0129,0x012a,0x012b,0x012c,0x012d,0x012e,0x012f, 0x0130,0x0131,0x0132,0x0133,0x0134,0x0135,0x0136,0x0137,0x0138,0x0139,0x013a,0x013b,0x013c,0x013d,0x013e,0x013f, 0x0140,0x0141,0x0142,0x0143,0x0144,0x0145,0x0146,0x0147,0x0148,0x0149,0x014a,0x014b,0x014c,0x014d,0x014e,0x014f, 0x0150,0x0151,0x0152,0x0153,0x0154,0x0155,0x0156,0x0157,0x0158,0x0159,0x015a,0x015b,0x015c,0x015d,0x015e,0x015f, 0x0160,0x0161,0x0162,0x0163,0x0164,0x0165,0x0166,0x0167,0x0168,0x0169,0x016a,0x016b,0x016c,0x016d,0x016e,0x016f, 0x0170,0x0171,0x0172,0x0173,0x0174,0x0175,0x0176,0x0177,0x0178,0x0179,0x017a,0x017b,0x017c,0x017d,0x017e,0x017f, 0x0186,0x018e,0x018f,0x0190,0x0192,0x019d,0x019e,0x01b5,0x01b6,0x01b7,0x01cd,0x01ce,0x01cf,0x01d0,0x01d1,0x01d2, 0x01d3,0x01d4,0x01e2,0x01e3,0x01e4,0x01e5,0x01e6,0x01e7,0x01e8,0x01e9,0x01ea,0x01eb,0x01ec,0x01ed,0x01ee,0x01ef, 0x01f0,0x01f4,0x01f5,0x01fc,0x01fd,0x01fe,0x01ff,0x0218,0x0219,0x021a,0x021b,0x0232,0x0233,0x0237,0x0254,0x0258, 0x0259,0x025b,0x0272,0x0292,0x02bb,0x02bc,0x02bd,0x02c6,0x02c7,0x02d8,0x02d9,0x02db,0x02dc,0x02dd,0x0300,0x0301, 0x0302,0x0303,0x0304,0x0305,0x0306,0x0307,0x0308,0x030a,0x030b,0x030c,0x0329,0x0384,0x0385,0x0386,0x0387,0x0388, 0x0389,0x038a,0x038c,0x038e,0x038f,0x0390,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039a, 0x039b,0x039c,0x039d,0x039e,0x039f,0x03a0,0x03a1,0x03a3,0x03a4,0x03a5,0x03a6,0x03a7,0x03a8,0x03a9,0x03aa,0x03ab, 0x03ac,0x03ad,0x03ae,0x03af,0x03b0,0x03b1,0x03b2,0x03b3,0x03b4,0x03b5,0x03b6,0x03b7,0x03b8,0x03b9,0x03ba,0x03bb, 0x03bc,0x03bd,0x03be,0x03bf,0x03c0,0x03c1,0x03c2,0x03c3,0x03c4,0x03c5,0x03c6,0x03c7,0x03c8,0x03c9,0x03ca,0x03cb, 0x03cc,0x03cd,0x03ce,0x03d1,0x03d5,0x03f0,0x03f1,0x03f2,0x03f3,0x03f4,0x03f5,0x03f6,0x0400,0x0401,0x0402,0x0403, 0x0404,0x0405,0x0406,0x0407,0x0408,0x0409,0x040a,0x040b,0x040c,0x040d,0x040e,0x040f,0x0410,0x0411,0x0412,0x0413, 0x0414,0x0415,0x0416,0x0417,0x0418,0x0419,0x041a,0x041b,0x041c,0x041d,0x041e,0x041f,0x0420,0x0421,0x0422,0x0423, 0x0424,0x0425,0x0426,0x0427,0x0428,0x0429,0x042a,0x042b,0x042c,0x042d,0x042e,0x042f,0x0430,0x0431,0x0432,0x0433, 0x0434,0x0435,0x0436,0x0437,0x0438,0x0439,0x043a,0x043b,0x043c,0x043d,0x043e,0x043f,0x0440,0x0441,0x0442,0x0443, 0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,0x044a,0x044b,0x044c,0x044d,0x044e,0x044f,0x0450,0x0451,0x0452,0x0453, 0x0454,0x0455,0x0456,0x0457,0x0458,0x0459,0x045a,0x045b,0x045c,0x045d,0x045e,0x045f,0x0462,0x0463,0x046a,0x046b, 0x0490,0x0491,0x0492,0x0493,0x0494,0x0495,0x0496,0x0497,0x0498,0x0499,0x049a,0x049b,0x049c,0x049d,0x04a0,0x04a1, 0x04a2,0x04a3,0x04a4,0x04a5,0x04aa,0x04ab,0x04ae,0x04af,0x04b0,0x04b1,0x04b2,0x04b3,0x04b6,0x04b7,0x04b8,0x04b9, 0x04ba,0x04bb,0x04c0,0x04c1,0x04c2,0x04cf,0x04d0,0x04d1,0x04d2,0x04d3,0x04d4,0x04d5,0x04d6,0x04d7,0x04d8,0x04d9, 0x04da,0x04db,0x04dc,0x04dd,0x04de,0x04df,0x04e2,0x04e3,0x04e4,0x04e5,0x04e6,0x04e7,0x04e8,0x04e9,0x04ea,0x04eb, 0x04ec,0x04ed,0x04ee,0x04ef,0x04f0,0x04f1,0x04f2,0x04f3,0x04f4,0x04f5,0x04f8,0x04f9,0x05d0,0x05d1,0x05d2,0x05d3, 0x05d4,0x05d5,0x05d6,0x05d7,0x05d8,0x05d9,0x05da,0x05db,0x05dc,0x05dd,0x05de,0x05df,0x05e0,0x05e1,0x05e2,0x05e3, 0x05e4,0x05e5,0x05e6,0x05e7,0x05e8,0x05e9,0x05ea,0x1e0c,0x1e0d,0x1e34,0x1e35,0x1e36,0x1e37,0x1e40,0x1e41,0x1e42, 0x1e43,0x1e44,0x1e45,0x1e46,0x1e47,0x1e6c,0x1e6d,0x1eb8,0x1eb9,0x1ebc,0x1ebd,0x1eca,0x1ecb,0x1ecc,0x1ecd,0x1ee4, 0x1ee5,0x1ef8,0x1ef9,0x2000,0x2001,0x2002,0x2003,0x2004,0x2005,0x2006,0x2007,0x2008,0x2009,0x200a,0x200b,0x200c, 0x200d,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x2015,0x2016,0x2017,0x2018,0x2019,0x201a,0x201b,0x201c, 0x201d,0x201e,0x201f,0x2020,0x2021,0x2022,0x2026,0x2030,0x2032,0x2033,0x2039,0x203a,0x203c,0x203e,0x2070,0x2071, 0x2074,0x2075,0x2076,0x2077,0x2078,0x2079,0x207a,0x207b,0x207c,0x207d,0x207e,0x207f,0x2080,0x2081,0x2082,0x2083, 0x2084,0x2085,0x2086,0x2087,0x2088,0x2089,0x208a,0x208b,0x208c,0x208d,0x208e,0x2090,0x2091,0x2092,0x2093,0x2094, 0x2095,0x2096,0x2097,0x2098,0x209a,0x20a7,0x20aa,0x20ac,0x20ae,0x2102,0x210e,0x210f,0x2115,0x2116,0x211a,0x211d, 0x2122,0x2124,0x2126,0x2135,0x2190,0x2191,0x2192,0x2193,0x2194,0x2195,0x21a4,0x21a6,0x21a8,0x21b5,0x21bb,0x21cb, 0x21cc,0x21d0,0x21d1,0x21d2,0x21d3,0x21d4,0x21d5,0x2200,0x2203,0x2204,0x2205,0x2206,0x2207,0x2208,0x2209,0x220a, 0x220b,0x220c,0x220d,0x2212,0x2213,0x2214,0x2215,0x2216,0x2219,0x221a,0x221e,0x221f,0x2225,0x2227,0x2228,0x2229, 0x222a,0x2248,0x2260,0x2261,0x2264,0x2265,0x226a,0x226b,0x2282,0x2283,0x2286,0x2287,0x22a5,0x22c2,0x22c3,0x2300, 0x2302,0x2308,0x2309,0x230a,0x230b,0x2310,0x2319,0x2320,0x2321,0x239b,0x239c,0x239d,0x239e,0x239f,0x23a0,0x23a1, 0x23a2,0x23a3,0x23a4,0x23a5,0x23a6,0x23a7,0x23a8,0x23a9,0x23ab,0x23ac,0x23ad,0x23ae,0x23af,0x23ba,0x23bb,0x23bc, 0x23bd,0x23d0,0x2409,0x240a,0x240b,0x240c,0x240d,0x2424,0x2500,0x2501,0x2502,0x2503,0x2508,0x2509,0x250a,0x250b, 0x250c,0x250d,0x250e,0x250f,0x2510,0x2511,0x2512,0x2513,0x2514,0x2515,0x2516,0x2517,0x2518,0x2519,0x251a,0x251b, 0x251c,0x251d,0x251e,0x251f,0x2520,0x2521,0x2522,0x2523,0x2524,0x2525,0x2526,0x2527,0x2528,0x2529,0x252a,0x252b, 0x252c,0x252d,0x252e,0x252f,0x2530,0x2531,0x2532,0x2533,0x2534,0x2535,0x2536,0x2537,0x2538,0x2539,0x253a,0x253b, 0x253c,0x253d,0x253e,0x253f,0x2540,0x2541,0x2542,0x2543,0x2544,0x2545,0x2546,0x2547,0x2548,0x2549,0x254a,0x254b, 0x2550,0x2551,0x2552,0x2553,0x2554,0x2555,0x2556,0x2557,0x2558,0x2559,0x255a,0x255b,0x255c,0x255d,0x255e,0x255f, 0x2560,0x2561,0x2562,0x2563,0x2564,0x2565,0x2566,0x2567,0x2568,0x2569,0x256a,0x256b,0x256c,0x256d,0x256e,0x256f, 0x2570,0x2571,0x2572,0x2573,0x2574,0x2575,0x2576,0x2577,0x2578,0x2579,0x257a,0x257b,0x257c,0x257d,0x257e,0x257f, 0x2580,0x2581,0x2582,0x2583,0x2584,0x2585,0x2586,0x2587,0x2588,0x2589,0x258a,0x258b,0x258c,0x258d,0x258e,0x258f, 0x2590,0x2591,0x2592,0x2593,0x2596,0x2597,0x2598,0x2599,0x259a,0x259b,0x259c,0x259d,0x259e,0x259f,0x25a0,0x25ac, 0x25ae,0x25b2,0x25b6,0x25ba,0x25bc,0x25c0,0x25c4,0x25c6,0x25ca,0x25cb,0x25cf,0x25d8,0x25d9,0x263a,0x263b,0x263c, 0x2640,0x2642,0x2660,0x2663,0x2665,0x2666,0x266a,0x266b,0x2713,0x2714,0x2717,0x2718,0x27e8,0x27e9,0x27ea,0x27eb, 0x2800,0x2801,0x2802,0x2803,0x2804,0x2805,0x2806,0x2807,0x2808,0x2809,0x280a,0x280b,0x280c,0x280d,0x280e,0x280f, 0x2810,0x2811,0x2812,0x2813,0x2814,0x2815,0x2816,0x2817,0x2818,0x2819,0x281a,0x281b,0x281c,0x281d,0x281e,0x281f, 0x2820,0x2821,0x2822,0x2823,0x2824,0x2825,0x2826,0x2827,0x2828,0x2829,0x282a,0x282b,0x282c,0x282d,0x282e,0x282f, 0x2830,0x2831,0x2832,0x2833,0x2834,0x2835,0x2836,0x2837,0x2838,0x2839,0x283a,0x283b,0x283c,0x283d,0x283e,0x283f, 0x2840,0x2841,0x2842,0x2843,0x2844,0x2845,0x2846,0x2847,0x2848,0x2849,0x284a,0x284b,0x284c,0x284d,0x284e,0x284f, 0x2850,0x2851,0x2852,0x2853,0x2854,0x2855,0x2856,0x2857,0x2858,0x2859,0x285a,0x285b,0x285c,0x285d,0x285e,0x285f, 0x2860,0x2861,0x2862,0x2863,0x2864,0x2865,0x2866,0x2867,0x2868,0x2869,0x286a,0x286b,0x286c,0x286d,0x286e,0x286f, 0x2870,0x2871,0x2872,0x2873,0x2874,0x2875,0x2876,0x2877,0x2878,0x2879,0x287a,0x287b,0x287c,0x287d,0x287e,0x287f, 0x2880,0x2881,0x2882,0x2883,0x2884,0x2885,0x2886,0x2887,0x2888,0x2889,0x288a,0x288b,0x288c,0x288d,0x288e,0x288f, 0x2890,0x2891,0x2892,0x2893,0x2894,0x2895,0x2896,0x2897,0x2898,0x2899,0x289a,0x289b,0x289c,0x289d,0x289e,0x289f, 0x28a0,0x28a1,0x28a2,0x28a3,0x28a4,0x28a5,0x28a6,0x28a7,0x28a8,0x28a9,0x28aa,0x28ab,0x28ac,0x28ad,0x28ae,0x28af, 0x28b0,0x28b1,0x28b2,0x28b3,0x28b4,0x28b5,0x28b6,0x28b7,0x28b8,0x28b9,0x28ba,0x28bb,0x28bc,0x28bd,0x28be,0x28bf, 0x28c0,0x28c1,0x28c2,0x28c3,0x28c4,0x28c5,0x28c6,0x28c7,0x28c8,0x28c9,0x28ca,0x28cb,0x28cc,0x28cd,0x28ce,0x28cf, 0x28d0,0x28d1,0x28d2,0x28d3,0x28d4,0x28d5,0x28d6,0x28d7,0x28d8,0x28d9,0x28da,0x28db,0x28dc,0x28dd,0x28de,0x28df, 0x28e0,0x28e1,0x28e2,0x28e3,0x28e4,0x28e5,0x28e6,0x28e7,0x28e8,0x28e9,0x28ea,0x28eb,0x28ec,0x28ed,0x28ee,0x28ef, 0x28f0,0x28f1,0x28f2,0x28f3,0x28f4,0x28f5,0x28f6,0x28f7,0x28f8,0x28f9,0x28fa,0x28fb,0x28fc,0x28fd,0x28fe,0x28ff, 0x2e2c,0xe0a0,0xe0a1,0xe0a2,0xe0b0,0xe0b1,0xe0b2,0xe0b3,0xf6be,0xfffd }; } // namespace // -- end of autogenerated text --- namespace fixed_font_22b { // -- start of autogenerated text --- // definition section for font: ter-u22b.bdf constexpr int CHARCOUNT = 1354; constexpr int WIDTH = 11; constexpr int HEIGHT = 22; constexpr int OFFSET_X = 0; constexpr int OFFSET_Y = 0; constexpr FixedFont_info_t fixedfont_info = { "Terminus", // font name "ter-u22b.bdf", // font name internal CHARCOUNT, // num of chars WIDTH, HEIGHT, OFFSET_X, OFFSET_Y, true // bold }; // font bitmap definitions constexpr std::array fixedfont_bitmap = { 0x0000,0x0000,0x0000,0x7bc0,0x60c0,0x60c0,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x0000,0x0000,0x60c0,0x60c0, 0x7bc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0020 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0021 0x0000,0x3300,0x3300,0x3300,0x3300,0x3300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0022 0x0000,0x0000,0x0000,0x3300,0x3300,0x3300,0x3300,0xffc0,0x3300,0x3300,0x3300,0x3300,0xffc0,0x3300,0x3300,0x3300, 0x3300,0x0000,0x0000,0x0000,0x0000,0x0000, // u0023 0x0000,0x0000,0x0c00,0x0c00,0x3f00,0x6d80,0xccc0,0xcc00,0xcc00,0x6c00,0x3f00,0x0d80,0x0cc0,0x0cc0,0xccc0,0x6d80, 0x3f00,0x0c00,0x0c00,0x0000,0x0000,0x0000, // u0024 0x0000,0x0000,0x0000,0x7180,0xd980,0xdb00,0x7300,0x0600,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x3380,0x36c0,0x66c0, 0x6380,0x0000,0x0000,0x0000,0x0000,0x0000, // u0025 0x0000,0x0000,0x0000,0x3e00,0x6300,0x6300,0x6300,0x3600,0x1c00,0x3c00,0x66c0,0xc3c0,0xc180,0xc180,0xc180,0x63c0, 0x3ec0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0026 0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0027 0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0c00,0x0c00,0x0600, 0x0300,0x0000,0x0000,0x0000,0x0000,0x0000, // u0028 0x0000,0x0000,0x0000,0x1800,0x0c00,0x0600,0x0600,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0600,0x0600,0x0c00, 0x1800,0x0000,0x0000,0x0000,0x0000,0x0000, // u0029 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x3300,0x1e00,0x0c00,0xffc0,0x0c00,0x1e00,0x3300,0x6180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00, 0x0c00,0x1800,0x0000,0x0000,0x0000,0x0000, // u002c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u002e 0x0000,0x0000,0x0000,0x0180,0x0180,0x0300,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x3000,0x3000,0x6000, 0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002f 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x61c0,0x63c0,0x66c0,0x6cc0,0x78c0,0x70c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0030 0x0000,0x0000,0x0000,0x0600,0x0e00,0x1e00,0x3600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0031 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0032 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x00c0,0x00c0,0x0180,0x0f00,0x0180,0x00c0,0x00c0,0x00c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0033 0x0000,0x0000,0x0000,0x00c0,0x01c0,0x03c0,0x06c0,0x0cc0,0x18c0,0x30c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x00c0,0x00c0, 0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0034 0x0000,0x0000,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x7f00,0x0180,0x00c0,0x00c0,0x00c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0035 0x0000,0x0000,0x0000,0x1f80,0x3000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0036 0x0000,0x0000,0x0000,0x7fc0,0x60c0,0x60c0,0x00c0,0x0180,0x0180,0x0300,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0037 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x3180,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0038 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0,0x1fc0,0x00c0,0x00c0,0x00c0,0x0180, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0039 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00, 0x0c00,0x1800,0x0000,0x0000,0x0000,0x0000, // u003b 0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0300, 0x0180,0x0000,0x0000,0x0000,0x0000,0x0000, // u003c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003d 0x0000,0x0000,0x0000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000, 0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003e 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x00c0,0x0180,0x0300,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600, 0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u003f 0x0000,0x0000,0x0000,0x3f00,0x6180,0xc0c0,0xc7c0,0xccc0,0xd8c0,0xd8c0,0xd8c0,0xd8c0,0xccc0,0xc7c0,0xc000,0x6000, 0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0040 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0041 0x0000,0x0000,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x6180,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x6180, 0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0042 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0043 0x0000,0x0000,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x6180, 0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0044 0x0000,0x0000,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0045 0x0000,0x0000,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0046 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x6000,0x6000,0x6000,0x67c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0047 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0048 0x0000,0x0000,0x0000,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0049 0x0000,0x0000,0x0000,0x07e0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x6180,0x6180,0x6180,0x3300, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u004a 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7800,0x6c00,0x6600,0x6300,0x6180,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u004b 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u004c 0x0000,0x0000,0x0000,0x8040,0xc0c0,0xe1c0,0xf3c0,0xdec0,0xccc0,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0xc0c0, 0xc0c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u004d 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x70c0,0x78c0,0x6cc0,0x66c0,0x63c0,0x61c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u004e 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u004f 0x0000,0x0000,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x6180,0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0050 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3780, 0x1f00,0x0180,0x00c0,0x0000,0x0000,0x0000, // u0051 0x0000,0x0000,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x6180,0x7f00,0x7800,0x6c00,0x6600,0x6300,0x6180, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0052 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x6000,0x6000,0x3000,0x1f00,0x0180,0x00c0,0x00c0,0x00c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0053 0x0000,0x0000,0x0000,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0054 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0055 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180,0x3180,0x3180,0x3180,0x1b00,0x1b00,0x0e00,0x0e00, 0x0e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0056 0x0000,0x0000,0x0000,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0xccc0,0xccc0,0xdec0,0xf3c0,0xe1c0,0xc0c0, 0x8040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0057 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x3180,0x3180,0x1b00,0x1b00,0x0e00,0x0e00,0x1b00,0x1b00,0x3180,0x3180,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0058 0x0000,0x0000,0x0000,0xc0c0,0xc0c0,0x6180,0x6180,0x3300,0x3300,0x1e00,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0059 0x0000,0x0000,0x0000,0x7fc0,0x00c0,0x00c0,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u005a 0x0000,0x0000,0x0000,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u005b 0x0000,0x0000,0x0000,0x6000,0x6000,0x3000,0x3000,0x1800,0x1800,0x0c00,0x0c00,0x0600,0x0600,0x0300,0x0300,0x0180, 0x0180,0x0000,0x0000,0x0000,0x0000,0x0000, // u005c 0x0000,0x0000,0x0000,0x1f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u005d 0x0000,0x0400,0x0e00,0x1b00,0x3180,0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0000, // u005f 0x1800,0x0c00,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0060 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0180,0x00c0,0x00c0,0x3fc0,0x60c0,0x60c0,0x60c0,0x60c0, 0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0061 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x6180, 0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0062 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x6000,0x6000,0x6000,0x6000,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0063 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x00c0,0x1fc0,0x30c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0064 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x7fc0,0x6000,0x6000,0x6000,0x30c0, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0065 0x0000,0x0000,0x0000,0x07c0,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0066 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x30c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x00c0,0x00c0,0x0180,0x3f00,0x0000, // u0067 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0068 0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0069 0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0780,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x3180,0x3180,0x3180,0x1f00,0x0000, // u006a 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x30c0,0x3180,0x3300,0x3600,0x3c00,0x3c00,0x3600,0x3300,0x3180, 0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u006b 0x0000,0x0000,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u006c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xcd80,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0, 0xccc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u006d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u006e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u006f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x6180, 0x7f00,0x6000,0x6000,0x6000,0x6000,0x0000, // u0070 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x30c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x00c0,0x00c0,0x00c0,0x00c0,0x0000, // u0071 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x67c0,0x6c00,0x7800,0x7000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0072 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x60c0,0x6000,0x6000,0x3f80,0x00c0,0x00c0,0x00c0,0x60c0, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0073 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x07c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0074 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0075 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x3180,0x3180,0x3180,0x1b00,0x1b00,0x0e00, 0x0e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0076 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc0c0,0xc0c0,0xc0c0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0077 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x60c0,0x3180,0x1b00,0x0e00,0x0e00,0x1b00,0x3180,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0078 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x00c0,0x00c0,0x0180,0x3f00,0x0000, // u0079 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u007a 0x0000,0x0000,0x0000,0x0380,0x0600,0x0c00,0x0c00,0x0c00,0x0c00,0x3800,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0600, 0x0380,0x0000,0x0000,0x0000,0x0000,0x0000, // u007b 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u007c 0x0000,0x0000,0x0000,0x3800,0x0c00,0x0600,0x0600,0x0600,0x0600,0x0380,0x0600,0x0600,0x0600,0x0600,0x0600,0x0c00, 0x3800,0x0000,0x0000,0x0000,0x0000,0x0000, // u007d 0x0000,0x38c0,0x6cc0,0x66c0,0x6380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a0 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x3f00,0x6d80,0xccc0,0xcc00,0xcc00,0xcc00,0xcc00,0xccc0,0x6d80, 0x3f00,0x0c00,0x0c00,0x0000,0x0000,0x0000, // u00a2 0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x3180,0x3000,0x3000,0x3000,0x7e00,0x3000,0x3000,0x3000,0x3000,0x30c0, 0x30c0,0x7fc0,0x0000,0x0000,0x0000,0x0000, // u00a3 0x0000,0x0000,0x0000,0x0000,0x0000,0xc0c0,0x6180,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x6180,0xc0c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a4 0x0000,0x0000,0x0000,0xc0c0,0xc0c0,0x6180,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x7f80,0x0c00,0x0c00,0x7f80,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a5 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a6 0x0000,0x0000,0x1f00,0x3180,0x3000,0x3000,0x1e00,0x3300,0x3180,0x3180,0x3180,0x3180,0x1980,0x0f00,0x0180,0x0180, 0x3180,0x1f00,0x0000,0x0000,0x0000,0x0000, // u00a7 0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a8 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x4080,0x9e40,0xb340,0xb040,0xb040,0xb040,0xb340,0x9e40,0x4080,0x3f00, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a9 0x0000,0x3f00,0x0180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x3f80,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0cc0,0x1980,0x3300,0x6600,0xcc00,0xcc00,0x6600,0x3300,0x1980, 0x0cc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ab 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x00c0,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ac 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ad 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x4080,0xbe40,0xb340,0xb340,0xbe40,0xbc40,0xb640,0xb340,0x4080,0x3f00, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ae 0x0000,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00af 0x0000,0x1e00,0x3300,0x3300,0x3300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0000, 0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b1 0x0000,0x1e00,0x3300,0x3300,0x0300,0x0600,0x0c00,0x1800,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b2 0x0000,0x1e00,0x3300,0x0300,0x0e00,0x0300,0x0300,0x3300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b3 0x0300,0x0600,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x61c0,0x63c0, 0x7ec0,0x6000,0x6000,0x6000,0x6000,0x0000, // u00b5 0x0000,0x0000,0x0000,0x7fc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0x7cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, 0x0cc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0600,0x0600,0x0600,0x0c00,0x0000, // u00b8 0x0000,0x0c00,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b9 0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3f00,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xcc00,0x6600,0x3300,0x1980,0x0cc0,0x0cc0,0x1980,0x3300,0x6600, 0xcc00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00bb 0x0000,0x0000,0x3000,0x7000,0xf000,0x3040,0x30c0,0x3180,0x3300,0x0600,0x0cc0,0x19c0,0x33c0,0x66c0,0x4cc0,0x0fc0, 0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000, // u00bc 0x0000,0x0000,0x3000,0x7000,0xf040,0x30c0,0x3180,0x3300,0x3600,0x0c00,0x1800,0x3780,0x6cc0,0x4cc0,0x0180,0x0300, 0x0600,0x0fc0,0x0000,0x0000,0x0000,0x0000, // u00bd 0x0000,0x0000,0x7800,0xcc00,0x0c00,0x3840,0x0cc0,0xcd80,0x7b00,0x0600,0x0cc0,0x19c0,0x33c0,0x66c0,0x4cc0,0x0fc0, 0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000, // u00be 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0c00,0x0c00,0x1800,0x3000,0x6000,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00bf 0x1800,0x0c00,0x0600,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c0 0x0300,0x0600,0x0c00,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c1 0x0e00,0x1b00,0x3180,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c2 0x1cc0,0x36c0,0x3380,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c3 0x3180,0x3180,0x3180,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c4 0x0e00,0x1b00,0x1b00,0x0e00,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c5 0x0000,0x0000,0x0000,0x3fe0,0x6600,0xc600,0xc600,0xc600,0xc600,0xffe0,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600, 0xc7e0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c6 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x60c0,0x60c0,0x3180, 0x1f00,0x0600,0x0600,0x0600,0x0c00,0x0000, // u00c7 0x1800,0x0c00,0x0600,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c8 0x0300,0x0600,0x0c00,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c9 0x0e00,0x1b00,0x3180,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ca 0x3180,0x3180,0x3180,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cb 0x3000,0x1800,0x0c00,0x0000,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cc 0x0300,0x0600,0x0c00,0x0000,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cd 0x0e00,0x1b00,0x3180,0x0000,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ce 0x3180,0x3180,0x3180,0x0000,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cf 0x0000,0x0000,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0xfcc0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x6180, 0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d0 0x1cc0,0x36c0,0x3380,0x0000,0x60c0,0x60c0,0x60c0,0x70c0,0x78c0,0x6cc0,0x66c0,0x63c0,0x61c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d1 0x1800,0x0c00,0x0600,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d2 0x0300,0x0600,0x0c00,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d3 0x0e00,0x1b00,0x3180,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d4 0x1cc0,0x36c0,0x3380,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d5 0x3180,0x3180,0x3180,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x3180,0x1b00,0x0e00,0x0e00,0x1b00,0x3180,0x60c0,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d7 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60e0,0x60c0,0x61c0,0x63c0,0x66c0,0x6cc0,0x78c0,0x70c0,0x60c0,0xe0c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d8 0x1800,0x0c00,0x0600,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d9 0x0300,0x0600,0x0c00,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00da 0x0e00,0x1b00,0x3180,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00db 0x3180,0x3180,0x3180,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00dc 0x0300,0x0600,0x0c00,0xc0c0,0xc0c0,0x6180,0x6180,0x3300,0x3300,0x1e00,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00dd 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x6180, 0x7f00,0x6000,0x6000,0x6000,0x6000,0x0000, // u00de 0x0000,0x0000,0x0000,0x3e00,0x6300,0x6180,0x6180,0x6180,0x6300,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x7180, 0x6f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00df 0x0000,0x0000,0x0000,0x1800,0x0c00,0x0600,0x0000,0x3f00,0x0180,0x00c0,0x00c0,0x3fc0,0x60c0,0x60c0,0x60c0,0x60c0, 0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e0 0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x0000,0x3f00,0x0180,0x00c0,0x00c0,0x3fc0,0x60c0,0x60c0,0x60c0,0x60c0, 0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e1 0x0000,0x0000,0x0000,0x0e00,0x1b00,0x3180,0x0000,0x3f00,0x0180,0x00c0,0x00c0,0x3fc0,0x60c0,0x60c0,0x60c0,0x60c0, 0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e2 0x0000,0x0000,0x0000,0x1cc0,0x36c0,0x3380,0x0000,0x3f00,0x0180,0x00c0,0x00c0,0x3fc0,0x60c0,0x60c0,0x60c0,0x60c0, 0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e3 0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x3f00,0x0180,0x00c0,0x00c0,0x3fc0,0x60c0,0x60c0,0x60c0,0x60c0, 0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e4 0x0000,0x0000,0x0000,0x0e00,0x1b00,0x1b00,0x0e00,0x3f00,0x0180,0x00c0,0x00c0,0x3fc0,0x60c0,0x60c0,0x60c0,0x60c0, 0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7b80,0x0cc0,0x0cc0,0x0cc0,0x7fc0,0xcc00,0xcc00,0xcc00,0xccc0, 0x7780,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x6000,0x6000,0x6000,0x6000,0x60c0,0x3180, 0x1f00,0x0600,0x0600,0x0600,0x0c00,0x0000, // u00e7 0x0000,0x0000,0x0000,0x1800,0x0c00,0x0600,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x7fc0,0x6000,0x6000,0x6000,0x30c0, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e8 0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x7fc0,0x6000,0x6000,0x6000,0x30c0, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e9 0x0000,0x0000,0x0000,0x0e00,0x1b00,0x3180,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x7fc0,0x6000,0x6000,0x6000,0x30c0, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ea 0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x7fc0,0x6000,0x6000,0x6000,0x30c0, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00eb 0x0000,0x0000,0x0000,0x1800,0x0c00,0x0600,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ec 0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ed 0x0000,0x0000,0x0000,0x0e00,0x1b00,0x3180,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ee 0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ef 0x0000,0x0000,0x0000,0x3600,0x1800,0x6c00,0x0600,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f0 0x0000,0x0000,0x0000,0x3980,0x6d80,0x6700,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f1 0x0000,0x0000,0x0000,0x1800,0x0c00,0x0600,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f2 0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f3 0x0000,0x0000,0x0000,0x0e00,0x1b00,0x3180,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f4 0x0000,0x0000,0x0000,0x1cc0,0x36c0,0x3380,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f5 0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0xffc0,0x0000,0x0000,0x0c00,0x0c00,0x0c00, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f60,0x31c0,0x61c0,0x63c0,0x66c0,0x6cc0,0x78c0,0x70c0,0x7180, 0xdf00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f8 0x0000,0x0000,0x0000,0x1800,0x0c00,0x0600,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f9 0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00fa 0x0000,0x0000,0x0000,0x0e00,0x1b00,0x3180,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00fb 0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00fc 0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x00c0,0x00c0,0x0180,0x3f00,0x0000, // u00fd 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x6180, 0x7f00,0x6000,0x6000,0x6000,0x6000,0x0000, // u00fe 0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x00c0,0x00c0,0x0180,0x3f00,0x0000, // u00ff 0x0000,0x3f80,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0100 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x3f00,0x0180,0x00c0,0x00c0,0x3fc0,0x60c0,0x60c0,0x60c0,0x60c0, 0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0101 0x3180,0x3180,0x1f00,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0102 0x0000,0x0000,0x0000,0x3180,0x3180,0x1f00,0x0000,0x3f00,0x0180,0x00c0,0x00c0,0x3fc0,0x60c0,0x60c0,0x60c0,0x60c0, 0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0103 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0180,0x0300,0x0300,0x01e0,0x0000, // u0104 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0180,0x00c0,0x00c0,0x3fc0,0x60c0,0x60c0,0x60c0,0x60c0, 0x3fc0,0x0180,0x0300,0x0300,0x01e0,0x0000, // u0105 0x0300,0x0600,0x0c00,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x6000,0x6000,0x6000,0x6000,0x6000,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0106 0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x0000,0x1f00,0x3180,0x60c0,0x6000,0x6000,0x6000,0x6000,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0107 0x0e00,0x1b00,0x3180,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x6000,0x6000,0x6000,0x6000,0x6000,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0108 0x0000,0x0000,0x0000,0x0e00,0x1b00,0x3180,0x0000,0x1f00,0x3180,0x60c0,0x6000,0x6000,0x6000,0x6000,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0109 0x0c00,0x0c00,0x0c00,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x6000,0x6000,0x6000,0x6000,0x6000,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u010a 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0000,0x1f00,0x3180,0x60c0,0x6000,0x6000,0x6000,0x6000,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u010b 0x3180,0x1b00,0x0e00,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x6000,0x6000,0x6000,0x6000,0x6000,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u010c 0x0000,0x0000,0x0000,0x3180,0x1b00,0x0e00,0x0000,0x1f00,0x3180,0x60c0,0x6000,0x6000,0x6000,0x6000,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u010d 0x3180,0x1b00,0x0e00,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x6180, 0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u010e 0x3180,0x1b00,0x0e00,0x00c0,0x00c0,0x00c0,0x00c0,0x1fc0,0x30c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u010f 0x0000,0x0000,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0xfcc0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x6180, 0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0110 0x0000,0x0000,0x0000,0x00c0,0x0fe0,0x00c0,0x00c0,0x1fc0,0x30c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0111 0x0000,0x3f80,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0112 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x7fc0,0x6000,0x6000,0x6000,0x30c0, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0113 0x3180,0x3180,0x1f00,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0114 0x0000,0x0000,0x0000,0x3180,0x3180,0x1f00,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x7fc0,0x6000,0x6000,0x6000,0x30c0, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0115 0x0c00,0x0c00,0x0c00,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0116 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x7fc0,0x6000,0x6000,0x6000,0x30c0, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0117 0x0000,0x0000,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x7fc0,0x0180,0x0300,0x0300,0x01e0,0x0000, // u0118 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x7fc0,0x6000,0x6000,0x6000,0x30c0, 0x1f80,0x0600,0x0c00,0x0c00,0x0780,0x0000, // u0119 0x3180,0x1b00,0x0e00,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u011a 0x0000,0x0000,0x0000,0x3180,0x1b00,0x0e00,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x7fc0,0x6000,0x6000,0x6000,0x30c0, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u011b 0x0e00,0x1b00,0x3180,0x0000,0x1f00,0x3180,0x61c0,0x6000,0x6000,0x6000,0x67c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u011c 0x0000,0x0000,0x0000,0x0e00,0x1b00,0x3180,0x0000,0x1fc0,0x30c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x00c0,0x00c0,0x0180,0x3f00,0x0000, // u011d 0x3180,0x3180,0x1f00,0x0000,0x1f00,0x3180,0x61c0,0x6000,0x6000,0x6000,0x67c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u011e 0x0000,0x0000,0x0000,0x3180,0x3180,0x1f00,0x0000,0x1fc0,0x30c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x00c0,0x00c0,0x0180,0x3f00,0x0000, // u011f 0x0c00,0x0c00,0x0c00,0x0000,0x1f00,0x3180,0x61c0,0x6000,0x6000,0x6000,0x67c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0120 0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0000,0x1fc0,0x30c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x00c0,0x00c0,0x0180,0x3f00,0x0000, // u0121 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x6000,0x6000,0x6000,0x67c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0600,0x0600,0x0600,0x0c00, // u0122 0x0000,0x0000,0x0300,0x0600,0x0600,0x0600,0x0000,0x1fc0,0x30c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x00c0,0x00c0,0x0180,0x3f00,0x0000, // u0123 0x0e00,0x1b00,0x3180,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0124 0x0700,0x0d80,0x18c0,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0125 0x0000,0x0000,0x0000,0x60c0,0x60c0,0xffe0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0126 0x0000,0x0000,0x0000,0x6000,0xfe00,0x6000,0x6000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0127 0x1cc0,0x36c0,0x3380,0x0000,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0128 0x0000,0x0000,0x0000,0x1cc0,0x36c0,0x3380,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0129 0x0000,0x3f80,0x0000,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u012a 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u012b 0x3180,0x3180,0x1f00,0x0000,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u012c 0x0000,0x0000,0x0000,0x3180,0x3180,0x1f00,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u012d 0x0000,0x0000,0x0000,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x3f00,0x0c00,0x1800,0x1800,0x0f00,0x0000, // u012e 0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x1f80,0x0600,0x0c00,0x0c00,0x0780,0x0000, // u012f 0x0c00,0x0c00,0x0c00,0x0000,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0130 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0131 0x0000,0x0000,0x0000,0xf1e0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x6cc0,0x6cc0,0x6cc0,0x6cc0, 0xf780,0x0000,0x0000,0x0000,0x0000,0x0000, // u0132 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x0000,0xe1c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0xf0c0,0x0cc0,0x0cc0,0x0cc0,0x0780,0x0000, // u0133 0x0380,0x06c0,0x0c60,0x0000,0x07e0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x6180,0x6180,0x6180,0x3300, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0134 0x0000,0x0000,0x0000,0x0380,0x06c0,0x0c60,0x0000,0x0780,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x3180,0x3180,0x3180,0x1f00,0x0000, // u0135 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7800,0x6c00,0x6600,0x6300,0x6180,0x60c0, 0x60c0,0x0000,0x0600,0x0600,0x0600,0x0c00, // u0136 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x30c0,0x3180,0x3300,0x3600,0x3c00,0x3c00,0x3600,0x3300,0x3180, 0x30c0,0x0000,0x0600,0x0600,0x0600,0x0c00, // u0137 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x3180,0x3300,0x3600,0x3c00,0x3c00,0x3600,0x3300,0x3180, 0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0138 0x1800,0x3000,0x6000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0139 0x0180,0x0300,0x0600,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u013a 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0600,0x0600,0x0600,0x0c00, // u013b 0x0000,0x0000,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x1f80,0x0000,0x0600,0x0600,0x0600,0x0c00, // u013c 0x3180,0x1b00,0x0e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u013d 0x3180,0x1b00,0x0e00,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u013e 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6300,0x6300,0x6300,0x6000,0x6000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u013f 0x0000,0x0000,0x0000,0x3c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c60,0x0c60,0x0c60,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0140 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3c00,0x3800,0x3000,0x7000,0xf000,0x3000,0x3000,0x3000,0x3000, 0x3fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0141 0x0000,0x0000,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0780,0x0700,0x0600,0x0e00,0x1e00,0x0600,0x0600,0x0600,0x0600, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0142 0x0300,0x0600,0x0c00,0x60c0,0x60c0,0x60c0,0x60c0,0x70c0,0x78c0,0x6cc0,0x66c0,0x63c0,0x61c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0143 0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0144 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x70c0,0x78c0,0x6cc0,0x66c0,0x63c0,0x61c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0600,0x0600,0x0600,0x0c00, // u0145 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0600,0x0600,0x0600,0x0c00, // u0146 0x3180,0x1b00,0x0e00,0x60c0,0x60c0,0x60c0,0x60c0,0x70c0,0x78c0,0x6cc0,0x66c0,0x63c0,0x61c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0147 0x0000,0x0000,0x0000,0x3180,0x1b00,0x0e00,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0148 0x0000,0x6000,0x6000,0x6000,0x6000,0xc000,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0149 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x70c0,0x78c0,0x6cc0,0x66c0,0x63c0,0x61c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x00c0,0x00c0,0x0180,0x0700,0x0000, // u014a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x00c0,0x00c0,0x0180,0x0700,0x0000, // u014b 0x0000,0x3f80,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u014c 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u014d 0x3180,0x3180,0x1f00,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u014e 0x0000,0x0000,0x0000,0x3180,0x3180,0x1f00,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u014f 0x0660,0x0cc0,0x1980,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0150 0x0000,0x0000,0x0000,0x0660,0x0cc0,0x1980,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0151 0x0000,0x0000,0x0000,0x3fe0,0x6600,0xc600,0xc600,0xc600,0xc600,0xc7e0,0xc600,0xc600,0xc600,0xc600,0xc600,0x6600, 0x3fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0152 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0xccc0,0xccc0,0xccc0,0xcfc0,0xcc00,0xcc00,0xcc00,0xccc0, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0153 0x0300,0x0600,0x0c00,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x6180,0x7f00,0x7800,0x6c00,0x6600,0x6300,0x6180, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0154 0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x0000,0x67c0,0x6c00,0x7800,0x7000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0155 0x0000,0x0000,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x6180,0x7f00,0x7800,0x6c00,0x6600,0x6300,0x6180, 0x60c0,0x0000,0x0600,0x0600,0x0600,0x0c00, // u0156 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x67c0,0x6c00,0x7800,0x7000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x0000,0x6000,0x6000,0x6000,0xc000, // u0157 0x3180,0x1b00,0x0e00,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x6180,0x7f00,0x7800,0x6c00,0x6600,0x6300,0x6180, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0158 0x0000,0x0000,0x0000,0x3180,0x1b00,0x0e00,0x0000,0x67c0,0x6c00,0x7800,0x7000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0159 0x0300,0x0600,0x0c00,0x0000,0x1f00,0x3180,0x60c0,0x6000,0x6000,0x3000,0x1f00,0x0180,0x00c0,0x00c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u015a 0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x0000,0x3f80,0x60c0,0x6000,0x6000,0x3f80,0x00c0,0x00c0,0x00c0,0x60c0, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u015b 0x0e00,0x1b00,0x3180,0x0000,0x1f00,0x3180,0x60c0,0x6000,0x6000,0x3000,0x1f00,0x0180,0x00c0,0x00c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u015c 0x0000,0x0000,0x0000,0x0e00,0x1b00,0x3180,0x0000,0x3f80,0x60c0,0x6000,0x6000,0x3f80,0x00c0,0x00c0,0x00c0,0x60c0, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u015d 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x6000,0x6000,0x3000,0x1f00,0x0180,0x00c0,0x00c0,0x00c0,0x60c0,0x3180, 0x1f00,0x0600,0x0600,0x0600,0x0c00,0x0000, // u015e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x60c0,0x6000,0x6000,0x3f80,0x00c0,0x00c0,0x00c0,0x60c0, 0x3f80,0x0600,0x0600,0x0600,0x0c00,0x0000, // u015f 0x3180,0x1b00,0x0e00,0x0000,0x1f00,0x3180,0x60c0,0x6000,0x6000,0x3000,0x1f00,0x0180,0x00c0,0x00c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0160 0x0000,0x0000,0x0000,0x3180,0x1b00,0x0e00,0x0000,0x3f80,0x60c0,0x6000,0x6000,0x3f80,0x00c0,0x00c0,0x00c0,0x60c0, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0161 0x0000,0x0000,0x0000,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0600,0x0600,0x0600,0x0c00,0x0000, // u0162 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x07c0,0x0300,0x0300,0x0300,0x0600,0x0000, // u0163 0x3180,0x1b00,0x0e00,0x0000,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0164 0x3300,0x1e00,0x0c00,0x0000,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x07c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0165 0x0000,0x0000,0x0000,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0166 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x07c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0167 0x1cc0,0x36c0,0x3380,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0168 0x0000,0x0000,0x0000,0x1cc0,0x36c0,0x3380,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0169 0x0000,0x3f80,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u016a 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u016b 0x3180,0x3180,0x1f00,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u016c 0x0000,0x0000,0x0000,0x3180,0x3180,0x1f00,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u016d 0x0e00,0x1b00,0x1b00,0x0e00,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u016e 0x0000,0x0000,0x0000,0x0e00,0x1b00,0x1b00,0x0e00,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u016f 0x0660,0x0cc0,0x1980,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0170 0x0000,0x0000,0x0000,0x0660,0x0cc0,0x1980,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0171 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0600,0x0c00,0x0c00,0x0780,0x0000, // u0172 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x0180,0x0300,0x0300,0x01e0,0x0000, // u0173 0x0e00,0x1b00,0x3180,0x0000,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0xccc0,0xdec0,0xf3c0,0xe1c0,0xc0c0, 0x8040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0174 0x0000,0x0000,0x0000,0x0e00,0x1b00,0x3180,0x0000,0xc0c0,0xc0c0,0xc0c0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0175 0x0e00,0x1b00,0x3180,0x0000,0xc0c0,0xc0c0,0x6180,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0176 0x0000,0x0000,0x0000,0x0e00,0x1b00,0x3180,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x00c0,0x00c0,0x0180,0x3f00,0x0000, // u0177 0x3180,0x3180,0x3180,0x0000,0xc0c0,0xc0c0,0x6180,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0178 0x0300,0x0600,0x0c00,0x0000,0x7fc0,0x00c0,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0179 0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x0000,0x7fc0,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u017a 0x0c00,0x0c00,0x0c00,0x0000,0x7fc0,0x00c0,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u017b 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0000,0x7fc0,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u017c 0x3180,0x1b00,0x0e00,0x0000,0x7fc0,0x00c0,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u017d 0x0000,0x0000,0x0000,0x3180,0x1b00,0x0e00,0x0000,0x7fc0,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u017e 0x0000,0x0000,0x0000,0x07c0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u017f 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0186 0x0000,0x0000,0x0000,0x7fc0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x1fc0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u018e 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x00c0,0x00c0,0x00c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u018f 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x6000,0x6000,0x3000,0x1e00,0x3000,0x6000,0x6000,0x6000,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0190 0x0000,0x0000,0x0000,0x0780,0x0cc0,0x0cc0,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0xcc00,0xcc00,0x7800,0x0000, // u0192 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x70c0,0x78c0,0x6cc0,0x66c0,0x63c0,0x61c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x6000,0x6000,0x6000,0xc000,0x0000, // u019d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x00c0,0x00c0,0x00c0,0x00c0,0x0000, // u019e 0x0000,0x0000,0x0000,0x7fc0,0x00c0,0x00c0,0x0180,0x0300,0x0600,0x7fc0,0x0c00,0x1800,0x3000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u01b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0180,0x0300,0x0600,0x7fc0,0x0c00,0x1800,0x3000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u01b6 0x0000,0x0000,0x0000,0x7fc0,0x00c0,0x0180,0x0300,0x0600,0x0f00,0x0180,0x00c0,0x00c0,0x00c0,0x00c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01b7 0x3180,0x1b00,0x0e00,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u01cd 0x0000,0x0000,0x0000,0x3180,0x1b00,0x0e00,0x0000,0x3f00,0x0180,0x00c0,0x00c0,0x3fc0,0x60c0,0x60c0,0x60c0,0x60c0, 0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u01ce 0x3180,0x1b00,0x0e00,0x0000,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01cf 0x0000,0x0000,0x0000,0x3180,0x1b00,0x0e00,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d0 0x3180,0x1b00,0x0e00,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d1 0x0000,0x0000,0x0000,0x3180,0x1b00,0x0e00,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d2 0x3180,0x1b00,0x0e00,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d3 0x0000,0x0000,0x0000,0x3180,0x1b00,0x0e00,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d4 0x0000,0x3fc0,0x0000,0x3fe0,0x6600,0xc600,0xc600,0xc600,0xc600,0xffe0,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600, 0xc7e0,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e2 0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x7b80,0x0cc0,0x0cc0,0x0cc0,0x7fc0,0xcc00,0xcc00,0xcc00,0xccc0, 0x7780,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e3 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x6000,0x6000,0x6000,0x67c0,0x60c0,0x60c0,0x67e0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x30c0,0x60c0,0x60c0,0x67e0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x00c0,0x00c0,0x0180,0x3f00,0x0000, // u01e5 0x3180,0x1b00,0x0e00,0x0000,0x1f00,0x3180,0x61c0,0x6000,0x6000,0x6000,0x67c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e6 0x0000,0x0000,0x0000,0x3180,0x1b00,0x0e00,0x0000,0x1fc0,0x30c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x00c0,0x00c0,0x0180,0x3f00,0x0000, // u01e7 0x3180,0x1b00,0x0e00,0x60c0,0x60c0,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7800,0x6c00,0x6600,0x6300,0x6180,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e8 0x18c0,0x0d80,0x0700,0x3000,0x3000,0x3000,0x3000,0x30c0,0x3180,0x3300,0x3600,0x3c00,0x3c00,0x3600,0x3300,0x3180, 0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e9 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0600,0x0c00,0x0c00,0x0780,0x0000, // u01ea 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0600,0x0c00,0x0c00,0x0780,0x0000, // u01eb 0x0000,0x3f80,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0600,0x0c00,0x0c00,0x0780,0x0000, // u01ec 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0600,0x0c00,0x0c00,0x0780,0x0000, // u01ed 0x3180,0x1b00,0x0e00,0x0000,0x7fc0,0x00c0,0x0180,0x0300,0x0600,0x0f00,0x0180,0x00c0,0x00c0,0x00c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01ee 0x0000,0x0000,0x0000,0x3180,0x1b00,0x0e00,0x0000,0x7fc0,0x00c0,0x0180,0x0300,0x0600,0x0f00,0x0180,0x00c0,0x00c0, 0x00c0,0x00c0,0x60c0,0x3180,0x1f00,0x0000, // u01ef 0x0000,0x0000,0x0000,0x0c60,0x06c0,0x0380,0x0000,0x0780,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x3180,0x3180,0x3180,0x1f00,0x0000, // u01f0 0x0300,0x0600,0x0c00,0x0000,0x1f00,0x3180,0x61c0,0x6000,0x6000,0x6000,0x67c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01f4 0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x1fc0,0x30c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x00c0,0x00c0,0x0180,0x3f00,0x0000, // u01f5 0x0180,0x0300,0x0600,0x0000,0x3fe0,0x6600,0xc600,0xc600,0xc600,0xc600,0xffe0,0xc600,0xc600,0xc600,0xc600,0xc600, 0xc7e0,0x0000,0x0000,0x0000,0x0000,0x0000, // u01fc 0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x0000,0x7b80,0x0cc0,0x0cc0,0x0cc0,0x7fc0,0xcc00,0xcc00,0xcc00,0xccc0, 0x7780,0x0000,0x0000,0x0000,0x0000,0x0000, // u01fd 0x0300,0x0600,0x0c00,0x0000,0x1f00,0x3180,0x60e0,0x61c0,0x63c0,0x66c0,0x6cc0,0x78c0,0x70c0,0x60c0,0xe0c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01fe 0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x0000,0x1f60,0x31c0,0x61c0,0x63c0,0x66c0,0x6cc0,0x78c0,0x70c0,0x7180, 0xdf00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01ff 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x6000,0x6000,0x3000,0x1f00,0x0180,0x00c0,0x00c0,0x00c0,0x60c0,0x3180, 0x1f00,0x0000,0x0600,0x0600,0x0600,0x0c00, // u0218 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x60c0,0x6000,0x6000,0x3f80,0x00c0,0x00c0,0x00c0,0x60c0, 0x3f80,0x0000,0x0600,0x0600,0x0600,0x0c00, // u0219 0x0000,0x0000,0x0000,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0c00,0x0c00,0x0c00,0x1800, // u021a 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x07c0,0x0000,0x0300,0x0300,0x0300,0x0600, // u021b 0x0000,0x3f80,0x0000,0xc0c0,0xc0c0,0x6180,0x6180,0x3300,0x3300,0x1e00,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0232 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x00c0,0x00c0,0x0180,0x3f00,0x0000, // u0233 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0780,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x3180,0x3180,0x3180,0x1f00,0x0000, // u0237 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x00c0,0x00c0,0x00c0,0x00c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0254 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x7fc0,0x00c0,0x00c0,0x00c0,0x6180, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0258 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x00c0,0x00c0,0x00c0,0x7fc0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0259 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x60c0,0x6000,0x6000,0x3e00,0x6000,0x6000,0x6000,0x60c0, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u025b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x6000,0x6000,0x6000,0xc000,0x0000, // u0272 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x00c0,0x0180,0x0300,0x0600,0x0f00,0x0180,0x00c0,0x00c0, 0x00c0,0x00c0,0x60c0,0x3180,0x1f00,0x0000, // u0292 0x0600,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bb 0x0c00,0x0c00,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bc 0x0c00,0x0c00,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bd 0x0e00,0x1b00,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02c6 0x3180,0x1b00,0x0e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02c7 0x3180,0x3180,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02d8 0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02d9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0600,0x0c00,0x0c00,0x0780,0x0000, // u02db 0x1cc0,0x36c0,0x3380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02dc 0x0660,0x0cc0,0x1980,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02dd 0x1800,0x0c00,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0300 0x0300,0x0600,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0301 0x0e00,0x1b00,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0302 0x1cc0,0x36c0,0x3380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0303 0x0000,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0304 0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0305 0x3180,0x3180,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0306 0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0307 0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0308 0x0e00,0x1b00,0x1b00,0x0e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030a 0x0660,0x0cc0,0x1980,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030b 0x3180,0x1b00,0x0e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0000, // u0329 0x3000,0x6000,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0384 0x0300,0x0600,0x0c00,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0385 0x3000,0x6000,0xc000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0386 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0387 0x3000,0x6000,0xc000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0388 0x3000,0x6000,0xc000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0389 0x3000,0x6000,0xc000,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u038a 0x3000,0x6000,0xc000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u038c 0x3000,0x6000,0xc000,0x0000,0xc0c0,0xc0c0,0x6180,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u038e 0x3000,0x6000,0xc000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180,0x1b00,0x1b00, 0x7bc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u038f 0x0300,0x0600,0x0c00,0x6300,0x6300,0x6300,0x0000,0x3c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0780,0x0000,0x0000,0x0000,0x0000,0x0000, // u0390 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0391 0x0000,0x0000,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x6180,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x6180, 0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0392 0x0000,0x0000,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0393 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x1e00,0x1e00,0x3300,0x3300,0x3300,0x6180,0x6180,0x6180,0xc0c0,0xc0c0, 0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0394 0x0000,0x0000,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0395 0x0000,0x0000,0x0000,0x7fc0,0x00c0,0x00c0,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0396 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0397 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x6ec0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0398 0x0000,0x0000,0x0000,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0399 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7800,0x6c00,0x6600,0x6300,0x6180,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u039a 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x1e00,0x1e00,0x3300,0x3300,0x3300,0x6180,0x6180,0x6180,0xc0c0,0xc0c0, 0xc0c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u039b 0x0000,0x0000,0x0000,0x8040,0xc0c0,0xe1c0,0xf3c0,0xdec0,0xccc0,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0xc0c0, 0xc0c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u039c 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x70c0,0x78c0,0x6cc0,0x66c0,0x63c0,0x61c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u039d 0x0000,0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u039e 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u039f 0x0000,0x0000,0x0000,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a0 0x0000,0x0000,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x6180,0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a1 0x0000,0x0000,0x0000,0x7fc0,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a3 0x0000,0x0000,0x0000,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a4 0x0000,0x0000,0x0000,0xc0c0,0xc0c0,0x6180,0x6180,0x3300,0x3300,0x1e00,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a5 0x0000,0x0000,0x0000,0x0c00,0x3f00,0x6d80,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0x6d80,0x3f00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a6 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x3180,0x3180,0x1b00,0x1b00,0x0e00,0x0e00,0x1b00,0x1b00,0x3180,0x3180,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a7 0x0000,0x0000,0x0000,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0x6d80,0x3f00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a8 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180,0x1b00,0x1b00, 0x7bc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a9 0x3180,0x3180,0x3180,0x0000,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03aa 0x3180,0x3180,0x3180,0x0000,0xc0c0,0xc0c0,0x6180,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ab 0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x0000,0x3cc0,0x6780,0xc300,0xc300,0xc300,0xc300,0xc300,0xc300,0x6780, 0x3cc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ac 0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x0000,0x3f80,0x60c0,0x6000,0x6000,0x3e00,0x6000,0x6000,0x6000,0x60c0, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ad 0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x00c0,0x00c0,0x00c0,0x00c0,0x0000, // u03ae 0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x0000,0x3c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0780,0x0000,0x0000,0x0000,0x0000,0x0000, // u03af 0x0300,0x0600,0x0c00,0x3180,0x3180,0x3180,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3cc0,0x6780,0xc300,0xc300,0xc300,0xc300,0xc300,0xc300,0x6780, 0x3cc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b1 0x0000,0x0000,0x0000,0x3e00,0x6300,0x6180,0x6180,0x6180,0x6300,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x6180, 0x7f00,0x6000,0x6000,0x6000,0x6000,0x0000, // u03b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc0c0,0xc0c0,0xc0c0,0x6180,0x6180,0x3300,0x3300,0x1e00,0x1e00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, // u03b3 0x0000,0x0000,0x0000,0x3f80,0x1800,0x0c00,0x0600,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x60c0,0x6000,0x6000,0x3e00,0x6000,0x6000,0x6000,0x60c0, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b5 0x0000,0x0000,0x0000,0x7fc0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x3000,0x6000,0x6000,0x6000,0x6000,0x3000, 0x1f80,0x00c0,0x00c0,0x00c0,0x0380,0x0000, // u03b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x00c0,0x00c0,0x00c0,0x00c0,0x0000, // u03b7 0x0000,0x0000,0x0000,0x1e00,0x3300,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0780,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x3180,0x3300,0x3600,0x3c00,0x3c00,0x3600,0x3300,0x3180, 0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ba 0x0000,0x0000,0x0000,0x1800,0x1800,0x0c00,0x0c00,0x0e00,0x0e00,0x1b00,0x1b00,0x3180,0x3180,0x3180,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x61c0,0x63c0, 0x7ec0,0x6000,0x6000,0x6000,0x6000,0x0000, // u03bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x3180,0x3180,0x3180,0x1b00,0x1b00,0x0e00, 0x0e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03bd 0x0000,0x0000,0x0000,0x1fc0,0x3000,0x6000,0x6000,0x6000,0x3000,0x1f80,0x3000,0x6000,0x6000,0x6000,0x6000,0x3000, 0x1f80,0x00c0,0x00c0,0x00c0,0x0380,0x0000, // u03be 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x6180, 0x7f00,0x6000,0x6000,0x6000,0x6000,0x0000, // u03c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x6000,0x6000,0x6000,0x6000,0x6000,0x3000, 0x1f80,0x00c0,0x00c0,0x00c0,0x0380,0x0000, // u03c2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fe0,0x3300,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0780,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6780,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0x6d80, 0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, // u03c6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x60c0,0x3180,0x3180,0x1b00,0x1b00,0x0e00,0x0e00,0x1b00, 0x1b00,0x3180,0x3180,0x60c0,0x60c0,0x0000, // u03c7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0x6d80, 0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, // u03c8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0xc0c0,0xc0c0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xdec0, 0x7380,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c9 0x0000,0x0000,0x0000,0x6300,0x6300,0x6300,0x0000,0x3c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0780,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ca 0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03cb 0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03cc 0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03cd 0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x0000,0x6180,0xc0c0,0xc0c0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xdec0, 0x7380,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ce 0x0000,0x0000,0x0000,0x0f00,0x1980,0x30c0,0x30c0,0x30c0,0x18c0,0x0fe0,0x00c0,0x70c0,0x30c0,0x30c0,0x30c0,0x1980, 0x0f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x3f00,0x6d80,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0x6d80, 0x3f00,0x0c00,0x0c00,0x0000,0x0000,0x0000, // u03d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf0c0,0x1980,0x0b00,0x0e00,0x0c00,0x0c00,0x1c00,0x3400,0x6600, 0xc3c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x6180, 0x7f00,0x6000,0x6000,0x3000,0x1f80,0x0000, // u03f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x6000,0x6000,0x6000,0x6000,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f2 0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0780,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x3180,0x3180,0x3180,0x1f00,0x0000, // u03f3 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3000,0x6000,0x6000,0x7f00,0x6000,0x6000,0x6000,0x3000, 0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0180,0x00c0,0x00c0,0x1fc0,0x00c0,0x00c0,0x00c0,0x0180, 0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f6 0x1800,0x0c00,0x0600,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0400 0x3180,0x3180,0x3180,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0401 0x0000,0x0000,0x0000,0xfc00,0x3000,0x3000,0x3000,0x3f00,0x3180,0x30c0,0x30c0,0x30c0,0x30c0,0x30c0,0x30c0,0x3180, 0x3300,0x0000,0x0000,0x0000,0x0000,0x0000, // u0402 0x0300,0x0600,0x0c00,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0403 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0404 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x6000,0x6000,0x3000,0x1f00,0x0180,0x00c0,0x00c0,0x00c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0405 0x0000,0x0000,0x0000,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0406 0x3180,0x3180,0x3180,0x0000,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0407 0x0000,0x0000,0x0000,0x07e0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x6180,0x6180,0x6180,0x3300, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0408 0x0000,0x0000,0x0000,0x3c00,0x6c00,0xcc00,0xcc00,0xcc00,0xcf80,0xccc0,0xcc60,0xcc60,0xcc60,0xcc60,0xcc60,0xccc0, 0xcf80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0409 0x0000,0x0000,0x0000,0xcc00,0xcc00,0xcc00,0xcc00,0xcc00,0xcf80,0xfcc0,0xcc60,0xcc60,0xcc60,0xcc60,0xcc60,0xccc0, 0xcf80,0x0000,0x0000,0x0000,0x0000,0x0000, // u040a 0x0000,0x0000,0x0000,0xfc00,0x3000,0x3000,0x3000,0x3f00,0x3180,0x30c0,0x30c0,0x30c0,0x30c0,0x30c0,0x30c0,0x30c0, 0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u040b 0x0300,0x0600,0x0c00,0x60c0,0x60c0,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7800,0x6c00,0x6600,0x6300,0x6180,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u040c 0x1800,0x0c00,0x0600,0x60c0,0x60c0,0x60c0,0x60c0,0x61c0,0x63c0,0x66c0,0x6cc0,0x78c0,0x70c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u040d 0x3180,0x3180,0x1f00,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0,0x1fc0,0x00c0,0x00c0,0x00c0,0x00c0,0x0180, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u040e 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x7fc0,0x0e00,0x0e00,0x0e00,0x0000,0x0000, // u040f 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0410 0x0000,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x6180, 0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0411 0x0000,0x0000,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x6180,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x6180, 0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0412 0x0000,0x0000,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0413 0x0000,0x0000,0x0000,0x0fc0,0x18c0,0x30c0,0x30c0,0x30c0,0x30c0,0x30c0,0x30c0,0x30c0,0x30c0,0x30c0,0x30c0,0x60c0, 0xffe0,0xc060,0xc060,0x0000,0x0000,0x0000, // u0414 0x0000,0x0000,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0415 0x0000,0x0000,0x0000,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0x6d80,0x3f00,0x3f00,0x6d80,0xccc0,0xccc0,0xccc0,0xccc0, 0xccc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0416 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x00c0,0x00c0,0x0180,0x0f00,0x0180,0x00c0,0x00c0,0x00c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0417 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x61c0,0x63c0,0x66c0,0x6cc0,0x78c0,0x70c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0418 0x3180,0x3180,0x1f00,0x60c0,0x60c0,0x60c0,0x60c0,0x61c0,0x63c0,0x66c0,0x6cc0,0x78c0,0x70c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0419 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7800,0x6c00,0x6600,0x6300,0x6180,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u041a 0x0000,0x0000,0x0000,0x0fc0,0x18c0,0x30c0,0x30c0,0x30c0,0x30c0,0x30c0,0x30c0,0x30c0,0x30c0,0x30c0,0x30c0,0x60c0, 0xc0c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u041b 0x0000,0x0000,0x0000,0x8040,0xc0c0,0xe1c0,0xf3c0,0xdec0,0xccc0,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0xc0c0, 0xc0c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u041c 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u041d 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u041e 0x0000,0x0000,0x0000,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u041f 0x0000,0x0000,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x6180,0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0420 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0421 0x0000,0x0000,0x0000,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0422 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0,0x1fc0,0x00c0,0x00c0,0x00c0,0x00c0,0x0180, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0423 0x0000,0x0000,0x0c00,0x3f00,0x6d80,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0x6d80, 0x3f00,0x0c00,0x0000,0x0000,0x0000,0x0000, // u0424 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x3180,0x3180,0x1b00,0x1b00,0x0e00,0x0e00,0x1b00,0x1b00,0x3180,0x3180,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0425 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fe0,0x0060,0x0060,0x0060,0x0000,0x0000, // u0426 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0,0x1fc0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0427 0x0000,0x0000,0x0000,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0x6cc0, 0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0428 0x0000,0x0000,0x0000,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0x6cc0, 0x3fe0,0x0060,0x0060,0x0060,0x0000,0x0000, // u0429 0x0000,0x0000,0x0000,0xe000,0xe000,0x6000,0x6000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x6180, 0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u042a 0x0000,0x0000,0x0000,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0xf8c0,0xccc0,0xc6c0,0xc6c0,0xc6c0,0xc6c0,0xc6c0,0xc6c0,0xccc0, 0xf8c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u042b 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x6180, 0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u042c 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x00c0,0x00c0,0x00c0,0x0fc0,0x00c0,0x00c0,0x00c0,0x00c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u042d 0x0000,0x0000,0x0000,0xc780,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xfcc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0, 0xc780,0x0000,0x0000,0x0000,0x0000,0x0000, // u042e 0x0000,0x0000,0x0000,0x1fc0,0x30c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0,0x1fc0,0x03c0,0x06c0,0x0cc0,0x18c0,0x30c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u042f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0180,0x00c0,0x00c0,0x3fc0,0x60c0,0x60c0,0x60c0,0x60c0, 0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0430 0x0000,0x0000,0x0000,0x1f80,0x3000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x6180, 0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0431 0x0000,0x0000,0x0000,0x3e00,0x6300,0x6180,0x6180,0x6180,0x6300,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x6180, 0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0432 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0433 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x30c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x00c0,0x00c0,0x0180,0x3f00,0x0000, // u0434 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x7fc0,0x6000,0x6000,0x6000,0x30c0, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0435 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xccc0,0xccc0,0xccc0,0x6d80,0x3f00,0x3f00,0x6d80,0xccc0,0xccc0, 0xccc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0436 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x60c0,0x00c0,0x00c0,0x0f80,0x00c0,0x00c0,0x00c0,0x60c0, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0437 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0438 0x0000,0x0000,0x0000,0x3180,0x3180,0x1f00,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0439 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x3180,0x3300,0x3600,0x3c00,0x3c00,0x3600,0x3300,0x3180, 0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u043a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x18c0,0x30c0,0x30c0,0x30c0,0x30c0,0x30c0,0x30c0,0x30c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u043b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8040,0xc0c0,0xe1c0,0xf3c0,0xdec0,0xccc0,0xc0c0,0xc0c0,0xc0c0, 0xc0c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u043c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u043d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u043e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u043f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x6180, 0x7f00,0x6000,0x6000,0x6000,0x6000,0x0000, // u0440 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x6000,0x6000,0x6000,0x6000,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0441 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0442 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x00c0,0x00c0,0x0180,0x3f00,0x0000, // u0443 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x3f00,0x6d80,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0x6d80, 0x3f00,0x0c00,0x0c00,0x0000,0x0000,0x0000, // u0444 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x60c0,0x3180,0x1b00,0x0e00,0x0e00,0x1b00,0x3180,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0445 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fe0,0x0060,0x0060,0x0060,0x0000,0x0000, // u0446 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0,0x1fc0,0x00c0,0x00c0,0x00c0, 0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0447 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0x6cc0, 0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0448 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0x6cc0, 0x3fe0,0x0060,0x0060,0x0060,0x0000,0x0000, // u0449 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x7000,0x3000,0x3f00,0x3180,0x30c0,0x30c0,0x30c0,0x3180, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u044a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc0c0,0xc0c0,0xc0c0,0xf8c0,0xccc0,0xc6c0,0xc6c0,0xc6c0,0xccc0, 0xf8c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u044b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3f00,0x3180,0x30c0,0x30c0,0x30c0,0x3180, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u044c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x00c0,0x0fc0,0x00c0,0x00c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u044d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc780,0xccc0,0xccc0,0xccc0,0xfcc0,0xccc0,0xccc0,0xccc0,0xccc0, 0xc780,0x0000,0x0000,0x0000,0x0000,0x0000, // u044e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x60c0,0x60c0,0x60c0,0x60c0,0x3fc0,0x06c0,0x0cc0,0x18c0, 0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u044f 0x0000,0x0000,0x0000,0x1800,0x0c00,0x0600,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x7fc0,0x6000,0x6000,0x6000,0x30c0, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0450 0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x7fc0,0x6000,0x6000,0x6000,0x30c0, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0451 0x0000,0x0000,0x0000,0x6000,0xfe00,0x6000,0x6000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x00c0,0x00c0,0x0180,0x0700,0x0000, // u0452 0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0453 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x6000,0x7e00,0x6000,0x6000,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0454 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x60c0,0x6000,0x6000,0x3f80,0x00c0,0x00c0,0x00c0,0x60c0, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0455 0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0456 0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0457 0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0780,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x3180,0x3180,0x3180,0x1f00,0x0000, // u0458 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x6c00,0xcc00,0xcf80,0xccc0,0xcc60,0xcc60,0xcc60,0xccc0, 0xcf80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0459 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xcc00,0xcc00,0xcc00,0xcf80,0xfcc0,0xcc60,0xcc60,0xcc60,0xccc0, 0xcf80,0x0000,0x0000,0x0000,0x0000,0x0000, // u045a 0x0000,0x0000,0x0000,0x6000,0xfe00,0x6000,0x6000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u045b 0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x30c0,0x3180,0x3300,0x3600,0x3c00,0x3c00,0x3600,0x3300,0x3180, 0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u045c 0x0000,0x0000,0x0000,0x1800,0x0c00,0x0600,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u045d 0x0000,0x0000,0x0000,0x3180,0x3180,0x1f00,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x00c0,0x00c0,0x0180,0x3f00,0x0000, // u045e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x7fc0,0x0e00,0x0e00,0x0e00,0x0000,0x0000, // u045f 0x0000,0x0000,0x0000,0x6000,0x6000,0xfe00,0x6000,0x6000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x6180, 0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0462 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0xfe00,0x3000,0x3000,0x3000,0x3f00,0x3180,0x30c0,0x30c0,0x30c0,0x3180, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0463 0x0000,0x0000,0x0000,0xffc0,0xc0c0,0x6180,0x6180,0x3300,0x3300,0x1e00,0x3f00,0x6d80,0xccc0,0xccc0,0xccc0,0xccc0, 0xccc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u046a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xc0c0,0x6180,0x3300,0x1e00,0x3f00,0x6d80,0xccc0,0xccc0, 0xccc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u046b 0x00c0,0x00c0,0x00c0,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0490 0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0491 0x0000,0x0000,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0xfe00,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0492 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0xfe00,0x6000,0x6000,0x6000, 0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0493 0x0000,0x0000,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x00c0,0x0180,0x0300,0x0000,0x0000, // u0494 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6300,0x6180,0x6180, 0x6180,0x0180,0x0300,0x0600,0x0000,0x0000, // u0495 0x0000,0x0000,0x0000,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0x6d80,0x3f00,0x3f00,0x6d80,0xccc0,0xccc0,0xccc0,0xccc0, 0xcce0,0x0060,0x0060,0x0060,0x0000,0x0000, // u0496 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xccc0,0xccc0,0xccc0,0x6d80,0x3f00,0x3f00,0x6d80,0xccc0,0xccc0, 0xcce0,0x0060,0x0060,0x0060,0x0000,0x0000, // u0497 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x00c0,0x00c0,0x0180,0x0f00,0x0180,0x00c0,0x00c0,0x00c0,0x60c0,0x3180, 0x1f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, // u0498 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x60c0,0x00c0,0x00c0,0x0f80,0x00c0,0x00c0,0x00c0,0x60c0, 0x3f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, // u0499 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7800,0x6c00,0x6600,0x6300,0x6180,0x60c0, 0x60e0,0x0060,0x0060,0x0060,0x0000,0x0000, // u049a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x3180,0x3300,0x3600,0x3c00,0x3c00,0x3600,0x3300,0x3180, 0x30e0,0x0060,0x0060,0x0060,0x0000,0x0000, // u049b 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x6180,0x6b00,0x6e00,0x6c00,0x7800,0x7800,0x6c00,0x6e00,0x6b00,0x6180,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u049c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x3580,0x3700,0x3600,0x3c00,0x3c00,0x3600,0x3700,0x3580, 0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u049d 0x0000,0x0000,0x0000,0xe0c0,0xe0c0,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7800,0x6c00,0x6600,0x6300,0x6180,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x70c0,0x7180,0x3300,0x3600,0x3c00,0x3c00,0x3600,0x3300,0x3180, 0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a1 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60e0,0x0060,0x0060,0x0060,0x0000,0x0000, // u04a2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60e0,0x0060,0x0060,0x0060,0x0000,0x0000, // u04a3 0x0000,0x0000,0x0000,0x63e0,0x6300,0x6300,0x6300,0x6300,0x6300,0x7f00,0x6300,0x6300,0x6300,0x6300,0x6300,0x6300, 0x6300,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x63e0,0x6300,0x6300,0x6300,0x7f00,0x6300,0x6300,0x6300,0x6300, 0x6300,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a5 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x60c0,0x60c0,0x3180, 0x1f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, // u04aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x6000,0x6000,0x6000,0x6000,0x60c0,0x3180, 0x1f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, // u04ab 0x0000,0x0000,0x0000,0xc0c0,0xc0c0,0x6180,0x6180,0x3300,0x3300,0x1e00,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc0c0,0xc0c0,0xc0c0,0x6180,0x6180,0x3300,0x3300,0x1e00,0x1e00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, // u04af 0x0000,0x0000,0x0000,0xc0c0,0xc0c0,0x6180,0x6180,0x3300,0x3300,0x1e00,0x1e00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc0c0,0xc0c0,0xc0c0,0x6180,0x6180,0x3300,0x3300,0x1e00,0x1e00, 0x0c00,0x7f80,0x0c00,0x0c00,0x0c00,0x0000, // u04b1 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x3180,0x3180,0x1b00,0x1b00,0x0e00,0x0e00,0x1b00,0x1b00,0x3180,0x3180,0x60c0, 0x60e0,0x0060,0x0060,0x0060,0x0000,0x0000, // u04b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x60c0,0x3180,0x1b00,0x0e00,0x0e00,0x1b00,0x3180,0x60c0, 0x60e0,0x0060,0x0060,0x0060,0x0000,0x0000, // u04b3 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0,0x1fc0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00e0,0x0060,0x0060,0x0060,0x0000,0x0000, // u04b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0,0x1fc0,0x00c0,0x00c0,0x00c0, 0x00e0,0x0060,0x0060,0x0060,0x0000,0x0000, // u04b7 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x66c0,0x66c0,0x36c0,0x1fc0,0x06c0,0x06c0,0x06c0,0x00c0,0x00c0, 0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x60c0,0x66c0,0x66c0,0x36c0,0x1fc0,0x06c0,0x06c0,0x00c0, 0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04b9 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04bb 0x0000,0x0000,0x0000,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04c0 0x3180,0x3180,0x1f00,0x0000,0xccc0,0xccc0,0xccc0,0xccc0,0x6d80,0x3f00,0x3f00,0x6d80,0xccc0,0xccc0,0xccc0,0xccc0, 0xccc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04c1 0x0000,0x0000,0x0000,0x3180,0x3180,0x1f00,0x0000,0xccc0,0xccc0,0xccc0,0x6d80,0x3f00,0x3f00,0x6d80,0xccc0,0xccc0, 0xccc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04c2 0x0000,0x0000,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04cf 0x3180,0x3180,0x1f00,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d0 0x0000,0x0000,0x0000,0x3180,0x3180,0x1f00,0x0000,0x3f00,0x0180,0x00c0,0x00c0,0x3fc0,0x60c0,0x60c0,0x60c0,0x60c0, 0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d1 0x3180,0x3180,0x3180,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d2 0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x3f00,0x0180,0x00c0,0x00c0,0x3fc0,0x60c0,0x60c0,0x60c0,0x60c0, 0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d3 0x0000,0x0000,0x0000,0x3fe0,0x6600,0xc600,0xc600,0xc600,0xc600,0xffe0,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600, 0xc7e0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7b80,0x0cc0,0x0cc0,0x0cc0,0x7fc0,0xcc00,0xcc00,0xcc00,0xccc0, 0x7780,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d5 0x3180,0x3180,0x1f00,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d6 0x0000,0x0000,0x0000,0x3180,0x3180,0x1f00,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x7fc0,0x6000,0x6000,0x6000,0x30c0, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d7 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x00c0,0x00c0,0x00c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x00c0,0x00c0,0x00c0,0x7fc0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d9 0x3180,0x3180,0x3180,0x0000,0x1f00,0x3180,0x60c0,0x00c0,0x00c0,0x00c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04da 0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x3f00,0x6180,0x00c0,0x00c0,0x00c0,0x7fc0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04db 0x3180,0x3180,0x3180,0x0000,0xccc0,0xccc0,0xccc0,0xccc0,0x6d80,0x3f00,0x3f00,0x6d80,0xccc0,0xccc0,0xccc0,0xccc0, 0xccc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04dc 0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0xccc0,0xccc0,0xccc0,0x6d80,0x3f00,0x3f00,0x6d80,0xccc0,0xccc0, 0xccc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04dd 0x3180,0x3180,0x3180,0x0000,0x1f00,0x3180,0x60c0,0x00c0,0x00c0,0x0180,0x0f00,0x0180,0x00c0,0x00c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04de 0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x3f80,0x60c0,0x00c0,0x00c0,0x0f80,0x00c0,0x00c0,0x00c0,0x60c0, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04df 0x0000,0x3f80,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x61c0,0x63c0,0x66c0,0x6cc0,0x78c0,0x70c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e2 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e3 0x3180,0x3180,0x3180,0x0000,0x60c0,0x60c0,0x60c0,0x61c0,0x63c0,0x66c0,0x6cc0,0x78c0,0x70c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e4 0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e5 0x3180,0x3180,0x3180,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e6 0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e7 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e9 0x3180,0x3180,0x3180,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ea 0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04eb 0x3180,0x3180,0x3180,0x0000,0x1f00,0x3180,0x60c0,0x00c0,0x00c0,0x00c0,0x0fc0,0x00c0,0x00c0,0x00c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ec 0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x1f00,0x3180,0x60c0,0x00c0,0x0fc0,0x00c0,0x00c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ed 0x0000,0x3f80,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0,0x1fc0,0x00c0,0x00c0,0x00c0,0x00c0,0x0180, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ee 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x00c0,0x00c0,0x0180,0x3f00,0x0000, // u04ef 0x3180,0x3180,0x3180,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0,0x1fc0,0x00c0,0x00c0,0x00c0,0x0180, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f0 0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x00c0,0x00c0,0x0180,0x3f00,0x0000, // u04f1 0x0660,0x0cc0,0x1980,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0,0x1fc0,0x00c0,0x00c0,0x00c0,0x0180, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f2 0x0000,0x0000,0x0000,0x0660,0x0cc0,0x1980,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x00c0,0x00c0,0x0180,0x3f00,0x0000, // u04f3 0x3180,0x3180,0x3180,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0,0x1fc0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f4 0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0,0x1fc0,0x00c0,0x00c0,0x00c0, 0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f5 0x6300,0x6300,0x6300,0x0000,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0xf8c0,0xccc0,0xc6c0,0xc6c0,0xc6c0,0xc6c0,0xc6c0,0xccc0, 0xf8c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f8 0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0xc0c0,0xc0c0,0xc0c0,0xf8c0,0xccc0,0xc6c0,0xc6c0,0xc6c0,0xccc0, 0xf8c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f9 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x30c0,0x30c0,0x18c0,0x18c0,0x3d80,0x6f00,0xc600,0xc600,0xc300,0xc300,0xc180, 0xc180,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d0 0x0000,0x0000,0x0000,0xfe00,0x0300,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0xffe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d1 0x0000,0x0000,0x0000,0x7c00,0x0600,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0700,0x0f00,0x1980,0x3180,0x60c0, 0xc0c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d2 0x0000,0x0000,0x0000,0xffe0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d3 0x0000,0x0000,0x0000,0x7f00,0x0180,0x00c0,0x00c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d4 0x0000,0x0000,0x0000,0x3800,0x0c00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d5 0x0000,0x0000,0x0000,0x7f80,0x0300,0x0600,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d6 0x0000,0x0000,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d7 0x0000,0x0000,0x0000,0x6700,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d8 0x0000,0x0000,0x0000,0x3800,0x0c00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d9 0x0000,0x0000,0x0000,0x7f00,0x0180,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x0000, // u05da 0x0000,0x0000,0x0000,0x7f00,0x0180,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x0180, 0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u05db 0x6000,0x6000,0x6000,0x7fc0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x1800,0x1800, 0x1800,0x0000,0x0000,0x0000,0x0000,0x0000, // u05dc 0x0000,0x0000,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u05dd 0x0000,0x0000,0x0000,0xdf00,0xf180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x63c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u05de 0x0000,0x0000,0x0000,0x7c00,0x0600,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0000, // u05df 0x0000,0x0000,0x0000,0x3e00,0x0300,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e0 0x0000,0x0000,0x0000,0xff00,0xc180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e1 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x30c0,0x30c0,0x30c0,0x18c0,0x1980,0x0d80,0x0d80,0x0700,0x0e00,0x1c00, 0x7000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e2 0x0000,0x0000,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x30c0,0x1cc0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x0000, // u05e3 0x0000,0x0000,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x30c0,0x1cc0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x0180, 0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e4 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x30c0,0x30c0,0x1980,0x1b00,0x0e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, // u05e5 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x30c0,0x30c0,0x1980,0x1b00,0x0e00,0x0c00,0x0600,0x0600,0x0300,0x0300,0x0180, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e6 0x0000,0x0000,0x0000,0x7fc0,0x00c0,0x00c0,0x00c0,0x60c0,0x60c0,0x6180,0x6300,0x6600,0x6600,0x6600,0x6600,0x6600, 0x6600,0x6000,0x6000,0x6000,0x6000,0x0000, // u05e7 0x0000,0x0000,0x0000,0x7f00,0x0180,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e8 0x0000,0x0000,0x0000,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6c60,0x7860,0x6060,0x6060,0x6060,0x60c0, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e9 0x0000,0x0000,0x0000,0xff00,0xc180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0xe0c0, 0xc0c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u05ea 0x0000,0x0000,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x6180, 0x7f00,0x0000,0x0c00,0x0c00,0x0c00,0x0000, // u1e0c 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x00c0,0x1fc0,0x30c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x0000,0x0600,0x0600,0x0600,0x0000, // u1e0d 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7800,0x6c00,0x6600,0x6300,0x6180,0x60c0, 0x60c0,0x0000,0x3f80,0x0000,0x0000,0x0000, // u1e34 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x30c0,0x3180,0x3300,0x3600,0x3c00,0x3c00,0x3600,0x3300,0x3180, 0x30c0,0x0000,0x1f80,0x0000,0x0000,0x0000, // u1e35 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0c00,0x0c00,0x0c00,0x0000, // u1e36 0x0000,0x0000,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x1f80,0x0000,0x0c00,0x0c00,0x0c00,0x0000, // u1e37 0x0c00,0x0c00,0x0c00,0x8040,0xc0c0,0xe1c0,0xf3c0,0xdec0,0xccc0,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0xc0c0, 0xc0c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e40 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0000,0xff00,0xcd80,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0, 0xccc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e41 0x0000,0x0000,0x0000,0x8040,0xc0c0,0xe1c0,0xf3c0,0xdec0,0xccc0,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0xc0c0, 0xc0c0,0x0000,0x0c00,0x0c00,0x0c00,0x0000, // u1e42 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xcd80,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0, 0xccc0,0x0000,0x0c00,0x0c00,0x0c00,0x0000, // u1e43 0x0c00,0x0c00,0x0c00,0x60c0,0x60c0,0x60c0,0x60c0,0x70c0,0x78c0,0x6cc0,0x66c0,0x63c0,0x61c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e44 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e45 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x70c0,0x78c0,0x6cc0,0x66c0,0x63c0,0x61c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0c00,0x0c00,0x0c00,0x0000, // u1e46 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0c00,0x0c00,0x0c00,0x0000, // u1e47 0x0000,0x0000,0x0000,0xffc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0c00,0x0c00,0x0c00,0x0000, // u1e6c 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x07c0,0x0000,0x0300,0x0300,0x0300,0x0000, // u1e6d 0x0000,0x0000,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0c00,0x0c00,0x0c00,0x0000, // u1eb8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x7fc0,0x6000,0x6000,0x6000,0x30c0, 0x1f80,0x0000,0x0c00,0x0c00,0x0c00,0x0000, // u1eb9 0x1cc0,0x36c0,0x3380,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6000,0x6000,0x6000,0x6000,0x6000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u1ebc 0x0000,0x0000,0x0000,0x1cc0,0x36c0,0x3380,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x7fc0,0x6000,0x6000,0x6000,0x30c0, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u1ebd 0x0000,0x0000,0x0000,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x3f00,0x0000,0x0c00,0x0c00,0x0c00,0x0000, // u1eca 0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x1f80,0x0000,0x0600,0x0600,0x0600,0x0000, // u1ecb 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0c00,0x0c00,0x0c00,0x0000, // u1ecc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0c00,0x0c00,0x0c00,0x0000, // u1ecd 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0c00,0x0c00,0x0c00,0x0000, // u1ee4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x0000,0x0600,0x0600,0x0600,0x0000, // u1ee5 0x3980,0x6d80,0x6700,0x0000,0xc0c0,0xc0c0,0x6180,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u1ef8 0x0000,0x0000,0x0000,0x1cc0,0x36c0,0x3380,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x30c0, 0x1fc0,0x00c0,0x00c0,0x0180,0x3f00,0x0000, // u1ef9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2001 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2002 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2003 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2004 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2005 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2006 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2007 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2008 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2009 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2010 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2011 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2012 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2013 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2014 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2015 0x0000,0x0000,0x0000,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00, 0x1b00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2016 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x7fc0,0x0000,0x0000,0x7fc0, // u2017 0x0000,0x0300,0x0600,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2018 0x0000,0x0600,0x0600,0x0600,0x0600,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2019 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00, 0x0c00,0x1800,0x0000,0x0000,0x0000,0x0000, // u201a 0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201b 0x0000,0x0cc0,0x1980,0x1980,0x1980,0x1980,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201c 0x0000,0x1980,0x1980,0x1980,0x1980,0x3300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1980,0x1980,0x1980, 0x1980,0x3300,0x0000,0x0000,0x0000,0x0000, // u201e 0x0000,0x3300,0x3300,0x3300,0x3300,0x1980,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201f 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2020 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2021 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x1f00,0x1f00,0x1f00,0x0e00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2022 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xccc0,0xccc0, 0xccc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2026 0x0000,0x0000,0x0000,0x7300,0xdb00,0xde00,0x7600,0x0c00,0x0c00,0x1800,0x1800,0x3000,0x3000,0x7dc0,0x7760,0xf760, 0xddc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2030 0x0000,0x0600,0x0600,0x0600,0x0600,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2032 0x0000,0x1980,0x1980,0x1980,0x1980,0x1100,0x1100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2033 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x1800,0x3000,0x3000,0x1800,0x0c00,0x0600, 0x0300,0x0000,0x0000,0x0000,0x0000,0x0000, // u2039 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0300,0x0600,0x0c00,0x1800, 0x3000,0x0000,0x0000,0x0000,0x0000,0x0000, // u203a 0x0000,0x0000,0x0000,0x3300,0x3300,0x3300,0x3300,0x3300,0x3300,0x3300,0x3300,0x3300,0x0000,0x0000,0x3300,0x3300, 0x3300,0x0000,0x0000,0x0000,0x0000,0x0000, // u203c 0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u203e 0x0000,0x1e00,0x3300,0x3300,0x3300,0x3300,0x3300,0x3300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2070 0x0c00,0x0c00,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2071 0x0000,0x0300,0x0700,0x0f00,0x1b00,0x3300,0x3f00,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2074 0x0000,0x3f00,0x3000,0x3000,0x3e00,0x0300,0x0300,0x3300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2075 0x0000,0x1e00,0x3000,0x3000,0x3e00,0x3300,0x3300,0x3300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2076 0x0000,0x3f00,0x0300,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2077 0x0000,0x1e00,0x3300,0x3300,0x1e00,0x3300,0x3300,0x3300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2078 0x0000,0x1e00,0x3300,0x3300,0x3300,0x1f00,0x0300,0x0300,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2079 0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207a 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207b 0x0000,0x0000,0x0000,0x3f80,0x0000,0x0000,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207c 0x0000,0x0600,0x0c00,0x1800,0x1800,0x1800,0x1800,0x0c00,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207d 0x0000,0x1800,0x0c00,0x0600,0x0600,0x0600,0x0600,0x0c00,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207e 0x0000,0x0000,0x3f00,0x3180,0x3180,0x3180,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x3300,0x3300,0x3300, 0x3300,0x3300,0x1e00,0x0000,0x0000,0x0000, // u2080 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x1c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x1e00,0x0000,0x0000,0x0000, // u2081 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x3300,0x0300,0x0600, 0x0c00,0x1800,0x3f00,0x0000,0x0000,0x0000, // u2082 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x0300,0x0e00,0x0300, 0x0300,0x3300,0x1e00,0x0000,0x0000,0x0000, // u2083 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0700,0x0f00,0x1b00,0x3300, 0x3f00,0x0300,0x0300,0x0000,0x0000,0x0000, // u2084 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x3000,0x3000,0x3e00,0x0300, 0x0300,0x3300,0x1e00,0x0000,0x0000,0x0000, // u2085 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3000,0x3000,0x3e00,0x3300, 0x3300,0x3300,0x1e00,0x0000,0x0000,0x0000, // u2086 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0300,0x0300,0x0600,0x0600, 0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000, // u2087 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x3300,0x1e00,0x3300, 0x3300,0x3300,0x1e00,0x0000,0x0000,0x0000, // u2088 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x3300,0x3300,0x1f00, 0x0300,0x0300,0x1e00,0x0000,0x0000,0x0000, // u2089 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x7f80, 0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000, // u208a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u208b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x0000, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u208c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0c00,0x1800,0x1800,0x1800, 0x1800,0x0c00,0x0600,0x0000,0x0000,0x0000, // u208d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x0c00,0x0600,0x0600,0x0600, 0x0600,0x0c00,0x1800,0x0000,0x0000,0x0000, // u208e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x0180,0x1f80,0x3180, 0x3180,0x3180,0x1f80,0x0000,0x0000,0x0000, // u2090 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x3180,0x3f80, 0x3000,0x3000,0x1f00,0x0000,0x0000,0x0000, // u2091 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x3180,0x3180, 0x3180,0x3180,0x1f00,0x0000,0x0000,0x0000, // u2092 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x1b00,0x0e00, 0x1b00,0x3180,0x3180,0x0000,0x0000,0x0000, // u2093 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x0180,0x0180,0x3f80, 0x3180,0x3180,0x1f00,0x0000,0x0000,0x0000, // u2094 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3f00,0x3180,0x3180,0x3180, 0x3180,0x3180,0x3180,0x0000,0x0000,0x0000, // u2095 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3180,0x3300,0x3600,0x3c00, 0x3600,0x3300,0x3180,0x0000,0x0000,0x0000, // u2096 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x1e00,0x0000,0x0000,0x0000, // u2097 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x6d80,0x6d80,0x6d80, 0x6d80,0x6d80,0x6d80,0x0000,0x0000,0x0000, // u2098 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x3180,0x3180,0x3180, 0x3180,0x3180,0x3f00,0x3000,0x3000,0x3000, // u209a 0x0000,0x0000,0x0000,0xf800,0xcc00,0xc600,0xc600,0xc600,0xc600,0xcc00,0xfb00,0xc300,0xcfc0,0xc300,0xc300,0xc300, 0xc1c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u20a7 0x0000,0x0000,0x0000,0xf840,0x8440,0x8240,0x8240,0x9240,0x9240,0x9240,0x9240,0x9240,0x9240,0x9040,0x9040,0x9080, 0x9f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u20aa 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x6000,0x6000,0xfe00,0x6000,0x6000,0xfe00,0x6000,0x6000,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u20ac 0x0000,0x0000,0x0000,0xffc0,0x0c00,0x0c00,0x0c00,0x0f80,0x0e00,0x1c00,0x7f80,0x0e00,0x1c00,0x7c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u20ae 0x0000,0x0000,0x0000,0x1e00,0x3100,0x5080,0x5080,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5080,0x5080,0x3100, 0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2102 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u210e 0x0000,0x0000,0x0000,0x6000,0xfe00,0x6000,0x6000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u210f 0x0000,0x0000,0x0000,0x4080,0x4080,0x4080,0x6080,0x5080,0x6880,0x5480,0x4a80,0x4580,0x4280,0x4180,0x4080,0x4080, 0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u2115 0x0000,0x0000,0x0000,0xcc00,0xccc0,0xcd20,0xcd20,0xecc0,0xec00,0xfc00,0xfc00,0xdc00,0xdde0,0xcc00,0xcde0,0xcc00, 0xcc00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2116 0x0000,0x0000,0x0000,0x1e00,0x3100,0x5080,0x5080,0x5080,0x5080,0x5080,0x5080,0x5080,0x5080,0x5080,0x5480,0x3300, 0x1f00,0x0080,0x0040,0x0000,0x0000,0x0000, // u211a 0x0000,0x0000,0x0000,0x7e00,0x5100,0x5080,0x5080,0x5080,0x5080,0x5100,0x5e00,0x5400,0x5a00,0x5500,0x5280,0x5140, 0x70c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u211d 0x0000,0x0000,0x0000,0xfe20,0x3360,0x33e0,0x3360,0x3360,0x3360,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2122 0x0000,0x0000,0x0000,0x7f80,0x0080,0x0080,0x0180,0x0280,0x0500,0x0a00,0x1400,0x2800,0x5000,0x6000,0x4000,0x4000, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u2124 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180,0x1b00,0x1b00, 0x7bc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2126 0x0000,0x0000,0x0000,0x6300,0x6300,0x3180,0x3180,0x18c0,0x1860,0x3cc0,0x6d80,0xc700,0xc600,0xc300,0xc300,0x6180, 0x3180,0x0000,0x0000,0x0000,0x0000,0x0000, // u2135 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x3000,0x6000,0xffc0,0xffc0,0x6000,0x3000,0x1000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2190 0x0000,0x0000,0x0000,0x0c00,0x1e00,0x3f00,0x6d80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2191 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0200,0x0300,0x0180,0xffc0,0xffc0,0x0180,0x0300,0x0200,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2192 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x6d80,0x3f00,0x1e00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2193 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1100,0x3180,0x60c0,0xffe0,0xffe0,0x60c0,0x3180,0x1100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2194 0x0000,0x0000,0x0000,0x0c00,0x1e00,0x3f00,0x6d80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x6d80,0x3f00,0x1e00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2195 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x10c0,0x30c0,0x60c0,0xffc0,0xffc0,0x60c0,0x30c0,0x10c0,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc200,0xc300,0xc180,0xffc0,0xffc0,0xc180,0xc300,0xc200,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a6 0x0000,0x0000,0x0000,0x0c00,0x1e00,0x3f00,0x6d80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x6d80,0x3f00,0x1e00,0x0c00, 0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a8 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x10c0,0x30c0,0x60c0,0xffc0,0xffc0,0x6000,0x3000, 0x1000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21b5 0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0x3800,0x6880,0xc8c0,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0x6180,0x3f00,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x3000,0x6000,0xffc0,0xffc0,0x0000,0xffc0,0xffc0,0x0180,0x0300,0x0200, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21cb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0200,0x0300,0x0180,0xffc0,0xffc0,0x0000,0xffc0,0xffc0,0x6000,0x3000,0x1000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21cc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1800,0x3fc0,0x7fc0,0xe000,0x7fc0,0x3fc0,0x1800,0x0800,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d0 0x0000,0x0000,0x0000,0x0400,0x0e00,0x1f00,0x3b80,0x7bc0,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00, 0x1b00,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0600,0xff00,0xff80,0x01c0,0xff80,0xff00,0x0600,0x0400,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d2 0x0000,0x0000,0x0000,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x7bc0,0x3b80,0x1f00,0x0e00, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1100,0x3180,0x7fc0,0xffe0,0xe0e0,0xffe0,0x7fc0,0x3180,0x1100,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d4 0x0000,0x0000,0x0000,0x0400,0x0e00,0x1f00,0x3b80,0x7bc0,0x1b00,0x1b00,0x1b00,0x1b00,0x7bc0,0x3b80,0x1f00,0x0e00, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d5 0x0000,0x0000,0x0000,0xc0c0,0xc0c0,0xc0c0,0x6180,0x7f80,0x6180,0x3300,0x3300,0x3300,0x1200,0x1e00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2200 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x7fc0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2203 0x0000,0x0000,0x00c0,0x00c0,0x7fc0,0x01c0,0x03c0,0x03c0,0x06c0,0x06c0,0x7fc0,0x0cc0,0x0cc0,0x18c0,0x18c0,0x30c0, 0x7fc0,0x6000,0x6000,0x0000,0x0000,0x0000, // u2204 0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x0180,0x1f00,0x3380,0x66c0,0x66c0,0x6cc0,0x6cc0,0x3980,0x1f00,0x3000, 0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2205 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x1e00,0x1e00,0x3300,0x3300,0x3300,0x6180,0x6180,0x6180,0xc0c0,0xc0c0, 0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2206 0x0000,0x0000,0x0000,0xffc0,0xc0c0,0xc0c0,0x6180,0x6180,0x6180,0x3300,0x3300,0x3300,0x1e00,0x1e00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2207 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x1800,0x3000,0x6000,0x6000,0x6000,0x7fc0,0x6000,0x6000,0x6000,0x3000,0x1800, 0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2208 0x0000,0x0000,0x00c0,0x00c0,0x0fc0,0x1980,0x3180,0x6300,0x6300,0x6600,0x7fc0,0x6600,0x6c00,0x6c00,0x3800,0x1800, 0x3fc0,0x3000,0x3000,0x0000,0x0000,0x0000, // u2209 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3000,0x6000,0x6000,0x7fc0,0x6000,0x6000,0x3000,0x1fc0,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u220a 0x0000,0x0000,0x0000,0x0000,0x7e00,0x0300,0x0180,0x00c0,0x00c0,0x00c0,0x7fc0,0x00c0,0x00c0,0x00c0,0x0180,0x0300, 0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u220b 0x0000,0x0000,0x6000,0x6000,0x7e00,0x3300,0x3180,0x18c0,0x18c0,0x0cc0,0x7fc0,0x0cc0,0x06c0,0x06c0,0x0380,0x0300, 0x7f80,0x0180,0x0180,0x0000,0x0000,0x0000, // u220c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0180,0x00c0,0x00c0,0x7fc0,0x00c0,0x00c0,0x0180,0x7f00,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u220d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2212 0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2213 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0xffc0,0x0c00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2214 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0xc000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2215 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180,0x00c0,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2216 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x1e00,0x1e00,0x0c00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2219 0x0000,0x01c0,0x01c0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x6180,0x6180,0x6180,0x3180,0x1980,0x0d80,0x0780, 0x0380,0x0000,0x0000,0x0000,0x0000,0x0000, // u221a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0xccc0,0xccc0,0xccc0,0xccc0,0xccc0,0x7f80,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u221e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u221f 0x0000,0x0000,0x0000,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00, 0x1b00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2225 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x1e00,0x1e00,0x3300,0x3300,0x6180,0x6180,0xc0c0, 0xc0c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2227 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc0c0,0xc0c0,0x6180,0x6180,0x3300,0x3300,0x1e00,0x1e00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2228 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2229 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u222a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x38c0,0x6ec0,0x6380,0x0000,0x38c0,0x6ec0,0x6380,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2248 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x7fc0,0x0300,0x0600,0x0c00,0x1800,0x7fc0,0x6000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2260 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0000,0x7fc0,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2261 0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180,0x0000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2264 0x0000,0x0000,0x0000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x0000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2265 0x0000,0x0000,0x0000,0x0000,0x0660,0x0cc0,0x1980,0x3300,0x6600,0xcc00,0xcc00,0x6600,0x3300,0x1980,0x0cc0,0x0660, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u226a 0x0000,0x0000,0x0000,0x0000,0xcc00,0x6600,0x3300,0x1980,0x0cc0,0x0660,0x0660,0x0cc0,0x1980,0x3300,0x6600,0xcc00, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u226b 0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3000,0x6000,0xc000,0xc000,0xc000,0xc000,0x6000,0x3000,0x1fc0,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2282 0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0300,0x0180,0x00c0,0x00c0,0x00c0,0x00c0,0x0180,0x0300,0xfe00,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2283 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3000,0x6000,0xc000,0xc000,0xc000,0xc000,0x6000,0x3000,0x1fc0,0x0000,0x0000, 0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2286 0x0000,0x0000,0x0000,0x0000,0xfe00,0x0300,0x0180,0x00c0,0x00c0,0x00c0,0x00c0,0x0180,0x0300,0xfe00,0x0000,0x0000, 0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2287 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u22a5 0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u22c2 0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u22c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x0180,0x1f00,0x3380,0x66c0,0x66c0,0x6cc0,0x6cc0,0x3980,0x1f00,0x3000, 0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2300 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x1e00,0x3300,0x6180,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0xc0c0, 0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2302 0x0000,0x0000,0x0000,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, 0x1800,0x0000,0x0000,0x0000,0x0000,0x0000, // u2308 0x0000,0x0000,0x0000,0x1f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0000,0x0000,0x0000,0x0000,0x0000, // u2309 0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u230a 0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u230b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2310 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2319 0x0000,0x0000,0x0000,0x0780,0x0cc0,0x0cc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2320 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xcc00,0xcc00, 0x7800,0x0000,0x0000,0x0000,0x0000,0x0000, // u2321 0x0180,0x0300,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x1800,0x3000,0x3000,0x3000,0x3000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, // u239b 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, // u239c 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x3000,0x3000,0x3000,0x3000,0x1800,0x1800, 0x1800,0x0c00,0x0c00,0x0600,0x0300,0x0180, // u239d 0x6000,0x3000,0x1800,0x0c00,0x0c00,0x0600,0x0600,0x0600,0x0300,0x0300,0x0300,0x0300,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u239e 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u239f 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0300,0x0300,0x0300,0x0300,0x0600,0x0600, 0x0600,0x0c00,0x0c00,0x1800,0x3000,0x6000, // u23a0 0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, // u23a1 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, // u23a2 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80, // u23a3 0x7f80,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u23a4 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u23a5 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x7f80, // u23a6 0x03c0,0x0e00,0x0c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u23a7 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x3000,0xe000,0xe000,0x3000,0x1800,0x1800,0x1800, 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u23a8 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, 0x1800,0x1800,0x1800,0x0c00,0x0e00,0x03c0, // u23a9 0xf000,0x1c00,0x0c00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u23ab 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0300,0x01c0,0x01c0,0x0300,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u23ac 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0c00,0x1c00,0xf000, // u23ad 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u23ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xffe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23af 0xffe0,0xffe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23ba 0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xffe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0, 0xffe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u23bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0xffe0,0xffe0, // u23bd 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u23d0 0x0000,0x0000,0x6600,0x6600,0x6600,0x7e00,0x6600,0x6600,0x6600,0x0000,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0000,0x0000,0x0000,0x0000,0x0000, // u2409 0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7e00,0x0000,0x0fc0,0x0c00,0x0c00,0x0f00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u240a 0x0000,0x0000,0xcc00,0xcc00,0xcc00,0xcc00,0xcc00,0x7800,0x3000,0x0000,0x1f80,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u240b 0x0000,0x0000,0x7e00,0x6000,0x6000,0x7800,0x6000,0x6000,0x6000,0x0000,0x0fc0,0x0c00,0x0c00,0x0f00,0x0c00,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u240c 0x0000,0x0000,0x3c00,0x6600,0x6000,0x6000,0x6000,0x6600,0x3c00,0x0000,0x0f80,0x0cc0,0x0cc0,0x0f80,0x0f00,0x0d80, 0x0cc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u240d 0x0000,0x0000,0x6600,0x6600,0x7600,0x7e00,0x6e00,0x6600,0x6600,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2424 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xffe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2500 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xffe0,0xffe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2501 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2502 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, // u2503 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xd6c0,0xd6c0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2508 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xd6c0,0xd6c0,0xd6c0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2509 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, // u250a 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0000,0x0e00,0x0e00,0x0e00,0x0e00,0x0000,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, 0x0000,0x0e00,0x0e00,0x0e00,0x0e00,0x0000, // u250b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0x0fe0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u250c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0x0fe0,0x0fe0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u250d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0x0fe0,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, // u250e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0x0fe0,0x0fe0,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, // u250f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2510 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2511 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xfe00,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, // u2512 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xfe00,0xfe00,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, // u2513 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2514 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fe0,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2515 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2516 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0fe0,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2517 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2518 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2519 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0xfe00,0xfe00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u251a 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0xfe00,0xfe00,0xfe00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u251b 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fe0,0x0fe0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u251c 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fe0,0x0fe0,0x0fe0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u251d 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0fe0,0x0fe0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u251e 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fe0,0x0fe0,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, // u251f 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0fe0,0x0fe0,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, // u2520 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0fe0,0x0fe0,0x0fe0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2521 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fe0,0x0fe0,0x0fe0,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, // u2522 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0fe0,0x0fe0,0x0fe0,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, // u2523 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2524 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2525 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0xfe00,0xfe00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2526 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfe00,0xfe00,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, // u2527 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0xfe00,0xfe00,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, // u2528 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0xfe00,0xfe00,0xfe00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2529 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfe00,0xfe00,0xfe00,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, // u252a 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0xfe00,0xfe00,0xfe00,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, // u252b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xffe0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u252c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xffe0,0xffe0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u252d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0xffe0,0xffe0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u252e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xffe0,0xffe0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u252f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xffe0,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, // u2530 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xffe0,0xffe0,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, // u2531 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0xffe0,0xffe0,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, // u2532 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xffe0,0xffe0,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, // u2533 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffe0,0xffe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2534 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xffe0,0xffe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2535 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fe0,0xffe0,0xffe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2536 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffe0,0xffe0,0xffe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2537 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0xffe0,0xffe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2538 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0xfe00,0xffe0,0xffe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2539 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0fe0,0xffe0,0xffe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u253a 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0xffe0,0xffe0,0xffe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u253b 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffe0,0xffe0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u253c 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xffe0,0xffe0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u253d 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fe0,0xffe0,0xffe0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u253e 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffe0,0xffe0,0xffe0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u253f 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0xffe0,0xffe0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2540 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffe0,0xffe0,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, // u2541 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0xffe0,0xffe0,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, // u2542 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0xfe00,0xffe0,0xffe0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2543 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0fe0,0xffe0,0xffe0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2544 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xffe0,0xffe0,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, // u2545 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fe0,0xffe0,0xffe0,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, // u2546 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0xffe0,0xffe0,0xffe0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2547 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffe0,0xffe0,0xffe0,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, // u2548 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0xfe00,0xffe0,0xffe0,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, // u2549 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0fe0,0xffe0,0xffe0,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, // u254a 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0xffe0,0xffe0,0xffe0,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, // u254b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xffe0,0x0000,0xffe0,0xffe0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2550 0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00, 0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00, // u2551 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0x0fe0,0x0c00,0x0fe0,0x0fe0,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2552 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fe0,0x1fe0,0x1b00,0x1b00,0x1b00,0x1b00, 0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00, // u2553 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fe0,0x1fe0,0x1800,0x1be0,0x1be0,0x1b00,0x1b00,0x1b00, 0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00, // u2554 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0x0c00,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2555 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x1b00,0x1b00,0x1b00,0x1b00, 0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00, // u2556 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x0300,0xfb00,0xfb00,0x1b00,0x1b00,0x1b00, 0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00, // u2557 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fe0,0x0fe0,0x0c00,0x0fe0,0x0fe0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2558 0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1fe0,0x1fe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2559 0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1be0,0x1be0,0x1800,0x1fe0,0x1fe0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255a 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0x0400,0xfc00,0xfc00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255b 0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0xff00,0xff00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255c 0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0xfb00,0xfb00,0x0300,0xff00,0xff00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255d 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fe0,0x0fe0,0x0c00,0x0fe0,0x0fe0,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u255e 0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1fe0,0x1fe0,0x1b00,0x1b00,0x1b00,0x1b00, 0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00, // u255f 0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1be0,0x1be0,0x1800,0x1be0,0x1be0,0x1b00,0x1b00,0x1b00, 0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00, // u2560 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xfc00,0xfc00,0x0c00,0xfc00,0xfc00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2561 0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0xff00,0xff00,0x1b00,0x1b00,0x1b00,0x1b00, 0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00, // u2562 0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0xfb00,0xfb00,0x0300,0xfb00,0xfb00,0x1b00,0x1b00,0x1b00, 0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00, // u2563 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xffe0,0x0000,0xffe0,0xffe0,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2564 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xffe0,0x1b00,0x1b00,0x1b00,0x1b00, 0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00, // u2565 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xffe0,0x0000,0xfbe0,0xfbe0,0x1b00,0x1b00,0x1b00, 0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00, // u2566 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffe0,0xffe0,0x0000,0xffe0,0xffe0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2567 0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0xffe0,0xffe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2568 0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0xfbe0,0xfbe0,0x0000,0xffe0,0xffe0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2569 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0xffe0,0xffe0,0x0c00,0xffe0,0xffe0,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u256a 0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0xffe0,0xffe0,0x1b00,0x1b00,0x1b00,0x1b00, 0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00, // u256b 0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0xfbe0,0xfbe0,0x0000,0xfbe0,0xfbe0,0x1b00,0x1b00,0x1b00, 0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00, // u256c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00e0,0x03e0,0x0700,0x0600,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u256d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0x3800,0x1800,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u256e 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1800,0x3800,0xf000,0xc000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u256f 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0600,0x0700,0x03e0,0x00e0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2570 0x0020,0x0020,0x0060,0x0040,0x00c0,0x0080,0x0180,0x0100,0x0300,0x0200,0x0600,0x0400,0x0c00,0x0800,0x1800,0x1000, 0x3000,0x2000,0x6000,0x4000,0xc000,0x8000, // u2571 0x8000,0xc000,0x4000,0x6000,0x2000,0x3000,0x1000,0x1800,0x0800,0x0c00,0x0400,0x0600,0x0200,0x0300,0x0100,0x0180, 0x0080,0x00c0,0x0040,0x0060,0x0020,0x0020, // u2572 0x8020,0xc020,0x4060,0x6040,0x20c0,0x3080,0x1180,0x1900,0x0b00,0x0e00,0x0600,0x0600,0x0e00,0x0b00,0x1900,0x1180, 0x3080,0x20c0,0x6040,0x4060,0xc020,0x8020, // u2573 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2574 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2575 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2576 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u2577 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2578 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2579 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, // u257b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0xffe0,0xffe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257c 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, // u257d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xffe0,0xffe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257e 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u257f 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2580 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0xffe0,0xffe0,0xffe0, // u2581 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, // u2582 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xffe0, 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, // u2583 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, // u2584 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, // u2585 0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, // u2586 0x0000,0x0000,0x0000,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, // u2587 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, // u2588 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, // u2589 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u258a 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, // u258b 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, // u258c 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, // u258d 0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000, 0xe000,0xe000,0xe000,0xe000,0xe000,0xe000, // u258e 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, // u258f 0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0, 0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0, // u2590 0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000, 0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000, // u2591 0xaaa0,0x5540,0xaaa0,0x5540,0xaaa0,0x5540,0xaaa0,0x5540,0xaaa0,0x5540,0xaaa0,0x5540,0xaaa0,0x5540,0xaaa0,0x5540, 0xaaa0,0x5540,0xaaa0,0x5540,0xaaa0,0x5540, // u2592 0xffe0,0xaaa0,0xffe0,0xaaa0,0xffe0,0xaaa0,0xffe0,0xaaa0,0xffe0,0xaaa0,0xffe0,0xaaa0,0xffe0,0xaaa0,0xffe0,0xaaa0, 0xffe0,0xaaa0,0xffe0,0xaaa0,0xffe0,0xaaa0, // u2593 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0xf800,0xf800,0xf800, 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, // u2596 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0, 0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0, // u2597 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2598 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, // u2599 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0, 0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0, // u259a 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xf800,0xf800,0xf800,0xf800,0xf800, 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, // u259b 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0, 0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0, // u259c 0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u259d 0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0xf800,0xf800,0xf800,0xf800,0xf800, 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, // u259e 0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, // u259f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x3f80,0x3f80,0x3f80,0x3f80,0x3f80,0x3f80,0x3f80,0x3f80,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ac 0x0000,0x0000,0x0000,0x7fc0,0x7fc0,0x7fc0,0x7fc0,0x7fc0,0x7fc0,0x7fc0,0x7fc0,0x7fc0,0x7fc0,0x7fc0,0x7fc0,0x7fc0, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0e00,0x0e00,0x1f00,0x1f00,0x3f80,0x3f80,0x7fc0,0x7fc0,0xffe0,0xffe0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25b2 0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xffc0,0xffe0,0xffc0,0xff00,0xfc00,0xf000,0xc000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25b6 0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xffc0,0xffe0,0xffc0,0xff00,0xfc00,0xf000,0xc000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ba 0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xffe0,0x7fc0,0x7fc0,0x3f80,0x3f80,0x1f00,0x1f00,0x0e00,0x0e00,0x0400, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x01e0,0x07e0,0x1fe0,0x7fe0,0xffe0,0x7fe0,0x1fe0,0x07e0,0x01e0,0x0060, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25c0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x01e0,0x07e0,0x1fe0,0x7fe0,0xffe0,0x7fe0,0x1fe0,0x07e0,0x01e0,0x0060, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25c4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x1e00,0x3f00,0x7f80,0xffc0,0xffc0,0x7f80,0x3f00,0x1e00,0x0c00,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25c6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x1e00,0x3300,0x6180,0xc0c0,0xc0c0,0x6180,0x3300,0x1e00,0x0c00,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ca 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x1b00,0x1100,0x1b00,0x0e00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25cb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x1f00,0x1f00,0x1f00,0x0e00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25cf 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xf1e0,0xe0e0,0xe0e0,0xe0e0,0xf1e0,0xffe0,0xffe0,0xffe0, 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, // u25d8 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xf1e0,0xe4e0,0xeee0,0xe4e0,0xf1e0,0xffe0,0xffe0,0xffe0, 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, // u25d9 0x0000,0x0000,0x0000,0x3f80,0x60c0,0xc060,0xdb60,0xdb60,0xc060,0xc060,0xc060,0xdf60,0xce60,0xc060,0xc060,0x60c0, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u263a 0x0000,0x0000,0x0000,0x3f80,0x7fc0,0xffe0,0xe4e0,0xe4e0,0xffe0,0xffe0,0xffe0,0xe0e0,0xf1e0,0xffe0,0xffe0,0x7fc0, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u263b 0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0xccc0,0x6d80,0x3f00,0x1e00,0xf3c0,0x1e00,0x3f00,0x6d80,0xccc0,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u263c 0x0000,0x0000,0x0000,0x3f00,0x6180,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0xc0c0,0x6180,0x3f00,0x0c00,0x0c00,0xffc0,0x0c00, 0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2640 0x0000,0x0000,0x0000,0x0fc0,0x01c0,0x0340,0x0640,0x0c40,0x3e00,0x6300,0xc180,0xc180,0xc180,0xc180,0xc180,0x6300, 0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2642 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x1e00,0x3f00,0x7f80,0xffc0,0xffc0,0xffc0,0xffc0,0x6d80,0x0c00,0x0c00, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2660 0x0000,0x0000,0x0000,0x1e00,0x3f00,0x3f00,0x1e00,0x0c00,0x0c00,0x6d80,0xffc0,0xffc0,0xffc0,0x6d80,0x0c00,0x0c00, 0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2663 0x0000,0x0000,0x0000,0x0000,0x0000,0x7380,0xf3c0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0x7f80,0x3f00,0x1e00,0x0c00, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2665 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x1e00,0x3f00,0x7f80,0xffc0,0xffc0,0x7f80,0x3f00,0x1e00,0x0c00,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2666 0x0000,0x0000,0x0000,0x3fc0,0x30c0,0x30c0,0x30c0,0x3fc0,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0xf000, 0xe000,0x0000,0x0000,0x0000,0x0000,0x0000, // u266a 0x0000,0x0000,0x0000,0x7fc0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x6180, 0xc000,0x0000,0x0000,0x0000,0x0000,0x0000, // u266b 0x0000,0x0000,0x0000,0x0060,0x0060,0x00c0,0x00c0,0x0180,0x0180,0xc300,0xc300,0x6600,0x6600,0x3c00,0x3c00,0x1800, 0x1800,0x0000,0x0000,0x0000,0x0000,0x0000, // u2713 0x0000,0x0000,0x0000,0x00e0,0x00e0,0x01c0,0x01c0,0x0380,0x0380,0xe700,0xe700,0x7e00,0x7e00,0x3c00,0x3c00,0x1800, 0x1800,0x0000,0x0000,0x0000,0x0000,0x0000, // u2714 0x0000,0x0000,0x0000,0x0180,0x0180,0x6300,0x3300,0x1e00,0x0e00,0x0e00,0x0f00,0x1980,0x18c0,0x3000,0x3000,0x6000, 0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2717 0x0000,0x0000,0x0000,0x0380,0xe380,0x7700,0x3f00,0x1e00,0x0e00,0x1f00,0x1f80,0x39c0,0x38c0,0x7000,0x7000,0xe000, 0xe000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2718 0x0000,0x0000,0x0000,0x0300,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x0c00,0x0c00,0x0600,0x0600,0x0300, 0x0300,0x0000,0x0000,0x0000,0x0000,0x0000, // u27e8 0x0000,0x0000,0x0000,0x1800,0x1800,0x0c00,0x0c00,0x0600,0x0600,0x0300,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x1800, 0x1800,0x0000,0x0000,0x0000,0x0000,0x0000, // u27e9 0x0000,0x0000,0x0000,0x0cc0,0x0cc0,0x1980,0x1980,0x3300,0x3300,0x6600,0x6600,0x3300,0x3300,0x1980,0x1980,0x0cc0, 0x0cc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u27ea 0x0000,0x0000,0x0000,0x6600,0x6600,0x3300,0x3300,0x1980,0x1980,0x0cc0,0x0cc0,0x1980,0x1980,0x3300,0x3300,0x6600, 0x6600,0x0000,0x0000,0x0000,0x0000,0x0000, // u27eb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2800 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2801 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2802 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2803 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2804 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2805 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2806 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2807 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2808 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2809 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280a 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280b 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280c 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280d 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280e 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2810 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2811 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2812 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2813 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2814 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2815 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2816 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2817 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2818 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2819 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281a 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281b 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281c 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281d 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281e 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2820 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2821 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2822 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2823 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2824 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2825 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2826 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2827 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2828 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2829 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282a 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282b 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282c 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282d 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282e 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2830 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2831 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2832 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2833 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2834 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2835 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2836 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2837 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2838 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2839 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283a 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283b 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283c 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283d 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283e 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2840 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2841 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2842 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2843 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2844 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2845 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2846 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2847 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2848 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2849 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u284a 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u284b 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u284c 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u284d 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u284e 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u284f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2850 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2851 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2852 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2853 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2854 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2855 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2856 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2857 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2858 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2859 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u285a 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u285b 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u285c 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u285d 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u285e 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u285f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2860 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2861 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2862 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2863 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2864 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2865 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2866 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2867 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2868 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2869 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u286a 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u286b 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u286c 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u286d 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u286e 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u286f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2870 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2871 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2872 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2873 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2874 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2875 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2876 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2877 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2878 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2879 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u287a 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u287b 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u287c 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u287d 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u287e 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u287f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u2880 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u2881 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u2882 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u2883 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u2884 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u2885 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u2886 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u2887 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u2888 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u2889 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u288a 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u288b 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u288c 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u288d 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u288e 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u288f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u2890 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u2891 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u2892 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u2893 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u2894 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u2895 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u2896 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u2897 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u2898 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u2899 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u289a 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u289b 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u289c 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u289d 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u289e 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u289f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28a0 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28a1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28a2 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28a4 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28a5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28a6 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28a7 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28a8 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28a9 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28aa 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28ab 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28ac 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28ad 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28ae 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28af 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28b0 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28b1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28b2 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28b4 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28b6 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28b7 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28b8 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28b9 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28ba 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28bb 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28bc 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28bd 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28be 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u28bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28c0 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28c2 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28c4 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28c6 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28c7 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28c8 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28c9 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28ca 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28cb 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28cc 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28cd 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28ce 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28cf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28d0 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28d2 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28d4 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28d6 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28d7 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28d8 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28d9 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28da 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28db 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28dc 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28dd 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28de 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28df 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28e0 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28e1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28e2 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28e3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28e4 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28e6 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28e7 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28e8 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28e9 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28ea 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28eb 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28ec 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28ed 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28ee 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28ef 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28f0 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28f2 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28f3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28f4 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28f6 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28f7 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28f8 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28f9 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28fa 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28fb 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28fc 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28fd 0x0000,0x0180,0x0180,0x0180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28fe 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000, 0x0000,0x3180,0x3180,0x3180,0x0000,0x0000, // u28ff 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0,0x0000,0x0000,0x0000,0x0000,0x60c0,0x60c0,0x60c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2e2c 0xc000,0xc000,0xc300,0xc780,0xcfc0,0xdb60,0xc300,0xc300,0xc300,0xc300,0xc600,0x8c00,0x1800,0x3000,0x6000,0xc000, 0xc000,0xc000,0xc000,0xc000,0xc000,0xc000, // ue0a0 0x0000,0x0000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xfe00,0x0000,0x0000,0x18c0,0x18c0,0x1cc0,0x1ec0, 0x1bc0,0x19c0,0x18c0,0x18c0,0x0000,0x0000, // ue0a1 0x0000,0x0000,0x3f00,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0xffc0,0xffc0,0xffc0,0xf3c0,0xe1c0,0xe1c0,0xf3c0, 0xffc0,0xffc0,0xffc0,0x0000,0x0000,0x0000, // ue0a2 0x8000,0xc000,0xe000,0xf000,0xf800,0xfc00,0xfe00,0xff00,0xff80,0xffc0,0xffe0,0xffe0,0xffc0,0xff80,0xff00,0xfe00, 0xfc00,0xf800,0xf000,0xe000,0xc000,0x8000, // ue0b0 0x8000,0xc000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180,0x00c0,0x0060,0x0060,0x00c0,0x0180,0x0300,0x0600, 0x0c00,0x1800,0x3000,0x6000,0xc000,0x8000, // ue0b1 0x0020,0x0060,0x00e0,0x01e0,0x03e0,0x07e0,0x0fe0,0x1fe0,0x3fe0,0x7fe0,0xffe0,0xffe0,0x7fe0,0x3fe0,0x1fe0,0x0fe0, 0x07e0,0x03e0,0x01e0,0x00e0,0x0060,0x0020, // ue0b2 0x0020,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0xc000,0xc000,0x6000,0x3000,0x1800,0x0c00, 0x0600,0x0300,0x0180,0x00c0,0x0060,0x0020, // ue0b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0780,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x3180,0x3180,0x3180,0x1f00,0x0000, // uf6be 0x0000,0x0000,0x0000,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000 // ufffd }; // codepoints array constexpr std::array fixedfont_codepoints = { 0x0000,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e, 0x002f,0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e, 0x003f,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e, 0x004f,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e, 0x005f,0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e, 0x006f,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e, 0x00a0,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af, 0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf, 0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf, 0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df, 0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef, 0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff, 0x0100,0x0101,0x0102,0x0103,0x0104,0x0105,0x0106,0x0107,0x0108,0x0109,0x010a,0x010b,0x010c,0x010d,0x010e,0x010f, 0x0110,0x0111,0x0112,0x0113,0x0114,0x0115,0x0116,0x0117,0x0118,0x0119,0x011a,0x011b,0x011c,0x011d,0x011e,0x011f, 0x0120,0x0121,0x0122,0x0123,0x0124,0x0125,0x0126,0x0127,0x0128,0x0129,0x012a,0x012b,0x012c,0x012d,0x012e,0x012f, 0x0130,0x0131,0x0132,0x0133,0x0134,0x0135,0x0136,0x0137,0x0138,0x0139,0x013a,0x013b,0x013c,0x013d,0x013e,0x013f, 0x0140,0x0141,0x0142,0x0143,0x0144,0x0145,0x0146,0x0147,0x0148,0x0149,0x014a,0x014b,0x014c,0x014d,0x014e,0x014f, 0x0150,0x0151,0x0152,0x0153,0x0154,0x0155,0x0156,0x0157,0x0158,0x0159,0x015a,0x015b,0x015c,0x015d,0x015e,0x015f, 0x0160,0x0161,0x0162,0x0163,0x0164,0x0165,0x0166,0x0167,0x0168,0x0169,0x016a,0x016b,0x016c,0x016d,0x016e,0x016f, 0x0170,0x0171,0x0172,0x0173,0x0174,0x0175,0x0176,0x0177,0x0178,0x0179,0x017a,0x017b,0x017c,0x017d,0x017e,0x017f, 0x0186,0x018e,0x018f,0x0190,0x0192,0x019d,0x019e,0x01b5,0x01b6,0x01b7,0x01cd,0x01ce,0x01cf,0x01d0,0x01d1,0x01d2, 0x01d3,0x01d4,0x01e2,0x01e3,0x01e4,0x01e5,0x01e6,0x01e7,0x01e8,0x01e9,0x01ea,0x01eb,0x01ec,0x01ed,0x01ee,0x01ef, 0x01f0,0x01f4,0x01f5,0x01fc,0x01fd,0x01fe,0x01ff,0x0218,0x0219,0x021a,0x021b,0x0232,0x0233,0x0237,0x0254,0x0258, 0x0259,0x025b,0x0272,0x0292,0x02bb,0x02bc,0x02bd,0x02c6,0x02c7,0x02d8,0x02d9,0x02db,0x02dc,0x02dd,0x0300,0x0301, 0x0302,0x0303,0x0304,0x0305,0x0306,0x0307,0x0308,0x030a,0x030b,0x030c,0x0329,0x0384,0x0385,0x0386,0x0387,0x0388, 0x0389,0x038a,0x038c,0x038e,0x038f,0x0390,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039a, 0x039b,0x039c,0x039d,0x039e,0x039f,0x03a0,0x03a1,0x03a3,0x03a4,0x03a5,0x03a6,0x03a7,0x03a8,0x03a9,0x03aa,0x03ab, 0x03ac,0x03ad,0x03ae,0x03af,0x03b0,0x03b1,0x03b2,0x03b3,0x03b4,0x03b5,0x03b6,0x03b7,0x03b8,0x03b9,0x03ba,0x03bb, 0x03bc,0x03bd,0x03be,0x03bf,0x03c0,0x03c1,0x03c2,0x03c3,0x03c4,0x03c5,0x03c6,0x03c7,0x03c8,0x03c9,0x03ca,0x03cb, 0x03cc,0x03cd,0x03ce,0x03d1,0x03d5,0x03f0,0x03f1,0x03f2,0x03f3,0x03f4,0x03f5,0x03f6,0x0400,0x0401,0x0402,0x0403, 0x0404,0x0405,0x0406,0x0407,0x0408,0x0409,0x040a,0x040b,0x040c,0x040d,0x040e,0x040f,0x0410,0x0411,0x0412,0x0413, 0x0414,0x0415,0x0416,0x0417,0x0418,0x0419,0x041a,0x041b,0x041c,0x041d,0x041e,0x041f,0x0420,0x0421,0x0422,0x0423, 0x0424,0x0425,0x0426,0x0427,0x0428,0x0429,0x042a,0x042b,0x042c,0x042d,0x042e,0x042f,0x0430,0x0431,0x0432,0x0433, 0x0434,0x0435,0x0436,0x0437,0x0438,0x0439,0x043a,0x043b,0x043c,0x043d,0x043e,0x043f,0x0440,0x0441,0x0442,0x0443, 0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,0x044a,0x044b,0x044c,0x044d,0x044e,0x044f,0x0450,0x0451,0x0452,0x0453, 0x0454,0x0455,0x0456,0x0457,0x0458,0x0459,0x045a,0x045b,0x045c,0x045d,0x045e,0x045f,0x0462,0x0463,0x046a,0x046b, 0x0490,0x0491,0x0492,0x0493,0x0494,0x0495,0x0496,0x0497,0x0498,0x0499,0x049a,0x049b,0x049c,0x049d,0x04a0,0x04a1, 0x04a2,0x04a3,0x04a4,0x04a5,0x04aa,0x04ab,0x04ae,0x04af,0x04b0,0x04b1,0x04b2,0x04b3,0x04b6,0x04b7,0x04b8,0x04b9, 0x04ba,0x04bb,0x04c0,0x04c1,0x04c2,0x04cf,0x04d0,0x04d1,0x04d2,0x04d3,0x04d4,0x04d5,0x04d6,0x04d7,0x04d8,0x04d9, 0x04da,0x04db,0x04dc,0x04dd,0x04de,0x04df,0x04e2,0x04e3,0x04e4,0x04e5,0x04e6,0x04e7,0x04e8,0x04e9,0x04ea,0x04eb, 0x04ec,0x04ed,0x04ee,0x04ef,0x04f0,0x04f1,0x04f2,0x04f3,0x04f4,0x04f5,0x04f8,0x04f9,0x05d0,0x05d1,0x05d2,0x05d3, 0x05d4,0x05d5,0x05d6,0x05d7,0x05d8,0x05d9,0x05da,0x05db,0x05dc,0x05dd,0x05de,0x05df,0x05e0,0x05e1,0x05e2,0x05e3, 0x05e4,0x05e5,0x05e6,0x05e7,0x05e8,0x05e9,0x05ea,0x1e0c,0x1e0d,0x1e34,0x1e35,0x1e36,0x1e37,0x1e40,0x1e41,0x1e42, 0x1e43,0x1e44,0x1e45,0x1e46,0x1e47,0x1e6c,0x1e6d,0x1eb8,0x1eb9,0x1ebc,0x1ebd,0x1eca,0x1ecb,0x1ecc,0x1ecd,0x1ee4, 0x1ee5,0x1ef8,0x1ef9,0x2000,0x2001,0x2002,0x2003,0x2004,0x2005,0x2006,0x2007,0x2008,0x2009,0x200a,0x200b,0x200c, 0x200d,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x2015,0x2016,0x2017,0x2018,0x2019,0x201a,0x201b,0x201c, 0x201d,0x201e,0x201f,0x2020,0x2021,0x2022,0x2026,0x2030,0x2032,0x2033,0x2039,0x203a,0x203c,0x203e,0x2070,0x2071, 0x2074,0x2075,0x2076,0x2077,0x2078,0x2079,0x207a,0x207b,0x207c,0x207d,0x207e,0x207f,0x2080,0x2081,0x2082,0x2083, 0x2084,0x2085,0x2086,0x2087,0x2088,0x2089,0x208a,0x208b,0x208c,0x208d,0x208e,0x2090,0x2091,0x2092,0x2093,0x2094, 0x2095,0x2096,0x2097,0x2098,0x209a,0x20a7,0x20aa,0x20ac,0x20ae,0x2102,0x210e,0x210f,0x2115,0x2116,0x211a,0x211d, 0x2122,0x2124,0x2126,0x2135,0x2190,0x2191,0x2192,0x2193,0x2194,0x2195,0x21a4,0x21a6,0x21a8,0x21b5,0x21bb,0x21cb, 0x21cc,0x21d0,0x21d1,0x21d2,0x21d3,0x21d4,0x21d5,0x2200,0x2203,0x2204,0x2205,0x2206,0x2207,0x2208,0x2209,0x220a, 0x220b,0x220c,0x220d,0x2212,0x2213,0x2214,0x2215,0x2216,0x2219,0x221a,0x221e,0x221f,0x2225,0x2227,0x2228,0x2229, 0x222a,0x2248,0x2260,0x2261,0x2264,0x2265,0x226a,0x226b,0x2282,0x2283,0x2286,0x2287,0x22a5,0x22c2,0x22c3,0x2300, 0x2302,0x2308,0x2309,0x230a,0x230b,0x2310,0x2319,0x2320,0x2321,0x239b,0x239c,0x239d,0x239e,0x239f,0x23a0,0x23a1, 0x23a2,0x23a3,0x23a4,0x23a5,0x23a6,0x23a7,0x23a8,0x23a9,0x23ab,0x23ac,0x23ad,0x23ae,0x23af,0x23ba,0x23bb,0x23bc, 0x23bd,0x23d0,0x2409,0x240a,0x240b,0x240c,0x240d,0x2424,0x2500,0x2501,0x2502,0x2503,0x2508,0x2509,0x250a,0x250b, 0x250c,0x250d,0x250e,0x250f,0x2510,0x2511,0x2512,0x2513,0x2514,0x2515,0x2516,0x2517,0x2518,0x2519,0x251a,0x251b, 0x251c,0x251d,0x251e,0x251f,0x2520,0x2521,0x2522,0x2523,0x2524,0x2525,0x2526,0x2527,0x2528,0x2529,0x252a,0x252b, 0x252c,0x252d,0x252e,0x252f,0x2530,0x2531,0x2532,0x2533,0x2534,0x2535,0x2536,0x2537,0x2538,0x2539,0x253a,0x253b, 0x253c,0x253d,0x253e,0x253f,0x2540,0x2541,0x2542,0x2543,0x2544,0x2545,0x2546,0x2547,0x2548,0x2549,0x254a,0x254b, 0x2550,0x2551,0x2552,0x2553,0x2554,0x2555,0x2556,0x2557,0x2558,0x2559,0x255a,0x255b,0x255c,0x255d,0x255e,0x255f, 0x2560,0x2561,0x2562,0x2563,0x2564,0x2565,0x2566,0x2567,0x2568,0x2569,0x256a,0x256b,0x256c,0x256d,0x256e,0x256f, 0x2570,0x2571,0x2572,0x2573,0x2574,0x2575,0x2576,0x2577,0x2578,0x2579,0x257a,0x257b,0x257c,0x257d,0x257e,0x257f, 0x2580,0x2581,0x2582,0x2583,0x2584,0x2585,0x2586,0x2587,0x2588,0x2589,0x258a,0x258b,0x258c,0x258d,0x258e,0x258f, 0x2590,0x2591,0x2592,0x2593,0x2596,0x2597,0x2598,0x2599,0x259a,0x259b,0x259c,0x259d,0x259e,0x259f,0x25a0,0x25ac, 0x25ae,0x25b2,0x25b6,0x25ba,0x25bc,0x25c0,0x25c4,0x25c6,0x25ca,0x25cb,0x25cf,0x25d8,0x25d9,0x263a,0x263b,0x263c, 0x2640,0x2642,0x2660,0x2663,0x2665,0x2666,0x266a,0x266b,0x2713,0x2714,0x2717,0x2718,0x27e8,0x27e9,0x27ea,0x27eb, 0x2800,0x2801,0x2802,0x2803,0x2804,0x2805,0x2806,0x2807,0x2808,0x2809,0x280a,0x280b,0x280c,0x280d,0x280e,0x280f, 0x2810,0x2811,0x2812,0x2813,0x2814,0x2815,0x2816,0x2817,0x2818,0x2819,0x281a,0x281b,0x281c,0x281d,0x281e,0x281f, 0x2820,0x2821,0x2822,0x2823,0x2824,0x2825,0x2826,0x2827,0x2828,0x2829,0x282a,0x282b,0x282c,0x282d,0x282e,0x282f, 0x2830,0x2831,0x2832,0x2833,0x2834,0x2835,0x2836,0x2837,0x2838,0x2839,0x283a,0x283b,0x283c,0x283d,0x283e,0x283f, 0x2840,0x2841,0x2842,0x2843,0x2844,0x2845,0x2846,0x2847,0x2848,0x2849,0x284a,0x284b,0x284c,0x284d,0x284e,0x284f, 0x2850,0x2851,0x2852,0x2853,0x2854,0x2855,0x2856,0x2857,0x2858,0x2859,0x285a,0x285b,0x285c,0x285d,0x285e,0x285f, 0x2860,0x2861,0x2862,0x2863,0x2864,0x2865,0x2866,0x2867,0x2868,0x2869,0x286a,0x286b,0x286c,0x286d,0x286e,0x286f, 0x2870,0x2871,0x2872,0x2873,0x2874,0x2875,0x2876,0x2877,0x2878,0x2879,0x287a,0x287b,0x287c,0x287d,0x287e,0x287f, 0x2880,0x2881,0x2882,0x2883,0x2884,0x2885,0x2886,0x2887,0x2888,0x2889,0x288a,0x288b,0x288c,0x288d,0x288e,0x288f, 0x2890,0x2891,0x2892,0x2893,0x2894,0x2895,0x2896,0x2897,0x2898,0x2899,0x289a,0x289b,0x289c,0x289d,0x289e,0x289f, 0x28a0,0x28a1,0x28a2,0x28a3,0x28a4,0x28a5,0x28a6,0x28a7,0x28a8,0x28a9,0x28aa,0x28ab,0x28ac,0x28ad,0x28ae,0x28af, 0x28b0,0x28b1,0x28b2,0x28b3,0x28b4,0x28b5,0x28b6,0x28b7,0x28b8,0x28b9,0x28ba,0x28bb,0x28bc,0x28bd,0x28be,0x28bf, 0x28c0,0x28c1,0x28c2,0x28c3,0x28c4,0x28c5,0x28c6,0x28c7,0x28c8,0x28c9,0x28ca,0x28cb,0x28cc,0x28cd,0x28ce,0x28cf, 0x28d0,0x28d1,0x28d2,0x28d3,0x28d4,0x28d5,0x28d6,0x28d7,0x28d8,0x28d9,0x28da,0x28db,0x28dc,0x28dd,0x28de,0x28df, 0x28e0,0x28e1,0x28e2,0x28e3,0x28e4,0x28e5,0x28e6,0x28e7,0x28e8,0x28e9,0x28ea,0x28eb,0x28ec,0x28ed,0x28ee,0x28ef, 0x28f0,0x28f1,0x28f2,0x28f3,0x28f4,0x28f5,0x28f6,0x28f7,0x28f8,0x28f9,0x28fa,0x28fb,0x28fc,0x28fd,0x28fe,0x28ff, 0x2e2c,0xe0a0,0xe0a1,0xe0a2,0xe0b0,0xe0b1,0xe0b2,0xe0b3,0xf6be,0xfffd }; } // namespace // -- end of autogenerated text --- namespace fixed_font_24n { // -- start of autogenerated text --- // definition section for font: ter-u24n.bdf constexpr int CHARCOUNT = 1354; constexpr int WIDTH = 12; constexpr int HEIGHT = 24; constexpr int OFFSET_X = 0; constexpr int OFFSET_Y = 0; constexpr FixedFont_info_t fixedfont_info = { "Terminus", // font name "ter-u24n.bdf", // font name internal CHARCOUNT, // num of chars WIDTH, HEIGHT, OFFSET_X, OFFSET_Y, false // bold }; // font bitmap definitions constexpr std::array fixedfont_bitmap = { 0x0000,0x0000,0x0000,0x0000,0x71c0,0x4040,0x4040,0x4040,0x0000,0x0000,0x4040,0x4040,0x4040,0x0000,0x0000,0x4040, 0x4040,0x4040,0x71c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0020 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0000,0x0000, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u0021 0x0000,0x0000,0x1100,0x1100,0x1100,0x1100,0x1100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0022 0x0000,0x0000,0x0000,0x0000,0x1100,0x1100,0x1100,0x1100,0x7fc0,0x1100,0x1100,0x1100,0x1100,0x1100,0x7fc0,0x1100, 0x1100,0x1100,0x1100,0x0000,0x0000,0x0000,0x0000,0x0000, // u0023 0x0000,0x0000,0x0000,0x0400,0x0400,0x1f00,0x2480,0x4440,0x4400,0x4400,0x2400,0x1f00,0x0480,0x0440,0x0440,0x4440, 0x2480,0x1f00,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000, // u0024 0x0000,0x0000,0x0000,0x0000,0x0000,0x3080,0x4880,0x4900,0x3100,0x0200,0x0200,0x0400,0x0400,0x0800,0x0800,0x1180, 0x1240,0x2240,0x2180,0x0000,0x0000,0x0000,0x0000,0x0000, // u0025 0x0000,0x0000,0x0000,0x0000,0x1e00,0x2100,0x2100,0x2100,0x2100,0x1200,0x0c00,0x1400,0x2240,0x4140,0x4080,0x4080, 0x4080,0x2140,0x1e40,0x0000,0x0000,0x0000,0x0000,0x0000, // u0026 0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0027 0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0400, 0x0400,0x0200,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000, // u0028 0x0000,0x0000,0x0000,0x0000,0x0800,0x0400,0x0200,0x0200,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0200, 0x0200,0x0400,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000, // u0029 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x1100,0x0a00,0x0400,0x7fc0,0x0400,0x0a00,0x1100,0x2080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x7fc0,0x0400,0x0400,0x0400,0x0400, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400, 0x0400,0x0400,0x0400,0x0800,0x0000,0x0000,0x0000,0x0000, // u002c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u002e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0100,0x0100,0x0200,0x0200,0x0400,0x0400,0x0800,0x0800,0x1000, 0x1000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002f 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x40c0,0x4140,0x4240,0x4440,0x4840,0x5040,0x6040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0030 0x0000,0x0000,0x0000,0x0000,0x0400,0x0c00,0x1400,0x2400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0031 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000, 0x2000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0032 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x0040,0x0040,0x0040,0x0080,0x0f00,0x0080,0x0040,0x0040,0x0040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0033 0x0000,0x0000,0x0000,0x0000,0x0040,0x00c0,0x0140,0x0240,0x0440,0x0840,0x1040,0x2040,0x4040,0x4040,0x4040,0x7fc0, 0x0040,0x0040,0x0040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0034 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x0080,0x0040,0x0040,0x0040,0x0040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0035 0x0000,0x0000,0x0000,0x0000,0x1f80,0x2000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0036 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x4040,0x4040,0x0040,0x0080,0x0080,0x0100,0x0100,0x0200,0x0200,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u0037 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x2080,0x1f00,0x2080,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0038 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x2040,0x1fc0,0x0040,0x0040,0x0040, 0x0040,0x0080,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0039 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0400, 0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0400, 0x0400,0x0400,0x0400,0x0800,0x0000,0x0000,0x0000,0x0000, // u003b 0x0000,0x0000,0x0000,0x0000,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x1000,0x0800,0x0400,0x0200, 0x0100,0x0080,0x0040,0x0000,0x0000,0x0000,0x0000,0x0000, // u003c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003d 0x0000,0x0000,0x0000,0x0000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0100,0x0080,0x0040,0x0080,0x0100,0x0200,0x0400, 0x0800,0x1000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003e 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x0080,0x0100,0x0200,0x0400,0x0400,0x0000,0x0000, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u003f 0x0000,0x0000,0x0000,0x0000,0x1f80,0x2040,0x4020,0x43e0,0x4420,0x4820,0x4820,0x4820,0x4820,0x4820,0x4460,0x43a0, 0x4000,0x2000,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0040 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0041 0x0000,0x0000,0x0000,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4080,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4080,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0042 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0043 0x0000,0x0000,0x0000,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4080,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0044 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0045 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0046 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4000,0x4000,0x4000,0x47c0,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0047 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0048 0x0000,0x0000,0x0000,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0049 0x0000,0x0000,0x0000,0x0000,0x03e0,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x4080,0x4080, 0x4080,0x2100,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u004a 0x0000,0x0000,0x0000,0x0000,0x4040,0x4080,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x5000,0x4800,0x4400,0x4200, 0x4100,0x4080,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u004b 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u004c 0x0000,0x0000,0x0000,0x0000,0x4020,0x6060,0x50a0,0x50a0,0x4920,0x4620,0x4620,0x4020,0x4020,0x4020,0x4020,0x4020, 0x4020,0x4020,0x4020,0x0000,0x0000,0x0000,0x0000,0x0000, // u004d 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x6040,0x5040,0x4840,0x4440,0x4240,0x4140,0x40c0,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u004e 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u004f 0x0000,0x0000,0x0000,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4080,0x7f00,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0050 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4440,0x2280,0x1f00,0x0080,0x0040,0x0000,0x0000,0x0000, // u0051 0x0000,0x0000,0x0000,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4080,0x7f00,0x5000,0x4800,0x4400,0x4200, 0x4100,0x4080,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0052 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4000,0x4000,0x4000,0x2000,0x1f00,0x0080,0x0040,0x0040,0x0040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0053 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u0054 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0055 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x2080,0x2080,0x2080,0x1100,0x1100,0x1100,0x0a00,0x0a00, 0x0a00,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u0056 0x0000,0x0000,0x0000,0x0000,0x4020,0x4020,0x4020,0x4020,0x4020,0x4020,0x4020,0x4020,0x4620,0x4620,0x4920,0x50a0, 0x50a0,0x6060,0x4020,0x0000,0x0000,0x0000,0x0000,0x0000, // u0057 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0400,0x0a00,0x1100,0x1100,0x2080, 0x2080,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0058 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0a00,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u0059 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0040,0x0040,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000, 0x4000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u005a 0x0000,0x0000,0x0000,0x0000,0x0f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u005b 0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x1000,0x1000,0x0800,0x0800,0x0400,0x0400,0x0200,0x0200,0x0100, 0x0100,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000, // u005c 0x0000,0x0000,0x0000,0x0000,0x0f00,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0100,0x0100,0x0f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u005d 0x0000,0x0000,0x0400,0x0a00,0x1100,0x2080,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0000, // u005f 0x1000,0x0800,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0060 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0080,0x0040,0x0040,0x1fc0,0x2040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0061 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4080,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0062 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0063 0x0000,0x0000,0x0000,0x0000,0x0040,0x0040,0x0040,0x0040,0x1fc0,0x2040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0064 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x7fc0,0x4000,0x4000, 0x4000,0x2040,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0065 0x0000,0x0000,0x0000,0x0000,0x03c0,0x0400,0x0400,0x0400,0x3f80,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u0066 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x2040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x20c0,0x1f40,0x0040,0x0040,0x0080,0x3f00,0x0000, // u0067 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0068 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0069 0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0380,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080, 0x0080,0x0080,0x0080,0x2080,0x2080,0x1100,0x0e00,0x0000, // u006a 0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x2000,0x2040,0x2080,0x2100,0x2200,0x2400,0x3800,0x2400,0x2200, 0x2100,0x2080,0x2040,0x0000,0x0000,0x0000,0x0000,0x0000, // u006b 0x0000,0x0000,0x0000,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u006c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x4480,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440, 0x4440,0x4440,0x4440,0x0000,0x0000,0x0000,0x0000,0x0000, // u006d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u006e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u006f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4080,0x7f00,0x4000,0x4000,0x4000,0x4000,0x0000, // u0070 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x2040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0040,0x0040,0x0040,0x0040,0x0000, // u0071 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x47c0,0x4800,0x5000,0x6000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0072 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x4040,0x4000,0x4000,0x4000,0x3f80,0x0040,0x0040, 0x0040,0x4040,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0073 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x3f80,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0074 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0075 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00, 0x0a00,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u0076 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4440,0x4440,0x4440,0x4440, 0x4440,0x4440,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0077 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x2080,0x1100,0x0a00,0x0400,0x0a00,0x1100, 0x2080,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0078 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x20c0,0x1f40,0x0040,0x0040,0x0080,0x3f00,0x0000, // u0079 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000, 0x2000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u007a 0x0000,0x0000,0x0000,0x0000,0x0180,0x0200,0x0400,0x0400,0x0400,0x0400,0x0400,0x1800,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0200,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000, // u007b 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u007c 0x0000,0x0000,0x0000,0x0000,0x1800,0x0400,0x0200,0x0200,0x0200,0x0200,0x0200,0x0180,0x0200,0x0200,0x0200,0x0200, 0x0200,0x0400,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000, // u007d 0x0000,0x0000,0x3840,0x4440,0x4440,0x4380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a0 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x1f00,0x2480,0x4440,0x4400,0x4400,0x4400,0x4400,0x4400, 0x4440,0x2480,0x1f00,0x0400,0x0400,0x0000,0x0000,0x0000, // u00a2 0x0000,0x0000,0x0000,0x0000,0x0e00,0x1100,0x2080,0x2000,0x2000,0x2000,0x2000,0x7e00,0x2000,0x2000,0x2000,0x2000, 0x2040,0x2040,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4020,0x2040,0x1f80,0x2040,0x2040,0x2040,0x2040,0x2040,0x2040,0x1f80, 0x2040,0x4020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a4 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0400,0x0400,0x3f80,0x0400,0x0400, 0x3f80,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a5 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a6 0x0000,0x0000,0x0000,0x0f00,0x1080,0x1000,0x1000,0x0e00,0x1100,0x1080,0x1080,0x1080,0x1080,0x0880,0x0700,0x0080, 0x0080,0x1080,0x0f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a7 0x1100,0x1100,0x1100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x2040,0x4f20,0x50a0,0x50a0,0x5020,0x5020,0x50a0,0x50a0,0x4f20, 0x2040,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a9 0x0000,0x1f80,0x0040,0x0040,0x1fc0,0x2040,0x2040,0x2040,0x2040,0x1fc0,0x0000,0x3fc0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0220,0x0440,0x0880,0x1100,0x2200,0x4400,0x2200,0x1100, 0x0880,0x0440,0x0220,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ab 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0040,0x0040,0x0040,0x0040,0x0040,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ac 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ad 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x2040,0x5f20,0x50a0,0x50a0,0x50a0,0x5f20,0x5220,0x5120,0x50a0, 0x2040,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ae 0x0000,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00af 0x0000,0x0000,0x0f00,0x1080,0x1080,0x1080,0x1080,0x0f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x7fc0,0x0400,0x0400,0x0400,0x0400, 0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b1 0x0000,0x0000,0x0f00,0x1080,0x1080,0x0080,0x0100,0x0200,0x0400,0x0800,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b2 0x0000,0x0000,0x0f00,0x1080,0x0080,0x0080,0x0700,0x0080,0x0080,0x1080,0x0f00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b3 0x0100,0x0200,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x40c0,0x4140,0x7e40,0x4000,0x4000,0x4000,0x4000,0x0000, // u00b5 0x0000,0x0000,0x0000,0x0000,0x3fc0,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x3c40,0x0440,0x0440,0x0440,0x0440, 0x0440,0x0440,0x0440,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0800,0x0000, // u00b8 0x0000,0x0000,0x0400,0x0c00,0x1400,0x0400,0x0400,0x0400,0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b9 0x0000,0x0f00,0x1080,0x2040,0x2040,0x2040,0x2040,0x2040,0x1080,0x0f00,0x0000,0x3fc0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x2200,0x1100,0x0880,0x0440,0x0220,0x0440,0x0880, 0x1100,0x2200,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000, // u00bb 0x0000,0x0000,0x0000,0x0800,0x1800,0x2800,0x0800,0x0840,0x0880,0x0900,0x0200,0x0400,0x0880,0x1180,0x2280,0x4480, 0x0880,0x0f80,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000, // u00bc 0x0000,0x0000,0x0000,0x0800,0x1800,0x2800,0x0800,0x0840,0x0880,0x0900,0x0200,0x0400,0x0800,0x1380,0x2440,0x4440, 0x0080,0x0100,0x0200,0x07c0,0x0000,0x0000,0x0000,0x0000, // u00bd 0x0000,0x0000,0x0000,0x1c00,0x2200,0x0200,0x0c00,0x0200,0x2240,0x1c80,0x0100,0x0200,0x0480,0x0980,0x1280,0x2480, 0x4880,0x0f80,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000, // u00be 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0800,0x1000,0x2000,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00bf 0x1000,0x0800,0x0400,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c0 0x0100,0x0200,0x0400,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c1 0x0400,0x0a00,0x1100,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c2 0x1880,0x2480,0x2300,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c3 0x1100,0x1100,0x1100,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c4 0x0e00,0x1100,0x1100,0x0e00,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c5 0x0000,0x0000,0x0000,0x0000,0x3fe0,0x4400,0x8400,0x8400,0x8400,0x8400,0x8400,0xffc0,0x8400,0x8400,0x8400,0x8400, 0x8400,0x8400,0x87e0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c6 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4040, 0x4040,0x2080,0x1f00,0x0400,0x0400,0x0400,0x0800,0x0000, // u00c7 0x1000,0x0800,0x0400,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c8 0x0100,0x0200,0x0400,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c9 0x0400,0x0a00,0x1100,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ca 0x1100,0x1100,0x1100,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cb 0x1000,0x0800,0x0400,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cc 0x0100,0x0200,0x0400,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cd 0x0400,0x0a00,0x1100,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ce 0x1100,0x1100,0x1100,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cf 0x0000,0x0000,0x0000,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0xfc40,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4080,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d0 0x1880,0x2480,0x2300,0x0000,0x4040,0x4040,0x4040,0x4040,0x6040,0x5040,0x4840,0x4440,0x4240,0x4140,0x40c0,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d1 0x1000,0x0800,0x0400,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d2 0x0100,0x0200,0x0400,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d3 0x0400,0x0a00,0x1100,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d4 0x1880,0x2480,0x2300,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d5 0x1100,0x1100,0x1100,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x2080,0x1100,0x0a00,0x0400,0x0a00,0x1100,0x2080,0x4040, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d7 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4060,0x4040,0x40c0,0x4140,0x4240,0x4440,0x4840,0x5040,0x6040,0x4040, 0xc040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d8 0x1000,0x0800,0x0400,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d9 0x0100,0x0200,0x0400,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00da 0x0400,0x0a00,0x1100,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00db 0x1100,0x1100,0x1100,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00dc 0x0100,0x0200,0x0400,0x0000,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0a00,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u00dd 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4080,0x7f00,0x4000, 0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00de 0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4080,0x4080,0x4080,0x4100,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040, 0x6040,0x5080,0x4f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00df 0x0000,0x0000,0x0000,0x0000,0x1000,0x0800,0x0400,0x0000,0x3f00,0x0080,0x0040,0x0040,0x1fc0,0x2040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e0 0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0000,0x3f00,0x0080,0x0040,0x0040,0x1fc0,0x2040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e1 0x0000,0x0000,0x0000,0x0000,0x0400,0x0a00,0x1100,0x0000,0x3f00,0x0080,0x0040,0x0040,0x1fc0,0x2040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e2 0x0000,0x0000,0x0000,0x0000,0x1880,0x2480,0x2300,0x0000,0x3f00,0x0080,0x0040,0x0040,0x1fc0,0x2040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e3 0x0000,0x0000,0x0000,0x0000,0x1100,0x1100,0x1100,0x0000,0x3f00,0x0080,0x0040,0x0040,0x1fc0,0x2040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e4 0x0000,0x0000,0x0000,0x0000,0x0e00,0x1100,0x1100,0x0e00,0x3f00,0x0080,0x0040,0x0040,0x1fc0,0x2040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7bc0,0x0420,0x0420,0x0420,0x7c20,0x87e0,0x8400,0x8400, 0x8400,0x8420,0x7bc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4040,0x2080,0x1f00,0x0400,0x0400,0x0400,0x0800,0x0000, // u00e7 0x0000,0x0000,0x0000,0x0000,0x1000,0x0800,0x0400,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x7fc0,0x4000,0x4000, 0x4000,0x2040,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e8 0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x7fc0,0x4000,0x4000, 0x4000,0x2040,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e9 0x0000,0x0000,0x0000,0x0000,0x0400,0x0a00,0x1100,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x7fc0,0x4000,0x4000, 0x4000,0x2040,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ea 0x0000,0x0000,0x0000,0x0000,0x1100,0x1100,0x1100,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x7fc0,0x4000,0x4000, 0x4000,0x2040,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00eb 0x0000,0x0000,0x0000,0x0000,0x1000,0x0800,0x0400,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ec 0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ed 0x0000,0x0000,0x0000,0x0000,0x0400,0x0a00,0x1100,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ee 0x0000,0x0000,0x0000,0x0000,0x1100,0x1100,0x1100,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ef 0x0000,0x0000,0x0000,0x0000,0x1600,0x0800,0x3400,0x0200,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f0 0x0000,0x0000,0x0000,0x0000,0x1880,0x2480,0x2300,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f1 0x0000,0x0000,0x0000,0x0000,0x1000,0x0800,0x0400,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f2 0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f3 0x0000,0x0000,0x0000,0x0000,0x0400,0x0a00,0x1100,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f4 0x0000,0x0000,0x0000,0x0000,0x1880,0x2480,0x2300,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f5 0x0000,0x0000,0x0000,0x0000,0x1100,0x1100,0x1100,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0400,0x0400, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f20,0x20c0,0x40c0,0x4140,0x4240,0x4440,0x4840,0x5040, 0x6040,0x6080,0x9f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f8 0x0000,0x0000,0x0000,0x0000,0x1000,0x0800,0x0400,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f9 0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00fa 0x0000,0x0000,0x0000,0x0000,0x0400,0x0a00,0x1100,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00fb 0x0000,0x0000,0x0000,0x0000,0x1100,0x1100,0x1100,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00fc 0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x20c0,0x1f40,0x0040,0x0040,0x0080,0x3f00,0x0000, // u00fd 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4080,0x7f00,0x4000,0x4000,0x4000,0x4000,0x0000, // u00fe 0x0000,0x0000,0x0000,0x0000,0x1100,0x1100,0x1100,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x20c0,0x1f40,0x0040,0x0040,0x0080,0x3f00,0x0000, // u00ff 0x0000,0x3f80,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0100 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x0000,0x3f00,0x0080,0x0040,0x0040,0x1fc0,0x2040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0101 0x2080,0x2080,0x1f00,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0102 0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x1f00,0x0000,0x3f00,0x0080,0x0040,0x0040,0x1fc0,0x2040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0103 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0080,0x0100,0x0100,0x00e0,0x0000, // u0104 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0080,0x0040,0x0040,0x1fc0,0x2040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0080,0x0100,0x0100,0x00e0,0x0000, // u0105 0x0100,0x0200,0x0400,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0106 0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0000,0x1f00,0x2080,0x4040,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0107 0x0400,0x0a00,0x1100,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0108 0x0000,0x0000,0x0000,0x0000,0x0400,0x0a00,0x1100,0x0000,0x1f00,0x2080,0x4040,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0109 0x0400,0x0400,0x0400,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u010a 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x1f00,0x2080,0x4040,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u010b 0x1100,0x0a00,0x0400,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u010c 0x0000,0x0000,0x0000,0x0000,0x1100,0x0a00,0x0400,0x0000,0x1f00,0x2080,0x4040,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u010d 0x1100,0x0a00,0x0400,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4080,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u010e 0x1100,0x0a00,0x0400,0x0000,0x0040,0x0040,0x0040,0x0040,0x1fc0,0x2040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u010f 0x0000,0x0000,0x0000,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0xfc40,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4080,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0110 0x0000,0x0000,0x0000,0x0000,0x0040,0x07e0,0x0040,0x0040,0x1fc0,0x2040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0111 0x0000,0x3f80,0x0000,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0112 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x7fc0,0x4000,0x4000, 0x4000,0x2040,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0113 0x2080,0x2080,0x1f00,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0114 0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x1f00,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x7fc0,0x4000,0x4000, 0x4000,0x2040,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0115 0x0400,0x0400,0x0400,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0116 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x7fc0,0x4000,0x4000, 0x4000,0x2040,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0117 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x7fc0,0x0080,0x0100,0x0100,0x00e0,0x0000, // u0118 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x7fc0,0x4000,0x4000, 0x4000,0x2040,0x1f80,0x0200,0x0400,0x0400,0x0380,0x0000, // u0119 0x1100,0x0a00,0x0400,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u011a 0x0000,0x0000,0x0000,0x0000,0x1100,0x0a00,0x0400,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x7fc0,0x4000,0x4000, 0x4000,0x2040,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u011b 0x0400,0x0a00,0x1100,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4000,0x4000,0x4000,0x47c0,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u011c 0x0000,0x0000,0x0000,0x0000,0x0400,0x0a00,0x1100,0x0000,0x1fc0,0x2040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x20c0,0x1f40,0x0040,0x0040,0x0080,0x3f00,0x0000, // u011d 0x2080,0x2080,0x1f00,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4000,0x4000,0x4000,0x47c0,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u011e 0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x1f00,0x0000,0x1fc0,0x2040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x20c0,0x1f40,0x0040,0x0040,0x0080,0x3f00,0x0000, // u011f 0x0400,0x0400,0x0400,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4000,0x4000,0x4000,0x47c0,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0120 0x0000,0x0000,0x0000,0x0000,0x0200,0x0200,0x0200,0x0000,0x1fc0,0x2040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x20c0,0x1f40,0x0040,0x0040,0x0080,0x3f00,0x0000, // u0121 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4000,0x4000,0x4000,0x47c0,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0400,0x0400,0x0400,0x0800, // u0122 0x0000,0x0000,0x0000,0x0100,0x0200,0x0200,0x0200,0x0000,0x1fc0,0x2040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x20c0,0x1f40,0x0040,0x0040,0x0080,0x3f00,0x0000, // u0123 0x0400,0x0a00,0x1100,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0124 0x0400,0x0a00,0x1100,0x0000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0125 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0xffe0,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0126 0x0000,0x0000,0x0000,0x0000,0x4000,0xfc00,0x4000,0x4000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0127 0x1880,0x2480,0x2300,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0128 0x0000,0x0000,0x0000,0x0000,0x1880,0x2480,0x2300,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0129 0x0000,0x3f80,0x0000,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u012a 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u012b 0x2080,0x2080,0x1f00,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u012c 0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x1f00,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u012d 0x0000,0x0000,0x0000,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0400,0x0800,0x0800,0x0700,0x0000, // u012e 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0400,0x0800,0x0800,0x0700,0x0000, // u012f 0x0400,0x0400,0x0400,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0130 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0131 0x0000,0x0000,0x0000,0x0000,0xe0e0,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4840,0x4840, 0x4840,0x4840,0xe780,0x0000,0x0000,0x0000,0x0000,0x0000, // u0132 0x0000,0x0000,0x0000,0x0000,0x2020,0x2020,0x2020,0x0000,0x6060,0x2020,0x2020,0x2020,0x2020,0x2020,0x2020,0x2020, 0x2020,0x2020,0x7020,0x0420,0x0420,0x0420,0x03c0,0x0000, // u0133 0x0080,0x0140,0x0220,0x0000,0x03e0,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x4080,0x4080, 0x4080,0x2100,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0134 0x0000,0x0000,0x0000,0x0000,0x0080,0x0140,0x0220,0x0000,0x0380,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080, 0x0080,0x0080,0x0080,0x2080,0x2080,0x1100,0x0e00,0x0000, // u0135 0x0000,0x0000,0x0000,0x0000,0x4040,0x4080,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x5000,0x4800,0x4400,0x4200, 0x4100,0x4080,0x4040,0x0000,0x0400,0x0400,0x0400,0x0800, // u0136 0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x2000,0x2040,0x2080,0x2100,0x2200,0x2400,0x3800,0x2400,0x2200, 0x2100,0x2080,0x2040,0x0000,0x0400,0x0400,0x0400,0x0800, // u0137 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2040,0x2080,0x2100,0x2200,0x2400,0x3800,0x2400,0x2200, 0x2100,0x2080,0x2040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0138 0x1000,0x2000,0x4000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0139 0x0100,0x0200,0x0400,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u013a 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x7fc0,0x0000,0x0400,0x0400,0x0400,0x0800, // u013b 0x0000,0x0000,0x0000,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0400,0x0400,0x0400,0x0800, // u013c 0x1100,0x0a00,0x0400,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u013d 0x1100,0x0a00,0x0400,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u013e 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4100,0x4100,0x4100,0x4000,0x4000,0x4000, 0x4000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u013f 0x0000,0x0000,0x0000,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0410,0x0410,0x0410,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0140 0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2800,0x3000,0x2000,0x6000,0xa000,0x2000,0x2000, 0x2000,0x2000,0x3fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0141 0x0000,0x0000,0x0000,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0500,0x0600,0x0400,0x0c00,0x1400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0142 0x0100,0x0200,0x0400,0x0000,0x4040,0x4040,0x4040,0x4040,0x6040,0x5040,0x4840,0x4440,0x4240,0x4140,0x40c0,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0143 0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0144 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x6040,0x5040,0x4840,0x4440,0x4240,0x4140,0x40c0,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0400,0x0400,0x0400,0x0800, // u0145 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0400,0x0400,0x0400,0x0800, // u0146 0x1100,0x0a00,0x0400,0x0000,0x4040,0x4040,0x4040,0x4040,0x6040,0x5040,0x4840,0x4440,0x4240,0x4140,0x40c0,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0147 0x0000,0x0000,0x0000,0x0000,0x1100,0x0a00,0x0400,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0148 0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x8000,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0149 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x6040,0x5040,0x4840,0x4440,0x4240,0x4140,0x40c0,0x4040, 0x4040,0x4040,0x4040,0x0040,0x0040,0x0080,0x0300,0x0000, // u014a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0040,0x0040,0x0080,0x0300,0x0000, // u014b 0x0000,0x3f80,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u014c 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u014d 0x2080,0x2080,0x1f00,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u014e 0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x1f00,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u014f 0x0440,0x0880,0x1100,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0150 0x0000,0x0000,0x0000,0x0000,0x0440,0x0880,0x1100,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0151 0x0000,0x0000,0x0000,0x0000,0x3fe0,0x4400,0x8400,0x8400,0x8400,0x8400,0x8400,0x87c0,0x8400,0x8400,0x8400,0x8400, 0x8400,0x4400,0x3fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0152 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x4440,0x8420,0x8420,0x8420,0x87e0,0x8400,0x8400, 0x8400,0x4420,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0153 0x0100,0x0200,0x0400,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4080,0x7f00,0x5000,0x4800,0x4400,0x4200, 0x4100,0x4080,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0154 0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0000,0x47c0,0x4800,0x5000,0x6000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0155 0x0000,0x0000,0x0000,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4080,0x7f00,0x5000,0x4800,0x4400,0x4200, 0x4100,0x4080,0x4040,0x0000,0x0400,0x0400,0x0400,0x0800, // u0156 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x47c0,0x4800,0x5000,0x6000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x4000,0x0000,0x4000,0x4000,0x4000,0x8000, // u0157 0x1100,0x0a00,0x0400,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4080,0x7f00,0x5000,0x4800,0x4400,0x4200, 0x4100,0x4080,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0158 0x0000,0x0000,0x0000,0x0000,0x1100,0x0a00,0x0400,0x0000,0x47c0,0x4800,0x5000,0x6000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0159 0x0100,0x0200,0x0400,0x0000,0x1f00,0x2080,0x4040,0x4000,0x4000,0x4000,0x2000,0x1f00,0x0080,0x0040,0x0040,0x0040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u015a 0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0000,0x3f80,0x4040,0x4000,0x4000,0x4000,0x3f80,0x0040,0x0040, 0x0040,0x4040,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u015b 0x0400,0x0a00,0x1100,0x0000,0x1f00,0x2080,0x4040,0x4000,0x4000,0x4000,0x2000,0x1f00,0x0080,0x0040,0x0040,0x0040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u015c 0x0000,0x0000,0x0000,0x0000,0x0400,0x0a00,0x1100,0x0000,0x3f80,0x4040,0x4000,0x4000,0x4000,0x3f80,0x0040,0x0040, 0x0040,0x4040,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u015d 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4000,0x4000,0x4000,0x2000,0x1f00,0x0080,0x0040,0x0040,0x0040, 0x4040,0x2080,0x1f00,0x0400,0x0400,0x0400,0x0800,0x0000, // u015e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x4040,0x4000,0x4000,0x4000,0x3f80,0x0040,0x0040, 0x0040,0x4040,0x3f80,0x0400,0x0400,0x0400,0x0800,0x0000, // u015f 0x1100,0x0a00,0x0400,0x0000,0x1f00,0x2080,0x4040,0x4000,0x4000,0x4000,0x2000,0x1f00,0x0080,0x0040,0x0040,0x0040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0160 0x0000,0x0000,0x0000,0x0000,0x1100,0x0a00,0x0400,0x0000,0x3f80,0x4040,0x4000,0x4000,0x4000,0x3f80,0x0040,0x0040, 0x0040,0x4040,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0161 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0200,0x0200,0x0200,0x0400,0x0000, // u0162 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x3f80,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x03c0,0x0100,0x0100,0x0100,0x0200,0x0000, // u0163 0x1100,0x0a00,0x0400,0x0000,0x7fc0,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u0164 0x1100,0x0a00,0x0400,0x0000,0x0400,0x0400,0x0400,0x0400,0x3f80,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0165 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x3f80,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u0166 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x3f80,0x0400,0x0400,0x1f00,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0167 0x1880,0x2480,0x2300,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0168 0x0000,0x0000,0x0000,0x0000,0x1880,0x2480,0x2300,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0169 0x0000,0x3f80,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u016a 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u016b 0x2080,0x2080,0x1f00,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u016c 0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x1f00,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u016d 0x0e00,0x1100,0x1100,0x0e00,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u016e 0x0000,0x0000,0x0000,0x0000,0x0e00,0x1100,0x1100,0x0e00,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u016f 0x0440,0x0880,0x1100,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0170 0x0000,0x0000,0x0000,0x0000,0x0440,0x0880,0x1100,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0171 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0400,0x0800,0x0800,0x0700,0x0000, // u0172 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0080,0x0100,0x0100,0x00e0,0x0000, // u0173 0x0400,0x0a00,0x1100,0x0000,0x4020,0x4020,0x4020,0x4020,0x4020,0x4020,0x4020,0x4020,0x4620,0x4620,0x4920,0x50a0, 0x50a0,0x6060,0x4020,0x0000,0x0000,0x0000,0x0000,0x0000, // u0174 0x0000,0x0000,0x0000,0x0000,0x0400,0x0a00,0x1100,0x0000,0x4040,0x4040,0x4040,0x4040,0x4440,0x4440,0x4440,0x4440, 0x4440,0x4440,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0175 0x0400,0x0a00,0x1100,0x0000,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0a00,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u0176 0x0000,0x0000,0x0000,0x0000,0x0400,0x0a00,0x1100,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x20c0,0x1f40,0x0040,0x0040,0x0080,0x3f00,0x0000, // u0177 0x1100,0x1100,0x1100,0x0000,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0a00,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u0178 0x0100,0x0200,0x0400,0x0000,0x7fc0,0x0040,0x0040,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000, 0x4000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0179 0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0000,0x7fc0,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000, 0x2000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u017a 0x0400,0x0400,0x0400,0x0000,0x7fc0,0x0040,0x0040,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000, 0x4000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u017b 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x7fc0,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000, 0x2000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u017c 0x1100,0x0a00,0x0400,0x0000,0x7fc0,0x0040,0x0040,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000, 0x4000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u017d 0x0000,0x0000,0x0000,0x0000,0x1100,0x0a00,0x0400,0x0000,0x7fc0,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000, 0x2000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u017e 0x0000,0x0000,0x0000,0x0000,0x03c0,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u017f 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0186 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x1fc0,0x0040,0x0040,0x0040,0x0040, 0x0040,0x0040,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u018e 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x0040,0x0040,0x0040,0x0040,0x7fc0,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u018f 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4000,0x4000,0x4000,0x2000,0x1e00,0x2000,0x4000,0x4000,0x4000, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0190 0x0000,0x0000,0x0000,0x0000,0x0380,0x0440,0x0440,0x0400,0x0400,0x0400,0x3f80,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x4400,0x4400,0x3800,0x0000, // u0192 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x6040,0x5040,0x4840,0x4440,0x4240,0x4140,0x40c0,0x4040, 0x4040,0x4040,0x4040,0x4000,0x4000,0x4000,0x8000,0x0000, // u019d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0040,0x0040,0x0040,0x0040,0x0000, // u019e 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0040,0x0040,0x0040,0x0080,0x0100,0x0200,0x7fc0,0x0400,0x0800,0x1000,0x2000, 0x4000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u01b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0040,0x0080,0x0100,0x0200,0x7fc0,0x0800,0x1000, 0x2000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u01b6 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0040,0x0080,0x0100,0x0200,0x0400,0x0f00,0x0080,0x0040,0x0040,0x0040,0x0040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01b7 0x1100,0x0a00,0x0400,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u01cd 0x0000,0x0000,0x0000,0x0000,0x1100,0x0a00,0x0400,0x0000,0x3f00,0x0080,0x0040,0x0040,0x1fc0,0x2040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u01ce 0x1100,0x0a00,0x0400,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01cf 0x0000,0x0000,0x0000,0x0000,0x1100,0x0a00,0x0400,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d0 0x1100,0x0a00,0x0400,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d1 0x0000,0x0000,0x0000,0x0000,0x1100,0x0a00,0x0400,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d2 0x1100,0x0a00,0x0400,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d3 0x0000,0x0000,0x0000,0x0000,0x1100,0x0a00,0x0400,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d4 0x0000,0x3fc0,0x0000,0x0000,0x3fe0,0x4400,0x8400,0x8400,0x8400,0x8400,0x8400,0xffc0,0x8400,0x8400,0x8400,0x8400, 0x8400,0x8400,0x87e0,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e2 0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x0000,0x0000,0x7bc0,0x0420,0x0420,0x0420,0x7c20,0x87e0,0x8400,0x8400, 0x8400,0x8420,0x7bc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e3 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4000,0x4000,0x4000,0x47c0,0x4040,0x4040,0x43e0,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x2040,0x4040,0x4040,0x4040,0x43e0,0x4040,0x4040, 0x4040,0x20c0,0x1f40,0x0040,0x0040,0x0080,0x3f00,0x0000, // u01e5 0x1100,0x0a00,0x0400,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4000,0x4000,0x4000,0x47c0,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e6 0x0000,0x0000,0x0000,0x0000,0x1100,0x0a00,0x0400,0x0000,0x1fc0,0x2040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x20c0,0x1f40,0x0040,0x0040,0x0080,0x3f00,0x0000, // u01e7 0x1100,0x0a00,0x0400,0x0000,0x4040,0x4080,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x5000,0x4800,0x4400,0x4200, 0x4100,0x4080,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e8 0x1100,0x0a00,0x0400,0x0000,0x2000,0x2000,0x2000,0x2000,0x2040,0x2080,0x2100,0x2200,0x2400,0x3800,0x2400,0x2200, 0x2100,0x2080,0x2040,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e9 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0400,0x0800,0x0800,0x0700,0x0000, // u01ea 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0400,0x0800,0x0800,0x0700,0x0000, // u01eb 0x0000,0x3f80,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0400,0x0800,0x0800,0x0700,0x0000, // u01ec 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0400,0x0800,0x0800,0x0700,0x0000, // u01ed 0x1100,0x0a00,0x0400,0x0000,0x7fc0,0x0040,0x0080,0x0100,0x0200,0x0400,0x0f00,0x0080,0x0040,0x0040,0x0040,0x0040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01ee 0x0000,0x0000,0x0000,0x0000,0x1100,0x0a00,0x0400,0x0000,0x7fc0,0x0040,0x0080,0x0100,0x0200,0x0400,0x0f00,0x0080, 0x0040,0x0040,0x0040,0x0040,0x4040,0x2080,0x1f00,0x0000, // u01ef 0x0000,0x0000,0x0000,0x0000,0x0220,0x0140,0x0080,0x0000,0x0380,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080, 0x0080,0x0080,0x0080,0x2080,0x2080,0x1100,0x0e00,0x0000, // u01f0 0x0100,0x0200,0x0400,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4000,0x4000,0x4000,0x47c0,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01f4 0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0000,0x1fc0,0x2040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x20c0,0x1f40,0x0040,0x0040,0x0080,0x3f00,0x0000, // u01f5 0x0100,0x0200,0x0400,0x0000,0x3fe0,0x4400,0x8400,0x8400,0x8400,0x8400,0x8400,0xffc0,0x8400,0x8400,0x8400,0x8400, 0x8400,0x8400,0x87e0,0x0000,0x0000,0x0000,0x0000,0x0000, // u01fc 0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0000,0x7bc0,0x0420,0x0420,0x0420,0x7c20,0x87e0,0x8400,0x8400, 0x8400,0x8420,0x7bc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u01fd 0x0100,0x0200,0x0400,0x0000,0x1f00,0x2080,0x4060,0x4040,0x40c0,0x4140,0x4240,0x4440,0x4840,0x5040,0x6040,0x4040, 0xc040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01fe 0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0000,0x1f20,0x20c0,0x40c0,0x4140,0x4240,0x4440,0x4840,0x5040, 0x6040,0x6080,0x9f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u01ff 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4000,0x4000,0x4000,0x2000,0x1f00,0x0080,0x0040,0x0040,0x0040, 0x4040,0x2080,0x1f00,0x0000,0x0400,0x0400,0x0400,0x0800, // u0218 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x4040,0x4000,0x4000,0x4000,0x3f80,0x0040,0x0040, 0x0040,0x4040,0x3f80,0x0000,0x0400,0x0400,0x0400,0x0800, // u0219 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0400,0x0400,0x0400,0x0800, // u021a 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x3f80,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x03c0,0x0000,0x0100,0x0100,0x0100,0x0200, // u021b 0x0000,0x3f80,0x0000,0x0000,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0a00,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u0232 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x20c0,0x1f40,0x0040,0x0040,0x0080,0x3f00,0x0000, // u0233 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080, 0x0080,0x0080,0x0080,0x2080,0x2080,0x1100,0x0e00,0x0000, // u0237 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x0040,0x0040,0x0040,0x0040,0x0040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0254 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x7fc0,0x0040,0x0040, 0x0040,0x4080,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0258 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x4080,0x0040,0x0040,0x0040,0x7fc0,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0259 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x4040,0x4000,0x4000,0x4000,0x3e00,0x4000,0x4000, 0x4000,0x4040,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u025b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x4000,0x4000,0x4000,0x8000,0x0000, // u0272 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0040,0x0080,0x0100,0x0200,0x0400,0x0f00,0x0080, 0x0040,0x0040,0x0040,0x0040,0x4040,0x2080,0x1f00,0x0000, // u0292 0x0200,0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bb 0x0400,0x0400,0x0400,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bc 0x0400,0x0400,0x0400,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bd 0x0400,0x0a00,0x1100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02c6 0x1100,0x0a00,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02c7 0x2080,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02d8 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02d9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0400,0x0800,0x0800,0x0700,0x0000, // u02db 0x1880,0x2480,0x2300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02dc 0x0440,0x0880,0x1100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02dd 0x1000,0x0800,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0300 0x0100,0x0200,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0301 0x0400,0x0a00,0x1100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0302 0x1880,0x2480,0x2300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0303 0x0000,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0304 0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0305 0x2080,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0306 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0307 0x1100,0x1100,0x1100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0308 0x0e00,0x1100,0x1100,0x0e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030a 0x0440,0x0880,0x1100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030b 0x1100,0x0a00,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000, // u0329 0x0000,0x2000,0x4000,0x8000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0384 0x0100,0x0200,0x0400,0x0000,0x1100,0x1100,0x1100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0385 0x0000,0x2000,0x4000,0x8000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0386 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0387 0x0000,0x2000,0x4000,0x8000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0388 0x0000,0x2000,0x4000,0x8000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0389 0x0000,0x2000,0x4000,0x8000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u038a 0x0000,0x2000,0x4000,0x8000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u038c 0x0000,0x2000,0x4000,0x8000,0x2020,0x2020,0x1040,0x1040,0x0880,0x0880,0x0500,0x0500,0x0200,0x0200,0x0200,0x0200, 0x0200,0x0200,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000, // u038e 0x0000,0x2000,0x4000,0x8000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x2080, 0x1100,0x1100,0x71c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u038f 0x0100,0x0200,0x0400,0x0000,0x1100,0x1100,0x1100,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000, // u0390 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0391 0x0000,0x0000,0x0000,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4080,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4080,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0392 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0393 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0a00,0x0a00,0x0a00,0x1100,0x1100,0x1100,0x2080,0x2080,0x2080, 0x4040,0x4040,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0394 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0395 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0040,0x0040,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000, 0x4000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0396 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0397 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x5f40,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0398 0x0000,0x0000,0x0000,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0399 0x0000,0x0000,0x0000,0x0000,0x4040,0x4080,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x5000,0x4800,0x4400,0x4200, 0x4100,0x4080,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u039a 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0a00,0x0a00,0x0a00,0x1100,0x1100,0x1100,0x2080,0x2080,0x2080, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u039b 0x0000,0x0000,0x0000,0x0000,0x4020,0x6060,0x50a0,0x50a0,0x4920,0x4620,0x4620,0x4020,0x4020,0x4020,0x4020,0x4020, 0x4020,0x4020,0x4020,0x0000,0x0000,0x0000,0x0000,0x0000, // u039c 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x6040,0x5040,0x4840,0x4440,0x4240,0x4140,0x40c0,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u039d 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u039e 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u039f 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a0 0x0000,0x0000,0x0000,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4080,0x7f00,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a1 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x4000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0100,0x0200,0x0400,0x0800,0x1000, 0x2000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a3 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a4 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0a00,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a5 0x0000,0x0000,0x0000,0x0000,0x0400,0x1f00,0x2480,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440, 0x2480,0x1f00,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a6 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0400,0x0a00,0x1100,0x1100,0x2080, 0x2080,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a7 0x0000,0x0000,0x0000,0x0000,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x2480,0x1f00, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a8 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x2080, 0x1100,0x1100,0x71c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a9 0x1100,0x1100,0x1100,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03aa 0x1100,0x1100,0x1100,0x0000,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0a00,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ab 0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0000,0x1e60,0x21c0,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x21c0,0x1e60,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ac 0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0000,0x3f80,0x4040,0x4000,0x4000,0x4000,0x3e00,0x4000,0x4000, 0x4000,0x4040,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ad 0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0040,0x0040,0x0040,0x0040,0x0000, // u03ae 0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000, // u03af 0x0100,0x0200,0x0400,0x0000,0x1100,0x1100,0x1100,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e60,0x21c0,0x4080,0x4080,0x4080,0x4080,0x4080,0x4080, 0x4080,0x21c0,0x1e60,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b1 0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4080,0x4080,0x4080,0x4100,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4080,0x7f00,0x4000,0x4000,0x4000,0x4000,0x0000, // u03b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x2080,0x2080,0x2080,0x1100,0x1100, 0x0a00,0x0a00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0000, // u03b3 0x0000,0x0000,0x0000,0x0000,0x1f80,0x0800,0x0400,0x0200,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x4040,0x4000,0x4000,0x4000,0x3e00,0x4000,0x4000, 0x4000,0x4040,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b5 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x2000,0x4000,0x4000,0x4000, 0x4000,0x2000,0x1f80,0x0040,0x0040,0x0040,0x0180,0x0000, // u03b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0040,0x0040,0x0040,0x0040,0x0000, // u03b7 0x0000,0x0000,0x0000,0x0000,0x0f00,0x1080,0x2040,0x2040,0x2040,0x2040,0x2040,0x3fc0,0x2040,0x2040,0x2040,0x2040, 0x2040,0x1080,0x0f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2040,0x2080,0x2100,0x2200,0x2400,0x3800,0x2400,0x2200, 0x2100,0x2080,0x2040,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ba 0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x0800,0x0800,0x0400,0x0400,0x0a00,0x0a00,0x1100,0x1100,0x2080,0x2080, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u03bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x40c0,0x4140,0x7e40,0x4000,0x4000,0x4000,0x4000,0x0000, // u03bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00, 0x0a00,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u03bd 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x2000,0x4000,0x4000,0x4000,0x2000,0x1f80,0x2000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x2000,0x1f80,0x0040,0x0040,0x0040,0x0180,0x0000, // u03be 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x6080,0x5f00,0x4000,0x4000,0x4000,0x4000,0x0000, // u03c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x2000,0x1f80,0x0040,0x0040,0x0040,0x0180,0x0000, // u03c2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fe0,0x2100,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2380,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440, 0x4440,0x2480,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0000, // u03c6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0400, 0x0a00,0x1100,0x1100,0x2080,0x2080,0x4040,0x4040,0x0000, // u03c7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440, 0x4440,0x2480,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0000, // u03c8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x4040,0x4040,0x4040,0x4440,0x4440,0x4440,0x4440, 0x4440,0x4440,0x3b80,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c9 0x0000,0x0000,0x0000,0x0000,0x1100,0x1100,0x1100,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ca 0x0000,0x0000,0x0000,0x0000,0x1100,0x1100,0x1100,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03cb 0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03cc 0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03cd 0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0000,0x2080,0x4040,0x4040,0x4040,0x4440,0x4440,0x4440,0x4440, 0x4440,0x4440,0x3b80,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ce 0x0000,0x0000,0x0000,0x0000,0x0f00,0x1080,0x2040,0x2040,0x2040,0x1040,0x0fe0,0x0040,0x0040,0xe040,0x2040,0x2040, 0x2040,0x1080,0x0f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x1f00,0x2480,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440, 0x4440,0x2480,0x1f00,0x0400,0x0400,0x0000,0x0000,0x0000, // u03d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7020,0x0840,0x0480,0x0500,0x0200,0x0600,0x0400,0x0a00, 0x1200,0x2100,0x40e0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x6080,0x5f00,0x4000,0x4000,0x2000,0x1f80,0x0000, // u03f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f2 0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0380,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080, 0x0080,0x0080,0x0080,0x2080,0x2080,0x1100,0x0e00,0x0000, // u03f3 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x1000,0x2000,0x4000,0x4000,0x7f00,0x4000,0x4000, 0x2000,0x1000,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0100,0x0080,0x0040,0x0040,0x1fc0,0x0040,0x0040, 0x0080,0x0100,0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f6 0x1000,0x0800,0x0400,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0400 0x1100,0x1100,0x1100,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0401 0x0000,0x0000,0x0000,0x0000,0xf800,0x2000,0x2000,0x2000,0x2000,0x3f00,0x2080,0x2040,0x2040,0x2040,0x2040,0x2040, 0x2040,0x2080,0x2300,0x0000,0x0000,0x0000,0x0000,0x0000, // u0402 0x0100,0x0200,0x0400,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0403 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4000,0x4000,0x4000,0x4000, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0404 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4000,0x4000,0x4000,0x2000,0x1f00,0x0080,0x0040,0x0040,0x0040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0405 0x0000,0x0000,0x0000,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0406 0x1100,0x1100,0x1100,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0407 0x0000,0x0000,0x0000,0x0000,0x03e0,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x4080,0x4080, 0x4080,0x2100,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0408 0x0000,0x0000,0x0000,0x0000,0x3c00,0x4400,0x8400,0x8400,0x8400,0x8400,0x8780,0x8440,0x8420,0x8420,0x8420,0x8420, 0x8420,0x8440,0x8780,0x0000,0x0000,0x0000,0x0000,0x0000, // u0409 0x0000,0x0000,0x0000,0x0000,0x8400,0x8400,0x8400,0x8400,0x8400,0x8400,0x8780,0xfc40,0x8420,0x8420,0x8420,0x8420, 0x8420,0x8440,0x8780,0x0000,0x0000,0x0000,0x0000,0x0000, // u040a 0x0000,0x0000,0x0000,0x0000,0xf800,0x2000,0x2000,0x2000,0x2000,0x3f00,0x2080,0x2040,0x2040,0x2040,0x2040,0x2040, 0x2040,0x2040,0x2040,0x0000,0x0000,0x0000,0x0000,0x0000, // u040b 0x0100,0x0200,0x0400,0x0000,0x4040,0x4080,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x5000,0x4800,0x4400,0x4200, 0x4100,0x4080,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u040c 0x1000,0x0800,0x0400,0x0000,0x4040,0x4040,0x4040,0x4040,0x40c0,0x4140,0x4240,0x4440,0x4840,0x5040,0x6040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u040d 0x2080,0x2080,0x1f00,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x2040,0x1fc0,0x0040,0x0040,0x0040, 0x0040,0x0080,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u040e 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x7fc0,0x0400,0x0400,0x0400,0x0000,0x0000, // u040f 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0410 0x0000,0x0000,0x0000,0x0000,0x7f80,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4080,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0411 0x0000,0x0000,0x0000,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4080,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4080,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0412 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0413 0x0000,0x0000,0x0000,0x0000,0x07c0,0x0840,0x1040,0x1040,0x1040,0x1040,0x1040,0x1040,0x1040,0x1040,0x1040,0x1040, 0x1040,0x2040,0x7fe0,0x4020,0x4020,0x4020,0x0000,0x0000, // u0414 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0415 0x0000,0x0000,0x0000,0x0000,0x4440,0x4440,0x4440,0x4440,0x4440,0x2480,0x1500,0x0e00,0x1500,0x2480,0x4440,0x4440, 0x4440,0x4440,0x4440,0x0000,0x0000,0x0000,0x0000,0x0000, // u0416 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x0040,0x0040,0x0040,0x0080,0x0f00,0x0080,0x0040,0x0040,0x0040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0417 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x40c0,0x4140,0x4240,0x4440,0x4840,0x5040,0x6040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0418 0x2080,0x2080,0x1f00,0x0000,0x4040,0x4040,0x4040,0x4040,0x40c0,0x4140,0x4240,0x4440,0x4840,0x5040,0x6040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0419 0x0000,0x0000,0x0000,0x0000,0x4040,0x4080,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x5000,0x4800,0x4400,0x4200, 0x4100,0x4080,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u041a 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x1040,0x2040,0x2040,0x2040,0x2040,0x2040,0x2040,0x2040,0x2040,0x2040,0x2040, 0x2040,0x4040,0x8040,0x0000,0x0000,0x0000,0x0000,0x0000, // u041b 0x0000,0x0000,0x0000,0x0000,0x4020,0x6060,0x50a0,0x50a0,0x4920,0x4620,0x4620,0x4020,0x4020,0x4020,0x4020,0x4020, 0x4020,0x4020,0x4020,0x0000,0x0000,0x0000,0x0000,0x0000, // u041c 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u041d 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u041e 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u041f 0x0000,0x0000,0x0000,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4080,0x7f00,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0420 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0421 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u0422 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x2040,0x1fc0,0x0040,0x0040,0x0040, 0x0040,0x0080,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0423 0x0000,0x0000,0x0000,0x0400,0x1f00,0x2480,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440, 0x4440,0x2480,0x1f00,0x0400,0x0000,0x0000,0x0000,0x0000, // u0424 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0400,0x0a00,0x1100,0x1100,0x2080, 0x2080,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0425 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2040,0x1fe0,0x0020,0x0020,0x0020,0x0000,0x0000, // u0426 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x2040,0x1fc0,0x0040,0x0040,0x0040,0x0040, 0x0040,0x0040,0x0040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0427 0x0000,0x0000,0x0000,0x0000,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440, 0x4440,0x2440,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0428 0x0000,0x0000,0x0000,0x0000,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440, 0x4440,0x2440,0x1fe0,0x0020,0x0020,0x0020,0x0000,0x0000, // u0429 0x0000,0x0000,0x0000,0x0000,0xc000,0xc000,0x4000,0x4000,0x4000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4080,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u042a 0x0000,0x0000,0x0000,0x0000,0x4020,0x4020,0x4020,0x4020,0x4020,0x7c20,0x4220,0x4120,0x4120,0x4120,0x4120,0x4120, 0x4120,0x4220,0x7c20,0x0000,0x0000,0x0000,0x0000,0x0000, // u042b 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4080,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u042c 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x0040,0x0040,0x0040,0x0040,0x0fc0,0x0040,0x0040,0x0040,0x0040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u042d 0x0000,0x0000,0x0000,0x0000,0x43c0,0x4420,0x4420,0x4420,0x4420,0x4420,0x4420,0x7c20,0x4420,0x4420,0x4420,0x4420, 0x4420,0x4420,0x43c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u042e 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x2040,0x4040,0x4040,0x4040,0x4040,0x2040,0x1fc0,0x0140,0x0240,0x0440,0x0840, 0x1040,0x2040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u042f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x0080,0x0040,0x0040,0x1fc0,0x2040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0430 0x0000,0x0000,0x0000,0x0000,0x1f80,0x2000,0x4000,0x4000,0x4000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4080,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0431 0x0000,0x0000,0x0000,0x0000,0x3e00,0x4100,0x4080,0x4080,0x4080,0x4100,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4080,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0432 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0433 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x2040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x20c0,0x1f40,0x0040,0x0040,0x0080,0x3f00,0x0000, // u0434 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x7fc0,0x4000,0x4000, 0x4000,0x2040,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0435 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4440,0x4440,0x4440,0x2480,0x1500,0x0e00,0x1500,0x2480, 0x4440,0x4440,0x4440,0x0000,0x0000,0x0000,0x0000,0x0000, // u0436 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x4040,0x0040,0x0040,0x0040,0x0f80,0x0040,0x0040, 0x0040,0x4040,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0437 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0438 0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x1f00,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0439 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2040,0x2080,0x2100,0x2200,0x2400,0x3800,0x2400,0x2200, 0x2100,0x2080,0x2040,0x0000,0x0000,0x0000,0x0000,0x0000, // u043a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x1040,0x2040,0x2040,0x2040,0x2040,0x2040,0x2040, 0x2040,0x2040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u043b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x60c0,0x5140,0x4a40,0x4440,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u043c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u043d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u043e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u043f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4080,0x7f00,0x4000,0x4000,0x4000,0x4000,0x0000, // u0440 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0441 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u0442 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x20c0,0x1f40,0x0040,0x0040,0x0080,0x3f00,0x0000, // u0443 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x1f00,0x2480,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440, 0x4440,0x2480,0x1f00,0x0400,0x0400,0x0000,0x0000,0x0000, // u0444 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x2080,0x1100,0x0a00,0x0400,0x0a00,0x1100, 0x2080,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0445 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2040,0x1fe0,0x0020,0x0020,0x0020,0x0000,0x0000, // u0446 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x2040,0x1fc0,0x0040,0x0040, 0x0040,0x0040,0x0040,0x0000,0x0000,0x0000,0x0000,0x0000, // u0447 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440, 0x4440,0x2440,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0448 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440, 0x4440,0x2440,0x1fe0,0x0020,0x0020,0x0020,0x0000,0x0000, // u0449 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xe000,0x2000,0x2000,0x3f00,0x2080,0x2040,0x2040,0x2040, 0x2040,0x2080,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u044a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x7840,0x4440,0x4240,0x4240,0x4240, 0x4240,0x4440,0x7840,0x0000,0x0000,0x0000,0x0000,0x0000, // u044b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x3f00,0x2080,0x2040,0x2040,0x2040, 0x2040,0x2080,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u044c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x0040,0x0040,0x0fc0,0x0040,0x0040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u044d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x43c0,0x4420,0x4420,0x4420,0x4420,0x7c20,0x4420,0x4420, 0x4420,0x4420,0x43c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u044e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x4040,0x4040,0x4040,0x4040,0x3fc0,0x0240,0x0440, 0x0840,0x1040,0x2040,0x0000,0x0000,0x0000,0x0000,0x0000, // u044f 0x0000,0x0000,0x0000,0x0000,0x1000,0x0800,0x0400,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x7fc0,0x4000,0x4000, 0x4000,0x2040,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0450 0x0000,0x0000,0x0000,0x0000,0x1100,0x1100,0x1100,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x7fc0,0x4000,0x4000, 0x4000,0x2040,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0451 0x0000,0x0000,0x0000,0x0000,0x4000,0xfc00,0x4000,0x4000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0040,0x0040,0x0080,0x0300,0x0000, // u0452 0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0453 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4000,0x4000,0x7e00,0x4000,0x4000, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0454 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x4040,0x4000,0x4000,0x4000,0x3f80,0x0040,0x0040, 0x0040,0x4040,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0455 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0456 0x0000,0x0000,0x0000,0x0000,0x1100,0x1100,0x1100,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0457 0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0380,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080, 0x0080,0x0080,0x0080,0x2080,0x2080,0x1100,0x0e00,0x0000, // u0458 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x4400,0x8400,0x8780,0x8440,0x8420,0x8420,0x8420, 0x8420,0x8440,0x8780,0x0000,0x0000,0x0000,0x0000,0x0000, // u0459 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8400,0x8400,0x8400,0x8400,0x8780,0xfc40,0x8420,0x8420, 0x8420,0x8440,0x8780,0x0000,0x0000,0x0000,0x0000,0x0000, // u045a 0x0000,0x0000,0x0000,0x0000,0x4000,0xfc00,0x4000,0x4000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u045b 0x0000,0x0000,0x0000,0x0000,0x0100,0x0200,0x0400,0x0000,0x2040,0x2080,0x2100,0x2200,0x2400,0x3800,0x2400,0x2200, 0x2100,0x2080,0x2040,0x0000,0x0000,0x0000,0x0000,0x0000, // u045c 0x0000,0x0000,0x0000,0x0000,0x1000,0x0800,0x0400,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u045d 0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x1f00,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x20c0,0x1f40,0x0040,0x0040,0x0080,0x3f00,0x0000, // u045e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x7fc0,0x0400,0x0400,0x0400,0x0000,0x0000, // u045f 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0xfc00,0x4000,0x4000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4080,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0462 0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0xfc00,0x2000,0x2000,0x2000,0x3f00,0x2080,0x2040,0x2040,0x2040, 0x2040,0x2080,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0463 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0e00,0x1500,0x2480,0x4440,0x4440, 0x4440,0x4440,0x4440,0x0000,0x0000,0x0000,0x0000,0x0000, // u046a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x4040,0x2080,0x1100,0x0a00,0x0e00,0x1500,0x2480, 0x4440,0x4440,0x4440,0x0000,0x0000,0x0000,0x0000,0x0000, // u046b 0x0000,0x0040,0x0040,0x0040,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0490 0x0000,0x0000,0x0000,0x0000,0x0000,0x0040,0x0040,0x0040,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0491 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0xfc00,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0492 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0xfc00,0x4000,0x4000, 0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0493 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4080,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0040,0x0080,0x0100,0x0000,0x0000, // u0494 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x7e00,0x4100,0x4080, 0x4080,0x4080,0x4080,0x0080,0x0100,0x0200,0x0000,0x0000, // u0495 0x0000,0x0000,0x0000,0x0000,0x4440,0x4440,0x4440,0x4440,0x4440,0x2480,0x1500,0x0e00,0x1500,0x2480,0x4440,0x4440, 0x4440,0x4440,0x4460,0x0020,0x0020,0x0020,0x0000,0x0000, // u0496 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4440,0x4440,0x4440,0x2480,0x1500,0x0e00,0x1500,0x2480, 0x4440,0x4440,0x4460,0x0020,0x0020,0x0020,0x0000,0x0000, // u0497 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x0040,0x0040,0x0040,0x0080,0x0f00,0x0080,0x0040,0x0040,0x0040, 0x4040,0x2080,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0000, // u0498 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x4040,0x0040,0x0040,0x0040,0x0f80,0x0040,0x0040, 0x0040,0x4040,0x3f80,0x0400,0x0400,0x0400,0x0400,0x0000, // u0499 0x0000,0x0000,0x0000,0x0000,0x4040,0x4080,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x5000,0x4800,0x4400,0x4200, 0x4100,0x4080,0x4060,0x0020,0x0020,0x0020,0x0000,0x0000, // u049a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2040,0x2080,0x2100,0x2200,0x2400,0x3800,0x2400,0x2200, 0x2100,0x2080,0x2060,0x0020,0x0020,0x0020,0x0000,0x0000, // u049b 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4080,0x4100,0x5200,0x5400,0x5800,0x7000,0x5800,0x5400,0x5200,0x4100, 0x4080,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u049c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4080,0x5100,0x5200,0x5400,0x7800,0x5400,0x5200, 0x5100,0x4080,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u049d 0x0000,0x0000,0x0000,0x0000,0xc040,0xc080,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x5000,0x4800,0x4400,0x4200, 0x4100,0x4080,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xe040,0x2080,0x2100,0x2200,0x2400,0x3800,0x2400,0x2200, 0x2100,0x2080,0x2040,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a1 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4060,0x0020,0x0020,0x0020,0x0000,0x0000, // u04a2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040, 0x4040,0x4040,0x4060,0x0020,0x0020,0x0020,0x0000,0x0000, // u04a3 0x0000,0x0000,0x0000,0x0000,0x41f0,0x4100,0x4100,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100,0x4100,0x4100, 0x4100,0x4100,0x4100,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x41f0,0x4100,0x4100,0x4100,0x4100,0x7f00,0x4100,0x4100, 0x4100,0x4100,0x4100,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a5 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4040, 0x4040,0x2080,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0000, // u04aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4040,0x2080,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0000, // u04ab 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0a00,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x2080,0x2080,0x2080,0x1100,0x1100, 0x0a00,0x0a00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0000, // u04af 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0a00,0x0400,0x3f80,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u04b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x2080,0x2080,0x2080,0x1100,0x1100, 0x0a00,0x0a00,0x0400,0x3f80,0x0400,0x0400,0x0400,0x0000, // u04b1 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0400,0x0a00,0x1100,0x1100,0x2080, 0x2080,0x4040,0x4060,0x0020,0x0020,0x0020,0x0000,0x0000, // u04b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x2080,0x1100,0x0a00,0x0400,0x0a00,0x1100, 0x2080,0x4040,0x4060,0x0020,0x0020,0x0020,0x0000,0x0000, // u04b3 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x2040,0x1fc0,0x0040,0x0040,0x0040,0x0040, 0x0040,0x0040,0x0060,0x0020,0x0020,0x0020,0x0000,0x0000, // u04b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x2040,0x1fc0,0x0040,0x0040, 0x0040,0x0040,0x0060,0x0020,0x0020,0x0020,0x0000,0x0000, // u04b7 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4440,0x4440,0x2440,0x1fc0,0x0440,0x0440,0x0440,0x0040, 0x0040,0x0040,0x0040,0x0000,0x0000,0x0000,0x0000,0x0000, // u04b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4440,0x4440,0x2440,0x1fc0,0x0440,0x0440, 0x0440,0x0040,0x0040,0x0000,0x0000,0x0000,0x0000,0x0000, // u04b9 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4080,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u04bb 0x0000,0x0000,0x0000,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04c0 0x2080,0x2080,0x1f00,0x0000,0x4440,0x4440,0x4440,0x4440,0x4440,0x2480,0x1500,0x0e00,0x1500,0x2480,0x4440,0x4440, 0x4440,0x4440,0x4440,0x0000,0x0000,0x0000,0x0000,0x0000, // u04c1 0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x1f00,0x0000,0x4440,0x4440,0x4440,0x2480,0x1500,0x0e00,0x1500,0x2480, 0x4440,0x4440,0x4440,0x0000,0x0000,0x0000,0x0000,0x0000, // u04c2 0x0000,0x0000,0x0000,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04cf 0x2080,0x2080,0x1f00,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d0 0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x1f00,0x0000,0x3f00,0x0080,0x0040,0x0040,0x1fc0,0x2040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d1 0x1100,0x1100,0x1100,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d2 0x0000,0x0000,0x0000,0x0000,0x1100,0x1100,0x1100,0x0000,0x3f00,0x0080,0x0040,0x0040,0x1fc0,0x2040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d3 0x0000,0x0000,0x0000,0x0000,0x3fe0,0x4400,0x8400,0x8400,0x8400,0x8400,0x8400,0xffc0,0x8400,0x8400,0x8400,0x8400, 0x8400,0x8400,0x87e0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7bc0,0x0420,0x0420,0x0420,0x7c20,0x87e0,0x8400,0x8400, 0x8400,0x8420,0x7bc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d5 0x2080,0x2080,0x1f00,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d6 0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x1f00,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x7fc0,0x4000,0x4000, 0x4000,0x2040,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d7 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x0040,0x0040,0x0040,0x0040,0x7fc0,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x4080,0x0040,0x0040,0x0040,0x7fc0,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d9 0x1100,0x1100,0x1100,0x0000,0x1f00,0x2080,0x4040,0x0040,0x0040,0x0040,0x0040,0x7fc0,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04da 0x0000,0x0000,0x0000,0x0000,0x1100,0x1100,0x1100,0x0000,0x3f00,0x4080,0x0040,0x0040,0x0040,0x7fc0,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04db 0x1100,0x1100,0x1100,0x0000,0x4440,0x4440,0x4440,0x4440,0x4440,0x2480,0x1500,0x0e00,0x1500,0x2480,0x4440,0x4440, 0x4440,0x4440,0x4440,0x0000,0x0000,0x0000,0x0000,0x0000, // u04dc 0x0000,0x0000,0x0000,0x0000,0x1100,0x1100,0x1100,0x0000,0x4440,0x4440,0x4440,0x2480,0x1500,0x0e00,0x1500,0x2480, 0x4440,0x4440,0x4440,0x0000,0x0000,0x0000,0x0000,0x0000, // u04dd 0x1100,0x1100,0x1100,0x0000,0x1f00,0x2080,0x4040,0x0040,0x0040,0x0040,0x0080,0x0f00,0x0080,0x0040,0x0040,0x0040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04de 0x0000,0x0000,0x0000,0x0000,0x1100,0x1100,0x1100,0x0000,0x3f80,0x4040,0x0040,0x0040,0x0040,0x0f80,0x0040,0x0040, 0x0040,0x4040,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04df 0x0000,0x3f80,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x40c0,0x4140,0x4240,0x4440,0x4840,0x5040,0x6040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e2 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e3 0x1100,0x1100,0x1100,0x0000,0x4040,0x4040,0x4040,0x4040,0x40c0,0x4140,0x4240,0x4440,0x4840,0x5040,0x6040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e4 0x0000,0x0000,0x0000,0x0000,0x1100,0x1100,0x1100,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e5 0x1100,0x1100,0x1100,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e6 0x0000,0x0000,0x0000,0x0000,0x1100,0x1100,0x1100,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e7 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e9 0x1100,0x1100,0x1100,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ea 0x0000,0x0000,0x0000,0x0000,0x1100,0x1100,0x1100,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04eb 0x1100,0x1100,0x1100,0x0000,0x1f00,0x2080,0x4040,0x0040,0x0040,0x0040,0x0040,0x0fc0,0x0040,0x0040,0x0040,0x0040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ec 0x0000,0x0000,0x0000,0x0000,0x1100,0x1100,0x1100,0x0000,0x1f00,0x2080,0x4040,0x0040,0x0040,0x0fc0,0x0040,0x0040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ed 0x0000,0x3f80,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x2040,0x1fc0,0x0040,0x0040,0x0040, 0x0040,0x0080,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ee 0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x20c0,0x1f40,0x0040,0x0040,0x0080,0x3f00,0x0000, // u04ef 0x1100,0x1100,0x1100,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x2040,0x1fc0,0x0040,0x0040,0x0040, 0x0040,0x0080,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f0 0x0000,0x0000,0x0000,0x0000,0x1100,0x1100,0x1100,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x20c0,0x1f40,0x0040,0x0040,0x0080,0x3f00,0x0000, // u04f1 0x0440,0x0880,0x1100,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x2040,0x1fc0,0x0040,0x0040,0x0040, 0x0040,0x0080,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f2 0x0000,0x0000,0x0000,0x0000,0x0440,0x0880,0x1100,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x20c0,0x1f40,0x0040,0x0040,0x0080,0x3f00,0x0000, // u04f3 0x1100,0x1100,0x1100,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x2040,0x1fc0,0x0040,0x0040,0x0040,0x0040, 0x0040,0x0040,0x0040,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f4 0x0000,0x0000,0x0000,0x0000,0x1100,0x1100,0x1100,0x0000,0x4040,0x4040,0x4040,0x4040,0x2040,0x1fc0,0x0040,0x0040, 0x0040,0x0040,0x0040,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f5 0x1100,0x1100,0x1100,0x0000,0x4020,0x4020,0x4020,0x4020,0x4020,0x7c20,0x4220,0x4120,0x4120,0x4120,0x4120,0x4120, 0x4120,0x4220,0x7c20,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f8 0x0000,0x0000,0x0000,0x0000,0x1100,0x1100,0x1100,0x0000,0x4040,0x4040,0x4040,0x7840,0x4440,0x4240,0x4240,0x4240, 0x4240,0x4440,0x7840,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f9 0x0000,0x0000,0x0000,0x0000,0x2040,0x2040,0x1040,0x1040,0x0840,0x0840,0x1440,0x2480,0x4500,0x4200,0x4200,0x4100, 0x4100,0x4080,0x4080,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d0 0x0000,0x0000,0x0000,0x0000,0xfe00,0x0100,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080, 0x0080,0x0080,0xffe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d1 0x0000,0x0000,0x0000,0x0000,0x3c00,0x0200,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0300,0x0500,0x0880, 0x1080,0x2040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d2 0x0000,0x0000,0x0000,0x0000,0xffe0,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080, 0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d3 0x0000,0x0000,0x0000,0x0000,0x7f00,0x0080,0x0040,0x0040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d4 0x0000,0x0000,0x0000,0x0000,0x3000,0x0800,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d5 0x0000,0x0000,0x0000,0x0000,0x3f80,0x0100,0x0200,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d6 0x0000,0x0000,0x0000,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d7 0x0000,0x0000,0x0000,0x0000,0x4300,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d8 0x0000,0x0000,0x0000,0x0000,0x3000,0x0800,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d9 0x0000,0x0000,0x0000,0x0000,0x7f00,0x0080,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040, 0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0000, // u05da 0x0000,0x0000,0x0000,0x0000,0x7f00,0x0080,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040, 0x0040,0x0080,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u05db 0x0000,0x4000,0x4000,0x4000,0x7fc0,0x0040,0x0040,0x0040,0x0040,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000, // u05dc 0x0000,0x0000,0x0000,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u05dd 0x0000,0x0000,0x0000,0x0000,0xc780,0x2840,0x3020,0x2020,0x2020,0x2020,0x2020,0x2020,0x2020,0x2020,0x2020,0x2020, 0x2020,0x2020,0x21e0,0x0000,0x0000,0x0000,0x0000,0x0000, // u05de 0x0000,0x0000,0x0000,0x0000,0x7800,0x0400,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200, 0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0000, // u05df 0x0000,0x0000,0x0000,0x0000,0x3c00,0x0200,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0100,0x0100,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e0 0x0000,0x0000,0x0000,0x0000,0xff80,0x2040,0x2020,0x2020,0x2020,0x2020,0x2020,0x2020,0x2020,0x2020,0x2020,0x2020, 0x2020,0x1040,0x0f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e1 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x2040,0x2040,0x2040,0x1040,0x1080,0x1080,0x0900,0x0900,0x0600, 0x0c00,0x1800,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e2 0x0000,0x0000,0x0000,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x2040,0x1840,0x0040,0x0040,0x0040,0x0040, 0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0000, // u05e3 0x0000,0x0000,0x0000,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x2040,0x1840,0x0040,0x0040,0x0040,0x0040, 0x0040,0x0080,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e4 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x2040,0x2040,0x1040,0x1080,0x0900,0x0a00,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0000, // u05e5 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x2040,0x2040,0x1040,0x1080,0x0900,0x0a00,0x0400,0x0200,0x0200,0x0100, 0x0100,0x0080,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e6 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0040,0x0040,0x0040,0x4040,0x4040,0x4080,0x4100,0x4200,0x4400,0x4800,0x4800, 0x4800,0x4800,0x4800,0x4000,0x4000,0x4000,0x4000,0x0000, // u05e7 0x0000,0x0000,0x0000,0x0000,0x7f00,0x0080,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040, 0x0040,0x0040,0x0040,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e8 0x0000,0x0000,0x0000,0x0000,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440,0x4840,0x7040,0x4040,0x4040,0x4040, 0x4040,0x4080,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e9 0x0000,0x0000,0x0000,0x0000,0xff80,0x2040,0x2020,0x2020,0x2020,0x2020,0x2020,0x2020,0x2020,0x2020,0x2020,0x2020, 0x2020,0x2020,0xc020,0x0000,0x0000,0x0000,0x0000,0x0000, // u05ea 0x0000,0x0000,0x0000,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4080,0x7f00,0x0000,0x0800,0x0800,0x0800,0x0000, // u1e0c 0x0000,0x0000,0x0000,0x0000,0x0040,0x0040,0x0040,0x0040,0x1fc0,0x2040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0200,0x0200,0x0200,0x0000, // u1e0d 0x0000,0x0000,0x0000,0x0000,0x4040,0x4080,0x4100,0x4200,0x4400,0x4800,0x5000,0x6000,0x5000,0x4800,0x4400,0x4200, 0x4100,0x4080,0x4040,0x0000,0x0000,0x3f80,0x0000,0x0000, // u1e34 0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x2000,0x2040,0x2080,0x2100,0x2200,0x2400,0x3800,0x2400,0x2200, 0x2100,0x2080,0x2040,0x0000,0x0000,0x1f80,0x0000,0x0000, // u1e35 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x7fc0,0x0000,0x0400,0x0400,0x0400,0x0000, // u1e36 0x0000,0x0000,0x0000,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0400,0x0400,0x0400,0x0000, // u1e37 0x0400,0x0400,0x0400,0x0000,0x4020,0x6060,0x50a0,0x50a0,0x4920,0x4620,0x4620,0x4020,0x4020,0x4020,0x4020,0x4020, 0x4020,0x4020,0x4020,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e40 0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0000,0x7f00,0x4480,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440, 0x4440,0x4440,0x4440,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e41 0x0000,0x0000,0x0000,0x0000,0x4020,0x6060,0x50a0,0x50a0,0x4920,0x4620,0x4620,0x4020,0x4020,0x4020,0x4020,0x4020, 0x4020,0x4020,0x4020,0x0000,0x0400,0x0400,0x0400,0x0000, // u1e42 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x4480,0x4440,0x4440,0x4440,0x4440,0x4440,0x4440, 0x4440,0x4440,0x4440,0x0000,0x0400,0x0400,0x0400,0x0000, // u1e43 0x0400,0x0400,0x0400,0x0000,0x4040,0x4040,0x4040,0x4040,0x6040,0x5040,0x4840,0x4440,0x4240,0x4140,0x40c0,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e44 0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e45 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x6040,0x5040,0x4840,0x4440,0x4240,0x4140,0x40c0,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0400,0x0400,0x0400,0x0000, // u1e46 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0400,0x0400,0x0400,0x0000, // u1e47 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0400,0x0400,0x0400,0x0000, // u1e6c 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x3f80,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x03c0,0x0000,0x0100,0x0100,0x0100,0x0000, // u1e6d 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x7fc0,0x0000,0x0400,0x0400,0x0400,0x0000, // u1eb8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x7fc0,0x4000,0x4000, 0x4000,0x2040,0x1f80,0x0000,0x0400,0x0400,0x0400,0x0000, // u1eb9 0x1880,0x2480,0x2300,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4000,0x4000,0x4000,0x4000, 0x4000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u1ebc 0x0000,0x0000,0x0000,0x0000,0x1880,0x2480,0x2300,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x7fc0,0x4000,0x4000, 0x4000,0x2040,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u1ebd 0x0000,0x0000,0x0000,0x0000,0x1f00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0400,0x0400,0x0400,0x0000, // u1eca 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x1c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0400,0x0400,0x0400,0x0000, // u1ecb 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0400,0x0400,0x0400,0x0000, // u1ecc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0400,0x0400,0x0400,0x0000, // u1ecd 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0400,0x0400,0x0400,0x0000, // u1ee4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2040,0x1fc0,0x0000,0x0200,0x0200,0x0200,0x0000, // u1ee5 0x1880,0x2480,0x2300,0x0000,0x4040,0x4040,0x2080,0x2080,0x1100,0x1100,0x0a00,0x0a00,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u1ef8 0x0000,0x0000,0x0000,0x0000,0x1880,0x2480,0x2300,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x20c0,0x1f40,0x0040,0x0040,0x0080,0x3f00,0x0000, // u1ef9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2001 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2002 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2003 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2004 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2005 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2006 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2007 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2008 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2009 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2010 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2011 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2012 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2013 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2014 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2015 0x0000,0x0000,0x0000,0x0000,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900, 0x0900,0x0900,0x0900,0x0000,0x0000,0x0000,0x0000,0x0000, // u2016 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0000,0x0000,0x7fc0, // u2017 0x0000,0x0000,0x0200,0x0400,0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2018 0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2019 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400, 0x0400,0x0400,0x0400,0x0800,0x0000,0x0000,0x0000,0x0000, // u201a 0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201b 0x0000,0x0000,0x0440,0x0880,0x0880,0x0880,0x0880,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201c 0x0000,0x0000,0x1100,0x1100,0x1100,0x1100,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0880, 0x0880,0x0880,0x0880,0x1100,0x0000,0x0000,0x0000,0x0000, // u201e 0x0000,0x0000,0x1100,0x1100,0x1100,0x1100,0x0880,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201f 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x7fc0,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2020 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x7fc0,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x7fc0, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2021 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f00,0x1f80,0x1f80,0x1f80,0x1f80,0x0f00,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2022 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x4440,0x4440,0x4440,0x0000,0x0000,0x0000,0x0000,0x0000, // u2026 0x0000,0x0000,0x0000,0x0000,0x0000,0x3100,0x4900,0x4a00,0x3200,0x0400,0x0400,0x0800,0x0800,0x1000,0x1000,0x26c0, 0x2920,0x4920,0x46c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2030 0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2032 0x0000,0x0000,0x1100,0x1100,0x1100,0x1100,0x1100,0x1100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2033 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x0800,0x0400, 0x0200,0x0100,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000, // u2039 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x0800,0x0400,0x0200,0x0100,0x0080,0x0100,0x0200, 0x0400,0x0800,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000, // u203a 0x0000,0x0000,0x0000,0x0000,0x1100,0x1100,0x1100,0x1100,0x1100,0x1100,0x1100,0x1100,0x1100,0x1100,0x0000,0x0000, 0x1100,0x1100,0x1100,0x0000,0x0000,0x0000,0x0000,0x0000, // u203c 0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u203e 0x0000,0x0000,0x0f00,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x0f00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2070 0x0000,0x0400,0x0400,0x0000,0x0c00,0x0400,0x0400,0x0400,0x0400,0x0400,0x0e00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2071 0x0000,0x0000,0x0080,0x0180,0x0280,0x0480,0x0880,0x1080,0x1f80,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2074 0x0000,0x0000,0x1f00,0x1000,0x1000,0x1000,0x1f00,0x0080,0x0080,0x0080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2075 0x0000,0x0000,0x0f00,0x1000,0x1000,0x1000,0x1f00,0x1080,0x1080,0x1080,0x0f00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2076 0x0000,0x0000,0x1f80,0x1080,0x0080,0x0100,0x0100,0x0200,0x0200,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2077 0x0000,0x0000,0x0f00,0x1080,0x1080,0x1080,0x0f00,0x1080,0x1080,0x1080,0x0f00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2078 0x0000,0x0000,0x0f00,0x1080,0x1080,0x1080,0x0f80,0x0080,0x0080,0x0080,0x0f00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2079 0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x3f80,0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207b 0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000,0x0000,0x0000,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207c 0x0000,0x0000,0x0200,0x0400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0400,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207d 0x0000,0x0000,0x0800,0x0400,0x0200,0x0200,0x0200,0x0200,0x0200,0x0400,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207e 0x0000,0x0000,0x0000,0x1f00,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f00,0x1080,0x1080,0x1080, 0x1080,0x1080,0x1080,0x1080,0x0f00,0x0000,0x0000,0x0000, // u2080 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0c00,0x1400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000, // u2081 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f00,0x1080,0x1080,0x0080, 0x0100,0x0200,0x0400,0x0800,0x1f80,0x0000,0x0000,0x0000, // u2082 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f00,0x1080,0x0080,0x0080, 0x0700,0x0080,0x0080,0x1080,0x0f00,0x0000,0x0000,0x0000, // u2083 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0180,0x0280,0x0480, 0x0880,0x1080,0x1f80,0x0080,0x0080,0x0000,0x0000,0x0000, // u2084 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x1000,0x1000,0x1000, 0x1f00,0x0080,0x0080,0x0080,0x1f00,0x0000,0x0000,0x0000, // u2085 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f00,0x1000,0x1000,0x1000, 0x1f00,0x1080,0x1080,0x1080,0x0f00,0x0000,0x0000,0x0000, // u2086 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x1080,0x0080,0x0100, 0x0100,0x0200,0x0200,0x0400,0x0400,0x0000,0x0000,0x0000, // u2087 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f00,0x1080,0x1080,0x1080, 0x0f00,0x1080,0x1080,0x1080,0x0f00,0x0000,0x0000,0x0000, // u2088 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f00,0x1080,0x1080,0x1080, 0x0f80,0x0080,0x0080,0x0080,0x0f00,0x0000,0x0000,0x0000, // u2089 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400, 0x3f80,0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000, // u208a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u208b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0000, 0x0000,0x0000,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u208c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0200,0x0400,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0400,0x0200,0x0000,0x0000,0x0000, // u208d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0400,0x0200,0x0200, 0x0200,0x0200,0x0200,0x0400,0x0800,0x0000,0x0000,0x0000, // u208e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f00,0x0080,0x0080, 0x0f80,0x1080,0x1080,0x1080,0x0f80,0x0000,0x0000,0x0000, // u2090 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f00,0x1080,0x1080, 0x1f80,0x1000,0x1000,0x1080,0x0f00,0x0000,0x0000,0x0000, // u2091 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f00,0x1080,0x1080, 0x1080,0x1080,0x1080,0x1080,0x0f00,0x0000,0x0000,0x0000, // u2092 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1080,0x1080,0x0900, 0x0600,0x0600,0x0900,0x1080,0x1080,0x0000,0x0000,0x0000, // u2093 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f00,0x1080,0x0080, 0x0080,0x1f80,0x1080,0x1080,0x0f00,0x0000,0x0000,0x0000, // u2094 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x1000,0x1f00,0x1080,0x1080, 0x1080,0x1080,0x1080,0x1080,0x1080,0x0000,0x0000,0x0000, // u2095 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1000,0x1000,0x1080,0x1100,0x1200, 0x1400,0x1c00,0x1200,0x1100,0x1080,0x0000,0x0000,0x0000, // u2096 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0e00,0x0000,0x0000,0x0000, // u2097 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x4440,0x4440, 0x4440,0x4440,0x4440,0x4440,0x4440,0x0000,0x0000,0x0000, // u2098 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x1080,0x1080, 0x1080,0x1080,0x1080,0x1080,0x1f00,0x1000,0x1000,0x1000, // u209a 0x0000,0x0000,0x0000,0x0000,0x7c00,0x4200,0x4100,0x4100,0x4100,0x4100,0x4200,0x7c80,0x4080,0x43e0,0x4080,0x4080, 0x4080,0x4080,0x4060,0x0000,0x0000,0x0000,0x0000,0x0000, // u20a7 0x0000,0x0000,0x0000,0x0000,0x7c20,0x4220,0x4120,0x4120,0x4920,0x4920,0x4920,0x4920,0x4920,0x4920,0x4920,0x4820, 0x4820,0x4840,0x4f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u20aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0f00,0x1080,0x2040,0x4000,0x4000,0xfe00,0x4000,0x4000,0xfe00,0x4000,0x4000, 0x2040,0x1080,0x0f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u20ac 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0400,0x0400,0x0400,0x0580,0x0600,0x0c00,0x3580,0x0600,0x0c00,0x3400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u20ae 0x0000,0x0000,0x0000,0x0000,0x1f00,0x3080,0x5040,0x5040,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5040, 0x5040,0x3080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2102 0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u210e 0x0000,0x0000,0x0000,0x0000,0x4000,0xfc00,0x4000,0x4000,0x7f00,0x4080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u210f 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x6040,0x5040,0x6840,0x5440,0x4a40,0x4540,0x42c0,0x4140,0x40c0, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u2115 0x0000,0x0000,0x0000,0x0000,0x8200,0x8260,0xc290,0xc290,0xa260,0xa200,0x9200,0x9200,0x8a00,0x8af0,0x8600,0x8600, 0x82f0,0x8200,0x8200,0x0000,0x0000,0x0000,0x0000,0x0000, // u2116 0x0000,0x0000,0x0000,0x0000,0x1f00,0x3080,0x5040,0x5040,0x5040,0x5040,0x5040,0x5040,0x5040,0x5040,0x5040,0x5040, 0x5440,0x3280,0x1f00,0x0080,0x0040,0x0000,0x0000,0x0000, // u211a 0x0000,0x0000,0x0000,0x0000,0x7f00,0x5080,0x5040,0x5040,0x5040,0x5040,0x5080,0x5f00,0x5400,0x5a00,0x5500,0x5280, 0x5140,0x50a0,0x7060,0x0000,0x0000,0x0000,0x0000,0x0000, // u211d 0x0000,0x0000,0x0000,0x0000,0xfa20,0x2360,0x22a0,0x2220,0x2220,0x2220,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2122 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0040,0x0040,0x00c0,0x0140,0x0280,0x0500,0x0a00,0x1400,0x2800,0x5000,0x6000, 0x4000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2124 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x2080, 0x1100,0x1100,0x71c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2126 0x0000,0x0000,0x0000,0x0000,0x2100,0x2100,0x1080,0x1080,0x0840,0x0820,0x1440,0x2480,0x4500,0x4200,0x4200,0x4100, 0x4100,0x2080,0x1080,0x0000,0x0000,0x0000,0x0000,0x0000, // u2135 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1000,0x2000,0x4000,0xffe0,0x4000,0x2000,0x1000,0x0800, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2190 0x0000,0x0000,0x0000,0x0000,0x0400,0x0e00,0x1500,0x2480,0x4440,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2191 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0200,0x0100,0x0080,0x0040,0xffe0,0x0040,0x0080,0x0100,0x0200, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2192 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x4440,0x2480, 0x1500,0x0e00,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2193 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0900,0x1080,0x2040,0x4020,0xfff0,0x4020,0x2040,0x1080,0x0900, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2194 0x0000,0x0000,0x0000,0x0000,0x0400,0x0e00,0x1500,0x2480,0x4440,0x0400,0x0400,0x0400,0x0400,0x0400,0x4440,0x2480, 0x1500,0x0e00,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2195 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0820,0x1020,0x2020,0x4020,0xffe0,0x4020,0x2020,0x1020,0x0820, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8200,0x8100,0x8080,0x8040,0xffe0,0x8040,0x8080,0x8100,0x8200, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a6 0x0000,0x0000,0x0000,0x0000,0x0400,0x0e00,0x1500,0x2480,0x4440,0x0400,0x0400,0x0400,0x0400,0x4440,0x2480,0x1500, 0x0e00,0x0400,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a8 0x0000,0x0000,0x0000,0x0000,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0820,0x1020,0x2020,0x4020,0xffe0,0x4000, 0x2000,0x1000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000, // u21b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7800,0x1800,0x2880,0x4840,0x4840,0x4040,0x4040,0x4040,0x4040,0x2080, 0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x2000,0x4000,0xffe0,0x0000,0x0000,0xffe0,0x0040,0x0080, 0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21cb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0080,0x0040,0xffe0,0x0000,0x0000,0xffe0,0x4000,0x2000, 0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21cc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1000,0x2000,0x7fe0,0xc000,0xc000,0x7fe0,0x2000,0x1000, 0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d0 0x0000,0x0000,0x0000,0x0000,0x0600,0x0f00,0x1980,0x2940,0x4920,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900, 0x0900,0x0900,0x0900,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0200,0x0100,0x0080,0xffc0,0x0060,0x0060,0xffc0,0x0080,0x0100, 0x0200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d2 0x0000,0x0000,0x0000,0x0000,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x4920,0x2940, 0x1980,0x0f00,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0900,0x1080,0x2040,0x7fe0,0xc030,0xc030,0x7fe0,0x2040,0x1080, 0x0900,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d4 0x0000,0x0000,0x0000,0x0000,0x0600,0x0f00,0x1980,0x2940,0x4920,0x0900,0x0900,0x0900,0x0900,0x0900,0x4920,0x2940, 0x1980,0x0f00,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d5 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x2080,0x3f80,0x2080,0x1100,0x1100,0x1100,0x0a00,0x0a00,0x0a00, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2200 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x7fc0,0x0040,0x0040,0x0040,0x0040, 0x0040,0x0040,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2203 0x0000,0x0000,0x0040,0x0040,0x7fc0,0x00c0,0x0140,0x0140,0x0240,0x0240,0x0440,0x7fc0,0x0440,0x0840,0x0840,0x1040, 0x1040,0x2040,0x7fc0,0x4000,0x4000,0x0000,0x0000,0x0000, // u2204 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x1f40,0x2080,0x4140,0x4240,0x4440,0x4840,0x5040,0x2080,0x5f00, 0x8000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2205 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0a00,0x0a00,0x0a00,0x1100,0x1100,0x1100,0x2080,0x2080,0x2080, 0x4040,0x4040,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2206 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x4040,0x4040,0x2080,0x2080,0x2080,0x1100,0x1100,0x1100,0x0a00,0x0a00,0x0a00, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2207 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x1000,0x2000,0x4000,0x4000,0x4000,0x4000,0x7fc0,0x4000,0x4000,0x4000,0x4000, 0x2000,0x1000,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2208 0x0000,0x0000,0x0020,0x0020,0x0fc0,0x1040,0x2080,0x4080,0x4100,0x4100,0x4200,0x7fc0,0x4400,0x4800,0x4800,0x5000, 0x3000,0x3000,0x2fc0,0x4000,0x4000,0x0000,0x0000,0x0000, // u2209 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x1000,0x2000,0x4000,0x4000,0x7fc0,0x4000,0x4000,0x2000,0x1000, 0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u220a 0x0000,0x0000,0x0000,0x0000,0x7e00,0x0100,0x0080,0x0040,0x0040,0x0040,0x0040,0x7fc0,0x0040,0x0040,0x0040,0x0040, 0x0080,0x0100,0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000, // u220b 0x0000,0x0000,0x4000,0x4000,0x3f00,0x2080,0x1040,0x1020,0x0820,0x0820,0x0420,0x3fe0,0x0220,0x0120,0x0120,0x00a0, 0x00c0,0x00c0,0x3f40,0x0020,0x0020,0x0000,0x0000,0x0000, // u220c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0100,0x0080,0x0040,0x0040,0x7fc0,0x0040,0x0040,0x0080,0x0100, 0x7e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u220d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2212 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x7fc0,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2213 0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x7fc0,0x0400, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2214 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2215 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0100,0x0080,0x0040, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2216 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0f00,0x0f00,0x0600,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2219 0x0000,0x0000,0x00e0,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x4080,0x4080,0x4080,0x2080,0x1080,0x0880, 0x0480,0x0280,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000, // u221a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3b80,0x4440,0x4440,0x4440,0x4440,0x4440,0x3b80,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u221e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7fc0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u221f 0x0000,0x0000,0x0000,0x0000,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900, 0x0900,0x0900,0x0900,0x0000,0x0000,0x0000,0x0000,0x0000, // u2225 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0a00,0x0a00,0x1100,0x1100,0x2080,0x2080, 0x2080,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u2227 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x2080,0x2080,0x2080,0x1100,0x1100,0x0a00, 0x0a00,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2228 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u2229 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u222a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3840,0x4440,0x4380,0x0000,0x3840,0x4440,0x4380,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2248 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0040,0x7fc0,0x0100,0x0200,0x0400,0x0800,0x1000,0x7fc0,0x4000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2260 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000, 0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2261 0x0000,0x0000,0x0000,0x0000,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0100, 0x0080,0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2264 0x0000,0x0000,0x0000,0x0000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0100,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000, 0x2000,0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2265 0x0000,0x0000,0x0000,0x0000,0x0000,0x0220,0x0440,0x0880,0x1100,0x2200,0x4400,0x8800,0x4400,0x2200,0x1100,0x0880, 0x0440,0x0220,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u226a 0x0000,0x0000,0x0000,0x0000,0x0000,0x8800,0x4400,0x2200,0x1100,0x0880,0x0440,0x0220,0x0440,0x0880,0x1100,0x2200, 0x4400,0x8800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u226b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0x1000,0x2000,0x4000,0x4000,0x4000,0x4000,0x4000,0x2000,0x1000, 0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2282 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0080,0x0040,0x0020,0x0020,0x0020,0x0020,0x0020,0x0040,0x0080, 0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2283 0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0x1000,0x2000,0x4000,0x4000,0x4000,0x4000,0x4000,0x2000,0x1000,0x0fe0, 0x0000,0x0000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2286 0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0080,0x0040,0x0020,0x0020,0x0020,0x0020,0x0020,0x0040,0x0080,0x7f00, 0x0000,0x0000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2287 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u22a5 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u22c2 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u22c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x1f40,0x2080,0x4140,0x4240,0x4440,0x4840,0x5040,0x2080,0x5f00, 0x8000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2300 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0900,0x1080,0x2040,0x4020,0x4020,0x4020,0x4020,0x4020, 0x4020,0x4020,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2302 0x0000,0x0000,0x0000,0x0000,0x0f00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000, // u2308 0x0000,0x0000,0x0000,0x0000,0x0f00,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000, // u2309 0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u230a 0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100,0x0100, 0x0100,0x0100,0x0f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u230b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2310 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7fc0,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2319 0x0000,0x0000,0x0000,0x0000,0x0380,0x0440,0x0440,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2320 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x4400,0x4400,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000, // u2321 0x0040,0x0080,0x0100,0x0200,0x0200,0x0400,0x0400,0x0800,0x0800,0x0800,0x1000,0x1000,0x1000,0x1000,0x2000,0x2000, 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u239b 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u239c 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x1000,0x1000,0x1000,0x1000,0x0800,0x0800, 0x0800,0x0400,0x0400,0x0200,0x0200,0x0100,0x0080,0x0040, // u239d 0x2000,0x1000,0x0800,0x0400,0x0400,0x0200,0x0200,0x0100,0x0100,0x0100,0x0080,0x0080,0x0080,0x0080,0x0040,0x0040, 0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040, // u239e 0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040, 0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040, // u239f 0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0080,0x0080,0x0080,0x0080,0x0100,0x0100, 0x0100,0x0200,0x0200,0x0400,0x0400,0x0800,0x1000,0x2000, // u23a0 0x3fc0,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u23a1 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, // u23a2 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, 0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x3fc0, // u23a3 0x3fc0,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040, 0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040, // u23a4 0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040, 0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040, // u23a5 0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040, 0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x3fc0, // u23a6 0x01e0,0x0600,0x0400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, // u23a7 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x1000,0xe000,0xe000,0x1000,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, // u23a8 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800, 0x0800,0x0800,0x0800,0x0800,0x0800,0x0400,0x0600,0x01e0, // u23a9 0xf000,0x0c00,0x0400,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200, 0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200, // u23ab 0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0100,0x00e0,0x00e0,0x0100,0x0200,0x0200, 0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200, // u23ac 0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200, 0x0200,0x0200,0x0200,0x0200,0x0200,0x0400,0x0c00,0xf000, // u23ad 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u23ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23af 0xfff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0xfff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0, // u23bd 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u23d0 0x0000,0x0000,0x0000,0x4400,0x4400,0x4400,0x7c00,0x4400,0x4400,0x4400,0x0000,0x0000,0x07c0,0x0100,0x0100,0x0100, 0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000, // u2409 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7c00,0x0000,0x0000,0x07c0,0x0400,0x0400,0x0700, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u240a 0x0000,0x0000,0x0000,0x4400,0x4400,0x4400,0x2800,0x2800,0x1000,0x1000,0x0000,0x0000,0x07c0,0x0100,0x0100,0x0100, 0x0100,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000, // u240b 0x0000,0x0000,0x0000,0x7c00,0x4000,0x4000,0x7000,0x4000,0x4000,0x4000,0x0000,0x0000,0x07c0,0x0400,0x0400,0x0700, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u240c 0x0000,0x0000,0x0000,0x3800,0x4400,0x4000,0x4000,0x4000,0x4400,0x3800,0x0000,0x0000,0x0780,0x0440,0x0440,0x0780, 0x0500,0x0480,0x0440,0x0000,0x0000,0x0000,0x0000,0x0000, // u240d 0x0000,0x0000,0x0000,0x4400,0x4400,0x6400,0x5400,0x4c00,0x4400,0x4400,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x07c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2424 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2500 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2501 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2502 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2503 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xdb60,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2508 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xdb60,0xdb60,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2509 0x0400,0x0400,0x0400,0x0400,0x0400,0x0000,0x0400,0x0400,0x0400,0x0400,0x0400,0x0000,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0000,0x0400,0x0400,0x0400,0x0400,0x0400,0x0000, // u250a 0x0600,0x0600,0x0600,0x0600,0x0600,0x0000,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0000,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000, // u250b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07f0,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u250c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07f0,0x07f0,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u250d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07f0,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u250e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07f0,0x07f0,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u250f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2510 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2511 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2512 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xfe00,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2513 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x07f0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2514 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x07f0,0x07f0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2515 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x07f0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2516 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x07f0,0x07f0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2517 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfc00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2518 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfc00,0xfc00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2519 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfe00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u251a 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfe00,0xfe00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u251b 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x07f0,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u251c 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x07f0,0x07f0,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u251d 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x07f0,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u251e 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x07f0,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u251f 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x07f0,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2520 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x07f0,0x07f0,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2521 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x07f0,0x07f0,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2522 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x07f0,0x07f0,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2523 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfc00,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2524 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfc00,0xfc00,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2525 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfe00,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2526 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfe00,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2527 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfe00,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2528 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfe00,0xfe00,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2529 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfe00,0xfe00,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u252a 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfe00,0xfe00,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u252b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u252c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfc00,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u252d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0x07f0,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u252e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff0,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u252f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2530 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfe00,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2531 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0x07f0,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2532 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff0,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2533 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfff0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2534 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfff0,0xfc00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2535 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfff0,0x07f0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2536 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfff0,0xfff0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2537 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfff0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2538 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfff0,0xfe00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2539 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfff0,0x07f0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u253a 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfff0,0xfff0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u253b 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfff0,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u253c 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfff0,0xfc00,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u253d 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfff0,0x07f0,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u253e 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfff0,0xfff0,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u253f 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfff0,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2540 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfff0,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2541 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfff0,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2542 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfff0,0xfc00,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2543 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfff0,0x07f0,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2544 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfff0,0xfe00,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2545 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfff0,0x07f0,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2546 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfff0,0xfff0,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2547 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfff0,0xfff0,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2548 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfff0,0xfe00,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2549 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfff0,0x07f0,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u254a 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfff0,0xfff0,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u254b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0x0000,0x0000,0xfff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2550 0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900, 0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900, // u2551 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07f0,0x0400,0x0400,0x07f0,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2552 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x0900,0x0900,0x0900,0x0900, 0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900, // u2553 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x0800,0x0800,0x09f0,0x0900,0x0900, 0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900, // u2554 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0x0400,0x0400,0xfc00,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2555 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x0900,0x0900,0x0900,0x0900, 0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900, // u2556 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x0100,0x0100,0xf900,0x0900,0x0900, 0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900, // u2557 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x07f0,0x0400,0x0400,0x07f0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2558 0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0ff0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2559 0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x09f0,0x0800,0x0800,0x0ff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255a 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfc00,0x0400,0x0400,0xfc00,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255b 0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0xff00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255c 0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0xf900,0x0100,0x0100,0xff00,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255d 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x07f0,0x0400,0x0400,0x07f0,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u255e 0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x09f0,0x0900,0x0900,0x0900,0x0900, 0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900, // u255f 0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x09f0,0x0800,0x0800,0x09f0,0x0900,0x0900, 0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900, // u2560 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfc00,0x0400,0x0400,0xfc00,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2561 0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0xf900,0x0900,0x0900,0x0900,0x0900, 0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900, // u2562 0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0xf900,0x0100,0x0100,0xf900,0x0900,0x0900, 0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900, // u2563 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0x0000,0x0000,0xfff0,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2564 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0x0900,0x0900,0x0900,0x0900, 0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900, // u2565 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0x0000,0x0000,0xf9f0,0x0900,0x0900, 0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900, // u2566 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfff0,0x0000,0x0000,0xfff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2567 0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0xfff0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2568 0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0xf9f0,0x0000,0x0000,0xfff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2569 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0xfff0,0x0400,0x0400,0xfff0,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u256a 0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0xfff0,0x0900,0x0900,0x0900,0x0900, 0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900, // u256b 0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0xf9f0,0x0000,0x0000,0xf9f0,0x0900,0x0900, 0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900,0x0900, // u256c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x0180,0x0200,0x0200,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u256d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0x3000,0x0800,0x0800,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u256e 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0800,0x0800,0x3000,0xc000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u256f 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0200,0x0200,0x0180,0x0070,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2570 0x0010,0x0010,0x0020,0x0020,0x0040,0x0040,0x0080,0x0080,0x0100,0x0100,0x0200,0x0200,0x0400,0x0400,0x0800,0x0800, 0x1000,0x1000,0x2000,0x2000,0x4000,0x4000,0x8000,0x8000, // u2571 0x8000,0x8000,0x4000,0x4000,0x2000,0x2000,0x1000,0x1000,0x0800,0x0800,0x0400,0x0400,0x0200,0x0200,0x0100,0x0100, 0x0080,0x0080,0x0040,0x0040,0x0020,0x0020,0x0010,0x0010, // u2572 0x8010,0x8010,0x4020,0x4020,0x2040,0x2040,0x1080,0x1080,0x0900,0x0900,0x0600,0x0600,0x0600,0x0600,0x0900,0x0900, 0x1080,0x1080,0x2040,0x2040,0x4020,0x4020,0x8010,0x8010, // u2573 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2574 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2575 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07f0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2576 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u2577 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2578 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2579 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07f0,0x07f0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u257b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0x07f0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257c 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u257d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfc00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257e 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0400,0x0400,0x0400,0x0400, 0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400, // u257f 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2580 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff0,0xfff0, // u2581 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, // u2582 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0, 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, // u2583 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff0,0xfff0,0xfff0, 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, // u2584 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, // u2585 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, // u2586 0x0000,0x0000,0x0000,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, // u2587 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, // u2588 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, // u2589 0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80, 0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80, // u258a 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, // u258b 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, // u258c 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, // u258d 0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000, 0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000, // u258e 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, // u258f 0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0, 0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0, // u2590 0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000, 0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000, // u2591 0xaaa0,0x5550,0xaaa0,0x5550,0xaaa0,0x5550,0xaaa0,0x5550,0xaaa0,0x5550,0xaaa0,0x5550,0xaaa0,0x5550,0xaaa0,0x5550, 0xaaa0,0x5550,0xaaa0,0x5550,0xaaa0,0x5550,0xaaa0,0x5550, // u2592 0xfff0,0xaaa0,0xfff0,0xaaa0,0xfff0,0xaaa0,0xfff0,0xaaa0,0xfff0,0xaaa0,0xfff0,0xaaa0,0xfff0,0xaaa0,0xfff0,0xaaa0, 0xfff0,0xaaa0,0xfff0,0xaaa0,0xfff0,0xaaa0,0xfff0,0xaaa0, // u2593 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0xfc00,0xfc00, 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, // u2596 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03f0,0x03f0,0x03f0,0x03f0, 0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0, // u2597 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2598 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfff0,0xfff0,0xfff0,0xfff0, 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, // u2599 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0x03f0,0x03f0,0x03f0,0x03f0, 0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0, // u259a 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfc00,0xfc00,0xfc00,0xfc00, 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, // u259b 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0x03f0,0x03f0,0x03f0,0x03f0, 0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0, // u259c 0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u259d 0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0xfc00,0xfc00,0xfc00,0xfc00, 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, // u259e 0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0xfff0,0xfff0,0xfff0,0xfff0, 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, // u259f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x3f80,0x3f80,0x3f80,0x3f80,0x3f80,0x3f80,0x3f80,0x3f80, 0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x7fe0,0x7fe0, 0x7fe0,0x7fe0,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ac 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7fc0,0x7fc0,0x7fc0,0x7fc0,0x7fc0,0x7fc0,0x7fc0,0x7fc0,0x7fc0,0x7fc0,0x7fc0, 0x7fc0,0x7fc0,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0e00,0x0e00,0x1f00,0x1f00,0x3f80,0x3f80,0x7fc0,0x7fc0, 0xffe0,0xffe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xffc0,0xfff0,0xffc0,0xff00,0xfc00,0xf000, 0xc000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xffc0,0xfff0,0xffc0,0xff00,0xfc00,0xf000, 0xc000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xffe0,0x7fc0,0x7fc0,0x3f80,0x3f80,0x1f00,0x1f00,0x0e00,0x0e00, 0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0030,0x00f0,0x03f0,0x0ff0,0x3ff0,0xfff0,0x3ff0,0x0ff0,0x03f0,0x00f0, 0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25c0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0030,0x00f0,0x03f0,0x0ff0,0x3ff0,0xfff0,0x3ff0,0x0ff0,0x03f0,0x00f0, 0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25c4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0e00,0x1f00,0x3f80,0x7fc0,0xffe0,0x7fc0,0x3f80,0x1f00,0x0e00, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25c6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0a00,0x1100,0x2080,0x4040,0x8020,0x4040,0x2080,0x1100,0x0a00, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ca 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f00,0x1080,0x1080,0x1080,0x1080,0x0f00,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25cb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f00,0x1f80,0x1f80,0x1f80,0x1f80,0x0f00,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25cf 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xf0f0,0xe070,0xe070,0xe070,0xe070,0xf0f0,0xfff0, 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, // u25d8 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xf0f0,0xef70,0xef70,0xef70,0xef70,0xf0f0,0xfff0, 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, // u25d9 0x0000,0x0000,0x0000,0x0000,0x3f80,0x4040,0x8020,0x8020,0x9b20,0x9b20,0x8020,0x8020,0x8020,0x9f20,0x8e20,0x8020, 0x8020,0x4040,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u263a 0x0000,0x0000,0x0000,0x0000,0x3f80,0x7fc0,0xffe0,0xffe0,0xe4e0,0xe4e0,0xffe0,0xffe0,0xffe0,0xe0e0,0xf1e0,0xffe0, 0xffe0,0x7fc0,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u263b 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x8420,0x4440,0x2480,0x1500,0x0e00,0xfbe0,0x0e00,0x1500,0x2480,0x4440, 0x8420,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u263c 0x0000,0x0000,0x0000,0x0000,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040,0x4040,0x2080,0x1f00,0x0400,0x0400,0x7fc0, 0x0400,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000, // u2640 0x0000,0x0000,0x0000,0x0000,0x07e0,0x0060,0x00a0,0x0120,0x0220,0x0420,0x1f00,0x2080,0x4040,0x4040,0x4040,0x4040, 0x4040,0x2080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2642 0x0000,0x0000,0x0000,0x0000,0x0400,0x0400,0x0e00,0x1f00,0x3f80,0x7fc0,0x7fc0,0x7fc0,0x7fc0,0x7fc0,0x3580,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2660 0x0000,0x0000,0x0000,0x0000,0x0e00,0x1f00,0x1f00,0x0e00,0x0400,0x0400,0x75c0,0xffe0,0xffe0,0xffe0,0x75c0,0x0400, 0x0400,0x0400,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2663 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x7bc0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0x7fc0,0x3f80,0x1f00, 0x0e00,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2665 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0e00,0x1f00,0x3f80,0x7fc0,0xffe0,0x7fc0,0x3f80,0x1f00,0x0e00, 0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2666 0x0000,0x0000,0x0000,0x0000,0x1fe0,0x1020,0x1020,0x1020,0x1fe0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, 0x1000,0x1000,0xe000,0x0000,0x0000,0x0000,0x0000,0x0000, // u266a 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x4040,0x4040,0x4040,0x7fc0,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4080,0x8000,0x0000,0x0000,0x0000,0x0000,0x0000, // u266b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0020,0x0040,0x0040,0x0080,0x0080,0x4100,0x4100,0x2200,0x2200,0x1400, 0x1400,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000, // u2713 0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x00c0,0x00c0,0x0180,0x0180,0xc300,0xc300,0x6600,0x6600,0x3c00, 0x3c00,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000, // u2714 0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x2100,0x1100,0x0a00,0x0600,0x0600,0x0500,0x0880,0x0840,0x1000, 0x1000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2717 0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x6300,0x3300,0x1e00,0x0e00,0x0e00,0x0f00,0x1980,0x18c0,0x3000, 0x3000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2718 0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0200,0x0200,0x0400,0x0400,0x0800,0x0800,0x0800,0x0400,0x0400,0x0200, 0x0200,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000, // u27e8 0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0400,0x0400,0x0200,0x0200,0x0100,0x0100,0x0100,0x0200,0x0200,0x0400, 0x0400,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000, // u27e9 0x0000,0x0000,0x0000,0x0000,0x0440,0x0440,0x0880,0x0880,0x1100,0x1100,0x2200,0x2200,0x2200,0x1100,0x1100,0x0880, 0x0880,0x0440,0x0440,0x0000,0x0000,0x0000,0x0000,0x0000, // u27ea 0x0000,0x0000,0x0000,0x0000,0x2200,0x2200,0x1100,0x1100,0x0880,0x0880,0x0440,0x0440,0x0440,0x0880,0x0880,0x1100, 0x1100,0x2200,0x2200,0x0000,0x0000,0x0000,0x0000,0x0000, // u27eb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2800 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2801 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2802 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2803 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2804 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2805 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2806 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2807 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2808 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2809 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280a 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280b 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280c 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280d 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280e 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2810 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2811 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2812 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2813 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2814 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2815 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2816 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2817 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2818 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2819 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281a 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281b 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281c 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281d 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281e 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2820 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2821 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2822 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2823 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2824 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2825 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2826 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2827 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2828 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2829 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282a 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282b 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282c 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282d 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282e 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2830 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2831 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2832 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2833 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2834 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2835 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2836 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2837 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2838 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2839 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283a 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283b 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283c 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283d 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283e 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2840 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2841 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2842 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2843 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2844 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2845 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2846 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2847 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2848 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2849 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u284a 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u284b 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u284c 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u284d 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u284e 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u284f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2850 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2851 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2852 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2853 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2854 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2855 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2856 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2857 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2858 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2859 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u285a 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u285b 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u285c 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u285d 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u285e 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u285f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2860 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2861 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2862 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2863 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2864 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2865 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2866 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2867 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2868 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2869 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u286a 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u286b 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u286c 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u286d 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u286e 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u286f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2870 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2871 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2872 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2873 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2874 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2875 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2876 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2877 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2878 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u2879 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u287a 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u287b 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u287c 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u287d 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u287e 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000, // u287f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u2880 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u2881 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u2882 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u2883 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u2884 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u2885 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u2886 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u2887 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u2888 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u2889 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u288a 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u288b 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u288c 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u288d 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u288e 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u288f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u2890 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u2891 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u2892 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u2893 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u2894 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u2895 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u2896 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u2897 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u2898 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u2899 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u289a 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u289b 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u289c 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u289d 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u289e 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u289f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28a0 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28a1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28a2 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28a4 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28a5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28a6 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28a7 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28a8 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28a9 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28aa 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28ab 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28ac 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28ad 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28ae 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28af 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28b0 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28b1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28b2 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28b4 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28b6 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28b7 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28b8 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28b9 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28ba 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28bb 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28bc 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28bd 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28be 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000, // u28bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28c0 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28c2 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28c4 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28c6 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28c7 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28c8 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28c9 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28ca 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28cb 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28cc 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28cd 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28ce 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28cf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28d0 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28d2 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28d4 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28d6 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28d7 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28d8 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28d9 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28da 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28db 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28dc 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28dd 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28de 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28df 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28e0 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28e1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28e2 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28e3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28e4 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28e6 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28e7 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28e8 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28e9 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28ea 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28eb 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28ec 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28ed 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28ee 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28ef 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28f0 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28f2 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28f3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28f4 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28f6 0x0000,0x2000,0x2000,0x2000,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28f7 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28f8 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28f9 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28fa 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28fb 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28fc 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28fd 0x0000,0x0080,0x0080,0x0080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28fe 0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000,0x0000,0x2080,0x2080,0x2080, 0x0000,0x0000,0x0000,0x2080,0x2080,0x2080,0x0000,0x0000, // u28ff 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x4040, 0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2e2c 0x4000,0x4000,0x4100,0x4380,0x4540,0x4920,0x4100,0x4100,0x4100,0x4100,0x4100,0x4200,0x0400,0x0800,0x1000,0x2000, 0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, // ue0a0 0x0000,0x0000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x7e00,0x0000,0x0000,0x0840,0x0840,0x0c40, 0x0a40,0x0940,0x08c0,0x0840,0x0840,0x0000,0x0000,0x0000, // ue0a1 0x0000,0x0000,0x0000,0x1f00,0x2080,0x2080,0x2080,0x2080,0x2080,0x2080,0x7fc0,0xffe0,0xffe0,0xf1e0,0xe0e0,0xe0e0, 0xf1e0,0xffe0,0xffe0,0xffe0,0x0000,0x0000,0x0000,0x0000, // ue0a2 0x8000,0xc000,0xe000,0xf000,0xf800,0xfc00,0xfe00,0xff00,0xff80,0xffc0,0xffe0,0xfff0,0xfff0,0xffe0,0xffc0,0xff80, 0xff00,0xfe00,0xfc00,0xf800,0xf000,0xe000,0xc000,0x8000, // ue0b0 0x8000,0x4000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0100,0x0080,0x0040,0x0020,0x0010,0x0010,0x0020,0x0040,0x0080, 0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000, // ue0b1 0x0010,0x0030,0x0070,0x00f0,0x01f0,0x03f0,0x07f0,0x0ff0,0x1ff0,0x3ff0,0x7ff0,0xfff0,0xfff0,0x7ff0,0x3ff0,0x1ff0, 0x0ff0,0x07f0,0x03f0,0x01f0,0x00f0,0x0070,0x0030,0x0010, // ue0b2 0x0010,0x0020,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000,0x8000,0x4000,0x2000,0x1000, 0x0800,0x0400,0x0200,0x0100,0x0080,0x0040,0x0020,0x0010, // ue0b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080, 0x0080,0x0080,0x0080,0x2080,0x2080,0x1100,0x0e00,0x0000, // uf6be 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040,0x4040, 0x4040,0x4040,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000 // ufffd }; // codepoints array constexpr std::array fixedfont_codepoints = { 0x0000,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e, 0x002f,0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e, 0x003f,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e, 0x004f,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e, 0x005f,0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e, 0x006f,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e, 0x00a0,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af, 0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf, 0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf, 0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df, 0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef, 0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff, 0x0100,0x0101,0x0102,0x0103,0x0104,0x0105,0x0106,0x0107,0x0108,0x0109,0x010a,0x010b,0x010c,0x010d,0x010e,0x010f, 0x0110,0x0111,0x0112,0x0113,0x0114,0x0115,0x0116,0x0117,0x0118,0x0119,0x011a,0x011b,0x011c,0x011d,0x011e,0x011f, 0x0120,0x0121,0x0122,0x0123,0x0124,0x0125,0x0126,0x0127,0x0128,0x0129,0x012a,0x012b,0x012c,0x012d,0x012e,0x012f, 0x0130,0x0131,0x0132,0x0133,0x0134,0x0135,0x0136,0x0137,0x0138,0x0139,0x013a,0x013b,0x013c,0x013d,0x013e,0x013f, 0x0140,0x0141,0x0142,0x0143,0x0144,0x0145,0x0146,0x0147,0x0148,0x0149,0x014a,0x014b,0x014c,0x014d,0x014e,0x014f, 0x0150,0x0151,0x0152,0x0153,0x0154,0x0155,0x0156,0x0157,0x0158,0x0159,0x015a,0x015b,0x015c,0x015d,0x015e,0x015f, 0x0160,0x0161,0x0162,0x0163,0x0164,0x0165,0x0166,0x0167,0x0168,0x0169,0x016a,0x016b,0x016c,0x016d,0x016e,0x016f, 0x0170,0x0171,0x0172,0x0173,0x0174,0x0175,0x0176,0x0177,0x0178,0x0179,0x017a,0x017b,0x017c,0x017d,0x017e,0x017f, 0x0186,0x018e,0x018f,0x0190,0x0192,0x019d,0x019e,0x01b5,0x01b6,0x01b7,0x01cd,0x01ce,0x01cf,0x01d0,0x01d1,0x01d2, 0x01d3,0x01d4,0x01e2,0x01e3,0x01e4,0x01e5,0x01e6,0x01e7,0x01e8,0x01e9,0x01ea,0x01eb,0x01ec,0x01ed,0x01ee,0x01ef, 0x01f0,0x01f4,0x01f5,0x01fc,0x01fd,0x01fe,0x01ff,0x0218,0x0219,0x021a,0x021b,0x0232,0x0233,0x0237,0x0254,0x0258, 0x0259,0x025b,0x0272,0x0292,0x02bb,0x02bc,0x02bd,0x02c6,0x02c7,0x02d8,0x02d9,0x02db,0x02dc,0x02dd,0x0300,0x0301, 0x0302,0x0303,0x0304,0x0305,0x0306,0x0307,0x0308,0x030a,0x030b,0x030c,0x0329,0x0384,0x0385,0x0386,0x0387,0x0388, 0x0389,0x038a,0x038c,0x038e,0x038f,0x0390,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039a, 0x039b,0x039c,0x039d,0x039e,0x039f,0x03a0,0x03a1,0x03a3,0x03a4,0x03a5,0x03a6,0x03a7,0x03a8,0x03a9,0x03aa,0x03ab, 0x03ac,0x03ad,0x03ae,0x03af,0x03b0,0x03b1,0x03b2,0x03b3,0x03b4,0x03b5,0x03b6,0x03b7,0x03b8,0x03b9,0x03ba,0x03bb, 0x03bc,0x03bd,0x03be,0x03bf,0x03c0,0x03c1,0x03c2,0x03c3,0x03c4,0x03c5,0x03c6,0x03c7,0x03c8,0x03c9,0x03ca,0x03cb, 0x03cc,0x03cd,0x03ce,0x03d1,0x03d5,0x03f0,0x03f1,0x03f2,0x03f3,0x03f4,0x03f5,0x03f6,0x0400,0x0401,0x0402,0x0403, 0x0404,0x0405,0x0406,0x0407,0x0408,0x0409,0x040a,0x040b,0x040c,0x040d,0x040e,0x040f,0x0410,0x0411,0x0412,0x0413, 0x0414,0x0415,0x0416,0x0417,0x0418,0x0419,0x041a,0x041b,0x041c,0x041d,0x041e,0x041f,0x0420,0x0421,0x0422,0x0423, 0x0424,0x0425,0x0426,0x0427,0x0428,0x0429,0x042a,0x042b,0x042c,0x042d,0x042e,0x042f,0x0430,0x0431,0x0432,0x0433, 0x0434,0x0435,0x0436,0x0437,0x0438,0x0439,0x043a,0x043b,0x043c,0x043d,0x043e,0x043f,0x0440,0x0441,0x0442,0x0443, 0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,0x044a,0x044b,0x044c,0x044d,0x044e,0x044f,0x0450,0x0451,0x0452,0x0453, 0x0454,0x0455,0x0456,0x0457,0x0458,0x0459,0x045a,0x045b,0x045c,0x045d,0x045e,0x045f,0x0462,0x0463,0x046a,0x046b, 0x0490,0x0491,0x0492,0x0493,0x0494,0x0495,0x0496,0x0497,0x0498,0x0499,0x049a,0x049b,0x049c,0x049d,0x04a0,0x04a1, 0x04a2,0x04a3,0x04a4,0x04a5,0x04aa,0x04ab,0x04ae,0x04af,0x04b0,0x04b1,0x04b2,0x04b3,0x04b6,0x04b7,0x04b8,0x04b9, 0x04ba,0x04bb,0x04c0,0x04c1,0x04c2,0x04cf,0x04d0,0x04d1,0x04d2,0x04d3,0x04d4,0x04d5,0x04d6,0x04d7,0x04d8,0x04d9, 0x04da,0x04db,0x04dc,0x04dd,0x04de,0x04df,0x04e2,0x04e3,0x04e4,0x04e5,0x04e6,0x04e7,0x04e8,0x04e9,0x04ea,0x04eb, 0x04ec,0x04ed,0x04ee,0x04ef,0x04f0,0x04f1,0x04f2,0x04f3,0x04f4,0x04f5,0x04f8,0x04f9,0x05d0,0x05d1,0x05d2,0x05d3, 0x05d4,0x05d5,0x05d6,0x05d7,0x05d8,0x05d9,0x05da,0x05db,0x05dc,0x05dd,0x05de,0x05df,0x05e0,0x05e1,0x05e2,0x05e3, 0x05e4,0x05e5,0x05e6,0x05e7,0x05e8,0x05e9,0x05ea,0x1e0c,0x1e0d,0x1e34,0x1e35,0x1e36,0x1e37,0x1e40,0x1e41,0x1e42, 0x1e43,0x1e44,0x1e45,0x1e46,0x1e47,0x1e6c,0x1e6d,0x1eb8,0x1eb9,0x1ebc,0x1ebd,0x1eca,0x1ecb,0x1ecc,0x1ecd,0x1ee4, 0x1ee5,0x1ef8,0x1ef9,0x2000,0x2001,0x2002,0x2003,0x2004,0x2005,0x2006,0x2007,0x2008,0x2009,0x200a,0x200b,0x200c, 0x200d,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x2015,0x2016,0x2017,0x2018,0x2019,0x201a,0x201b,0x201c, 0x201d,0x201e,0x201f,0x2020,0x2021,0x2022,0x2026,0x2030,0x2032,0x2033,0x2039,0x203a,0x203c,0x203e,0x2070,0x2071, 0x2074,0x2075,0x2076,0x2077,0x2078,0x2079,0x207a,0x207b,0x207c,0x207d,0x207e,0x207f,0x2080,0x2081,0x2082,0x2083, 0x2084,0x2085,0x2086,0x2087,0x2088,0x2089,0x208a,0x208b,0x208c,0x208d,0x208e,0x2090,0x2091,0x2092,0x2093,0x2094, 0x2095,0x2096,0x2097,0x2098,0x209a,0x20a7,0x20aa,0x20ac,0x20ae,0x2102,0x210e,0x210f,0x2115,0x2116,0x211a,0x211d, 0x2122,0x2124,0x2126,0x2135,0x2190,0x2191,0x2192,0x2193,0x2194,0x2195,0x21a4,0x21a6,0x21a8,0x21b5,0x21bb,0x21cb, 0x21cc,0x21d0,0x21d1,0x21d2,0x21d3,0x21d4,0x21d5,0x2200,0x2203,0x2204,0x2205,0x2206,0x2207,0x2208,0x2209,0x220a, 0x220b,0x220c,0x220d,0x2212,0x2213,0x2214,0x2215,0x2216,0x2219,0x221a,0x221e,0x221f,0x2225,0x2227,0x2228,0x2229, 0x222a,0x2248,0x2260,0x2261,0x2264,0x2265,0x226a,0x226b,0x2282,0x2283,0x2286,0x2287,0x22a5,0x22c2,0x22c3,0x2300, 0x2302,0x2308,0x2309,0x230a,0x230b,0x2310,0x2319,0x2320,0x2321,0x239b,0x239c,0x239d,0x239e,0x239f,0x23a0,0x23a1, 0x23a2,0x23a3,0x23a4,0x23a5,0x23a6,0x23a7,0x23a8,0x23a9,0x23ab,0x23ac,0x23ad,0x23ae,0x23af,0x23ba,0x23bb,0x23bc, 0x23bd,0x23d0,0x2409,0x240a,0x240b,0x240c,0x240d,0x2424,0x2500,0x2501,0x2502,0x2503,0x2508,0x2509,0x250a,0x250b, 0x250c,0x250d,0x250e,0x250f,0x2510,0x2511,0x2512,0x2513,0x2514,0x2515,0x2516,0x2517,0x2518,0x2519,0x251a,0x251b, 0x251c,0x251d,0x251e,0x251f,0x2520,0x2521,0x2522,0x2523,0x2524,0x2525,0x2526,0x2527,0x2528,0x2529,0x252a,0x252b, 0x252c,0x252d,0x252e,0x252f,0x2530,0x2531,0x2532,0x2533,0x2534,0x2535,0x2536,0x2537,0x2538,0x2539,0x253a,0x253b, 0x253c,0x253d,0x253e,0x253f,0x2540,0x2541,0x2542,0x2543,0x2544,0x2545,0x2546,0x2547,0x2548,0x2549,0x254a,0x254b, 0x2550,0x2551,0x2552,0x2553,0x2554,0x2555,0x2556,0x2557,0x2558,0x2559,0x255a,0x255b,0x255c,0x255d,0x255e,0x255f, 0x2560,0x2561,0x2562,0x2563,0x2564,0x2565,0x2566,0x2567,0x2568,0x2569,0x256a,0x256b,0x256c,0x256d,0x256e,0x256f, 0x2570,0x2571,0x2572,0x2573,0x2574,0x2575,0x2576,0x2577,0x2578,0x2579,0x257a,0x257b,0x257c,0x257d,0x257e,0x257f, 0x2580,0x2581,0x2582,0x2583,0x2584,0x2585,0x2586,0x2587,0x2588,0x2589,0x258a,0x258b,0x258c,0x258d,0x258e,0x258f, 0x2590,0x2591,0x2592,0x2593,0x2596,0x2597,0x2598,0x2599,0x259a,0x259b,0x259c,0x259d,0x259e,0x259f,0x25a0,0x25ac, 0x25ae,0x25b2,0x25b6,0x25ba,0x25bc,0x25c0,0x25c4,0x25c6,0x25ca,0x25cb,0x25cf,0x25d8,0x25d9,0x263a,0x263b,0x263c, 0x2640,0x2642,0x2660,0x2663,0x2665,0x2666,0x266a,0x266b,0x2713,0x2714,0x2717,0x2718,0x27e8,0x27e9,0x27ea,0x27eb, 0x2800,0x2801,0x2802,0x2803,0x2804,0x2805,0x2806,0x2807,0x2808,0x2809,0x280a,0x280b,0x280c,0x280d,0x280e,0x280f, 0x2810,0x2811,0x2812,0x2813,0x2814,0x2815,0x2816,0x2817,0x2818,0x2819,0x281a,0x281b,0x281c,0x281d,0x281e,0x281f, 0x2820,0x2821,0x2822,0x2823,0x2824,0x2825,0x2826,0x2827,0x2828,0x2829,0x282a,0x282b,0x282c,0x282d,0x282e,0x282f, 0x2830,0x2831,0x2832,0x2833,0x2834,0x2835,0x2836,0x2837,0x2838,0x2839,0x283a,0x283b,0x283c,0x283d,0x283e,0x283f, 0x2840,0x2841,0x2842,0x2843,0x2844,0x2845,0x2846,0x2847,0x2848,0x2849,0x284a,0x284b,0x284c,0x284d,0x284e,0x284f, 0x2850,0x2851,0x2852,0x2853,0x2854,0x2855,0x2856,0x2857,0x2858,0x2859,0x285a,0x285b,0x285c,0x285d,0x285e,0x285f, 0x2860,0x2861,0x2862,0x2863,0x2864,0x2865,0x2866,0x2867,0x2868,0x2869,0x286a,0x286b,0x286c,0x286d,0x286e,0x286f, 0x2870,0x2871,0x2872,0x2873,0x2874,0x2875,0x2876,0x2877,0x2878,0x2879,0x287a,0x287b,0x287c,0x287d,0x287e,0x287f, 0x2880,0x2881,0x2882,0x2883,0x2884,0x2885,0x2886,0x2887,0x2888,0x2889,0x288a,0x288b,0x288c,0x288d,0x288e,0x288f, 0x2890,0x2891,0x2892,0x2893,0x2894,0x2895,0x2896,0x2897,0x2898,0x2899,0x289a,0x289b,0x289c,0x289d,0x289e,0x289f, 0x28a0,0x28a1,0x28a2,0x28a3,0x28a4,0x28a5,0x28a6,0x28a7,0x28a8,0x28a9,0x28aa,0x28ab,0x28ac,0x28ad,0x28ae,0x28af, 0x28b0,0x28b1,0x28b2,0x28b3,0x28b4,0x28b5,0x28b6,0x28b7,0x28b8,0x28b9,0x28ba,0x28bb,0x28bc,0x28bd,0x28be,0x28bf, 0x28c0,0x28c1,0x28c2,0x28c3,0x28c4,0x28c5,0x28c6,0x28c7,0x28c8,0x28c9,0x28ca,0x28cb,0x28cc,0x28cd,0x28ce,0x28cf, 0x28d0,0x28d1,0x28d2,0x28d3,0x28d4,0x28d5,0x28d6,0x28d7,0x28d8,0x28d9,0x28da,0x28db,0x28dc,0x28dd,0x28de,0x28df, 0x28e0,0x28e1,0x28e2,0x28e3,0x28e4,0x28e5,0x28e6,0x28e7,0x28e8,0x28e9,0x28ea,0x28eb,0x28ec,0x28ed,0x28ee,0x28ef, 0x28f0,0x28f1,0x28f2,0x28f3,0x28f4,0x28f5,0x28f6,0x28f7,0x28f8,0x28f9,0x28fa,0x28fb,0x28fc,0x28fd,0x28fe,0x28ff, 0x2e2c,0xe0a0,0xe0a1,0xe0a2,0xe0b0,0xe0b1,0xe0b2,0xe0b3,0xf6be,0xfffd }; } // namespace // -- end of autogenerated text --- namespace fixed_font_24b { // -- start of autogenerated text --- // definition section for font: ter-u24b.bdf constexpr int CHARCOUNT = 1354; constexpr int WIDTH = 12; constexpr int HEIGHT = 24; constexpr int OFFSET_X = 0; constexpr int OFFSET_Y = 0; constexpr FixedFont_info_t fixedfont_info = { "Terminus", // font name "ter-u24b.bdf", // font name internal CHARCOUNT, // num of chars WIDTH, HEIGHT, OFFSET_X, OFFSET_Y, true // bold }; // font bitmap definitions constexpr std::array fixedfont_bitmap = { 0x0000,0x0000,0x0000,0x0000,0x79e0,0x6060,0x6060,0x6060,0x0000,0x0000,0x6060,0x6060,0x6060,0x0000,0x0000,0x6060, 0x6060,0x6060,0x79e0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0020 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000,0x0000, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u0021 0x0000,0x0000,0x1980,0x1980,0x1980,0x1980,0x1980,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0022 0x0000,0x0000,0x0000,0x0000,0x1980,0x1980,0x1980,0x1980,0x7fe0,0x1980,0x1980,0x1980,0x1980,0x1980,0x7fe0,0x1980, 0x1980,0x1980,0x1980,0x0000,0x0000,0x0000,0x0000,0x0000, // u0023 0x0000,0x0000,0x0000,0x0600,0x0600,0x1f80,0x36c0,0x6660,0x6600,0x6600,0x3600,0x1f80,0x06c0,0x0660,0x0660,0x6660, 0x36c0,0x1f80,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u0024 0x0000,0x0000,0x0000,0x0000,0x0000,0x38c0,0x6cc0,0x6d80,0x3980,0x0300,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x19c0, 0x1b60,0x3360,0x31c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0025 0x0000,0x0000,0x0000,0x0000,0x0e00,0x1b00,0x3180,0x3180,0x3180,0x1b00,0x0e00,0x1e60,0x3360,0x61c0,0x60c0,0x60c0, 0x61c0,0x3360,0x1e60,0x0000,0x0000,0x0000,0x0000,0x0000, // u0026 0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0027 0x0000,0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0c00, 0x0c00,0x0600,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000, // u0028 0x0000,0x0000,0x0000,0x0000,0x1800,0x0c00,0x0600,0x0600,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0600, 0x0600,0x0c00,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000, // u0029 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x3180,0x1b00,0x0e00,0xffe0,0x0e00,0x1b00,0x3180,0x60c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x7fe0,0x0600,0x0600,0x0600,0x0600, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600, 0x0600,0x0600,0x0600,0x0c00,0x0000,0x0000,0x0000,0x0000, // u002c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u002e 0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x0180,0x0180,0x0300,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x1800, 0x1800,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002f 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x60e0,0x61e0,0x6360,0x6660,0x6c60,0x7860,0x7060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0030 0x0000,0x0000,0x0000,0x0000,0x0600,0x0e00,0x1e00,0x3600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0031 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800, 0x3000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0032 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x0060,0x0060,0x0060,0x00c0,0x0f80,0x00c0,0x0060,0x0060,0x0060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0033 0x0000,0x0000,0x0000,0x0000,0x0060,0x00e0,0x01e0,0x0360,0x0660,0x0c60,0x1860,0x3060,0x6060,0x6060,0x6060,0x7fe0, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0034 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x00c0,0x0060,0x0060,0x0060,0x0060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0035 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0036 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6060,0x6060,0x0060,0x00c0,0x00c0,0x0180,0x0180,0x0300,0x0300,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u0037 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x30c0,0x1f80,0x30c0,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0038 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x3060,0x1fe0,0x0060,0x0060,0x0060, 0x0060,0x00c0,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0039 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0600, 0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0600, 0x0600,0x0600,0x0600,0x0c00,0x0000,0x0000,0x0000,0x0000, // u003b 0x0000,0x0000,0x0000,0x0000,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x3000,0x1800,0x0c00,0x0600, 0x0300,0x0180,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u003c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003d 0x0000,0x0000,0x0000,0x0000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180,0x00c0,0x0180,0x0300,0x0600,0x0c00, 0x1800,0x3000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003e 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x00c0,0x0180,0x0300,0x0600,0x0600,0x0000,0x0000, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u003f 0x0000,0x0000,0x0000,0x0000,0x3f80,0x60c0,0xc060,0xc3e0,0xc660,0xcc60,0xcc60,0xcc60,0xcc60,0xcc60,0xc660,0xc3e0, 0xc000,0x6000,0x3fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0040 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0041 0x0000,0x0000,0x0000,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x60c0,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x60c0,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0042 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0043 0x0000,0x0000,0x0000,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x60c0,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0044 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0045 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0046 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6000,0x6000,0x6000,0x63e0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0047 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0048 0x0000,0x0000,0x0000,0x0000,0x1f80,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0049 0x0000,0x0000,0x0000,0x0000,0x03f0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x60c0,0x60c0, 0x60c0,0x3180,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u004a 0x0000,0x0000,0x0000,0x0000,0x6060,0x60c0,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7000,0x7800,0x6c00,0x6600,0x6300, 0x6180,0x60c0,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u004b 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u004c 0x0000,0x0000,0x0000,0x0000,0x8020,0xc060,0xe0e0,0xf1e0,0xdb60,0xce60,0xc460,0xc060,0xc060,0xc060,0xc060,0xc060, 0xc060,0xc060,0xc060,0x0000,0x0000,0x0000,0x0000,0x0000, // u004d 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x7060,0x7860,0x6c60,0x6660,0x6360,0x61e0,0x60e0,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u004e 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u004f 0x0000,0x0000,0x0000,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x60c0,0x7f80,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0050 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6660,0x33c0,0x1f80,0x00c0,0x0060,0x0000,0x0000,0x0000, // u0051 0x0000,0x0000,0x0000,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x60c0,0x7f80,0x7800,0x6c00,0x6600,0x6300, 0x6180,0x60c0,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0052 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6000,0x6000,0x6000,0x3000,0x1f80,0x00c0,0x0060,0x0060,0x0060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0053 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u0054 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0055 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x30c0,0x30c0,0x30c0,0x30c0,0x1980,0x1980,0x1980,0x0f00, 0x0f00,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u0056 0x0000,0x0000,0x0000,0x0000,0xc060,0xc060,0xc060,0xc060,0xc060,0xc060,0xc060,0xc060,0xc460,0xce60,0xdb60,0xf1e0, 0xe0e0,0xc060,0x8020,0x0000,0x0000,0x0000,0x0000,0x0000, // u0057 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x30c0,0x30c0,0x1980,0x1980,0x0f00,0x0600,0x0f00,0x1980,0x1980,0x30c0, 0x30c0,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0058 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x30c0,0x30c0,0x1980,0x1980,0x0f00,0x0f00,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u0059 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0060,0x0060,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000, 0x6000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u005a 0x0000,0x0000,0x0000,0x0000,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, 0x1800,0x1800,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u005b 0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x1800,0x1800,0x0c00,0x0c00,0x0600,0x0600,0x0300,0x0300,0x0180, 0x0180,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u005c 0x0000,0x0000,0x0000,0x0000,0x1f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u005d 0x0000,0x0000,0x0600,0x0f00,0x1980,0x30c0,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0000,0x0000,0x0000, // u005f 0x1800,0x0c00,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0060 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x00c0,0x0060,0x0060,0x1fe0,0x3060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0061 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x60c0,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0062 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0063 0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x1fe0,0x3060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0064 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x7fe0,0x6000,0x6000, 0x6000,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0065 0x0000,0x0000,0x0000,0x0000,0x03e0,0x0600,0x0600,0x0600,0x3fc0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u0066 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fe0,0x3060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30e0,0x1fe0,0x0060,0x0060,0x00c0,0x3f80,0x0000, // u0067 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0068 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0069 0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x03c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x00c0,0x00c0,0x30c0,0x30c0,0x1980,0x0f00,0x0000, // u006a 0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3060,0x30c0,0x3180,0x3300,0x3600,0x3c00,0x3600,0x3300, 0x3180,0x30c0,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000, // u006b 0x0000,0x0000,0x0000,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u006c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x66c0,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660, 0x6660,0x6660,0x6660,0x0000,0x0000,0x0000,0x0000,0x0000, // u006d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u006e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u006f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x60c0,0x7f80,0x6000,0x6000,0x6000,0x6000,0x0000, // u0070 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fe0,0x3060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0060,0x0060,0x0060,0x0060,0x0000, // u0071 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x67e0,0x6c00,0x7800,0x7000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0072 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x6060,0x6000,0x6000,0x6000,0x3fc0,0x0060,0x0060, 0x0060,0x6060,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0073 0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x07c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0074 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0075 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x30c0,0x30c0,0x1980,0x1980,0x0f00, 0x0f00,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u0076 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6660,0x6660,0x6660,0x6660, 0x6660,0x6660,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0077 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x30c0,0x1980,0x0f00,0x0600,0x0f00,0x1980, 0x30c0,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0078 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30e0,0x1fe0,0x0060,0x0060,0x00c0,0x3f80,0x0000, // u0079 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800, 0x3000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u007a 0x0000,0x0000,0x0000,0x0000,0x0380,0x0600,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x3800,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0600,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000, // u007b 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u007c 0x0000,0x0000,0x0000,0x0000,0x3800,0x0c00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0380,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0c00,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000, // u007d 0x0000,0x0000,0x3c60,0x6660,0x6660,0x63c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a0 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x1f80,0x36c0,0x6660,0x6600,0x6600,0x6600,0x6600,0x6600, 0x6660,0x36c0,0x1f80,0x0600,0x0600,0x0000,0x0000,0x0000, // u00a2 0x0000,0x0000,0x0000,0x0000,0x0f00,0x1980,0x30c0,0x3000,0x3000,0x3000,0x3000,0x7f00,0x3000,0x3000,0x3000,0x3000, 0x3060,0x3060,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc060,0x60c0,0x3f80,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3f80, 0x60c0,0xc060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a4 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x30c0,0x30c0,0x1980,0x1980,0x0f00,0x0600,0x0600,0x3fc0,0x0600,0x0600, 0x3fc0,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a5 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a6 0x0000,0x0000,0x0000,0x1f00,0x3180,0x3000,0x3000,0x1e00,0x3300,0x3180,0x3180,0x3180,0x3180,0x1980,0x0f00,0x0180, 0x0180,0x3180,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a7 0x1980,0x1980,0x1980,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x4040,0x9f20,0xb1a0,0xb1a0,0xb020,0xb020,0xb1a0,0xb1a0,0x9f20, 0x4040,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a9 0x0000,0x3f80,0x00c0,0x00c0,0x3fc0,0x60c0,0x60c0,0x60c0,0x60c0,0x3fc0,0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0660,0x0cc0,0x1980,0x3300,0x6600,0xcc00,0x6600,0x3300, 0x1980,0x0cc0,0x0660,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ab 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0060,0x0060,0x0060,0x0060,0x0060,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ac 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ad 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x4040,0xbf20,0xb1a0,0xb1a0,0xb1a0,0xbf20,0xb620,0xb320,0xb1a0, 0x4040,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ae 0x0000,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00af 0x0000,0x0000,0x1f00,0x3180,0x3180,0x3180,0x3180,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x7fe0,0x0600,0x0600,0x0600,0x0600, 0x0000,0x0000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b1 0x0000,0x0000,0x1f00,0x3180,0x3180,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b2 0x0000,0x0000,0x1f00,0x3180,0x0180,0x0180,0x0f00,0x0180,0x0180,0x3180,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b3 0x0180,0x0300,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x60e0,0x61e0,0x7f60,0x6000,0x6000,0x6000,0x6000,0x0000, // u00b5 0x0000,0x0000,0x0000,0x0000,0x3fe0,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x3e60,0x0660,0x0660,0x0660,0x0660, 0x0660,0x0660,0x0660,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0c00,0x0000, // u00b8 0x0000,0x0000,0x0600,0x0e00,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b9 0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x3180,0x1f00,0x0000,0x7fc0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xcc00,0x6600,0x3300,0x1980,0x0cc0,0x0660,0x0cc0,0x1980, 0x3300,0x6600,0xcc00,0x0000,0x0000,0x0000,0x0000,0x0000, // u00bb 0x0000,0x0000,0x0000,0x0c00,0x1c00,0x3c00,0x0c00,0x0c20,0x0c60,0x0cc0,0x0180,0x0300,0x0660,0x0ce0,0x19e0,0x3360, 0x6660,0x47e0,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, // u00bc 0x0000,0x0000,0x0000,0x0c00,0x1c00,0x3c00,0x0c20,0x0c60,0x0cc0,0x0d80,0x0300,0x0600,0x0c00,0x1bc0,0x3660,0x6660, 0x40c0,0x0180,0x0300,0x07e0,0x0000,0x0000,0x0000,0x0000, // u00bd 0x0000,0x0000,0x0000,0x3c00,0x6600,0x0600,0x1c00,0x0620,0x6660,0x3cc0,0x0180,0x0300,0x0660,0x0ce0,0x19e0,0x3360, 0x6660,0x47e0,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, // u00be 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0c00,0x1800,0x3000,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00bf 0x1800,0x0c00,0x0600,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c0 0x0180,0x0300,0x0600,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c1 0x0600,0x0f00,0x1980,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c2 0x1cc0,0x36c0,0x3380,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c3 0x1980,0x1980,0x1980,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c4 0x0f00,0x1980,0x1980,0x0f00,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c5 0x0000,0x0000,0x0000,0x0000,0x3ff0,0x6300,0xc300,0xc300,0xc300,0xc300,0xc300,0xfff0,0xc300,0xc300,0xc300,0xc300, 0xc300,0xc300,0xc3f0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c6 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6060, 0x6060,0x30c0,0x1f80,0x0600,0x0600,0x0600,0x0c00,0x0000, // u00c7 0x1800,0x0c00,0x0600,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c8 0x0180,0x0300,0x0600,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c9 0x0600,0x0f00,0x1980,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ca 0x1980,0x1980,0x1980,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cb 0x1800,0x0c00,0x0600,0x0000,0x1f80,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cc 0x0180,0x0300,0x0600,0x0000,0x1f80,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cd 0x0600,0x0f00,0x1980,0x0000,0x1f80,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ce 0x1980,0x1980,0x1980,0x0000,0x1f80,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cf 0x0000,0x0000,0x0000,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0xfe60,0x6060,0x6060,0x6060,0x6060, 0x6060,0x60c0,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d0 0x1cc0,0x36c0,0x3380,0x0000,0x6060,0x6060,0x6060,0x6060,0x7060,0x7860,0x6c60,0x6660,0x6360,0x61e0,0x60e0,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d1 0x1800,0x0c00,0x0600,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d2 0x0180,0x0300,0x0600,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d3 0x0600,0x0f00,0x1980,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d4 0x1cc0,0x36c0,0x3380,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d5 0x1980,0x1980,0x1980,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x30c0,0x1980,0x0f00,0x0600,0x0f00,0x1980,0x30c0,0x6060, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d7 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6070,0x6060,0x60e0,0x61e0,0x6360,0x6660,0x6c60,0x7860,0x7060,0x6060, 0xe060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d8 0x1800,0x0c00,0x0600,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d9 0x0180,0x0300,0x0600,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00da 0x0600,0x0f00,0x1980,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00db 0x1980,0x1980,0x1980,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00dc 0x0180,0x0300,0x0600,0x0000,0x6060,0x6060,0x30c0,0x30c0,0x1980,0x1980,0x0f00,0x0f00,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u00dd 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x60c0,0x7f80,0x6000, 0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00de 0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x60c0,0x60c0,0x60c0,0x6180,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060, 0x7060,0x68c0,0x6f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00df 0x0000,0x0000,0x0000,0x0000,0x1800,0x0c00,0x0600,0x0000,0x3f80,0x00c0,0x0060,0x0060,0x1fe0,0x3060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e0 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x3f80,0x00c0,0x0060,0x0060,0x1fe0,0x3060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e1 0x0000,0x0000,0x0000,0x0000,0x0600,0x0f00,0x1980,0x0000,0x3f80,0x00c0,0x0060,0x0060,0x1fe0,0x3060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e2 0x0000,0x0000,0x0000,0x0000,0x1cc0,0x36c0,0x3380,0x0000,0x3f80,0x00c0,0x0060,0x0060,0x1fe0,0x3060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e3 0x0000,0x0000,0x0000,0x0000,0x1980,0x1980,0x1980,0x0000,0x3f80,0x00c0,0x0060,0x0060,0x1fe0,0x3060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e4 0x0000,0x0000,0x0000,0x0000,0x0f00,0x1980,0x1980,0x0f00,0x3f80,0x00c0,0x0060,0x0060,0x1fe0,0x3060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7be0,0x0e30,0x0630,0x0630,0x7e30,0xc7f0,0xc600,0xc600, 0xc600,0xc730,0x7de0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6060,0x30c0,0x1f80,0x0600,0x0600,0x0600,0x0c00,0x0000, // u00e7 0x0000,0x0000,0x0000,0x0000,0x1800,0x0c00,0x0600,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x7fe0,0x6000,0x6000, 0x6000,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e8 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x7fe0,0x6000,0x6000, 0x6000,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e9 0x0000,0x0000,0x0000,0x0000,0x0600,0x0f00,0x1980,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x7fe0,0x6000,0x6000, 0x6000,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ea 0x0000,0x0000,0x0000,0x0000,0x1980,0x1980,0x1980,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x7fe0,0x6000,0x6000, 0x6000,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00eb 0x0000,0x0000,0x0000,0x0000,0x1800,0x0c00,0x0600,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ec 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ed 0x0000,0x0000,0x0000,0x0000,0x0600,0x0f00,0x1980,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ee 0x0000,0x0000,0x0000,0x0000,0x1980,0x1980,0x1980,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ef 0x0000,0x0000,0x0000,0x0000,0x3600,0x1c00,0x3600,0x0300,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f0 0x0000,0x0000,0x0000,0x0000,0x1cc0,0x36c0,0x3380,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f1 0x0000,0x0000,0x0000,0x0000,0x1800,0x0c00,0x0600,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f2 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f3 0x0000,0x0000,0x0000,0x0000,0x0600,0x0f00,0x1980,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f4 0x0000,0x0000,0x0000,0x0000,0x1cc0,0x36c0,0x3380,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f5 0x0000,0x0000,0x0000,0x0000,0x1980,0x1980,0x1980,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0000,0x0000,0x7fe0,0x0000,0x0000,0x0600,0x0600, 0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fa0,0x30c0,0x60e0,0x61e0,0x6360,0x6660,0x6c60,0x7860, 0x7060,0x30c0,0x5f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f8 0x0000,0x0000,0x0000,0x0000,0x1800,0x0c00,0x0600,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f9 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00fa 0x0000,0x0000,0x0000,0x0000,0x0600,0x0f00,0x1980,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00fb 0x0000,0x0000,0x0000,0x0000,0x1980,0x1980,0x1980,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00fc 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30e0,0x1fe0,0x0060,0x0060,0x00c0,0x3f80,0x0000, // u00fd 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x60c0,0x7f80,0x6000,0x6000,0x6000,0x6000,0x0000, // u00fe 0x0000,0x0000,0x0000,0x0000,0x1980,0x1980,0x1980,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30e0,0x1fe0,0x0060,0x0060,0x00c0,0x3f80,0x0000, // u00ff 0x0000,0x3fc0,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0100 0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x0000,0x0000,0x3f80,0x00c0,0x0060,0x0060,0x1fe0,0x3060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0101 0x30c0,0x30c0,0x1f80,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0102 0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x1f80,0x0000,0x3f80,0x00c0,0x0060,0x0060,0x1fe0,0x3060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0103 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x00c0,0x0180,0x0180,0x00f0,0x0000, // u0104 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x00c0,0x0060,0x0060,0x1fe0,0x3060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x00c0,0x0180,0x0180,0x00f0,0x0000, // u0105 0x0180,0x0300,0x0600,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0106 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x1f80,0x30c0,0x6060,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0107 0x0600,0x0f00,0x1980,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0108 0x0000,0x0000,0x0000,0x0000,0x0600,0x0f00,0x1980,0x0000,0x1f80,0x30c0,0x6060,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0109 0x0600,0x0600,0x0600,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u010a 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0000,0x1f80,0x30c0,0x6060,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u010b 0x1980,0x0f00,0x0600,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u010c 0x0000,0x0000,0x0000,0x0000,0x1980,0x0f00,0x0600,0x0000,0x1f80,0x30c0,0x6060,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u010d 0x1980,0x0f00,0x0600,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x60c0,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u010e 0x1980,0x0f00,0x0600,0x0000,0x0060,0x0060,0x0060,0x0060,0x1fe0,0x3060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u010f 0x0000,0x0000,0x0000,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0xfe60,0x6060,0x6060,0x6060,0x6060, 0x6060,0x60c0,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0110 0x0000,0x0000,0x0000,0x0000,0x0060,0x07f0,0x0060,0x0060,0x1fe0,0x3060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0111 0x0000,0x3fc0,0x0000,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0112 0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x7fe0,0x6000,0x6000, 0x6000,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0113 0x30c0,0x30c0,0x1f80,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0114 0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x1f80,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x7fe0,0x6000,0x6000, 0x6000,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0115 0x0600,0x0600,0x0600,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0116 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x7fe0,0x6000,0x6000, 0x6000,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0117 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x7fe0,0x00c0,0x0180,0x0180,0x00f0,0x0000, // u0118 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x7fe0,0x6000,0x6000, 0x6000,0x3060,0x1fc0,0x0300,0x0600,0x0600,0x03c0,0x0000, // u0119 0x1980,0x0f00,0x0600,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u011a 0x0000,0x0000,0x0000,0x0000,0x1980,0x0f00,0x0600,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x7fe0,0x6000,0x6000, 0x6000,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u011b 0x0600,0x0f00,0x1980,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6000,0x6000,0x6000,0x63e0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u011c 0x0000,0x0000,0x0000,0x0000,0x0600,0x0f00,0x1980,0x0000,0x1fe0,0x3060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30e0,0x1fe0,0x0060,0x0060,0x00c0,0x3f80,0x0000, // u011d 0x30c0,0x30c0,0x1f80,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6000,0x6000,0x6000,0x63e0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u011e 0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x1f80,0x0000,0x1fe0,0x3060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30e0,0x1fe0,0x0060,0x0060,0x00c0,0x3f80,0x0000, // u011f 0x0600,0x0600,0x0600,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6000,0x6000,0x6000,0x63e0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0120 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0000,0x1fe0,0x3060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30e0,0x1fe0,0x0060,0x0060,0x00c0,0x3f80,0x0000, // u0121 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6000,0x6000,0x6000,0x63e0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0600,0x0600,0x0600,0x0c00, // u0122 0x0000,0x0000,0x0000,0x0180,0x0300,0x0300,0x0300,0x0000,0x1fe0,0x3060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30e0,0x1fe0,0x0060,0x0060,0x00c0,0x3f80,0x0000, // u0123 0x0600,0x0f00,0x1980,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0124 0x0600,0x0f00,0x1980,0x0000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0125 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0xfff0,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0126 0x0000,0x0000,0x0000,0x0000,0x6000,0xfe00,0x6000,0x6000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0127 0x1cc0,0x36c0,0x3380,0x0000,0x1f80,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0128 0x0000,0x0000,0x0000,0x0000,0x1cc0,0x36c0,0x3380,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0129 0x0000,0x3fc0,0x0000,0x0000,0x1f80,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u012a 0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x0000,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u012b 0x30c0,0x30c0,0x1f80,0x0000,0x1f80,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u012c 0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x1f80,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u012d 0x0000,0x0000,0x0000,0x0000,0x1f80,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0600,0x0c00,0x0c00,0x0780,0x0000, // u012e 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0600,0x0c00,0x0c00,0x0780,0x0000, // u012f 0x0600,0x0600,0x0600,0x0000,0x1f80,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0130 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0131 0x0000,0x0000,0x0000,0x0000,0xf0f0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6c60,0x6c60, 0x6c60,0x6c60,0xf7c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0132 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x0000,0xe0e0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0xf060,0x0c60,0x0c60,0x0c60,0x07c0,0x0000, // u0133 0x00c0,0x01e0,0x0330,0x0000,0x03f0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x60c0,0x60c0, 0x60c0,0x3180,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0134 0x0000,0x0000,0x0000,0x0000,0x00c0,0x01e0,0x0330,0x0000,0x03c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x00c0,0x00c0,0x30c0,0x30c0,0x1980,0x0f00,0x0000, // u0135 0x0000,0x0000,0x0000,0x0000,0x6060,0x60c0,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7000,0x7800,0x6c00,0x6600,0x6300, 0x6180,0x60c0,0x6060,0x0000,0x0600,0x0600,0x0600,0x0c00, // u0136 0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3060,0x30c0,0x3180,0x3300,0x3600,0x3c00,0x3600,0x3300, 0x3180,0x30c0,0x3060,0x0000,0x0600,0x0600,0x0600,0x0c00, // u0137 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x30c0,0x3180,0x3300,0x3600,0x3c00,0x3600,0x3300, 0x3180,0x30c0,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0138 0x1800,0x3000,0x6000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0139 0x0180,0x0300,0x0600,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u013a 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x7fe0,0x0000,0x0600,0x0600,0x0600,0x0c00, // u013b 0x0000,0x0000,0x0000,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0600,0x0600,0x0600,0x0c00, // u013c 0x1980,0x0f00,0x0600,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u013d 0x1980,0x0f00,0x0600,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u013e 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x6180,0x6180,0x6000,0x6000,0x6000, 0x6000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u013f 0x0000,0x0000,0x0000,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0630,0x0630,0x0630,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0140 0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3c00,0x3800,0x3000,0x7000,0xf000,0x3000,0x3000, 0x3000,0x3000,0x3ff0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0141 0x0000,0x0000,0x0000,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0780,0x0700,0x0600,0x0e00,0x1e00,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0142 0x0180,0x0300,0x0600,0x0000,0x6060,0x6060,0x6060,0x6060,0x7060,0x7860,0x6c60,0x6660,0x6360,0x61e0,0x60e0,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0143 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0144 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x7060,0x7860,0x6c60,0x6660,0x6360,0x61e0,0x60e0,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0600,0x0600,0x0600,0x0c00, // u0145 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0600,0x0600,0x0600,0x0c00, // u0146 0x1980,0x0f00,0x0600,0x0000,0x6060,0x6060,0x6060,0x6060,0x7060,0x7860,0x6c60,0x6660,0x6360,0x61e0,0x60e0,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0147 0x0000,0x0000,0x0000,0x0000,0x1980,0x0f00,0x0600,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0148 0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0xc000,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0149 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x7060,0x7860,0x6c60,0x6660,0x6360,0x61e0,0x60e0,0x6060, 0x6060,0x6060,0x6060,0x0060,0x0060,0x00c0,0x0380,0x0000, // u014a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0060,0x0060,0x00c0,0x0380,0x0000, // u014b 0x0000,0x3fc0,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u014c 0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u014d 0x30c0,0x30c0,0x1f80,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u014e 0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x1f80,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u014f 0x0660,0x0cc0,0x1980,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0150 0x0000,0x0000,0x0000,0x0000,0x0660,0x0cc0,0x1980,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0151 0x0000,0x0000,0x0000,0x0000,0x3ff0,0x6300,0xc300,0xc300,0xc300,0xc300,0xc300,0xc3f0,0xc300,0xc300,0xc300,0xc300, 0xc300,0x6300,0x3ff0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0152 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x6660,0xc630,0xc630,0xc630,0xc7f0,0xc600,0xc600, 0xc600,0x6630,0x3fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0153 0x0180,0x0300,0x0600,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x60c0,0x7f80,0x7800,0x6c00,0x6600,0x6300, 0x6180,0x60c0,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0154 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x67e0,0x6c00,0x7800,0x7000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0155 0x0000,0x0000,0x0000,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x60c0,0x7f80,0x7800,0x6c00,0x6600,0x6300, 0x6180,0x60c0,0x6060,0x0000,0x0600,0x0600,0x0600,0x0c00, // u0156 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x67e0,0x6c00,0x7800,0x7000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x0000,0x6000,0x6000,0x6000,0xc000, // u0157 0x1980,0x0f00,0x0600,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x60c0,0x7f80,0x7800,0x6c00,0x6600,0x6300, 0x6180,0x60c0,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0158 0x0000,0x0000,0x0000,0x0000,0x1980,0x0f00,0x0600,0x0000,0x67e0,0x6c00,0x7800,0x7000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0159 0x0180,0x0300,0x0600,0x0000,0x1f80,0x30c0,0x6060,0x6000,0x6000,0x6000,0x3000,0x1f80,0x00c0,0x0060,0x0060,0x0060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u015a 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x3fc0,0x6060,0x6000,0x6000,0x6000,0x3fc0,0x0060,0x0060, 0x0060,0x6060,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u015b 0x0600,0x0f00,0x1980,0x0000,0x1f80,0x30c0,0x6060,0x6000,0x6000,0x6000,0x3000,0x1f80,0x00c0,0x0060,0x0060,0x0060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u015c 0x0000,0x0000,0x0000,0x0000,0x0600,0x0f00,0x1980,0x0000,0x3fc0,0x6060,0x6000,0x6000,0x6000,0x3fc0,0x0060,0x0060, 0x0060,0x6060,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u015d 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6000,0x6000,0x6000,0x3000,0x1f80,0x00c0,0x0060,0x0060,0x0060, 0x6060,0x30c0,0x1f80,0x0600,0x0600,0x0600,0x0c00,0x0000, // u015e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x6060,0x6000,0x6000,0x6000,0x3fc0,0x0060,0x0060, 0x0060,0x6060,0x3fc0,0x0600,0x0600,0x0600,0x0c00,0x0000, // u015f 0x1980,0x0f00,0x0600,0x0000,0x1f80,0x30c0,0x6060,0x6000,0x6000,0x6000,0x3000,0x1f80,0x00c0,0x0060,0x0060,0x0060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0160 0x0000,0x0000,0x0000,0x0000,0x1980,0x0f00,0x0600,0x0000,0x3fc0,0x6060,0x6000,0x6000,0x6000,0x3fc0,0x0060,0x0060, 0x0060,0x6060,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0161 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0300,0x0300,0x0300,0x0600,0x0000, // u0162 0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x07c0,0x0300,0x0300,0x0300,0x0600,0x0000, // u0163 0x1980,0x0f00,0x0600,0x0000,0x7fe0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u0164 0x3300,0x1e00,0x0c00,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x07c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0165 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x3fc0,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u0166 0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x07c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0167 0x1cc0,0x36c0,0x3380,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0168 0x0000,0x0000,0x0000,0x0000,0x1cc0,0x36c0,0x3380,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0169 0x0000,0x3fc0,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u016a 0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u016b 0x30c0,0x30c0,0x1f80,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u016c 0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x1f80,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u016d 0x0f00,0x1980,0x1980,0x0f00,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u016e 0x0000,0x0000,0x0000,0x0000,0x0f00,0x1980,0x1980,0x0f00,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u016f 0x0660,0x0cc0,0x1980,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0170 0x0000,0x0000,0x0000,0x0000,0x0660,0x0cc0,0x1980,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0171 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0600,0x0c00,0x0c00,0x0780,0x0000, // u0172 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x00c0,0x0180,0x0180,0x00f0,0x0000, // u0173 0x0600,0x0f00,0x1980,0x0000,0xc060,0xc060,0xc060,0xc060,0xc060,0xc060,0xc060,0xc060,0xc460,0xce60,0xdb60,0xf1e0, 0xe0e0,0xc060,0x8020,0x0000,0x0000,0x0000,0x0000,0x0000, // u0174 0x0000,0x0000,0x0000,0x0000,0x0600,0x0f00,0x1980,0x0000,0x6060,0x6060,0x6060,0x6060,0x6660,0x6660,0x6660,0x6660, 0x6660,0x6660,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0175 0x0600,0x0f00,0x1980,0x0000,0x6060,0x6060,0x30c0,0x30c0,0x1980,0x1980,0x0f00,0x0f00,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u0176 0x0000,0x0000,0x0000,0x0000,0x0600,0x0f00,0x1980,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30e0,0x1fe0,0x0060,0x0060,0x00c0,0x3f80,0x0000, // u0177 0x1980,0x1980,0x1980,0x0000,0x6060,0x6060,0x30c0,0x30c0,0x1980,0x1980,0x0f00,0x0f00,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u0178 0x0180,0x0300,0x0600,0x0000,0x7fe0,0x0060,0x0060,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000, 0x6000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0179 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x7fe0,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800, 0x3000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u017a 0x0600,0x0600,0x0600,0x0000,0x7fe0,0x0060,0x0060,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000, 0x6000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u017b 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0000,0x7fe0,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800, 0x3000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u017c 0x1980,0x0f00,0x0600,0x0000,0x7fe0,0x0060,0x0060,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000, 0x6000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u017d 0x0000,0x0000,0x0000,0x0000,0x1980,0x0f00,0x0600,0x0000,0x7fe0,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800, 0x3000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u017e 0x0000,0x0000,0x0000,0x0000,0x03e0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u017f 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0186 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x1fe0,0x0060,0x0060,0x0060,0x0060, 0x0060,0x0060,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u018e 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x0060,0x0060,0x0060,0x0060,0x7fe0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u018f 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6000,0x6000,0x6000,0x3000,0x1f00,0x3000,0x6000,0x6000,0x6000, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0190 0x0000,0x0000,0x0000,0x0000,0x03c0,0x0660,0x0660,0x0600,0x0600,0x0600,0x3fc0,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x6600,0x6600,0x3c00,0x0000, // u0192 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x7060,0x7860,0x6c60,0x6660,0x6360,0x61e0,0x60e0,0x6060, 0x6060,0x6060,0x6060,0x6000,0x6000,0x6000,0xc000,0x0000, // u019d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0060,0x0060,0x0060,0x0060,0x0000, // u019e 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0060,0x0060,0x0060,0x00c0,0x0180,0x0300,0x7fe0,0x0600,0x0c00,0x1800,0x3000, 0x6000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u01b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0060,0x00c0,0x0180,0x0300,0x7fe0,0x0c00,0x1800, 0x3000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u01b6 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0f80,0x00c0,0x0060,0x0060,0x0060,0x0060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u01b7 0x1980,0x0f00,0x0600,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u01cd 0x0000,0x0000,0x0000,0x0000,0x1980,0x0f00,0x0600,0x0000,0x3f80,0x00c0,0x0060,0x0060,0x1fe0,0x3060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u01ce 0x1980,0x0f00,0x0600,0x0000,0x1f80,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u01cf 0x0000,0x0000,0x0000,0x0000,0x1980,0x0f00,0x0600,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d0 0x1980,0x0f00,0x0600,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d1 0x0000,0x0000,0x0000,0x0000,0x1980,0x0f00,0x0600,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d2 0x1980,0x0f00,0x0600,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d3 0x0000,0x0000,0x0000,0x0000,0x1980,0x0f00,0x0600,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d4 0x0000,0x3fe0,0x0000,0x0000,0x3ff0,0x6300,0xc300,0xc300,0xc300,0xc300,0xc300,0xfff0,0xc300,0xc300,0xc300,0xc300, 0xc300,0xc300,0xc3f0,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e2 0x0000,0x0000,0x0000,0x0000,0x0000,0x3fe0,0x0000,0x0000,0x7be0,0x0e30,0x0630,0x0630,0x7e30,0xc7f0,0xc600,0xc600, 0xc600,0xc730,0x7de0,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e3 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6000,0x6000,0x6000,0x63e0,0x6060,0x6060,0x63f0,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fe0,0x3060,0x6060,0x6060,0x6060,0x63f0,0x6060,0x6060, 0x6060,0x30e0,0x1fe0,0x0060,0x0060,0x00c0,0x3f80,0x0000, // u01e5 0x1980,0x0f00,0x0600,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6000,0x6000,0x6000,0x63e0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e6 0x0000,0x0000,0x0000,0x0000,0x1980,0x0f00,0x0600,0x0000,0x1fe0,0x3060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30e0,0x1fe0,0x0060,0x0060,0x00c0,0x3f80,0x0000, // u01e7 0x1980,0x0f00,0x0600,0x0000,0x6060,0x60c0,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7000,0x7800,0x6c00,0x6600,0x6300, 0x6180,0x60c0,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e8 0x1980,0x0f00,0x0600,0x0000,0x3000,0x3000,0x3000,0x3000,0x3060,0x30c0,0x3180,0x3300,0x3600,0x3c00,0x3600,0x3300, 0x3180,0x30c0,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e9 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0600,0x0c00,0x0c00,0x0780,0x0000, // u01ea 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0600,0x0c00,0x0c00,0x0780,0x0000, // u01eb 0x0000,0x3fc0,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0600,0x0c00,0x0c00,0x0780,0x0000, // u01ec 0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0600,0x0c00,0x0c00,0x0780,0x0000, // u01ed 0x1980,0x0f00,0x0600,0x0000,0x7fe0,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0f80,0x00c0,0x0060,0x0060,0x0060,0x0060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u01ee 0x0000,0x0000,0x0000,0x0000,0x1980,0x0f00,0x0600,0x0000,0x7fe0,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0f80,0x00c0, 0x0060,0x0060,0x0060,0x0060,0x6060,0x30c0,0x1f80,0x0000, // u01ef 0x0000,0x0000,0x0000,0x0000,0x0330,0x01e0,0x00c0,0x0000,0x03c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x00c0,0x00c0,0x30c0,0x30c0,0x1980,0x0f00,0x0000, // u01f0 0x0180,0x0300,0x0600,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6000,0x6000,0x6000,0x63e0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u01f4 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x1fe0,0x3060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30e0,0x1fe0,0x0060,0x0060,0x00c0,0x3f80,0x0000, // u01f5 0x0180,0x0300,0x0600,0x0000,0x3ff0,0x6300,0xc300,0xc300,0xc300,0xc300,0xc300,0xfff0,0xc300,0xc300,0xc300,0xc300, 0xc300,0xc300,0xc3f0,0x0000,0x0000,0x0000,0x0000,0x0000, // u01fc 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x7be0,0x0e30,0x0630,0x0630,0x7e30,0xc7f0,0xc600,0xc600, 0xc600,0xc730,0x7de0,0x0000,0x0000,0x0000,0x0000,0x0000, // u01fd 0x0180,0x0300,0x0600,0x0000,0x1f80,0x30c0,0x6070,0x6060,0x60e0,0x61e0,0x6360,0x6660,0x6c60,0x7860,0x7060,0x6060, 0xe060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u01fe 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x1fa0,0x30c0,0x60e0,0x61e0,0x6360,0x6660,0x6c60,0x7860, 0x7060,0x30c0,0x5f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u01ff 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6000,0x6000,0x6000,0x3000,0x1f80,0x00c0,0x0060,0x0060,0x0060, 0x6060,0x30c0,0x1f80,0x0000,0x0600,0x0600,0x0600,0x0c00, // u0218 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x6060,0x6000,0x6000,0x6000,0x3fc0,0x0060,0x0060, 0x0060,0x6060,0x3fc0,0x0000,0x0600,0x0600,0x0600,0x0c00, // u0219 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0600,0x0600,0x0600,0x0c00, // u021a 0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x07c0,0x0000,0x0300,0x0300,0x0300,0x0600, // u021b 0x0000,0x3fc0,0x0000,0x0000,0x6060,0x6060,0x30c0,0x30c0,0x1980,0x1980,0x0f00,0x0f00,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u0232 0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30e0,0x1fe0,0x0060,0x0060,0x00c0,0x3f80,0x0000, // u0233 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x00c0,0x00c0,0x30c0,0x30c0,0x1980,0x0f00,0x0000, // u0237 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x0060,0x0060,0x0060,0x0060,0x0060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0254 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x7fe0,0x0060,0x0060, 0x0060,0x60c0,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0258 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x60c0,0x0060,0x0060,0x0060,0x7fe0,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0259 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x6060,0x6000,0x6000,0x6000,0x3f00,0x6000,0x6000, 0x6000,0x6060,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u025b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x6000,0x6000,0x6000,0xc000,0x0000, // u0272 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0f80,0x00c0, 0x0060,0x0060,0x0060,0x0060,0x6060,0x30c0,0x1f80,0x0000, // u0292 0x0300,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bb 0x0600,0x0600,0x0600,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bc 0x0600,0x0600,0x0600,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bd 0x0600,0x0f00,0x1980,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02c6 0x1980,0x0f00,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02c7 0x30c0,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02d8 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02d9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0600,0x0c00,0x0c00,0x0780,0x0000, // u02db 0x1cc0,0x36c0,0x3380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02dc 0x0660,0x0cc0,0x1980,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02dd 0x1800,0x0c00,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0300 0x0180,0x0300,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0301 0x0600,0x0f00,0x1980,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0302 0x1cc0,0x36c0,0x3380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0303 0x0000,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0304 0x0000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0305 0x30c0,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0306 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0307 0x1980,0x1980,0x1980,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0308 0x0f00,0x1980,0x1980,0x0f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030a 0x0660,0x0cc0,0x1980,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030b 0x1980,0x0f00,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0000, // u0329 0x0000,0x3000,0x6000,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0384 0x0180,0x0300,0x0600,0x0000,0x1980,0x1980,0x1980,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0385 0x0000,0x3000,0x6000,0xc000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0386 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0387 0x0000,0x3000,0x6000,0xc000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0388 0x0000,0x3000,0x6000,0xc000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0389 0x0000,0x3000,0x6000,0xc000,0x1f80,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u038a 0x0000,0x3000,0x6000,0xc000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u038c 0x0000,0x3000,0x6000,0xc000,0x3030,0x3030,0x1860,0x1860,0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000, // u038e 0x0000,0x3000,0x6000,0xc000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x30c0, 0x1980,0x1980,0x79e0,0x0000,0x0000,0x0000,0x0000,0x0000, // u038f 0x0180,0x0300,0x0600,0x0000,0x1980,0x1980,0x1980,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0390 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0391 0x0000,0x0000,0x0000,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x60c0,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x60c0,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0392 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0393 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0f00,0x0f00,0x0f00,0x1980,0x1980,0x1980,0x30c0,0x30c0,0x30c0, 0x6060,0x6060,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0394 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0395 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0060,0x0060,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000, 0x6000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0396 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0397 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6f60,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0398 0x0000,0x0000,0x0000,0x0000,0x1f80,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0399 0x0000,0x0000,0x0000,0x0000,0x6060,0x60c0,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7000,0x7800,0x6c00,0x6600,0x6300, 0x6180,0x60c0,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u039a 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0f00,0x0f00,0x0f00,0x1980,0x1980,0x1980,0x30c0,0x30c0,0x30c0, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u039b 0x0000,0x0000,0x0000,0x0000,0x8020,0xc060,0xe0e0,0xf1e0,0xdb60,0xce60,0xc460,0xc060,0xc060,0xc060,0xc060,0xc060, 0xc060,0xc060,0xc060,0x0000,0x0000,0x0000,0x0000,0x0000, // u039c 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x7060,0x7860,0x6c60,0x6660,0x6360,0x61e0,0x60e0,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u039d 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u039e 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u039f 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a0 0x0000,0x0000,0x0000,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x60c0,0x7f80,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a1 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180,0x0300,0x0600,0x0c00,0x1800, 0x3000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a3 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a4 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x30c0,0x30c0,0x1980,0x1980,0x0f00,0x0f00,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a5 0x0000,0x0000,0x0000,0x0000,0x0600,0x1f80,0x36c0,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660, 0x36c0,0x1f80,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a6 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x30c0,0x30c0,0x1980,0x1980,0x0f00,0x0600,0x0f00,0x1980,0x1980,0x30c0, 0x30c0,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a7 0x0000,0x0000,0x0000,0x0000,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x36c0,0x1f80, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a8 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x30c0, 0x1980,0x1980,0x79e0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a9 0x1980,0x1980,0x1980,0x0000,0x1f80,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u03aa 0x1980,0x1980,0x1980,0x0000,0x6060,0x6060,0x30c0,0x30c0,0x1980,0x1980,0x0f00,0x0f00,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ab 0x0000,0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x0000,0x3e60,0x63c0,0xc180,0xc180,0xc180,0xc180,0xc180,0xc180, 0xc180,0x63c0,0x3e60,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ac 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x3fc0,0x6060,0x6000,0x6000,0x6000,0x3f00,0x6000,0x6000, 0x6000,0x6060,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ad 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0060,0x0060,0x0060,0x0060,0x0000, // u03ae 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03af 0x0180,0x0300,0x0600,0x0000,0x1980,0x1980,0x1980,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e60,0x63c0,0xc180,0xc180,0xc180,0xc180,0xc180,0xc180, 0xc180,0x63c0,0x3e60,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b1 0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x60c0,0x60c0,0x60c0,0x6180,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x60c0,0x7f80,0x6000,0x6000,0x6000,0x6000,0x0000, // u03b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x30c0,0x30c0,0x30c0,0x1980,0x1980, 0x0f00,0x0f00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000, // u03b3 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x0c00,0x0600,0x0300,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x6060,0x6000,0x6000,0x6000,0x3f00,0x6000,0x6000, 0x6000,0x6060,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b5 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x3000,0x6000,0x6000,0x6000, 0x6000,0x3000,0x1fc0,0x0060,0x0060,0x0060,0x01c0,0x0000, // u03b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0060,0x0060,0x0060,0x0060,0x0000, // u03b7 0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0,0x60c0, 0x60c0,0x3180,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x30c0,0x3180,0x3300,0x3600,0x3c00,0x3600,0x3300, 0x3180,0x30c0,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ba 0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x0c00,0x0c00,0x0600,0x0600,0x0f00,0x0f00,0x1980,0x1980,0x30c0,0x30c0, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u03bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x60e0,0x61e0,0x7f60,0x6000,0x6000,0x6000,0x6000,0x0000, // u03bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x30c0,0x30c0,0x1980,0x1980,0x0f00, 0x0f00,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u03bd 0x0000,0x0000,0x0000,0x0000,0x1fe0,0x3000,0x6000,0x6000,0x6000,0x3000,0x1fc0,0x3000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x3000,0x1fc0,0x0060,0x0060,0x0060,0x01c0,0x0000, // u03be 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u03bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x70c0,0x7f80,0x6000,0x6000,0x6000,0x6000,0x0000, // u03c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x3000,0x1fc0,0x0060,0x0060,0x0060,0x01c0,0x0000, // u03c2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3180,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x33c0,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660, 0x6660,0x36c0,0x1f80,0x0600,0x0600,0x0600,0x0600,0x0000, // u03c6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x30c0,0x30c0,0x1980,0x1980,0x0f00,0x0600, 0x0f00,0x1980,0x1980,0x30c0,0x30c0,0x6060,0x6060,0x0000, // u03c7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660, 0x6660,0x36c0,0x1f80,0x0600,0x0600,0x0600,0x0600,0x0000, // u03c8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x6060,0x6060,0x6060,0x6660,0x6660,0x6660,0x6660, 0x6660,0x6f60,0x39c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c9 0x0000,0x0000,0x0000,0x0000,0x1980,0x1980,0x1980,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ca 0x0000,0x0000,0x0000,0x0000,0x1980,0x1980,0x1980,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u03cb 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u03cc 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u03cd 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x30c0,0x6060,0x6060,0x6060,0x6660,0x6660,0x6660,0x6660, 0x6660,0x6f60,0x39c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ce 0x0000,0x0000,0x0000,0x0000,0x0f80,0x18c0,0x3060,0x3060,0x3060,0x1860,0x0ff0,0x0060,0x0060,0xf060,0x3060,0x3060, 0x3060,0x18c0,0x0f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u03d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x1f80,0x36c0,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660, 0x6660,0x36c0,0x1f80,0x0600,0x0600,0x0000,0x0000,0x0000, // u03d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7030,0x1860,0x0cc0,0x0580,0x0700,0x0600,0x0e00,0x1a00, 0x3300,0x6180,0xc0e0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x70c0,0x7f80,0x6000,0x6000,0x3000,0x1fc0,0x0000, // u03f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f2 0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x03c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x00c0,0x00c0,0x30c0,0x30c0,0x1980,0x0f00,0x0000, // u03f3 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0x1800,0x3000,0x6000,0x6000,0x7f80,0x6000,0x6000, 0x3000,0x1800,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0180,0x00c0,0x0060,0x0060,0x1fe0,0x0060,0x0060, 0x00c0,0x0180,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f6 0x1800,0x0c00,0x0600,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0400 0x1980,0x1980,0x1980,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0401 0x0000,0x0000,0x0000,0x0000,0xfc00,0x3000,0x3000,0x3000,0x3000,0x3f80,0x30c0,0x3060,0x3060,0x3060,0x3060,0x3060, 0x3060,0x30c0,0x3380,0x0000,0x0000,0x0000,0x0000,0x0000, // u0402 0x0180,0x0300,0x0600,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0403 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6000,0x6000,0x6000,0x6000, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0404 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6000,0x6000,0x6000,0x3000,0x1f80,0x00c0,0x0060,0x0060,0x0060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0405 0x0000,0x0000,0x0000,0x0000,0x1f80,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0406 0x1980,0x1980,0x1980,0x0000,0x1f80,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0407 0x0000,0x0000,0x0000,0x0000,0x03f0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x60c0,0x60c0, 0x60c0,0x3180,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u0408 0x0000,0x0000,0x0000,0x0000,0x3e00,0x6600,0xc600,0xc600,0xc600,0xc600,0xc7c0,0xc660,0xc630,0xc630,0xc630,0xc630, 0xc630,0xc660,0x87c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0409 0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc600,0xc600,0xc7c0,0xfe60,0xc630,0xc630,0xc630,0xc630, 0xc630,0xc660,0xc7c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u040a 0x0000,0x0000,0x0000,0x0000,0xfc00,0x3000,0x3000,0x3000,0x3000,0x3f80,0x30c0,0x3060,0x3060,0x3060,0x3060,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000, // u040b 0x0180,0x0300,0x0600,0x0000,0x6060,0x60c0,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7000,0x7800,0x6c00,0x6600,0x6300, 0x6180,0x60c0,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u040c 0x1800,0x0c00,0x0600,0x0000,0x6060,0x6060,0x6060,0x6060,0x60e0,0x61e0,0x6360,0x6660,0x6c60,0x7860,0x7060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u040d 0x30c0,0x30c0,0x1f80,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x3060,0x1fe0,0x0060,0x0060,0x0060, 0x0060,0x00c0,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u040e 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x7fe0,0x0600,0x0600,0x0600,0x0000,0x0000, // u040f 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0410 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x60c0,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0411 0x0000,0x0000,0x0000,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x60c0,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x60c0,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0412 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0413 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x18c0,0x30c0,0x30c0,0x30c0,0x30c0,0x30c0,0x30c0,0x30c0,0x30c0,0x30c0,0x30c0, 0x30c0,0x70c0,0xffe0,0xc060,0xc060,0xc060,0x0000,0x0000, // u0414 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0415 0x0000,0x0000,0x0000,0x0000,0x6660,0x6660,0x6660,0x6660,0x6660,0x36c0,0x1f80,0x0f00,0x1f80,0x36c0,0x6660,0x6660, 0x6660,0x6660,0x6660,0x0000,0x0000,0x0000,0x0000,0x0000, // u0416 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x0060,0x0060,0x0060,0x00c0,0x0f80,0x00c0,0x0060,0x0060,0x0060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0417 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x60e0,0x61e0,0x6360,0x6660,0x6c60,0x7860,0x7060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0418 0x30c0,0x30c0,0x1f80,0x0000,0x6060,0x6060,0x6060,0x6060,0x60e0,0x61e0,0x6360,0x6660,0x6c60,0x7860,0x7060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0419 0x0000,0x0000,0x0000,0x0000,0x6060,0x60c0,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7000,0x7800,0x6c00,0x6600,0x6300, 0x6180,0x60c0,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u041a 0x0000,0x0000,0x0000,0x0000,0x0fe0,0x1860,0x3060,0x3060,0x3060,0x3060,0x3060,0x3060,0x3060,0x3060,0x3060,0x3060, 0x3060,0x6060,0xc060,0x0000,0x0000,0x0000,0x0000,0x0000, // u041b 0x0000,0x0000,0x0000,0x0000,0x8020,0xc060,0xe0e0,0xf1e0,0xdb60,0xce60,0xc460,0xc060,0xc060,0xc060,0xc060,0xc060, 0xc060,0xc060,0xc060,0x0000,0x0000,0x0000,0x0000,0x0000, // u041c 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u041d 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u041e 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u041f 0x0000,0x0000,0x0000,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x60c0,0x7f80,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0420 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0421 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u0422 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x3060,0x1fe0,0x0060,0x0060,0x0060, 0x0060,0x00c0,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0423 0x0000,0x0000,0x0000,0x0600,0x1f80,0x36c0,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660, 0x6660,0x36c0,0x1f80,0x0600,0x0000,0x0000,0x0000,0x0000, // u0424 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x30c0,0x30c0,0x1980,0x1980,0x0f00,0x0600,0x0f00,0x1980,0x1980,0x30c0, 0x30c0,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0425 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x3060,0x1ff0,0x0030,0x0030,0x0030,0x0000,0x0000, // u0426 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x3060,0x1fe0,0x0060,0x0060,0x0060,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0427 0x0000,0x0000,0x0000,0x0000,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660, 0x6660,0x3660,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0428 0x0000,0x0000,0x0000,0x0000,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660, 0x6660,0x3660,0x1ff0,0x0030,0x0030,0x0030,0x0000,0x0000, // u0429 0x0000,0x0000,0x0000,0x0000,0xe000,0xe000,0x6000,0x6000,0x6000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x60c0,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u042a 0x0000,0x0000,0x0000,0x0000,0xc060,0xc060,0xc060,0xc060,0xc060,0xfc60,0xc660,0xc360,0xc360,0xc360,0xc360,0xc360, 0xc360,0xc660,0xfc60,0x0000,0x0000,0x0000,0x0000,0x0000, // u042b 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x60c0,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u042c 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x0060,0x0060,0x0060,0x0060,0x0fe0,0x0060,0x0060,0x0060,0x0060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u042d 0x0000,0x0000,0x0000,0x0000,0xc7c0,0xcc60,0xcc60,0xcc60,0xcc60,0xcc60,0xcc60,0xfc60,0xcc60,0xcc60,0xcc60,0xcc60, 0xcc60,0xcc60,0xc7c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u042e 0x0000,0x0000,0x0000,0x0000,0x1fe0,0x3060,0x6060,0x6060,0x6060,0x6060,0x3060,0x1fe0,0x01e0,0x0360,0x0660,0x0c60, 0x1860,0x3060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u042f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x00c0,0x0060,0x0060,0x1fe0,0x3060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0430 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3000,0x6000,0x6000,0x6000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x60c0,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0431 0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x60c0,0x60c0,0x60c0,0x6180,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x60c0,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0432 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0433 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fe0,0x3060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30e0,0x1fe0,0x0060,0x0060,0x00c0,0x3f80,0x0000, // u0434 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x7fe0,0x6000,0x6000, 0x6000,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0435 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6660,0x6660,0x6660,0x36c0,0x1f80,0x0f00,0x1f80,0x36c0, 0x6660,0x6660,0x6660,0x0000,0x0000,0x0000,0x0000,0x0000, // u0436 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x6060,0x0060,0x0060,0x0060,0x0fc0,0x0060,0x0060, 0x0060,0x6060,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0437 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0438 0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x1f80,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0439 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x30c0,0x3180,0x3300,0x3600,0x3c00,0x3600,0x3300, 0x3180,0x30c0,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000, // u043a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0x1860,0x3060,0x3060,0x3060,0x3060,0x3060,0x3060, 0x3060,0x3060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u043b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4020,0x6060,0x70e0,0x79e0,0x6f60,0x6660,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u043c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u043d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u043e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u043f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x60c0,0x7f80,0x6000,0x6000,0x6000,0x6000,0x0000, // u0440 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0441 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u0442 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30e0,0x1fe0,0x0060,0x0060,0x00c0,0x3f80,0x0000, // u0443 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x1f80,0x36c0,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660, 0x6660,0x36c0,0x1f80,0x0600,0x0600,0x0000,0x0000,0x0000, // u0444 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x30c0,0x1980,0x0f00,0x0600,0x0f00,0x1980, 0x30c0,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0445 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x3060,0x1ff0,0x0030,0x0030,0x0030,0x0000,0x0000, // u0446 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x3060,0x1fe0,0x0060,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000, // u0447 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660, 0x6660,0x3660,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0448 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660, 0x6660,0x3660,0x1ff0,0x0030,0x0030,0x0030,0x0000,0x0000, // u0449 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x7000,0x3000,0x3f80,0x30c0,0x3060,0x3060,0x3060, 0x3060,0x30c0,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u044a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x7c60,0x6660,0x6360,0x6360,0x6360, 0x6360,0x6660,0x7c60,0x0000,0x0000,0x0000,0x0000,0x0000, // u044b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0, 0x60c0,0x6180,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u044c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x0060,0x0060,0x0fe0,0x0060,0x0060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u044d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc7c0,0xcc60,0xcc60,0xcc60,0xcc60,0xfc60,0xcc60,0xcc60, 0xcc60,0xcc60,0xc7c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u044e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fe0,0x6060,0x6060,0x6060,0x6060,0x3fe0,0x0360,0x0660, 0x0c60,0x1860,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000, // u044f 0x0000,0x0000,0x0000,0x0000,0x1800,0x0c00,0x0600,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x7fe0,0x6000,0x6000, 0x6000,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0450 0x0000,0x0000,0x0000,0x0000,0x1980,0x1980,0x1980,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x7fe0,0x6000,0x6000, 0x6000,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0451 0x0000,0x0000,0x0000,0x0000,0x6000,0xfe00,0x6000,0x6000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0060,0x0060,0x00c0,0x0380,0x0000, // u0452 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0453 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6000,0x6000,0x7f00,0x6000,0x6000, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0454 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x6060,0x6000,0x6000,0x6000,0x3fc0,0x0060,0x0060, 0x0060,0x6060,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0455 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0456 0x0000,0x0000,0x0000,0x0000,0x1980,0x1980,0x1980,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0457 0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x03c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x00c0,0x00c0,0x30c0,0x30c0,0x1980,0x0f00,0x0000, // u0458 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x6600,0xc600,0xc7c0,0xc660,0xc630,0xc630,0xc630, 0xc630,0xc660,0x87c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u0459 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xc600,0xc600,0xc600,0xc7c0,0xfe60,0xc630,0xc630, 0xc630,0xc660,0xc7c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u045a 0x0000,0x0000,0x0000,0x0000,0x6000,0xfe00,0x6000,0x6000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u045b 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x3060,0x30c0,0x3180,0x3300,0x3600,0x3c00,0x3600,0x3300, 0x3180,0x30c0,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000, // u045c 0x0000,0x0000,0x0000,0x0000,0x1800,0x0c00,0x0600,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u045d 0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x1f80,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30e0,0x1fe0,0x0060,0x0060,0x00c0,0x3f80,0x0000, // u045e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x7fe0,0x0600,0x0600,0x0600,0x0000,0x0000, // u045f 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0xfe00,0x6000,0x6000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x60c0,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0462 0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0xfe00,0x3000,0x3000,0x3000,0x3f80,0x30c0,0x3060,0x3060,0x3060, 0x3060,0x30c0,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u0463 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6060,0x30c0,0x30c0,0x1980,0x1980,0x0f00,0x0f00,0x1f80,0x36c0,0x6660,0x6660, 0x6660,0x6660,0x6660,0x0000,0x0000,0x0000,0x0000,0x0000, // u046a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6060,0x30c0,0x1980,0x0f00,0x0f00,0x1f80,0x36c0, 0x6660,0x6660,0x6660,0x0000,0x0000,0x0000,0x0000,0x0000, // u046b 0x0000,0x0060,0x0060,0x0060,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0490 0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0491 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0xfe00,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0492 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0xfe00,0x6000,0x6000, 0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0493 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x60c0,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0060,0x00c0,0x0180,0x0000,0x0000, // u0494 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x7f00,0x6180,0x60c0, 0x60c0,0x60c0,0x60c0,0x00c0,0x0180,0x0300,0x0000,0x0000, // u0495 0x0000,0x0000,0x0000,0x0000,0x6660,0x6660,0x6660,0x6660,0x6660,0x36c0,0x1f80,0x0f00,0x1f80,0x36c0,0x6660,0x6660, 0x6660,0x6660,0x6670,0x0030,0x0030,0x0030,0x0000,0x0000, // u0496 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6660,0x6660,0x6660,0x36c0,0x1f80,0x0f00,0x1f80,0x36c0, 0x6660,0x6660,0x6670,0x0030,0x0030,0x0030,0x0000,0x0000, // u0497 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x0060,0x0060,0x0060,0x00c0,0x0f80,0x00c0,0x0060,0x0060,0x0060, 0x6060,0x30c0,0x1f80,0x0600,0x0600,0x0600,0x0600,0x0000, // u0498 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x6060,0x0060,0x0060,0x0060,0x0fc0,0x0060,0x0060, 0x0060,0x6060,0x3fc0,0x0600,0x0600,0x0600,0x0600,0x0000, // u0499 0x0000,0x0000,0x0000,0x0000,0x6060,0x60c0,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7000,0x7800,0x6c00,0x6600,0x6300, 0x6180,0x60c0,0x6070,0x0030,0x0030,0x0030,0x0000,0x0000, // u049a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x6180,0x6300,0x6600,0x6c00,0x7800,0x6c00,0x6600, 0x6300,0x6180,0x60e0,0x0060,0x0060,0x0060,0x0000,0x0000, // u049b 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x60c0,0x6180,0x6b00,0x6e00,0x6c00,0x7800,0x6c00,0x6e00,0x6b00,0x6180, 0x60c0,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u049c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x60c0,0x6980,0x6b00,0x6e00,0x7c00,0x6e00,0x6b00, 0x6980,0x60c0,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u049d 0x0000,0x0000,0x0000,0x0000,0xe060,0xe0c0,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7000,0x7800,0x6c00,0x6600,0x6300, 0x6180,0x60c0,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7060,0x70c0,0x3180,0x3300,0x3600,0x3c00,0x3600,0x3300, 0x3180,0x30c0,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a1 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6070,0x0030,0x0030,0x0030,0x0000,0x0000, // u04a2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060, 0x6060,0x6060,0x6070,0x0030,0x0030,0x0030,0x0000,0x0000, // u04a3 0x0000,0x0000,0x0000,0x0000,0x61f0,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180, 0x6180,0x6180,0x6180,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x61f0,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180, 0x6180,0x6180,0x6180,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a5 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6060, 0x6060,0x30c0,0x1f80,0x0600,0x0600,0x0600,0x0600,0x0000, // u04aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6060,0x30c0,0x1f80,0x0600,0x0600,0x0600,0x0600,0x0000, // u04ab 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x30c0,0x30c0,0x1980,0x1980,0x0f00,0x0f00,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x30c0,0x30c0,0x30c0,0x1980,0x1980, 0x0f00,0x0f00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000, // u04af 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x30c0,0x30c0,0x1980,0x1980,0x0f00,0x0f00,0x0600,0x3fc0,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u04b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x30c0,0x30c0,0x30c0,0x1980,0x1980, 0x0f00,0x0f00,0x0600,0x3fc0,0x0600,0x0600,0x0600,0x0000, // u04b1 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x30c0,0x30c0,0x1980,0x1980,0x0f00,0x0600,0x0f00,0x1980,0x1980,0x30c0, 0x30c0,0x6060,0x6070,0x0030,0x0030,0x0030,0x0000,0x0000, // u04b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x30c0,0x1980,0x0f00,0x0600,0x0f00,0x1980, 0x30c0,0x6060,0x6070,0x0030,0x0030,0x0030,0x0000,0x0000, // u04b3 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x3060,0x1fe0,0x0060,0x0060,0x0060,0x0060, 0x0060,0x0060,0x0070,0x0030,0x0030,0x0030,0x0000,0x0000, // u04b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x3060,0x1fe0,0x0060,0x0060, 0x0060,0x0060,0x0070,0x0030,0x0030,0x0030,0x0000,0x0000, // u04b7 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6660,0x6660,0x3660,0x1fe0,0x0660,0x0660,0x0660,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000, // u04b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6660,0x6660,0x3660,0x1fe0,0x0660,0x0660, 0x0660,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000, // u04b9 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x60c0,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u04bb 0x0000,0x0000,0x0000,0x0000,0x1f80,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04c0 0x30c0,0x30c0,0x1f80,0x0000,0x6660,0x6660,0x6660,0x6660,0x6660,0x36c0,0x1f80,0x0f00,0x1f80,0x36c0,0x6660,0x6660, 0x6660,0x6660,0x6660,0x0000,0x0000,0x0000,0x0000,0x0000, // u04c1 0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x1f80,0x0000,0x6660,0x6660,0x6660,0x36c0,0x1f80,0x0f00,0x1f80,0x36c0, 0x6660,0x6660,0x6660,0x0000,0x0000,0x0000,0x0000,0x0000, // u04c2 0x0000,0x0000,0x0000,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04cf 0x30c0,0x30c0,0x1f80,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d0 0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x1f80,0x0000,0x3f80,0x00c0,0x0060,0x0060,0x1fe0,0x3060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d1 0x1980,0x1980,0x1980,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d2 0x0000,0x0000,0x0000,0x0000,0x1980,0x1980,0x1980,0x0000,0x3f80,0x00c0,0x0060,0x0060,0x1fe0,0x3060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d3 0x0000,0x0000,0x0000,0x0000,0x3ff0,0x6300,0xc300,0xc300,0xc300,0xc300,0xc300,0xfff0,0xc300,0xc300,0xc300,0xc300, 0xc300,0xc300,0xc3f0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7be0,0x0e30,0x0630,0x0630,0x7e30,0xc7f0,0xc600,0xc600, 0xc600,0xc730,0x7de0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d5 0x30c0,0x30c0,0x1f80,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d6 0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x1f80,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x7fe0,0x6000,0x6000, 0x6000,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d7 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x0060,0x0060,0x0060,0x0060,0x7fe0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x60c0,0x0060,0x0060,0x0060,0x7fe0,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d9 0x1980,0x1980,0x1980,0x0000,0x1f80,0x30c0,0x6060,0x0060,0x0060,0x0060,0x0060,0x7fe0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04da 0x0000,0x0000,0x0000,0x0000,0x1980,0x1980,0x1980,0x0000,0x3f80,0x60c0,0x0060,0x0060,0x0060,0x7fe0,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04db 0x1980,0x1980,0x1980,0x0000,0x6660,0x6660,0x6660,0x6660,0x6660,0x36c0,0x1f80,0x0f00,0x1f80,0x36c0,0x6660,0x6660, 0x6660,0x6660,0x6660,0x0000,0x0000,0x0000,0x0000,0x0000, // u04dc 0x0000,0x0000,0x0000,0x0000,0x1980,0x1980,0x1980,0x0000,0x6660,0x6660,0x6660,0x36c0,0x1f80,0x0f00,0x1f80,0x36c0, 0x6660,0x6660,0x6660,0x0000,0x0000,0x0000,0x0000,0x0000, // u04dd 0x1980,0x1980,0x1980,0x0000,0x1f80,0x30c0,0x6060,0x0060,0x0060,0x0060,0x00c0,0x0f80,0x00c0,0x0060,0x0060,0x0060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04de 0x0000,0x0000,0x0000,0x0000,0x1980,0x1980,0x1980,0x0000,0x3fc0,0x6060,0x0060,0x0060,0x0060,0x0fc0,0x0060,0x0060, 0x0060,0x6060,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04df 0x0000,0x3fc0,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x60e0,0x61e0,0x6360,0x6660,0x6c60,0x7860,0x7060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e2 0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e3 0x1980,0x1980,0x1980,0x0000,0x6060,0x6060,0x6060,0x6060,0x60e0,0x61e0,0x6360,0x6660,0x6c60,0x7860,0x7060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e4 0x0000,0x0000,0x0000,0x0000,0x1980,0x1980,0x1980,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e5 0x1980,0x1980,0x1980,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e6 0x0000,0x0000,0x0000,0x0000,0x1980,0x1980,0x1980,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e7 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e9 0x1980,0x1980,0x1980,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ea 0x0000,0x0000,0x0000,0x0000,0x1980,0x1980,0x1980,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04eb 0x1980,0x1980,0x1980,0x0000,0x1f80,0x30c0,0x6060,0x0060,0x0060,0x0060,0x0060,0x0fe0,0x0060,0x0060,0x0060,0x0060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ec 0x0000,0x0000,0x0000,0x0000,0x1980,0x1980,0x1980,0x0000,0x1f80,0x30c0,0x6060,0x0060,0x0060,0x0fe0,0x0060,0x0060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ed 0x0000,0x3fc0,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x3060,0x1fe0,0x0060,0x0060,0x0060, 0x0060,0x00c0,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ee 0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30e0,0x1fe0,0x0060,0x0060,0x00c0,0x3f80,0x0000, // u04ef 0x1980,0x1980,0x1980,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x3060,0x1fe0,0x0060,0x0060,0x0060, 0x0060,0x00c0,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f0 0x0000,0x0000,0x0000,0x0000,0x1980,0x1980,0x1980,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30e0,0x1fe0,0x0060,0x0060,0x00c0,0x3f80,0x0000, // u04f1 0x0660,0x0cc0,0x1980,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x3060,0x1fe0,0x0060,0x0060,0x0060, 0x0060,0x00c0,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f2 0x0000,0x0000,0x0000,0x0000,0x0660,0x0cc0,0x1980,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30e0,0x1fe0,0x0060,0x0060,0x00c0,0x3f80,0x0000, // u04f3 0x1980,0x1980,0x1980,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x3060,0x1fe0,0x0060,0x0060,0x0060,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f4 0x0000,0x0000,0x0000,0x0000,0x1980,0x1980,0x1980,0x0000,0x6060,0x6060,0x6060,0x6060,0x3060,0x1fe0,0x0060,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f5 0x3300,0x3300,0x3300,0x0000,0xc060,0xc060,0xc060,0xc060,0xc060,0xfc60,0xc660,0xc360,0xc360,0xc360,0xc360,0xc360, 0xc360,0xc660,0xfc60,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f8 0x0000,0x0000,0x0000,0x0000,0x1980,0x1980,0x1980,0x0000,0x6060,0x6060,0x6060,0x7c60,0x6660,0x6360,0x6360,0x6360, 0x6360,0x6660,0x7c60,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f9 0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x1860,0x1860,0x0c60,0x0c60,0x1e60,0x36c0,0x6780,0x6300,0x6300,0x6180, 0x6180,0x60c0,0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d0 0x0000,0x0000,0x0000,0x0000,0xff00,0x0180,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x00c0,0xfff0,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d1 0x0000,0x0000,0x0000,0x0000,0x3e00,0x0300,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0380,0x0780,0x0cc0, 0x18c0,0x3060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d2 0x0000,0x0000,0x0000,0x0000,0xfff0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d3 0x0000,0x0000,0x0000,0x0000,0x7f80,0x00c0,0x0060,0x0060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d4 0x0000,0x0000,0x0000,0x0000,0x3800,0x0c00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d5 0x0000,0x0000,0x0000,0x0000,0x7f80,0x0300,0x0600,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d6 0x0000,0x0000,0x0000,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d7 0x0000,0x0000,0x0000,0x0000,0x6380,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d8 0x0000,0x0000,0x0000,0x0000,0x3800,0x0c00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d9 0x0000,0x0000,0x0000,0x0000,0x7f80,0x00c0,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060, 0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0000, // u05da 0x0000,0x0000,0x0000,0x0000,0x7f80,0x00c0,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060, 0x0060,0x00c0,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u05db 0x0000,0x6000,0x6000,0x6000,0x7fe0,0x0060,0x0060,0x0060,0x0060,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u05dc 0x0000,0x0000,0x0000,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u05dd 0x0000,0x0000,0x0000,0x0000,0xcf80,0xf8c0,0x7060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x63e0,0x0000,0x0000,0x0000,0x0000,0x0000, // u05de 0x0000,0x0000,0x0000,0x0000,0x7c00,0x0600,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000, // u05df 0x0000,0x0000,0x0000,0x0000,0x3e00,0x0300,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e0 0x0000,0x0000,0x0000,0x0000,0xff80,0xc0c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e1 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x3060,0x3060,0x3060,0x1860,0x18c0,0x18c0,0x0d80,0x0d80,0x0700, 0x0e00,0x1c00,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e2 0x0000,0x0000,0x0000,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x3060,0x1c60,0x0060,0x0060,0x0060,0x0060, 0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0000, // u05e3 0x0000,0x0000,0x0000,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x3060,0x1c60,0x0060,0x0060,0x0060,0x0060, 0x0060,0x00c0,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e4 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x3060,0x3060,0x1860,0x18c0,0x0d80,0x0f00,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000, // u05e5 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x3060,0x3060,0x1860,0x18c0,0x0d80,0x0f00,0x0600,0x0300,0x0300,0x0180, 0x0180,0x00c0,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e6 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0060,0x0060,0x0060,0x6060,0x6060,0x6060,0x60c0,0x6180,0x6300,0x6600,0x6600, 0x6600,0x6600,0x6600,0x6000,0x6000,0x6000,0x6000,0x0000, // u05e7 0x0000,0x0000,0x0000,0x0000,0x7f80,0x00c0,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e8 0x0000,0x0000,0x0000,0x0000,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660,0x6c60,0x7860,0x6060,0x6060,0x6060, 0x6060,0x60c0,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e9 0x0000,0x0000,0x0000,0x0000,0xff80,0xc0c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0xc060,0x0000,0x0000,0x0000,0x0000,0x0000, // u05ea 0x0000,0x0000,0x0000,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x60c0,0x7f80,0x0000,0x0c00,0x0c00,0x0c00,0x0000, // u1e0c 0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x1fe0,0x3060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0300,0x0300,0x0300,0x0000, // u1e0d 0x0000,0x0000,0x0000,0x0000,0x6060,0x60c0,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7000,0x7800,0x6c00,0x6600,0x6300, 0x6180,0x60c0,0x6060,0x0000,0x0000,0x3fc0,0x0000,0x0000, // u1e34 0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3060,0x30c0,0x3180,0x3300,0x3600,0x3c00,0x3600,0x3300, 0x3180,0x30c0,0x3060,0x0000,0x0000,0x1fc0,0x0000,0x0000, // u1e35 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x7fe0,0x0000,0x0600,0x0600,0x0600,0x0000, // u1e36 0x0000,0x0000,0x0000,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0600,0x0600,0x0600,0x0000, // u1e37 0x0600,0x0600,0x0600,0x0000,0x8020,0xc060,0xe0e0,0xf1e0,0xdb60,0xce60,0xc460,0xc060,0xc060,0xc060,0xc060,0xc060, 0xc060,0xc060,0xc060,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e40 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0000,0x7f80,0x66c0,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660, 0x6660,0x6660,0x6660,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e41 0x0000,0x0000,0x0000,0x0000,0x8020,0xc060,0xe0e0,0xf1e0,0xdb60,0xce60,0xc460,0xc060,0xc060,0xc060,0xc060,0xc060, 0xc060,0xc060,0xc060,0x0000,0x0600,0x0600,0x0600,0x0000, // u1e42 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x66c0,0x6660,0x6660,0x6660,0x6660,0x6660,0x6660, 0x6660,0x6660,0x6660,0x0000,0x0600,0x0600,0x0600,0x0000, // u1e43 0x0600,0x0600,0x0600,0x0000,0x6060,0x6060,0x6060,0x6060,0x7060,0x7860,0x6c60,0x6660,0x6360,0x61e0,0x60e0,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e44 0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e45 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x7060,0x7860,0x6c60,0x6660,0x6360,0x61e0,0x60e0,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0600,0x0600,0x0600,0x0000, // u1e46 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0600,0x0600,0x0600,0x0000, // u1e47 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0600,0x0600,0x0600,0x0000, // u1e6c 0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x07c0,0x0000,0x0300,0x0300,0x0300,0x0000, // u1e6d 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x7fe0,0x0000,0x0600,0x0600,0x0600,0x0000, // u1eb8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x7fe0,0x6000,0x6000, 0x6000,0x3060,0x1fc0,0x0000,0x0600,0x0600,0x0600,0x0000, // u1eb9 0x1cc0,0x36c0,0x3380,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u1ebc 0x0000,0x0000,0x0000,0x0000,0x1cc0,0x36c0,0x3380,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x7fe0,0x6000,0x6000, 0x6000,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u1ebd 0x0000,0x0000,0x0000,0x0000,0x1f80,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0600,0x0600,0x0600,0x0000, // u1eca 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0600,0x0600,0x0600,0x0000, // u1ecb 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0600,0x0600,0x0600,0x0000, // u1ecc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0600,0x0600,0x0600,0x0000, // u1ecd 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0600,0x0600,0x0600,0x0000, // u1ee4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x3060,0x1fe0,0x0000,0x0300,0x0300,0x0300,0x0000, // u1ee5 0x1cc0,0x36c0,0x3380,0x0000,0x6060,0x6060,0x30c0,0x30c0,0x1980,0x1980,0x0f00,0x0f00,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u1ef8 0x0000,0x0000,0x0000,0x0000,0x1cc0,0x36c0,0x3380,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30e0,0x1fe0,0x0060,0x0060,0x00c0,0x3f80,0x0000, // u1ef9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2001 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2002 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2003 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2004 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2005 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2006 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2007 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2008 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2009 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2010 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2011 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2012 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2013 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2014 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2015 0x0000,0x0000,0x0000,0x0000,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980, 0x1980,0x1980,0x1980,0x0000,0x0000,0x0000,0x0000,0x0000, // u2016 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0000,0x0000,0x7fe0, // u2017 0x0000,0x0000,0x0300,0x0600,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2018 0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2019 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600, 0x0600,0x0600,0x0600,0x0c00,0x0000,0x0000,0x0000,0x0000, // u201a 0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201b 0x0000,0x0000,0x0660,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201c 0x0000,0x0000,0x1980,0x1980,0x1980,0x1980,0x3300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0cc0, 0x0cc0,0x0cc0,0x0cc0,0x1980,0x0000,0x0000,0x0000,0x0000, // u201e 0x0000,0x0000,0x1980,0x1980,0x1980,0x1980,0x0cc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201f 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x7fe0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2020 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x7fe0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x7fe0, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2021 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f00,0x1f80,0x1f80,0x1f80,0x1f80,0x0f00,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2022 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x6660,0x6660,0x6660,0x0000,0x0000,0x0000,0x0000,0x0000, // u2026 0x0000,0x0000,0x0000,0x0000,0x0000,0x7300,0xdb00,0xde00,0x7600,0x0c00,0x0c00,0x1800,0x1800,0x3000,0x3000,0x6ee0, 0x7bb0,0xdbb0,0xcee0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2030 0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x0400,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2032 0x0000,0x0000,0x1980,0x1980,0x1980,0x1980,0x1100,0x1100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2033 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x1800,0x0c00, 0x0600,0x0300,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000, // u2039 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180,0x0300,0x0600, 0x0c00,0x1800,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000, // u203a 0x0000,0x0000,0x0000,0x0000,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x0000,0x0000, 0x1980,0x1980,0x1980,0x0000,0x0000,0x0000,0x0000,0x0000, // u203c 0x0000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u203e 0x0000,0x0000,0x1f00,0x3180,0x3180,0x3180,0x3180,0x3180,0x3180,0x3180,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2070 0x0000,0x0600,0x0600,0x0000,0x0e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0f00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2071 0x0000,0x0000,0x0180,0x0380,0x0780,0x0d80,0x1980,0x3180,0x3f80,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2074 0x0000,0x0000,0x3f00,0x3000,0x3000,0x3000,0x3f00,0x0180,0x0180,0x0180,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2075 0x0000,0x0000,0x1f00,0x3000,0x3000,0x3000,0x3f00,0x3180,0x3180,0x3180,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2076 0x0000,0x0000,0x3f80,0x3180,0x0180,0x0300,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2077 0x0000,0x0000,0x1f00,0x3180,0x3180,0x3180,0x1f00,0x3180,0x3180,0x3180,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2078 0x0000,0x0000,0x1f00,0x3180,0x3180,0x3180,0x1f80,0x0180,0x0180,0x0180,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2079 0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x3fc0,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207b 0x0000,0x0000,0x0000,0x0000,0x3fc0,0x0000,0x0000,0x0000,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207c 0x0000,0x0000,0x0300,0x0600,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0600,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207d 0x0000,0x0000,0x1800,0x0c00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0c00,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207e 0x0000,0x0000,0x0000,0x1f80,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x3180,0x3180, 0x3180,0x3180,0x3180,0x3180,0x1f00,0x0000,0x0000,0x0000, // u2080 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0e00,0x1e00,0x0600, 0x0600,0x0600,0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000, // u2081 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x3180,0x0180, 0x0300,0x0600,0x0c00,0x1800,0x3f80,0x0000,0x0000,0x0000, // u2082 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x0180,0x0180, 0x0f00,0x0180,0x0180,0x3180,0x1f00,0x0000,0x0000,0x0000, // u2083 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0380,0x0780,0x0d80, 0x1980,0x3180,0x3f80,0x0180,0x0180,0x0000,0x0000,0x0000, // u2084 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x3000,0x3000,0x3000, 0x3f00,0x0180,0x0180,0x0180,0x3f00,0x0000,0x0000,0x0000, // u2085 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3000,0x3000,0x3000, 0x3f00,0x3180,0x3180,0x3180,0x1f00,0x0000,0x0000,0x0000, // u2086 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x3180,0x0180,0x0300, 0x0300,0x0600,0x0600,0x0c00,0x0c00,0x0000,0x0000,0x0000, // u2087 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x3180,0x3180, 0x1f00,0x3180,0x3180,0x3180,0x1f00,0x0000,0x0000,0x0000, // u2088 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x3180,0x3180, 0x1f80,0x0180,0x0180,0x0180,0x1f00,0x0000,0x0000,0x0000, // u2089 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600, 0x3fc0,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u208a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u208b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x0000, 0x0000,0x0000,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u208c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0600,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0600,0x0300,0x0000,0x0000,0x0000, // u208d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x0c00,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0c00,0x1800,0x0000,0x0000,0x0000, // u208e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x0180,0x0180, 0x1f80,0x3180,0x3180,0x3180,0x1f80,0x0000,0x0000,0x0000, // u2090 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x3180, 0x3f80,0x3000,0x3000,0x3180,0x1f00,0x0000,0x0000,0x0000, // u2091 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x3180, 0x3180,0x3180,0x3180,0x3180,0x1f00,0x0000,0x0000,0x0000, // u2092 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x1b00, 0x0e00,0x0e00,0x1b00,0x3180,0x3180,0x0000,0x0000,0x0000, // u2093 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x0180, 0x0180,0x3f80,0x3180,0x3180,0x1f00,0x0000,0x0000,0x0000, // u2094 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3f00,0x3180,0x3180, 0x3180,0x3180,0x3180,0x3180,0x3180,0x0000,0x0000,0x0000, // u2095 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3180,0x3300,0x3600, 0x3c00,0x3c00,0x3600,0x3300,0x3180,0x0000,0x0000,0x0000, // u2096 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0f00,0x0000,0x0000,0x0000, // u2097 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x6660,0x6660, 0x6660,0x6660,0x6660,0x6660,0x6660,0x0000,0x0000,0x0000, // u2098 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x3180,0x3180, 0x3180,0x3180,0x3180,0x3180,0x3f00,0x3000,0x3000,0x3000, // u209a 0x0000,0x0000,0x0000,0x0000,0xfc00,0xc600,0xc300,0xc300,0xc300,0xc300,0xc600,0xfd80,0xc180,0xc7e0,0xc180,0xc180, 0xc180,0xc180,0xc0e0,0x0000,0x0000,0x0000,0x0000,0x0000, // u20a7 0x0000,0x0000,0x0000,0x0000,0xfc60,0xc660,0xc360,0xc360,0xdb60,0xdb60,0xdb60,0xdb60,0xdb60,0xdb60,0xdb60,0xd860, 0xd860,0xd8c0,0xdf80,0x0000,0x0000,0x0000,0x0000,0x0000, // u20aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0f80,0x18c0,0x3060,0x6000,0x6000,0xff00,0x6000,0x6000,0xff00,0x6000,0x6000, 0x3060,0x18c0,0x0f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u20ac 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0600,0x0600,0x0600,0x07c0,0x0700,0x0e00,0x3fc0,0x0700,0x0e00,0x3e00,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u20ae 0x0000,0x0000,0x0000,0x0000,0x1f00,0x3080,0x5040,0x5040,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5040, 0x5040,0x3080,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2102 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u210e 0x0000,0x0000,0x0000,0x0000,0x6000,0xfe00,0x6000,0x6000,0x7f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u210f 0x0000,0x0000,0x0000,0x0000,0x4040,0x4040,0x4040,0x6040,0x5040,0x6840,0x5440,0x4a40,0x4540,0x42c0,0x4140,0x40c0, 0x4040,0x4040,0x4040,0x0000,0x0000,0x0000,0x0000,0x0000, // u2115 0x0000,0x0000,0x0000,0x0000,0xc600,0xc660,0xc690,0xe690,0xe660,0xf600,0xf600,0xde00,0xde00,0xcef0,0xce00,0xc600, 0xc6f0,0xc600,0xc600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2116 0x0000,0x0000,0x0000,0x0000,0x1f00,0x3080,0x5040,0x5040,0x5040,0x5040,0x5040,0x5040,0x5040,0x5040,0x5040,0x5040, 0x5440,0x3280,0x1f00,0x0080,0x0040,0x0000,0x0000,0x0000, // u211a 0x0000,0x0000,0x0000,0x0000,0x7f00,0x5080,0x5040,0x5040,0x5040,0x5040,0x5080,0x5f00,0x5400,0x5a00,0x5500,0x5280, 0x5140,0x50a0,0x7060,0x0000,0x0000,0x0000,0x0000,0x0000, // u211d 0x0000,0x0000,0x0000,0x0000,0xfd10,0x31b0,0x31f0,0x31b0,0x31b0,0x31b0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2122 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0040,0x0040,0x00c0,0x0140,0x0280,0x0500,0x0a00,0x1400,0x2800,0x5000,0x6000, 0x4000,0x4000,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2124 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x30c0, 0x1980,0x1980,0x79e0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2126 0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x18c0,0x18c0,0x0c60,0x0c30,0x1e60,0x36c0,0x6780,0x6300,0x6300,0x6180, 0x6180,0x30c0,0x18c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2135 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1800,0x3000,0x6000,0xffe0,0xffe0,0x6000,0x3000,0x1800, 0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2190 0x0000,0x0000,0x0000,0x0000,0x0600,0x0f00,0x1f80,0x36c0,0x6660,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2191 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0200,0x0300,0x0180,0x00c0,0xffe0,0xffe0,0x00c0,0x0180,0x0300, 0x0200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2192 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x6660,0x36c0, 0x1f80,0x0f00,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2193 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0900,0x1980,0x30c0,0x6060,0xfff0,0xfff0,0x6060,0x30c0,0x1980, 0x0900,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2194 0x0000,0x0000,0x0000,0x0000,0x0600,0x0f00,0x1f80,0x36c0,0x6660,0x0600,0x0600,0x0600,0x0600,0x0600,0x6660,0x36c0, 0x1f80,0x0f00,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2195 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0860,0x1860,0x3060,0x6060,0xffe0,0xffe0,0x6060,0x3060,0x1860, 0x0860,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc200,0xc300,0xc180,0xc0c0,0xffe0,0xffe0,0xc0c0,0xc180,0xc300, 0xc200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a6 0x0000,0x0000,0x0000,0x0000,0x0600,0x0f00,0x1f80,0x36c0,0x6660,0x0600,0x0600,0x0600,0x0600,0x6660,0x36c0,0x1f80, 0x0f00,0x0600,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a8 0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0060,0x0860,0x1860,0x3060,0x6060,0xffe0,0xffe0,0x6000, 0x3000,0x1800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000, // u21b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x1c00,0x3440,0x6460,0x6460,0x6060,0x6060,0x6060,0x6060,0x30c0, 0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x3000,0x6000,0xffe0,0xffe0,0x0000,0x0000,0xffe0,0xffe0,0x00c0, 0x0180,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21cb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0180,0x00c0,0xffe0,0xffe0,0x0000,0x0000,0xffe0,0xffe0,0x6000, 0x3000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21cc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1800,0x3fe0,0x7fe0,0xe000,0xe000,0x7fe0,0x3fe0,0x1800, 0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d0 0x0000,0x0000,0x0000,0x0000,0x0600,0x0f00,0x1f80,0x39c0,0x79e0,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980, 0x1980,0x1980,0x1980,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0200,0x0300,0xff80,0xffc0,0x00e0,0x00e0,0xffc0,0xff80,0x0300, 0x0200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d2 0x0000,0x0000,0x0000,0x0000,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x79e0,0x39c0, 0x1f80,0x0f00,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0900,0x1980,0x3fc0,0x7fe0,0xe070,0xe070,0x7fe0,0x3fc0,0x1980, 0x0900,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d4 0x0000,0x0000,0x0000,0x0000,0x0600,0x0f00,0x1f80,0x39c0,0x79e0,0x1980,0x1980,0x1980,0x1980,0x1980,0x79e0,0x39c0, 0x1f80,0x0f00,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d5 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x30c0,0x3fc0,0x30c0,0x1980,0x1980,0x1980,0x0f00,0x0f00,0x0f00, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2200 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x7fe0,0x0060,0x0060,0x0060,0x0060, 0x0060,0x0060,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2203 0x0000,0x0000,0x0060,0x0060,0x7fe0,0x00e0,0x01e0,0x01e0,0x0360,0x0360,0x0660,0x7fe0,0x0660,0x0c60,0x0c60,0x1860, 0x1860,0x3060,0x7fe0,0x6000,0x6000,0x0000,0x0000,0x0000, // u2204 0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x00c0,0x1f80,0x31c0,0x6360,0x6360,0x6660,0x6c60,0x6c60,0x38c0,0x1f80, 0x3000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2205 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0f00,0x0f00,0x0f00,0x1980,0x1980,0x1980,0x30c0,0x30c0,0x30c0, 0x6060,0x6060,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2206 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6060,0x6060,0x30c0,0x30c0,0x30c0,0x1980,0x1980,0x1980,0x0f00,0x0f00,0x0f00, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2207 0x0000,0x0000,0x0000,0x0000,0x0fe0,0x1800,0x3000,0x6000,0x6000,0x6000,0x6000,0x7fe0,0x6000,0x6000,0x6000,0x6000, 0x3000,0x1800,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2208 0x0000,0x0000,0x0030,0x0030,0x0fe0,0x1860,0x30c0,0x60c0,0x6180,0x6180,0x6300,0x7fe0,0x6600,0x6c00,0x6c00,0x7800, 0x3800,0x3800,0x3fe0,0x6000,0x6000,0x0000,0x0000,0x0000, // u2209 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0x1800,0x3000,0x6000,0x6000,0x7fe0,0x6000,0x6000,0x3000,0x1800, 0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u220a 0x0000,0x0000,0x0000,0x0000,0x7f00,0x0180,0x00c0,0x0060,0x0060,0x0060,0x0060,0x7fe0,0x0060,0x0060,0x0060,0x0060, 0x00c0,0x0180,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u220b 0x0000,0x0000,0x6000,0x6000,0x3f80,0x30c0,0x1860,0x1830,0x0c30,0x0c30,0x0630,0x3ff0,0x0330,0x01b0,0x01b0,0x00f0, 0x00e0,0x00e0,0x3fe0,0x0030,0x0030,0x0000,0x0000,0x0000, // u220c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x0180,0x00c0,0x0060,0x0060,0x7fe0,0x0060,0x0060,0x00c0,0x0180, 0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u220d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2212 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x7fe0,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2213 0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x7fe0,0x0600, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2214 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2215 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180,0x00c0,0x0060, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2216 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x1f00,0x1f00,0x1f00,0x0e00,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2219 0x0000,0x0000,0x00e0,0x00e0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x60c0,0x60c0,0x60c0,0x30c0,0x18c0,0x0cc0, 0x06c0,0x03c0,0x01c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u221a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x6660,0x6660,0x6660,0x6660,0x6660,0x3fc0,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u221e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7fe0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u221f 0x0000,0x0000,0x0000,0x0000,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980, 0x1980,0x1980,0x1980,0x0000,0x0000,0x0000,0x0000,0x0000, // u2225 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0f00,0x0f00,0x1980,0x1980,0x30c0,0x30c0, 0x30c0,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u2227 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x30c0,0x30c0,0x30c0,0x1980,0x1980,0x0f00, 0x0f00,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2228 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u2229 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u222a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3c60,0x6660,0x63c0,0x0000,0x3c60,0x6660,0x63c0,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2248 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x7fe0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x7fe0,0x6000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2260 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x0000,0x0000,0x0000,0x0000, 0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2261 0x0000,0x0000,0x0000,0x0000,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180, 0x00c0,0x0000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2264 0x0000,0x0000,0x0000,0x0000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800, 0x3000,0x0000,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2265 0x0000,0x0000,0x0000,0x0000,0x0000,0x0330,0x0660,0x0cc0,0x1980,0x3300,0x6600,0xcc00,0x6600,0x3300,0x1980,0x0cc0, 0x0660,0x0330,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u226a 0x0000,0x0000,0x0000,0x0000,0x0000,0xcc00,0x6600,0x3300,0x1980,0x0cc0,0x0660,0x0330,0x0660,0x0cc0,0x1980,0x3300, 0x6600,0xcc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u226b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fe0,0x3000,0x6000,0xc000,0xc000,0xc000,0xc000,0xc000,0x6000,0x3000, 0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2282 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x0180,0x00c0,0x0060,0x0060,0x0060,0x0060,0x0060,0x00c0,0x0180, 0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2283 0x0000,0x0000,0x0000,0x0000,0x0000,0x1fe0,0x3000,0x6000,0xc000,0xc000,0xc000,0xc000,0xc000,0x6000,0x3000,0x1fe0, 0x0000,0x0000,0xffe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2286 0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0x0180,0x00c0,0x0060,0x0060,0x0060,0x0060,0x0060,0x00c0,0x0180,0xff00, 0x0000,0x0000,0xffe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2287 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u22a5 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000, // u22c2 0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u22c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x00c0,0x1f80,0x31c0,0x6360,0x6360,0x6660,0x6c60,0x6c60,0x38c0,0x1f80, 0x3000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2300 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0f00,0x1980,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2302 0x0000,0x0000,0x0000,0x0000,0x1f00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, 0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000, // u2308 0x0000,0x0000,0x0000,0x0000,0x1f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000, // u2309 0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, 0x1800,0x1800,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u230a 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u230b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2310 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7fe0,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2319 0x0000,0x0000,0x0000,0x0000,0x03c0,0x0660,0x0660,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2320 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x6600,0x6600,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2321 0x00c0,0x0180,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x1800,0x3000,0x3000,0x3000,0x3000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, // u239b 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, // u239c 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x3000,0x3000,0x3000,0x3000,0x1800,0x1800, 0x1800,0x0c00,0x0c00,0x0600,0x0600,0x0300,0x0180,0x00c0, // u239d 0x6000,0x3000,0x1800,0x0c00,0x0c00,0x0600,0x0600,0x0300,0x0300,0x0300,0x0180,0x0180,0x0180,0x0180,0x00c0,0x00c0, 0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, // u239e 0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, // u239f 0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x0180,0x0180,0x0180,0x0180,0x0300,0x0300, 0x0300,0x0600,0x0600,0x0c00,0x0c00,0x1800,0x3000,0x6000, // u23a0 0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, // u23a1 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, // u23a2 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7fc0, // u23a3 0x7fc0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, // u23a4 0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, // u23a5 0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x7fc0, // u23a6 0x01f0,0x0700,0x0600,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u23a7 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1800,0xf000,0xf000,0x1800,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u23a8 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0600,0x0700,0x01f0, // u23a9 0xf800,0x0e00,0x0600,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u23ab 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0180,0x00f0,0x00f0,0x0180,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u23ac 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0600,0x0e00,0xf800, // u23ad 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u23ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23af 0xfff0,0xfff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0xfff0,0xfff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff0, // u23bd 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u23d0 0x0000,0x0000,0x0000,0x6600,0x6600,0x6600,0x7e00,0x6600,0x6600,0x6600,0x0000,0x0000,0x07e0,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000, // u2409 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7e00,0x0000,0x0000,0x07e0,0x0600,0x0600,0x0780, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u240a 0x0000,0x0000,0x0000,0x6600,0x6600,0x6600,0x6600,0x6600,0x3c00,0x1800,0x0000,0x0000,0x07e0,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000, // u240b 0x0000,0x0000,0x0000,0x7e00,0x6000,0x6000,0x7800,0x6000,0x6000,0x6000,0x0000,0x0000,0x07e0,0x0600,0x0600,0x0780, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u240c 0x0000,0x0000,0x0000,0x3c00,0x6600,0x6000,0x6000,0x6000,0x6600,0x3c00,0x0000,0x0000,0x07c0,0x0660,0x0660,0x07c0, 0x0780,0x06c0,0x0660,0x0000,0x0000,0x0000,0x0000,0x0000, // u240d 0x0000,0x0000,0x0000,0x6600,0x6600,0x7600,0x7e00,0x6e00,0x6600,0x6600,0x0000,0x0000,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000, // u2424 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2500 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff0,0xfff0,0xfff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2501 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2502 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u2503 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xdb60,0xdb60,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2508 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xdb60,0xdb60,0xdb60,0xdb60,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2509 0x0600,0x0600,0x0600,0x0600,0x0600,0x0000,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0000,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000, // u250a 0x0f00,0x0f00,0x0f00,0x0f00,0x0000,0x0000,0x0f00,0x0f00,0x0f00,0x0f00,0x0000,0x0000,0x0f00,0x0f00,0x0f00,0x0f00, 0x0000,0x0000,0x0f00,0x0f00,0x0f00,0x0f00,0x0000,0x0000, // u250b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07f0,0x07f0,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u250c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07f0,0x07f0,0x07f0,0x07f0,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u250d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x0ff0,0x0f00,0x0f00,0x0f00, 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u250e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x0ff0,0x0ff0,0x0ff0,0x0f00,0x0f00, 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u250f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xfe00,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2510 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xfe00,0xfe00,0xfe00,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2511 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x0f00,0x0f00,0x0f00, 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u2512 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0xff00,0x0f00,0x0f00, 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u2513 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x07f0,0x07f0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2514 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x07f0,0x07f0,0x07f0,0x07f0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2515 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0ff0,0x0ff0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2516 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0ff0,0x0ff0,0x0ff0,0x0ff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2517 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfe00,0xfe00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2518 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfe00,0xfe00,0xfe00,0xfe00,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2519 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0xff00,0xff00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u251a 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0xff00,0xff00,0xff00,0xff00,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u251b 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x07f0,0x07f0,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u251c 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x07f0,0x07f0,0x07f0,0x07f0,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u251d 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0ff0,0x0ff0,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u251e 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0ff0,0x0ff0,0x0f00,0x0f00,0x0f00, 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u251f 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0ff0,0x0ff0,0x0f00,0x0f00,0x0f00, 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u2520 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0ff0,0x0ff0,0x0ff0,0x0ff0,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2521 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0ff0,0x0ff0,0x0ff0,0x0ff0,0x0f00,0x0f00, 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u2522 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0ff0,0x0ff0,0x0ff0,0x0ff0,0x0f00,0x0f00, 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u2523 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfe00,0xfe00,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2524 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfe00,0xfe00,0xfe00,0xfe00,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2525 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0xff00,0xff00,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2526 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xff00,0xff00,0x0f00,0x0f00,0x0f00, 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u2527 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0xff00,0xff00,0x0f00,0x0f00,0x0f00, 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u2528 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0xff00,0xff00,0xff00,0xff00,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2529 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xff00,0xff00,0xff00,0xff00,0x0f00,0x0f00, 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u252a 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0xff00,0xff00,0xff00,0xff00,0x0f00,0x0f00, 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u252b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff0,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u252c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xfff0,0xfff0,0xfe00,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u252d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07f0,0xfff0,0xfff0,0x07f0,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u252e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff0,0xfff0,0xfff0,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u252f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff0,0x0f00,0x0f00,0x0f00, 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u2530 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xfff0,0xfff0,0xff00,0x0f00,0x0f00, 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u2531 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0xfff0,0xfff0,0x0ff0,0x0f00,0x0f00, 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u2532 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff0,0xfff0,0xfff0,0x0f00,0x0f00, 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u2533 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfff0,0xfff0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2534 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfe00,0xfff0,0xfff0,0xfe00,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2535 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x07f0,0xfff0,0xfff0,0x07f0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2536 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfff0,0xfff0,0xfff0,0xfff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2537 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0xfff0,0xfff0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2538 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0xff00,0xfff0,0xfff0,0xff00,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2539 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0ff0,0xfff0,0xfff0,0x0ff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u253a 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0xfff0,0xfff0,0xfff0,0xfff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u253b 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfff0,0xfff0,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u253c 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfe00,0xfff0,0xfff0,0xfe00,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u253d 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x07f0,0xfff0,0xfff0,0x07f0,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u253e 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfff0,0xfff0,0xfff0,0xfff0,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u253f 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0xfff0,0xfff0,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2540 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfff0,0xfff0,0x0f00,0x0f00,0x0f00, 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u2541 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0xfff0,0xfff0,0x0f00,0x0f00,0x0f00, 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u2542 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0xff00,0xfff0,0xfff0,0xfe00,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2543 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0ff0,0xfff0,0xfff0,0x07f0,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2544 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfe00,0xfff0,0xfff0,0xff00,0x0f00,0x0f00, 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u2545 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x07f0,0xfff0,0xfff0,0x0ff0,0x0f00,0x0f00, 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u2546 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0xfff0,0xfff0,0xfff0,0xfff0,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2547 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfff0,0xfff0,0xfff0,0xfff0,0x0f00,0x0f00, 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u2548 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0xff00,0xfff0,0xfff0,0xff00,0x0f00,0x0f00, 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u2549 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0ff0,0xfff0,0xfff0,0x0ff0,0x0f00,0x0f00, 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u254a 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0xfff0,0xfff0,0xfff0,0xfff0,0x0f00,0x0f00, 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u254b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff0,0x0000,0x0000,0xfff0,0xfff0,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2550 0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980, 0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980, // u2551 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07f0,0x07f0,0x0600,0x0600,0x07f0,0x07f0,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2552 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x1ff0,0x1980,0x1980,0x1980, 0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980, // u2553 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x1ff0,0x1800,0x1800,0x19f0,0x19f0,0x1980, 0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980, // u2554 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xfe00,0x0600,0x0600,0xfe00,0xfe00,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2555 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff80,0xff80,0x1980,0x1980,0x1980, 0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980, // u2556 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff80,0xff80,0x0180,0x0180,0xf980,0xf980,0x1980, 0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980, // u2557 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x07f0,0x07f0,0x0600,0x0600,0x07f0,0x07f0,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2558 0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1ff0,0x1ff0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2559 0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x19f0,0x19f0,0x1800,0x1800,0x1ff0,0x1ff0,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255a 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfe00,0xfe00,0x0600,0x0600,0xfe00,0xfe00,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255b 0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0xff80,0xff80,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255c 0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0xf980,0xf980,0x0180,0x0180,0xff80,0xff80,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255d 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x07f0,0x07f0,0x0600,0x0600,0x07f0,0x07f0,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u255e 0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x19f0,0x19f0,0x1980,0x1980,0x1980, 0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980, // u255f 0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x19f0,0x19f0,0x1800,0x1800,0x19f0,0x19f0,0x1980, 0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980, // u2560 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfe00,0xfe00,0x0600,0x0600,0xfe00,0xfe00,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2561 0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0xf980,0xf980,0x1980,0x1980,0x1980, 0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980, // u2562 0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0xf980,0xf980,0x0180,0x0180,0xf980,0xf980,0x1980, 0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980, // u2563 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff0,0x0000,0x0000,0xfff0,0xfff0,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2564 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff0,0x1980,0x1980,0x1980, 0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980, // u2565 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff0,0x0000,0x0000,0xf9f0,0xf9f0,0x1980, 0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980, // u2566 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfff0,0xfff0,0x0000,0x0000,0xfff0,0xfff0,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2567 0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0xfff0,0xfff0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2568 0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0xf9f0,0xf9f0,0x0000,0x0000,0xfff0,0xfff0,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2569 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0xfff0,0xfff0,0x0600,0x0600,0xfff0,0xfff0,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u256a 0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0xfff0,0xfff0,0x1980,0x1980,0x1980, 0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980, // u256b 0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0xf9f0,0xf9f0,0x0000,0x0000,0xf9f0,0xf9f0,0x1980, 0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980, // u256c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x01f0,0x0380,0x0300,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u256d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xe000,0xf800,0x1c00,0x0c00,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u256e 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0c00,0x1c00,0xf800,0xe000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u256f 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0300,0x0380,0x01f0,0x0070,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2570 0x0010,0x0010,0x0030,0x0020,0x0060,0x0040,0x00c0,0x0080,0x0180,0x0100,0x0300,0x0200,0x0600,0x0400,0x0c00,0x0800, 0x1800,0x1000,0x3000,0x2000,0x6000,0x4000,0xc000,0x8000, // u2571 0x8000,0xc000,0x4000,0x6000,0x2000,0x3000,0x1000,0x1800,0x0800,0x0c00,0x0400,0x0600,0x0200,0x0300,0x0100,0x0180, 0x0080,0x00c0,0x0040,0x0060,0x0020,0x0030,0x0010,0x0010, // u2572 0x8010,0xc010,0x4030,0x6020,0x2060,0x3040,0x10c0,0x1880,0x0980,0x0d00,0x0700,0x0600,0x0600,0x0700,0x0d00,0x0980, 0x1880,0x10c0,0x3040,0x2060,0x6020,0x4030,0xc010,0x8010, // u2573 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xfe00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2574 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2575 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07f0,0x07f0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2576 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u2577 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xfe00,0xfe00,0xfe00,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2578 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2579 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07f0,0x07f0,0x07f0,0x07f0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u257b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07f0,0xfff0,0xfff0,0x07f0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257c 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00, // u257d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xfff0,0xfff0,0xfe00,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257e 0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0f00,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u257f 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2580 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff0,0xfff0, // u2581 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, // u2582 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0, 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, // u2583 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff0,0xfff0,0xfff0, 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, // u2584 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, // u2585 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, // u2586 0x0000,0x0000,0x0000,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, // u2587 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, // u2588 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, // u2589 0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80, 0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80, // u258a 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u258b 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, // u258c 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, // u258d 0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000, 0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000, // u258e 0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000, 0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000, // u258f 0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0, 0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0, // u2590 0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000, 0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000,0xaaa0,0x0000, // u2591 0xaaa0,0x5550,0xaaa0,0x5550,0xaaa0,0x5550,0xaaa0,0x5550,0xaaa0,0x5550,0xaaa0,0x5550,0xaaa0,0x5550,0xaaa0,0x5550, 0xaaa0,0x5550,0xaaa0,0x5550,0xaaa0,0x5550,0xaaa0,0x5550, // u2592 0xfff0,0xaaa0,0xfff0,0xaaa0,0xfff0,0xaaa0,0xfff0,0xaaa0,0xfff0,0xaaa0,0xfff0,0xaaa0,0xfff0,0xaaa0,0xfff0,0xaaa0, 0xfff0,0xaaa0,0xfff0,0xaaa0,0xfff0,0xaaa0,0xfff0,0xaaa0, // u2593 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0xfc00,0xfc00, 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, // u2596 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03f0,0x03f0,0x03f0,0x03f0, 0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0, // u2597 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2598 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfff0,0xfff0,0xfff0,0xfff0, 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, // u2599 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0x03f0,0x03f0,0x03f0,0x03f0, 0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0, // u259a 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfc00,0xfc00,0xfc00,0xfc00, 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, // u259b 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0x03f0,0x03f0,0x03f0,0x03f0, 0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0, // u259c 0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u259d 0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0xfc00,0xfc00,0xfc00,0xfc00, 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, // u259e 0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0x03f0,0xfff0,0xfff0,0xfff0,0xfff0, 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, // u259f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x3fc0,0x3fc0,0x3fc0,0x3fc0,0x3fc0,0x3fc0,0x3fc0,0x3fc0, 0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xffe0,0xffe0, 0xffe0,0xffe0,0xffe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ac 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x7fe0,0x7fe0,0x7fe0,0x7fe0,0x7fe0,0x7fe0,0x7fe0,0x7fe0,0x7fe0,0x7fe0,0x7fe0, 0x7fe0,0x7fe0,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0f00,0x0f00,0x1f80,0x1f80,0x3fc0,0x3fc0,0x7fe0,0x7fe0, 0xfff0,0xfff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xffc0,0xfff0,0xfff0,0xffc0,0xff00,0xfc00, 0xf000,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xffc0,0xfff0,0xfff0,0xffc0,0xff00,0xfc00, 0xf000,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff0,0x7fe0,0x7fe0,0x3fc0,0x3fc0,0x1f80,0x1f80,0x0f00,0x0f00, 0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0030,0x00f0,0x03f0,0x0ff0,0x3ff0,0xfff0,0xfff0,0x3ff0,0x0ff0,0x03f0, 0x00f0,0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25c0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0030,0x00f0,0x03f0,0x0ff0,0x3ff0,0xfff0,0xfff0,0x3ff0,0x0ff0,0x03f0, 0x00f0,0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25c4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0f00,0x1f80,0x3fc0,0x7fe0,0xfff0,0xfff0,0x7fe0,0x3fc0,0x1f80, 0x0f00,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25c6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0f00,0x1980,0x30c0,0x6060,0xc030,0xc030,0x6060,0x30c0,0x1980, 0x0f00,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ca 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f00,0x1980,0x1080,0x1080,0x1980,0x0f00,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25cb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f00,0x1f80,0x1f80,0x1f80,0x1f80,0x0f00,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25cf 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xf0f0,0xe070,0xe070,0xe070,0xe070,0xf0f0,0xfff0, 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, // u25d8 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xf0f0,0xe670,0xef70,0xef70,0xe670,0xf0f0,0xfff0, 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, // u25d9 0x0000,0x0000,0x0000,0x0000,0x3fc0,0x6060,0xc030,0xc030,0xd9b0,0xd9b0,0xc030,0xc030,0xc030,0xdfb0,0xcf30,0xc030, 0xc030,0x6060,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u263a 0x0000,0x0000,0x0000,0x0000,0x3fc0,0x7fe0,0xfff0,0xfff0,0xe670,0xe670,0xfff0,0xfff0,0xfff0,0xe070,0xf0f0,0xfff0, 0xfff0,0x7fe0,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u263b 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0xc630,0x6660,0x36c0,0x1f80,0x0f00,0xf9f0,0x0f00,0x1f80,0x36c0,0x6660, 0xc630,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u263c 0x0000,0x0000,0x0000,0x0000,0x1f80,0x30c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x30c0,0x1f80,0x0600,0x0600,0x7fe0, 0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000, // u2640 0x0000,0x0000,0x0000,0x0000,0x0fe0,0x00e0,0x01a0,0x0320,0x0620,0x0c20,0x3f00,0x6180,0xc0c0,0xc0c0,0xc0c0,0xc0c0, 0xc0c0,0x6180,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2642 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0f00,0x1f80,0x3fc0,0x7fe0,0x7fe0,0x7fe0,0x7fe0,0x7fe0,0x36c0,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u2660 0x0000,0x0000,0x0000,0x0000,0x0f00,0x1f80,0x1f80,0x0f00,0x0600,0x0600,0x76e0,0xfff0,0xfff0,0xfff0,0x76e0,0x0600, 0x0600,0x0600,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000, // u2663 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39c0,0x79e0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0x7fe0,0x3fc0,0x1f80, 0x0f00,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2665 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0f00,0x1f80,0x3fc0,0x7fe0,0xfff0,0xfff0,0x7fe0,0x3fc0,0x1f80, 0x0f00,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2666 0x0000,0x0000,0x0000,0x0000,0x3fe0,0x3060,0x3060,0x3060,0x3fe0,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0xf000,0xe000,0x0000,0x0000,0x0000,0x0000,0x0000, // u266a 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6060,0x6060,0x6060,0x7fe0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x60c0,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000, // u266b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x00c0,0x00c0,0x0180,0x0180,0xc300,0xc300,0x6600,0x6600,0x3c00, 0x3c00,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000, // u2713 0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x0070,0x00e0,0x00e0,0x01c0,0x01c0,0xe380,0xe380,0x7700,0x7700,0x3e00, 0x3e00,0x1c00,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000, // u2714 0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x6300,0x3300,0x1e00,0x0e00,0x0e00,0x0f00,0x1980,0x18c0,0x3000, 0x3000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2717 0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x71c0,0x3b80,0x1f80,0x0f00,0x0700,0x0f80,0x0fc0,0x1ce0,0x1c60,0x3800, 0x3800,0x7000,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2718 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x1800,0x0c00,0x0c00,0x0600, 0x0600,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000, // u27e8 0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x0c00,0x0c00,0x0600,0x0600,0x0300,0x0300,0x0300,0x0600,0x0600,0x0c00, 0x0c00,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000, // u27e9 0x0000,0x0000,0x0000,0x0000,0x0cc0,0x0cc0,0x1980,0x1980,0x3300,0x3300,0x6600,0x6600,0x6600,0x3300,0x3300,0x1980, 0x1980,0x0cc0,0x0cc0,0x0000,0x0000,0x0000,0x0000,0x0000, // u27ea 0x0000,0x0000,0x0000,0x0000,0x6600,0x6600,0x3300,0x3300,0x1980,0x1980,0x0cc0,0x0cc0,0x0cc0,0x1980,0x1980,0x3300, 0x3300,0x6600,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000, // u27eb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2800 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2801 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2802 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2803 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2804 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2805 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2806 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2807 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2808 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2809 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280a 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280b 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280c 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280d 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280e 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2810 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2811 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2812 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2813 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2814 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2815 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2816 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2817 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2818 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2819 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281a 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281b 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281c 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281d 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281e 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2820 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2821 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2822 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2823 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2824 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2825 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2826 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2827 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2828 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2829 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282a 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282b 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282c 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282d 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282e 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2830 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2831 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2832 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2833 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2834 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2835 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2836 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2837 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2838 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2839 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283a 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283b 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283c 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283d 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283e 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2840 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2841 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2842 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2843 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2844 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2845 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2846 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2847 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2848 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2849 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u284a 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u284b 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u284c 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u284d 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u284e 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u284f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2850 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2851 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2852 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2853 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2854 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2855 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2856 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2857 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2858 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2859 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u285a 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u285b 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u285c 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u285d 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u285e 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u285f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2860 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2861 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2862 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2863 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2864 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2865 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2866 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2867 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2868 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2869 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u286a 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u286b 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u286c 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u286d 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u286e 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u286f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2870 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2871 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2872 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2873 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2874 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2875 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2876 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2877 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2878 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2879 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u287a 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u287b 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u287c 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u287d 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u287e 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000, // u287f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u2880 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u2881 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u2882 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u2883 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u2884 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u2885 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u2886 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u2887 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u2888 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u2889 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u288a 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u288b 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u288c 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u288d 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u288e 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u288f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u2890 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u2891 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u2892 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u2893 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u2894 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u2895 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u2896 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u2897 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u2898 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u2899 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u289a 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u289b 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u289c 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u289d 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u289e 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u289f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28a0 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28a1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28a2 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28a4 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28a5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28a6 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28a7 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28a8 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28a9 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28aa 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28ab 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28ac 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28ad 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28ae 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28af 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28b0 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28b1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28b2 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28b4 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28b6 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28b7 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28b8 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28b9 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28ba 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28bb 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28bc 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28bd 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28be 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u28bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28c0 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28c2 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28c4 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28c6 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28c7 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28c8 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28c9 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28ca 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28cb 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28cc 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28cd 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28ce 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28cf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28d0 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28d2 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28d4 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28d6 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28d7 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28d8 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28d9 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28da 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28db 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28dc 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28dd 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28de 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28df 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28e0 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28e1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28e2 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28e3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28e4 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28e6 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28e7 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28e8 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28e9 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28ea 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28eb 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28ec 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28ed 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28ee 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28ef 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28f0 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28f2 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28f3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28f4 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28f6 0x0000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28f7 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28f8 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28f9 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28fa 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28fb 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28fc 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28fd 0x0000,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28fe 0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0, 0x0000,0x0000,0x0000,0x30c0,0x30c0,0x30c0,0x0000,0x0000, // u28ff 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x6060, 0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2e2c 0xc000,0xc000,0xc300,0xc780,0xcfc0,0xdb60,0xc300,0xc300,0xc300,0xc300,0xc300,0xc600,0x8c00,0x1800,0x3000,0x6000, 0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000, // ue0a0 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x0000,0x0000,0x0c60,0x0c60,0x0e60, 0x0f60,0x0de0,0x0ce0,0x0c60,0x0c60,0x0000,0x0000,0x0000, // ue0a1 0x0000,0x0000,0x0000,0x1f80,0x30c0,0x30c0,0x30c0,0x30c0,0x30c0,0x30c0,0x7fe0,0xfff0,0xfff0,0xf9f0,0xf0f0,0xf0f0, 0xf0f0,0xf9f0,0xfff0,0xfff0,0xfff0,0x0000,0x0000,0x0000, // ue0a2 0x8000,0xc000,0xe000,0xf000,0xf800,0xfc00,0xfe00,0xff00,0xff80,0xffc0,0xffe0,0xfff0,0xfff0,0xffe0,0xffc0,0xff80, 0xff00,0xfe00,0xfc00,0xf800,0xf000,0xe000,0xc000,0x8000, // ue0b0 0x8000,0xc000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180,0x00c0,0x0060,0x0030,0x0030,0x0060,0x00c0,0x0180, 0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0xc000,0x8000, // ue0b1 0x0010,0x0030,0x0070,0x00f0,0x01f0,0x03f0,0x07f0,0x0ff0,0x1ff0,0x3ff0,0x7ff0,0xfff0,0xfff0,0x7ff0,0x3ff0,0x1ff0, 0x0ff0,0x07f0,0x03f0,0x01f0,0x00f0,0x0070,0x0030,0x0010, // ue0b2 0x0010,0x0030,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0xc000,0xc000,0x6000,0x3000,0x1800, 0x0c00,0x0600,0x0300,0x0180,0x00c0,0x0060,0x0030,0x0010, // ue0b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x00c0,0x00c0,0x30c0,0x30c0,0x1980,0x0f00,0x0000, // uf6be 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000 // ufffd }; // codepoints array constexpr std::array fixedfont_codepoints = { 0x0000,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e, 0x002f,0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e, 0x003f,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e, 0x004f,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e, 0x005f,0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e, 0x006f,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e, 0x00a0,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af, 0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf, 0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf, 0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df, 0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef, 0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff, 0x0100,0x0101,0x0102,0x0103,0x0104,0x0105,0x0106,0x0107,0x0108,0x0109,0x010a,0x010b,0x010c,0x010d,0x010e,0x010f, 0x0110,0x0111,0x0112,0x0113,0x0114,0x0115,0x0116,0x0117,0x0118,0x0119,0x011a,0x011b,0x011c,0x011d,0x011e,0x011f, 0x0120,0x0121,0x0122,0x0123,0x0124,0x0125,0x0126,0x0127,0x0128,0x0129,0x012a,0x012b,0x012c,0x012d,0x012e,0x012f, 0x0130,0x0131,0x0132,0x0133,0x0134,0x0135,0x0136,0x0137,0x0138,0x0139,0x013a,0x013b,0x013c,0x013d,0x013e,0x013f, 0x0140,0x0141,0x0142,0x0143,0x0144,0x0145,0x0146,0x0147,0x0148,0x0149,0x014a,0x014b,0x014c,0x014d,0x014e,0x014f, 0x0150,0x0151,0x0152,0x0153,0x0154,0x0155,0x0156,0x0157,0x0158,0x0159,0x015a,0x015b,0x015c,0x015d,0x015e,0x015f, 0x0160,0x0161,0x0162,0x0163,0x0164,0x0165,0x0166,0x0167,0x0168,0x0169,0x016a,0x016b,0x016c,0x016d,0x016e,0x016f, 0x0170,0x0171,0x0172,0x0173,0x0174,0x0175,0x0176,0x0177,0x0178,0x0179,0x017a,0x017b,0x017c,0x017d,0x017e,0x017f, 0x0186,0x018e,0x018f,0x0190,0x0192,0x019d,0x019e,0x01b5,0x01b6,0x01b7,0x01cd,0x01ce,0x01cf,0x01d0,0x01d1,0x01d2, 0x01d3,0x01d4,0x01e2,0x01e3,0x01e4,0x01e5,0x01e6,0x01e7,0x01e8,0x01e9,0x01ea,0x01eb,0x01ec,0x01ed,0x01ee,0x01ef, 0x01f0,0x01f4,0x01f5,0x01fc,0x01fd,0x01fe,0x01ff,0x0218,0x0219,0x021a,0x021b,0x0232,0x0233,0x0237,0x0254,0x0258, 0x0259,0x025b,0x0272,0x0292,0x02bb,0x02bc,0x02bd,0x02c6,0x02c7,0x02d8,0x02d9,0x02db,0x02dc,0x02dd,0x0300,0x0301, 0x0302,0x0303,0x0304,0x0305,0x0306,0x0307,0x0308,0x030a,0x030b,0x030c,0x0329,0x0384,0x0385,0x0386,0x0387,0x0388, 0x0389,0x038a,0x038c,0x038e,0x038f,0x0390,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039a, 0x039b,0x039c,0x039d,0x039e,0x039f,0x03a0,0x03a1,0x03a3,0x03a4,0x03a5,0x03a6,0x03a7,0x03a8,0x03a9,0x03aa,0x03ab, 0x03ac,0x03ad,0x03ae,0x03af,0x03b0,0x03b1,0x03b2,0x03b3,0x03b4,0x03b5,0x03b6,0x03b7,0x03b8,0x03b9,0x03ba,0x03bb, 0x03bc,0x03bd,0x03be,0x03bf,0x03c0,0x03c1,0x03c2,0x03c3,0x03c4,0x03c5,0x03c6,0x03c7,0x03c8,0x03c9,0x03ca,0x03cb, 0x03cc,0x03cd,0x03ce,0x03d1,0x03d5,0x03f0,0x03f1,0x03f2,0x03f3,0x03f4,0x03f5,0x03f6,0x0400,0x0401,0x0402,0x0403, 0x0404,0x0405,0x0406,0x0407,0x0408,0x0409,0x040a,0x040b,0x040c,0x040d,0x040e,0x040f,0x0410,0x0411,0x0412,0x0413, 0x0414,0x0415,0x0416,0x0417,0x0418,0x0419,0x041a,0x041b,0x041c,0x041d,0x041e,0x041f,0x0420,0x0421,0x0422,0x0423, 0x0424,0x0425,0x0426,0x0427,0x0428,0x0429,0x042a,0x042b,0x042c,0x042d,0x042e,0x042f,0x0430,0x0431,0x0432,0x0433, 0x0434,0x0435,0x0436,0x0437,0x0438,0x0439,0x043a,0x043b,0x043c,0x043d,0x043e,0x043f,0x0440,0x0441,0x0442,0x0443, 0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,0x044a,0x044b,0x044c,0x044d,0x044e,0x044f,0x0450,0x0451,0x0452,0x0453, 0x0454,0x0455,0x0456,0x0457,0x0458,0x0459,0x045a,0x045b,0x045c,0x045d,0x045e,0x045f,0x0462,0x0463,0x046a,0x046b, 0x0490,0x0491,0x0492,0x0493,0x0494,0x0495,0x0496,0x0497,0x0498,0x0499,0x049a,0x049b,0x049c,0x049d,0x04a0,0x04a1, 0x04a2,0x04a3,0x04a4,0x04a5,0x04aa,0x04ab,0x04ae,0x04af,0x04b0,0x04b1,0x04b2,0x04b3,0x04b6,0x04b7,0x04b8,0x04b9, 0x04ba,0x04bb,0x04c0,0x04c1,0x04c2,0x04cf,0x04d0,0x04d1,0x04d2,0x04d3,0x04d4,0x04d5,0x04d6,0x04d7,0x04d8,0x04d9, 0x04da,0x04db,0x04dc,0x04dd,0x04de,0x04df,0x04e2,0x04e3,0x04e4,0x04e5,0x04e6,0x04e7,0x04e8,0x04e9,0x04ea,0x04eb, 0x04ec,0x04ed,0x04ee,0x04ef,0x04f0,0x04f1,0x04f2,0x04f3,0x04f4,0x04f5,0x04f8,0x04f9,0x05d0,0x05d1,0x05d2,0x05d3, 0x05d4,0x05d5,0x05d6,0x05d7,0x05d8,0x05d9,0x05da,0x05db,0x05dc,0x05dd,0x05de,0x05df,0x05e0,0x05e1,0x05e2,0x05e3, 0x05e4,0x05e5,0x05e6,0x05e7,0x05e8,0x05e9,0x05ea,0x1e0c,0x1e0d,0x1e34,0x1e35,0x1e36,0x1e37,0x1e40,0x1e41,0x1e42, 0x1e43,0x1e44,0x1e45,0x1e46,0x1e47,0x1e6c,0x1e6d,0x1eb8,0x1eb9,0x1ebc,0x1ebd,0x1eca,0x1ecb,0x1ecc,0x1ecd,0x1ee4, 0x1ee5,0x1ef8,0x1ef9,0x2000,0x2001,0x2002,0x2003,0x2004,0x2005,0x2006,0x2007,0x2008,0x2009,0x200a,0x200b,0x200c, 0x200d,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x2015,0x2016,0x2017,0x2018,0x2019,0x201a,0x201b,0x201c, 0x201d,0x201e,0x201f,0x2020,0x2021,0x2022,0x2026,0x2030,0x2032,0x2033,0x2039,0x203a,0x203c,0x203e,0x2070,0x2071, 0x2074,0x2075,0x2076,0x2077,0x2078,0x2079,0x207a,0x207b,0x207c,0x207d,0x207e,0x207f,0x2080,0x2081,0x2082,0x2083, 0x2084,0x2085,0x2086,0x2087,0x2088,0x2089,0x208a,0x208b,0x208c,0x208d,0x208e,0x2090,0x2091,0x2092,0x2093,0x2094, 0x2095,0x2096,0x2097,0x2098,0x209a,0x20a7,0x20aa,0x20ac,0x20ae,0x2102,0x210e,0x210f,0x2115,0x2116,0x211a,0x211d, 0x2122,0x2124,0x2126,0x2135,0x2190,0x2191,0x2192,0x2193,0x2194,0x2195,0x21a4,0x21a6,0x21a8,0x21b5,0x21bb,0x21cb, 0x21cc,0x21d0,0x21d1,0x21d2,0x21d3,0x21d4,0x21d5,0x2200,0x2203,0x2204,0x2205,0x2206,0x2207,0x2208,0x2209,0x220a, 0x220b,0x220c,0x220d,0x2212,0x2213,0x2214,0x2215,0x2216,0x2219,0x221a,0x221e,0x221f,0x2225,0x2227,0x2228,0x2229, 0x222a,0x2248,0x2260,0x2261,0x2264,0x2265,0x226a,0x226b,0x2282,0x2283,0x2286,0x2287,0x22a5,0x22c2,0x22c3,0x2300, 0x2302,0x2308,0x2309,0x230a,0x230b,0x2310,0x2319,0x2320,0x2321,0x239b,0x239c,0x239d,0x239e,0x239f,0x23a0,0x23a1, 0x23a2,0x23a3,0x23a4,0x23a5,0x23a6,0x23a7,0x23a8,0x23a9,0x23ab,0x23ac,0x23ad,0x23ae,0x23af,0x23ba,0x23bb,0x23bc, 0x23bd,0x23d0,0x2409,0x240a,0x240b,0x240c,0x240d,0x2424,0x2500,0x2501,0x2502,0x2503,0x2508,0x2509,0x250a,0x250b, 0x250c,0x250d,0x250e,0x250f,0x2510,0x2511,0x2512,0x2513,0x2514,0x2515,0x2516,0x2517,0x2518,0x2519,0x251a,0x251b, 0x251c,0x251d,0x251e,0x251f,0x2520,0x2521,0x2522,0x2523,0x2524,0x2525,0x2526,0x2527,0x2528,0x2529,0x252a,0x252b, 0x252c,0x252d,0x252e,0x252f,0x2530,0x2531,0x2532,0x2533,0x2534,0x2535,0x2536,0x2537,0x2538,0x2539,0x253a,0x253b, 0x253c,0x253d,0x253e,0x253f,0x2540,0x2541,0x2542,0x2543,0x2544,0x2545,0x2546,0x2547,0x2548,0x2549,0x254a,0x254b, 0x2550,0x2551,0x2552,0x2553,0x2554,0x2555,0x2556,0x2557,0x2558,0x2559,0x255a,0x255b,0x255c,0x255d,0x255e,0x255f, 0x2560,0x2561,0x2562,0x2563,0x2564,0x2565,0x2566,0x2567,0x2568,0x2569,0x256a,0x256b,0x256c,0x256d,0x256e,0x256f, 0x2570,0x2571,0x2572,0x2573,0x2574,0x2575,0x2576,0x2577,0x2578,0x2579,0x257a,0x257b,0x257c,0x257d,0x257e,0x257f, 0x2580,0x2581,0x2582,0x2583,0x2584,0x2585,0x2586,0x2587,0x2588,0x2589,0x258a,0x258b,0x258c,0x258d,0x258e,0x258f, 0x2590,0x2591,0x2592,0x2593,0x2596,0x2597,0x2598,0x2599,0x259a,0x259b,0x259c,0x259d,0x259e,0x259f,0x25a0,0x25ac, 0x25ae,0x25b2,0x25b6,0x25ba,0x25bc,0x25c0,0x25c4,0x25c6,0x25ca,0x25cb,0x25cf,0x25d8,0x25d9,0x263a,0x263b,0x263c, 0x2640,0x2642,0x2660,0x2663,0x2665,0x2666,0x266a,0x266b,0x2713,0x2714,0x2717,0x2718,0x27e8,0x27e9,0x27ea,0x27eb, 0x2800,0x2801,0x2802,0x2803,0x2804,0x2805,0x2806,0x2807,0x2808,0x2809,0x280a,0x280b,0x280c,0x280d,0x280e,0x280f, 0x2810,0x2811,0x2812,0x2813,0x2814,0x2815,0x2816,0x2817,0x2818,0x2819,0x281a,0x281b,0x281c,0x281d,0x281e,0x281f, 0x2820,0x2821,0x2822,0x2823,0x2824,0x2825,0x2826,0x2827,0x2828,0x2829,0x282a,0x282b,0x282c,0x282d,0x282e,0x282f, 0x2830,0x2831,0x2832,0x2833,0x2834,0x2835,0x2836,0x2837,0x2838,0x2839,0x283a,0x283b,0x283c,0x283d,0x283e,0x283f, 0x2840,0x2841,0x2842,0x2843,0x2844,0x2845,0x2846,0x2847,0x2848,0x2849,0x284a,0x284b,0x284c,0x284d,0x284e,0x284f, 0x2850,0x2851,0x2852,0x2853,0x2854,0x2855,0x2856,0x2857,0x2858,0x2859,0x285a,0x285b,0x285c,0x285d,0x285e,0x285f, 0x2860,0x2861,0x2862,0x2863,0x2864,0x2865,0x2866,0x2867,0x2868,0x2869,0x286a,0x286b,0x286c,0x286d,0x286e,0x286f, 0x2870,0x2871,0x2872,0x2873,0x2874,0x2875,0x2876,0x2877,0x2878,0x2879,0x287a,0x287b,0x287c,0x287d,0x287e,0x287f, 0x2880,0x2881,0x2882,0x2883,0x2884,0x2885,0x2886,0x2887,0x2888,0x2889,0x288a,0x288b,0x288c,0x288d,0x288e,0x288f, 0x2890,0x2891,0x2892,0x2893,0x2894,0x2895,0x2896,0x2897,0x2898,0x2899,0x289a,0x289b,0x289c,0x289d,0x289e,0x289f, 0x28a0,0x28a1,0x28a2,0x28a3,0x28a4,0x28a5,0x28a6,0x28a7,0x28a8,0x28a9,0x28aa,0x28ab,0x28ac,0x28ad,0x28ae,0x28af, 0x28b0,0x28b1,0x28b2,0x28b3,0x28b4,0x28b5,0x28b6,0x28b7,0x28b8,0x28b9,0x28ba,0x28bb,0x28bc,0x28bd,0x28be,0x28bf, 0x28c0,0x28c1,0x28c2,0x28c3,0x28c4,0x28c5,0x28c6,0x28c7,0x28c8,0x28c9,0x28ca,0x28cb,0x28cc,0x28cd,0x28ce,0x28cf, 0x28d0,0x28d1,0x28d2,0x28d3,0x28d4,0x28d5,0x28d6,0x28d7,0x28d8,0x28d9,0x28da,0x28db,0x28dc,0x28dd,0x28de,0x28df, 0x28e0,0x28e1,0x28e2,0x28e3,0x28e4,0x28e5,0x28e6,0x28e7,0x28e8,0x28e9,0x28ea,0x28eb,0x28ec,0x28ed,0x28ee,0x28ef, 0x28f0,0x28f1,0x28f2,0x28f3,0x28f4,0x28f5,0x28f6,0x28f7,0x28f8,0x28f9,0x28fa,0x28fb,0x28fc,0x28fd,0x28fe,0x28ff, 0x2e2c,0xe0a0,0xe0a1,0xe0a2,0xe0b0,0xe0b1,0xe0b2,0xe0b3,0xf6be,0xfffd }; } // namespace // -- end of autogenerated text --- namespace fixed_font_28n { // -- start of autogenerated text --- // definition section for font: ter-u28n.bdf constexpr int CHARCOUNT = 1354; constexpr int WIDTH = 14; constexpr int HEIGHT = 28; constexpr int OFFSET_X = 0; constexpr int OFFSET_Y = 0; constexpr FixedFont_info_t fixedfont_info = { "Terminus", // font name "ter-u28n.bdf", // font name internal CHARCOUNT, // num of chars WIDTH, HEIGHT, OFFSET_X, OFFSET_Y, false // bold }; // font bitmap definitions constexpr std::array fixedfont_bitmap = { 0x0000,0x0000,0x0000,0x0000,0x78f0,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x0000, 0x0000,0x0000,0x6030,0x6030,0x6030,0x78f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0020 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0021 0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0022 0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x7ff0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0, 0x7ff0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0023 0x0000,0x0000,0x0300,0x0300,0x0300,0x1fe0,0x3330,0x6318,0x6300,0x6300,0x6300,0x6300,0x3300,0x1fe0,0x0330,0x0318, 0x0318,0x0318,0x0318,0x6318,0x3330,0x1fe0,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000, // u0024 0x0000,0x0000,0x0000,0x0000,0x3c30,0x6630,0x6660,0x6660,0x3cc0,0x00c0,0x0180,0x0180,0x0300,0x0300,0x0600,0x0600, 0x0c00,0x0cf0,0x1998,0x1998,0x3198,0x30f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0025 0x0000,0x0000,0x0000,0x0000,0x0f00,0x1980,0x30c0,0x30c0,0x30c0,0x30c0,0x1980,0x0f00,0x0e00,0x1b18,0x3198,0x60f0, 0x6060,0x6060,0x6060,0x60f0,0x3198,0x1f18,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0026 0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0027 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0600,0x0600,0x0300,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0028 0x0000,0x0000,0x0000,0x0000,0x0c00,0x0600,0x0300,0x0300,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0300,0x0300,0x0600,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0029 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3030,0x1860,0x0cc0,0x0780,0x0300,0x7ff8,0x0300,0x0780, 0x0cc0,0x1860,0x3030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x7ff8,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0600,0x0c00,0x0000,0x0000,0x0000,0x0000, // u002c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002e 0x0000,0x0000,0x0000,0x0000,0x0030,0x0030,0x0060,0x0060,0x00c0,0x00c0,0x0180,0x0180,0x0300,0x0300,0x0600,0x0600, 0x0c00,0x0c00,0x1800,0x1800,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002f 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6070,0x60f0,0x61b0,0x6330,0x6630,0x6c30,0x7830, 0x7030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0030 0x0000,0x0000,0x0000,0x0000,0x0300,0x0700,0x0f00,0x1b00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0031 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x0030,0x0060,0x00c0,0x0180,0x0300,0x0600, 0x0c00,0x1800,0x3000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0032 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x0030,0x0030,0x0030,0x0030,0x0060,0x0fc0,0x0060,0x0030,0x0030, 0x0030,0x0030,0x0030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0033 0x0000,0x0000,0x0000,0x0000,0x0030,0x0070,0x00f0,0x01b0,0x0330,0x0630,0x0c30,0x1830,0x3030,0x6030,0x6030,0x6030, 0x6030,0x7ff0,0x0030,0x0030,0x0030,0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0034 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x0060,0x0030,0x0030,0x0030, 0x0030,0x0030,0x0030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0035 0x0000,0x0000,0x0000,0x0000,0x1fe0,0x3000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x6060,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0036 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x6030,0x6030,0x6030,0x6030,0x0060,0x0060,0x00c0,0x00c0,0x0180,0x0180,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0037 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x3060,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0038 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0060,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0039 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0600,0x0c00,0x0000,0x0000,0x0000,0x0000, // u003b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0030,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x1800,0x0c00, 0x0600,0x0300,0x0180,0x00c0,0x0060,0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003d 0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180,0x00c0,0x0060,0x0030,0x0060,0x00c0, 0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003e 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x0060,0x00c0,0x0180,0x0300,0x0300,0x0300, 0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003f 0x0000,0x0000,0x0000,0x0000,0x1fe0,0x3030,0x6018,0x6018,0x61f8,0x6318,0x6618,0x6618,0x6618,0x6618,0x6618,0x6618, 0x6318,0x61e8,0x6000,0x6000,0x3000,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0040 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0041 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6060,0x7fc0,0x6060,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6060,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0042 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0043 0x0000,0x0000,0x0000,0x0000,0x7f00,0x61c0,0x6060,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6060,0x6060,0x61c0,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0044 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0045 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0046 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6000,0x6000,0x6000,0x6000,0x63f0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0047 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0048 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0049 0x0000,0x0000,0x0000,0x0000,0x01f8,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060, 0x6060,0x6060,0x6060,0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u004a 0x0000,0x0000,0x0000,0x0000,0x6030,0x6060,0x60c0,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7000,0x7000,0x7800,0x6c00, 0x6600,0x6300,0x6180,0x60c0,0x6060,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u004b 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u004c 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x7038,0x7878,0x6cd8,0x6cd8,0x6798,0x6318,0x6318,0x6018,0x6018,0x6018, 0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u004d 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x7030,0x7830,0x6c30,0x6630,0x6330,0x61b0,0x60f0, 0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u004e 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u004f 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6060,0x7fc0,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0050 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6330,0x31e0,0x1fc0,0x0060,0x0030,0x0000,0x0000,0x0000,0x0000, // u0051 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6060,0x7fc0,0x7800,0x6c00, 0x6600,0x6300,0x6180,0x60c0,0x6060,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0052 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6000,0x6000,0x6000,0x3000,0x1fc0,0x0060,0x0030,0x0030, 0x0030,0x0030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0053 0x0000,0x0000,0x0000,0x0000,0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0054 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0055 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x3060,0x3060,0x3060,0x3060,0x18c0,0x18c0,0x18c0,0x18c0, 0x0d80,0x0d80,0x0d80,0x0700,0x0700,0x0700,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0056 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6318,0x6318,0x6798, 0x6cd8,0x6cd8,0x7878,0x7038,0x6018,0x6018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0057 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x3060,0x3060,0x18c0,0x18c0,0x0d80,0x0d80,0x0700,0x0700,0x0d80,0x0d80, 0x18c0,0x18c0,0x3060,0x3060,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0058 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860,0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0059 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x0030,0x0030,0x0030,0x0030,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800, 0x3000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005a 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005b 0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x1800,0x1800,0x0c00,0x0c00,0x0600,0x0600,0x0300,0x0300,0x0180,0x0180, 0x00c0,0x00c0,0x0060,0x0060,0x0030,0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005c 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005d 0x0000,0x0000,0x0200,0x0700,0x0d80,0x18c0,0x3060,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x0000,0x0000,0x0000, // u005f 0x0c00,0x0600,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0060 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x0060,0x0030,0x0030,0x1ff0,0x3030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0061 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6060,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0062 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0063 0x0000,0x0000,0x0000,0x0000,0x0030,0x0030,0x0030,0x0030,0x0030,0x1ff0,0x3030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0064 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x7ff0, 0x6000,0x6000,0x6000,0x6000,0x3030,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0065 0x0000,0x0000,0x0000,0x0000,0x03f0,0x0600,0x0600,0x0600,0x0600,0x3fc0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0066 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030,0x0030,0x0030,0x0060,0x3fc0,0x0000, // u0067 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0068 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0069 0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0000,0x0000,0x01e0,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060, 0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x3060,0x3060,0x3060,0x18c0,0x0f80,0x0000, // u006a 0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3030,0x3060,0x30c0,0x3180,0x3300,0x3600,0x3c00, 0x3600,0x3300,0x3180,0x30c0,0x3060,0x3030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u006b 0x0000,0x0000,0x0000,0x0000,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u006c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6330,0x6318,0x6318,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u006d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u006e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u006f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6060,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, // u0070 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030,0x0030,0x0030,0x0030,0x0030,0x0000, // u0071 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x67f0,0x6c00,0x7800,0x7000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0072 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6000,0x6000,0x3000,0x1fc0, 0x0060,0x0030,0x0030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0073 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x0600,0x3fc0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x03e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0074 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0075 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x3060,0x3060,0x3060,0x18c0, 0x18c0,0x18c0,0x0d80,0x0d80,0x0700,0x0700,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0076 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x6018,0x6018,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x6318,0x3330,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0077 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x3060,0x18c0,0x0d80,0x0700,0x0700, 0x0700,0x0d80,0x18c0,0x3060,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0078 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030,0x0030,0x0030,0x0060,0x3fc0,0x0000, // u0079 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x0030,0x0060,0x00c0,0x0180,0x0300,0x0600, 0x0c00,0x1800,0x3000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007a 0x0000,0x0000,0x0000,0x0000,0x01c0,0x0300,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x1c00,0x1c00,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0300,0x01c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007b 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007c 0x0000,0x0000,0x0000,0x0000,0x1c00,0x0600,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x01c0,0x01c0,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0600,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007d 0x0000,0x0000,0x3c30,0x6630,0x6330,0x6330,0x61e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a0 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0fc0,0x1b60,0x3330,0x3300,0x3300,0x3300,0x3300, 0x3300,0x3300,0x3300,0x3330,0x1b60,0x0fc0,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000, // u00a2 0x0000,0x0000,0x0000,0x0000,0x0780,0x0cc0,0x1860,0x1800,0x1800,0x1800,0x1800,0x1800,0x3f80,0x1800,0x1800,0x1800, 0x1800,0x1800,0x1800,0x1830,0x3830,0x3ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6018,0x3030,0x1fe0,0x3030,0x3030,0x3030,0x3030,0x3030,0x3030, 0x3030,0x1fe0,0x3030,0x6018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a4 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860,0x0cc0,0x0cc0,0x0780,0x0300,0x0300,0x3ff0, 0x0300,0x0300,0x3ff0,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a5 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a6 0x0000,0x0000,0x0000,0x0780,0x0cc0,0x1860,0x1800,0x1c00,0x0f00,0x0d80,0x18c0,0x1860,0x1860,0x1860,0x1860,0x0c60, 0x06c0,0x03c0,0x00e0,0x0060,0x1860,0x0cc0,0x0780,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a7 0x18c0,0x18c0,0x18c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fe0,0x6030,0xcf98,0xd8d8,0xd8d8,0xd818,0xd818,0xd818,0xd818, 0xd8d8,0xd8d8,0xcf98,0x6030,0x3fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a9 0x0000,0x1fc0,0x0060,0x0030,0x0ff0,0x1830,0x3030,0x3030,0x3030,0x1830,0x0ff0,0x0000,0x0000,0x3ff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0198,0x0330,0x0660,0x0cc0,0x1980,0x3300,0x6600, 0x3300,0x1980,0x0cc0,0x0660,0x0330,0x0198,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ab 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x0030,0x0030,0x0030,0x0030,0x0030, 0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ac 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ad 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fe0,0x6030,0xdf98,0xd8d8,0xd8d8,0xd8d8,0xd8d8,0xdf98,0xde18, 0xdb18,0xd998,0xd8d8,0x6030,0x3fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ae 0x0000,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00af 0x0000,0x0000,0x0f80,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x0f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x7ff8,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0000,0x0000,0x0000,0x7ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b1 0x0000,0x0000,0x0f80,0x18c0,0x18c0,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x1fc0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b2 0x0000,0x0000,0x0f80,0x18c0,0x00c0,0x00c0,0x0780,0x00c0,0x00c0,0x00c0,0x18c0,0x0f80,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b3 0x0180,0x0300,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6070,0x60f0,0x61b0,0x7f30,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, // u00b5 0x0000,0x0000,0x0000,0x0000,0x3ff8,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x3f18,0x0318,0x0318, 0x0318,0x0318,0x0318,0x0318,0x0318,0x0318,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0c00,0x1800,0x0000, // u00b8 0x0000,0x0000,0x0300,0x0700,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b9 0x0000,0x0fc0,0x1860,0x3030,0x3030,0x3030,0x3030,0x3030,0x3030,0x1860,0x0fc0,0x0000,0x0000,0x3ff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6600,0x3300,0x1980,0x0cc0,0x0660,0x0330,0x0198, 0x0330,0x0660,0x0cc0,0x1980,0x3300,0x6600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00bb 0x0000,0x0000,0x0000,0x0000,0x0c00,0x1c00,0x3c00,0x0c00,0x0c10,0x0c30,0x0c60,0x0cc0,0x0180,0x0330,0x0670,0x0cf0, 0x19b0,0x3330,0x6630,0x47f0,0x0030,0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00bc 0x0000,0x0000,0x0000,0x0000,0x1800,0x3800,0x7810,0x1830,0x1860,0x18c0,0x1980,0x1b00,0x0600,0x0c00,0x1be0,0x3630, 0x6630,0x4060,0x00c0,0x0180,0x0300,0x07f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00bd 0x0000,0x0000,0x0000,0x0000,0x3e00,0x6300,0x0300,0x1e00,0x0308,0x0318,0x6330,0x3e60,0x00c0,0x0198,0x0338,0x0678, 0x0cd8,0x1998,0x3318,0x63f8,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00be 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0600,0x0c00,0x1800,0x3000, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00bf 0x0c00,0x0600,0x0300,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c0 0x0180,0x0300,0x0600,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c1 0x0700,0x0d80,0x18c0,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c2 0x1c60,0x3760,0x31c0,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c3 0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c4 0x0780,0x0cc0,0x0cc0,0x0780,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c5 0x0000,0x0000,0x0000,0x0000,0x3ff8,0x6300,0xc300,0xc300,0xc300,0xc300,0xc300,0xc300,0xfff0,0xc300,0xc300,0xc300, 0xc300,0xc300,0xc300,0xc300,0xc300,0xc3f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c6 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0600,0x0600,0x0600,0x0c00,0x1800,0x0000, // u00c7 0x0c00,0x0600,0x0300,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c8 0x0180,0x0300,0x0600,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c9 0x0700,0x0d80,0x18c0,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ca 0x18c0,0x18c0,0x18c0,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cb 0x0c00,0x0600,0x0300,0x0000,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cc 0x00c0,0x0180,0x0300,0x0000,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cd 0x0700,0x0d80,0x18c0,0x0000,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ce 0x18c0,0x18c0,0x18c0,0x0000,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cf 0x0000,0x0000,0x0000,0x0000,0x7f00,0x61c0,0x6060,0x6060,0x6030,0x6030,0x6030,0x6030,0xfe30,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6060,0x6060,0x61c0,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d0 0x1c60,0x3760,0x31c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x7030,0x7830,0x6c30,0x6630,0x6330,0x61b0,0x60f0, 0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d1 0x0c00,0x0600,0x0300,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d2 0x0180,0x0300,0x0600,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d3 0x0700,0x0d80,0x18c0,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d4 0x1c60,0x3760,0x31c0,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d5 0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6018,0x3030,0x1860,0x0cc0,0x0780,0x0300,0x0780,0x0cc0, 0x1860,0x3030,0x6018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d7 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6038,0x6030,0x6070,0x60f0,0x61b0,0x6330,0x6630,0x6c30,0x7830, 0x7030,0x6030,0xe030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d8 0x0c00,0x0600,0x0300,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d9 0x0180,0x0300,0x0600,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00da 0x0700,0x0d80,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00db 0x18c0,0x18c0,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00dc 0x00c0,0x0180,0x0300,0x0000,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860,0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00dd 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6060,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00de 0x0000,0x0000,0x0000,0x0000,0x3f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x60c0,0x7fc0,0x6060,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x6c60,0x67c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00df 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0600,0x0300,0x0000,0x1fc0,0x0060,0x0030,0x0030,0x1ff0,0x3030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x1fc0,0x0060,0x0030,0x0030,0x1ff0,0x3030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0d80,0x18c0,0x0000,0x1fc0,0x0060,0x0030,0x0030,0x1ff0,0x3030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e2 0x0000,0x0000,0x0000,0x0000,0x0000,0x1c60,0x3760,0x31c0,0x0000,0x1fc0,0x0060,0x0030,0x0030,0x1ff0,0x3030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e3 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x0060,0x0030,0x0030,0x1ff0,0x3030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0780,0x0cc0,0x0cc0,0x0780,0x1fc0,0x0060,0x0030,0x0030,0x1ff0,0x3030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7de0,0x0730,0x0318,0x0318,0x0318,0x3f18,0x63f8, 0xc300,0xc300,0xc300,0xc300,0x6398,0x3ef0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6030,0x3060,0x1fc0,0x0600,0x0600,0x0600,0x0c00,0x1800,0x0000, // u00e7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0600,0x0300,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x7ff0, 0x6000,0x6000,0x6000,0x6000,0x3030,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x7ff0, 0x6000,0x6000,0x6000,0x6000,0x3030,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0d80,0x18c0,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x7ff0, 0x6000,0x6000,0x6000,0x6000,0x3030,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ea 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x7ff0, 0x6000,0x6000,0x6000,0x6000,0x3030,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00eb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0600,0x0300,0x0000,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ec 0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x0180,0x0300,0x0000,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ed 0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0d80,0x18c0,0x0000,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ee 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ef 0x0000,0x0000,0x0000,0x0000,0x1980,0x0f00,0x1e00,0x3300,0x0180,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f0 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c60,0x6660,0x63c0,0x0000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0600,0x0300,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0d80,0x18c0,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f4 0x0000,0x0000,0x0000,0x0000,0x0000,0x1c60,0x3760,0x31c0,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x7ff8,0x0000,0x0000, 0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fd8,0x3078,0x6070,0x60f0,0x61b0,0x6330,0x6630, 0x6c30,0x7830,0x7030,0x6030,0xf060,0xdfc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0600,0x0300,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00fa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0d80,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00fb 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00fc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030,0x0030,0x0030,0x0060,0x3fc0,0x0000, // u00fd 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6060,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, // u00fe 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030,0x0030,0x0030,0x0060,0x3fc0,0x0000, // u00ff 0x0000,0x1fc0,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0100 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x0000,0x0000,0x1fc0,0x0060,0x0030,0x0030,0x1ff0,0x3030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0101 0x18c0,0x18c0,0x0f80,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0102 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x0f80,0x0000,0x1fc0,0x0060,0x0030,0x0030,0x1ff0,0x3030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0103 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0060,0x00c0,0x00c0,0x00c0,0x0078,0x0000, // u0104 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x0060,0x0030,0x0030,0x1ff0,0x3030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0060,0x00c0,0x00c0,0x00c0,0x0078,0x0000, // u0105 0x0180,0x0300,0x0600,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0106 0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x1fc0,0x3060,0x6030,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0107 0x0700,0x0d80,0x18c0,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0108 0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0d80,0x18c0,0x0000,0x1fc0,0x3060,0x6030,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0109 0x0300,0x0300,0x0300,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u010a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0000,0x1fc0,0x3060,0x6030,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u010b 0x18c0,0x0d80,0x0700,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u010c 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x0d80,0x0700,0x0000,0x1fc0,0x3060,0x6030,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u010d 0x18c0,0x0d80,0x0700,0x0000,0x7f00,0x61c0,0x6060,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6060,0x6060,0x61c0,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u010e 0x18c0,0x0d80,0x0700,0x0000,0x0030,0x0030,0x0030,0x0030,0x0030,0x1ff0,0x3030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u010f 0x0000,0x0000,0x0000,0x0000,0x7f00,0x61c0,0x6060,0x6060,0x6030,0x6030,0x6030,0x6030,0xfe30,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6060,0x6060,0x61c0,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0110 0x0000,0x0000,0x0000,0x0000,0x0030,0x0030,0x07f8,0x0030,0x0030,0x1ff0,0x3030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0111 0x0000,0x1fc0,0x0000,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0112 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x7ff0, 0x6000,0x6000,0x6000,0x6000,0x3030,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0113 0x18c0,0x18c0,0x0f80,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0114 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x0f80,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x7ff0, 0x6000,0x6000,0x6000,0x6000,0x3030,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0115 0x0300,0x0300,0x0300,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0116 0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x7ff0, 0x6000,0x6000,0x6000,0x6000,0x3030,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0117 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0060,0x00c0,0x00c0,0x00c0,0x0078,0x0000, // u0118 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x7ff0, 0x6000,0x6000,0x6000,0x6000,0x3030,0x1fe0,0x0380,0x0600,0x0600,0x0600,0x03c0,0x0000, // u0119 0x18c0,0x0d80,0x0700,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u011a 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x0d80,0x0700,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x7ff0, 0x6000,0x6000,0x6000,0x6000,0x3030,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u011b 0x0700,0x0d80,0x18c0,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6000,0x6000,0x6000,0x6000,0x63f0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u011c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0d80,0x18c0,0x0000,0x1ff0,0x3030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030,0x0030,0x0030,0x0060,0x3fc0,0x0000, // u011d 0x18c0,0x18c0,0x0f80,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6000,0x6000,0x6000,0x6000,0x63f0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u011e 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x0f80,0x0000,0x1ff0,0x3030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030,0x0030,0x0030,0x0060,0x3fc0,0x0000, // u011f 0x0300,0x0300,0x0300,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6000,0x6000,0x6000,0x6000,0x63f0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0120 0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0000,0x1ff0,0x3030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030,0x0030,0x0030,0x0060,0x3fc0,0x0000, // u0121 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6000,0x6000,0x6000,0x6000,0x63f0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0600,0x0600,0x0600,0x0c00,0x1800, // u0122 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0300,0x0300,0x0000,0x1ff0,0x3030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030,0x0030,0x0030,0x0060,0x3fc0,0x0000, // u0123 0x0700,0x0d80,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0124 0x0700,0x0d80,0x18c0,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0125 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0xfff8,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0126 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0xff00,0x6000,0x6000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0127 0x1c60,0x3760,0x31c0,0x0000,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0128 0x0000,0x0000,0x0000,0x0000,0x0000,0x1c60,0x3760,0x31c0,0x0000,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0129 0x0000,0x1fc0,0x0000,0x0000,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u012a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x0000,0x0000,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u012b 0x18c0,0x18c0,0x0f80,0x0000,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u012c 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x0f80,0x0000,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u012d 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0300,0x0600,0x0600,0x0600,0x03c0,0x0000, // u012e 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0300,0x0600,0x0600,0x0600,0x03c0,0x0000, // u012f 0x0300,0x0300,0x0300,0x0000,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0130 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0131 0x0000,0x0000,0x0000,0x0000,0xf078,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6630,0x6630,0x6630,0x6630,0x6630,0xf3e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0132 0x0000,0x0000,0x0000,0x0000,0x3018,0x3018,0x3018,0x0000,0x0000,0x7038,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018, 0x3018,0x3018,0x3018,0x3018,0x3018,0x7818,0x0018,0x0318,0x0318,0x0318,0x01f0,0x0000, // u0133 0x00e0,0x01b0,0x0318,0x0000,0x01f8,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060, 0x6060,0x6060,0x6060,0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0134 0x0000,0x0000,0x0000,0x0000,0x0000,0x00e0,0x01b0,0x0318,0x0000,0x01e0,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060, 0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x3060,0x3060,0x3060,0x18c0,0x0f80,0x0000, // u0135 0x0000,0x0000,0x0000,0x0000,0x6030,0x6060,0x60c0,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7000,0x7000,0x7800,0x6c00, 0x6600,0x6300,0x6180,0x60c0,0x6060,0x6030,0x0000,0x0600,0x0600,0x0600,0x0c00,0x1800, // u0136 0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3030,0x3060,0x30c0,0x3180,0x3300,0x3600,0x3c00, 0x3600,0x3300,0x3180,0x30c0,0x3060,0x3030,0x0000,0x0600,0x0600,0x0600,0x0c00,0x1800, // u0137 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3030,0x3060,0x30c0,0x3180,0x3300,0x3600,0x3c00, 0x3600,0x3300,0x3180,0x30c0,0x3060,0x3030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0138 0x1800,0x3000,0x6000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0139 0x00c0,0x0180,0x0300,0x0000,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u013a 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0600,0x0600,0x0600,0x0c00,0x1800, // u013b 0x0000,0x0000,0x0000,0x0000,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0300,0x0300,0x0300,0x0600,0x0c00, // u013c 0x18c0,0x0d80,0x0700,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u013d 0x18c0,0x0d80,0x0700,0x0000,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u013e 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x60c0,0x60c0,0x60c0,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u013f 0x0000,0x0000,0x0000,0x0000,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x030c,0x030c,0x030c,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0140 0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3300,0x3600,0x3c00,0x3800,0x3000,0x7000,0xf000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0141 0x0000,0x0000,0x0000,0x0000,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0360,0x03c0,0x0380,0x0300,0x0700,0x0f00,0x1b00, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0142 0x0180,0x0300,0x0600,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x7030,0x7830,0x6c30,0x6630,0x6330,0x61b0,0x60f0, 0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0143 0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0144 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x7030,0x7830,0x6c30,0x6630,0x6330,0x61b0,0x60f0, 0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0600,0x0600,0x0600,0x0c00,0x1800, // u0145 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0600,0x0600,0x0600,0x0c00,0x1800, // u0146 0x18c0,0x0d80,0x0700,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x7030,0x7830,0x6c30,0x6630,0x6330,0x61b0,0x60f0, 0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0147 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x0d80,0x0700,0x0000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0148 0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0xc000,0xc000,0x0000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0149 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x7030,0x7830,0x6c30,0x6630,0x6330,0x61b0,0x60f0, 0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x0030,0x0030,0x0030,0x0060,0x03c0,0x0000, // u014a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0030,0x0030,0x0030,0x0060,0x03c0,0x0000, // u014b 0x0000,0x1fc0,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u014c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u014d 0x18c0,0x18c0,0x0f80,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u014e 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x0f80,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u014f 0x0630,0x0c60,0x18c0,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0150 0x0000,0x0000,0x0000,0x0000,0x0000,0x0630,0x0c60,0x18c0,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0151 0x0000,0x0000,0x0000,0x0000,0x3ff8,0x6300,0xc300,0xc300,0xc300,0xc300,0xc300,0xc300,0xc3f0,0xc300,0xc300,0xc300, 0xc300,0xc300,0xc300,0xc300,0x6300,0x3ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0152 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fe0,0x6330,0xc318,0xc318,0xc318,0xc318,0xc3f8, 0xc300,0xc300,0xc300,0xc300,0x6318,0x3ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0153 0x0180,0x0300,0x0600,0x0000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6060,0x7fc0,0x7800,0x6c00, 0x6600,0x6300,0x6180,0x60c0,0x6060,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0154 0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x67f0,0x6c00,0x7800,0x7000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0155 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6060,0x7fc0,0x7800,0x6c00, 0x6600,0x6300,0x6180,0x60c0,0x6060,0x6030,0x0000,0x0600,0x0600,0x0600,0x0c00,0x1800, // u0156 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x33f8,0x3600,0x3c00,0x3800,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000,0x3000,0x3000,0x3000,0x6000,0xc000, // u0157 0x18c0,0x0d80,0x0700,0x0000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6060,0x7fc0,0x7800,0x6c00, 0x6600,0x6300,0x6180,0x60c0,0x6060,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0158 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x0d80,0x0700,0x0000,0x67f0,0x6c00,0x7800,0x7000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0159 0x0180,0x0300,0x0600,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6000,0x6000,0x6000,0x3000,0x1fc0,0x0060,0x0030,0x0030, 0x0030,0x0030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u015a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x1fc0,0x3060,0x6030,0x6000,0x6000,0x3000,0x1fc0, 0x0060,0x0030,0x0030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u015b 0x0700,0x0d80,0x18c0,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6000,0x6000,0x6000,0x3000,0x1fc0,0x0060,0x0030,0x0030, 0x0030,0x0030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u015c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0d80,0x18c0,0x0000,0x1fc0,0x3060,0x6030,0x6000,0x6000,0x3000,0x1fc0, 0x0060,0x0030,0x0030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u015d 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6000,0x6000,0x6000,0x3000,0x1fc0,0x0060,0x0030,0x0030, 0x0030,0x0030,0x6030,0x6030,0x3060,0x1fc0,0x0600,0x0600,0x0600,0x0c00,0x1800,0x0000, // u015e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6000,0x6000,0x3000,0x1fc0, 0x0060,0x0030,0x0030,0x6030,0x3060,0x1fc0,0x0600,0x0600,0x0600,0x0c00,0x1800,0x0000, // u015f 0x18c0,0x0d80,0x0700,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6000,0x6000,0x6000,0x3000,0x1fc0,0x0060,0x0030,0x0030, 0x0030,0x0030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0160 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x0d80,0x0700,0x0000,0x1fc0,0x3060,0x6030,0x6000,0x6000,0x3000,0x1fc0, 0x0060,0x0030,0x0030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0161 0x0000,0x0000,0x0000,0x0000,0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0180,0x0180,0x0180,0x0300,0x0600,0x0000, // u0162 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x0600,0x3fc0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x03e0,0x0180,0x0180,0x0180,0x0300,0x0600,0x0000, // u0163 0x18c0,0x0d80,0x0700,0x0000,0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0164 0x3180,0x1b00,0x0e00,0x0000,0x0600,0x0600,0x0600,0x0600,0x0600,0x3fc0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x03e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0165 0x0000,0x0000,0x0000,0x0000,0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x1fe0,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0166 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x0600,0x3fc0,0x0600,0x0600,0x1f80,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x03e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0167 0x1c60,0x3760,0x31c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0168 0x0000,0x0000,0x0000,0x0000,0x0000,0x1c60,0x3760,0x31c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0169 0x0000,0x1fc0,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u016a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u016b 0x18c0,0x18c0,0x0f80,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u016c 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x0f80,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u016d 0x0780,0x0cc0,0x0cc0,0x0780,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u016e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0780,0x0cc0,0x0cc0,0x0780,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u016f 0x0630,0x0c60,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0170 0x0000,0x0000,0x0000,0x0000,0x0000,0x0630,0x0c60,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0171 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0380,0x0600,0x0600,0x0600,0x03c0,0x0000, // u0172 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0060,0x00c0,0x00c0,0x00c0,0x0078,0x0000, // u0173 0x0700,0x0d80,0x18c0,0x0000,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6318,0x6318,0x6798, 0x6cd8,0x6cd8,0x7878,0x7038,0x6018,0x6018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0174 0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0d80,0x18c0,0x0000,0x6018,0x6018,0x6018,0x6018,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x6318,0x3330,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0175 0x0700,0x0d80,0x18c0,0x0000,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860,0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0176 0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0d80,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030,0x0030,0x0030,0x0060,0x3fc0,0x0000, // u0177 0x18c0,0x18c0,0x18c0,0x0000,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860,0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0178 0x0180,0x0300,0x0600,0x0000,0x7ff0,0x0030,0x0030,0x0030,0x0030,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800, 0x3000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0179 0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x7ff0,0x0030,0x0060,0x00c0,0x0180,0x0300,0x0600, 0x0c00,0x1800,0x3000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u017a 0x0300,0x0300,0x0300,0x0000,0x7ff0,0x0030,0x0030,0x0030,0x0030,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800, 0x3000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u017b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0000,0x7ff0,0x0030,0x0060,0x00c0,0x0180,0x0300,0x0600, 0x0c00,0x1800,0x3000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u017c 0x18c0,0x0d80,0x0700,0x0000,0x7ff0,0x0030,0x0030,0x0030,0x0030,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800, 0x3000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u017d 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x0d80,0x0700,0x0000,0x7ff0,0x0030,0x0060,0x00c0,0x0180,0x0300,0x0600, 0x0c00,0x1800,0x3000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u017e 0x0000,0x0000,0x0000,0x0000,0x03f0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u017f 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, 0x0030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0186 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0ff0,0x0030,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0030,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u018e 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x0030,0x0030,0x0030,0x0030,0x0030,0x7ff0,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u018f 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6000,0x6000,0x6000,0x6000,0x3000,0x1f80,0x3000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0190 0x0000,0x0000,0x0000,0x0000,0x01e0,0x0330,0x0330,0x0300,0x0300,0x0300,0x0300,0x1fe0,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x3300,0x3300,0x1e00,0x0000,0x0000, // u0192 0x0000,0x0000,0x0000,0x0000,0x3018,0x3018,0x3018,0x3018,0x3018,0x3818,0x3c18,0x3618,0x3318,0x3198,0x30d8,0x3078, 0x3038,0x3018,0x3018,0x3018,0x3018,0x3018,0x3000,0x3000,0x3000,0x3000,0xe000,0x0000, // u019d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0000, // u019e 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x0030,0x0030,0x0030,0x0060,0x00c0,0x0180,0x0300,0x7ff0,0x0600,0x0c00,0x1800, 0x3000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x0030,0x0060,0x00c0,0x0180,0x0300,0x7ff0, 0x0600,0x0c00,0x1800,0x3000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01b6 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x0030,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0fc0,0x0060,0x0030,0x0030,0x0030, 0x0030,0x0030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01b7 0x18c0,0x0d80,0x0700,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01cd 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x0d80,0x0700,0x0000,0x1fc0,0x0060,0x0030,0x0030,0x1ff0,0x3030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01ce 0x18c0,0x0d80,0x0700,0x0000,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01cf 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x0d80,0x0700,0x0000,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d0 0x18c0,0x0d80,0x0700,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x0d80,0x0700,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d2 0x18c0,0x0d80,0x0700,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x0d80,0x0700,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d4 0x0000,0x3ff0,0x0000,0x0000,0x3ff8,0x6300,0xc300,0xc300,0xc300,0xc300,0xc300,0xc300,0xfff0,0xc300,0xc300,0xc300, 0xc300,0xc300,0xc300,0xc300,0xc300,0xc3f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fe0,0x0000,0x0000,0x7de0,0x0730,0x0318,0x0318,0x0318,0x3f18,0x63f8, 0xc300,0xc300,0xc300,0xc300,0x6398,0x3ef0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e3 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6000,0x6000,0x6000,0x6000,0x63f0,0x6030,0x6030, 0x61fc,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3030,0x6030,0x6030,0x6030,0x6030,0x61fc, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030,0x0030,0x0030,0x0060,0x3fc0,0x0000, // u01e5 0x18c0,0x0d80,0x0700,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6000,0x6000,0x6000,0x6000,0x63f0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e6 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x0d80,0x0700,0x0000,0x1ff0,0x3030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030,0x0030,0x0030,0x0060,0x3fc0,0x0000, // u01e7 0x18c0,0x0d80,0x0700,0x0000,0x6030,0x6060,0x60c0,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7000,0x7000,0x7800,0x6c00, 0x6600,0x6300,0x6180,0x60c0,0x6060,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e8 0x18c0,0x0d80,0x0700,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3030,0x3060,0x30c0,0x3180,0x3300,0x3600,0x3c00, 0x3600,0x3300,0x3180,0x30c0,0x3060,0x3030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e9 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0380,0x0600,0x0600,0x0600,0x03c0,0x0000, // u01ea 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0380,0x0600,0x0600,0x0600,0x03c0,0x0000, // u01eb 0x0000,0x1fc0,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0380,0x0600,0x0600,0x0600,0x03c0,0x0000, // u01ec 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0380,0x0600,0x0600,0x0600,0x03c0,0x0000, // u01ed 0x18c0,0x0d80,0x0700,0x0000,0x7ff0,0x0030,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0fc0,0x0060,0x0030,0x0030,0x0030, 0x0030,0x0030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01ee 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x0d80,0x0700,0x0000,0x7ff0,0x0030,0x0060,0x00c0,0x0180,0x0300,0x0600, 0x0fc0,0x0060,0x0030,0x0030,0x0030,0x0030,0x0030,0x6030,0x6030,0x3060,0x1fc0,0x0000, // u01ef 0x0000,0x0000,0x0000,0x0000,0x0000,0x0318,0x01b0,0x00e0,0x0000,0x01e0,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060, 0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x3060,0x3060,0x3060,0x18c0,0x0f80,0x0000, // u01f0 0x0180,0x0300,0x0600,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6000,0x6000,0x6000,0x6000,0x63f0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01f4 0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x0180,0x0300,0x0000,0x1ff0,0x3030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030,0x0030,0x0030,0x0060,0x3fc0,0x0000, // u01f5 0x00c0,0x0180,0x0300,0x0000,0x3ff8,0x6300,0xc300,0xc300,0xc300,0xc300,0xc300,0xc300,0xfff0,0xc300,0xc300,0xc300, 0xc300,0xc300,0xc300,0xc300,0xc300,0xc3f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01fc 0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x0180,0x0300,0x0000,0x7de0,0x0730,0x0318,0x0318,0x0318,0x3f18,0x63f8, 0xc300,0xc300,0xc300,0xc300,0x6398,0x3ef0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01fd 0x0180,0x0300,0x0600,0x0000,0x1fc0,0x3060,0x6030,0x6038,0x6030,0x6070,0x60f0,0x61b0,0x6330,0x6630,0x6c30,0x7830, 0x7030,0x6030,0xe030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01fe 0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x1fd8,0x3078,0x6070,0x60f0,0x61b0,0x6330,0x6630, 0x6c30,0x7830,0x7030,0x6030,0xf060,0xdfc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01ff 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6000,0x6000,0x6000,0x3000,0x1fc0,0x0060,0x0030,0x0030, 0x0030,0x0030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0600,0x0600,0x0600,0x0c00,0x1800, // u0218 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6000,0x6000,0x3000,0x1fc0, 0x0060,0x0030,0x0030,0x6030,0x3060,0x1fc0,0x0000,0x0600,0x0600,0x0600,0x0c00,0x1800, // u0219 0x0000,0x0000,0x0000,0x0000,0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0300,0x0300,0x0300,0x0600,0x0c00, // u021a 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x0600,0x3fc0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x03e0,0x0000,0x0180,0x0180,0x0180,0x0300,0x0600, // u021b 0x0000,0x1fc0,0x0000,0x0000,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860,0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0232 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030,0x0030,0x0030,0x0060,0x3fc0,0x0000, // u0233 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01e0,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060, 0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x3060,0x3060,0x3060,0x18c0,0x0f80,0x0000, // u0237 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x0030,0x0030,0x0030,0x0030, 0x0030,0x0030,0x0030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0254 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x7ff0, 0x0030,0x0030,0x0030,0x0030,0x6060,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0258 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x6060,0x0030,0x0030,0x0030,0x0030,0x7ff0, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0259 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6000,0x6000,0x3000,0x1f80, 0x3000,0x6000,0x6000,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u025b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fe0,0x3030,0x3018,0x3018,0x3018,0x3018,0x3018, 0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3000,0x3000,0x3000,0x3000,0xe000,0x0000, // u0272 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x0030,0x0060,0x00c0,0x0180,0x0300,0x0600, 0x0fc0,0x0060,0x0030,0x0030,0x0030,0x0030,0x0030,0x6030,0x6030,0x3060,0x1fc0,0x0000, // u0292 0x0300,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bb 0x0300,0x0300,0x0300,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bc 0x0600,0x0600,0x0600,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bd 0x0700,0x0d80,0x18c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02c6 0x18c0,0x0d80,0x0700,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02c7 0x18c0,0x18c0,0x0f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02d8 0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02d9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0600,0x0600,0x0600,0x03c0,0x0000, // u02db 0x1c60,0x3760,0x31c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02dc 0x0630,0x0c60,0x18c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02dd 0x0c00,0x0600,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0300 0x0180,0x0300,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0301 0x0700,0x0d80,0x18c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0302 0x1c60,0x3760,0x31c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0303 0x0000,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0304 0x0000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0305 0x18c0,0x18c0,0x0f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0306 0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0307 0x18c0,0x18c0,0x18c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0308 0x0780,0x0cc0,0x0cc0,0x0780,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030a 0x0630,0x0c60,0x18c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030b 0x18c0,0x0d80,0x0700,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u0329 0x0000,0x3000,0x6000,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0384 0x0180,0x0300,0x0600,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0385 0x0000,0x3000,0x6000,0xc000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0386 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0387 0x0000,0x3000,0x6000,0xc000,0x3ff8,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3fc0,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0388 0x0000,0x3000,0x6000,0xc000,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3ff8,0x3018,0x3018,0x3018, 0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0389 0x0000,0x3000,0x6000,0xc000,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u038a 0x0000,0x3000,0x6000,0xc000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u038c 0x0000,0x3000,0x6000,0xc000,0x300c,0x300c,0x1818,0x1818,0x0c30,0x0c30,0x0660,0x0660,0x03c0,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u038e 0x0000,0x3000,0x6000,0xc000,0x1fe0,0x3030,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018, 0x3030,0x1860,0x0cc0,0x0cc0,0x0cc0,0x7cf8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u038f 0x0180,0x0300,0x0600,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0390 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0391 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6060,0x7fc0,0x6060,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6060,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0392 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0393 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0780,0x0780,0x0780,0x0cc0,0x0cc0,0x0cc0,0x1860,0x1860,0x1860, 0x3030,0x3030,0x3030,0x6018,0x6018,0x7ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0394 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0395 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x0030,0x0030,0x0030,0x0030,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800, 0x3000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0396 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0397 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6fb0,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0398 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0399 0x0000,0x0000,0x0000,0x0000,0x6030,0x6060,0x60c0,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7000,0x7000,0x7800,0x6c00, 0x6600,0x6300,0x6180,0x60c0,0x6060,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u039a 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0780,0x0780,0x0780,0x0cc0,0x0cc0,0x0cc0,0x1860,0x1860,0x1860, 0x3030,0x3030,0x3030,0x6018,0x6018,0x6018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u039b 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x7038,0x7878,0x6cd8,0x6cd8,0x6798,0x6318,0x6318,0x6018,0x6018,0x6018, 0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u039c 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x7030,0x7830,0x6c30,0x6630,0x6330,0x61b0,0x60f0, 0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u039d 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u039e 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u039f 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a0 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6060,0x7fc0,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a1 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180,0x00c0,0x00c0,0x0180,0x0300, 0x0600,0x0c00,0x1800,0x3000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a3 0x0000,0x0000,0x0000,0x0000,0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a4 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860,0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a5 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x1fe0,0x3330,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318, 0x6318,0x6318,0x3330,0x1fe0,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a6 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x3060,0x3060,0x18c0,0x18c0,0x0d80,0x0d80,0x0700,0x0700,0x0d80,0x0d80, 0x18c0,0x18c0,0x3060,0x3060,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a7 0x0000,0x0000,0x0000,0x0000,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318, 0x3330,0x1fe0,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a8 0x0000,0x0000,0x0000,0x0000,0x1fe0,0x3030,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018, 0x3030,0x1860,0x0cc0,0x0cc0,0x0cc0,0x7cf8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a9 0x18c0,0x18c0,0x18c0,0x0000,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03aa 0x18c0,0x18c0,0x18c0,0x0000,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860,0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ab 0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x1f98,0x30f0,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x6060,0x30f0,0x1f98,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ac 0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x1fc0,0x3060,0x6030,0x6000,0x6000,0x3000,0x1f80, 0x3000,0x6000,0x6000,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ad 0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0000, // u03ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03af 0x0180,0x0300,0x0600,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f98,0x30f0,0x6060,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x6060,0x30f0,0x1f98,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b1 0x0000,0x0000,0x0000,0x0000,0x3f80,0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x60c0,0x7fc0,0x6060,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6060,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, // u03b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860, 0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000, // u03b3 0x0000,0x0000,0x0000,0x0000,0x1fe0,0x0c00,0x0600,0x0300,0x0180,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6000,0x6000,0x3000,0x1f80, 0x3000,0x6000,0x6000,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b5 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x3000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x3000,0x1fc0,0x0060,0x0030,0x0030,0x0030,0x00e0,0x0000, // u03b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0000, // u03b7 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x1860,0x3030,0x3030,0x3030,0x3030,0x3030,0x3030,0x3ff0,0x3030,0x3030,0x3030, 0x3030,0x3030,0x3030,0x3030,0x1860,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3030,0x3060,0x30c0,0x3180,0x3300,0x3600,0x3c00, 0x3600,0x3300,0x3180,0x30c0,0x3060,0x3030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ba 0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x0c00,0x0c00,0x0600,0x0600,0x0700,0x0700,0x0d80,0x0d80,0x18c0,0x18c0, 0x3060,0x3060,0x3060,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6070,0x60f0,0x61b0,0x7f30,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, // u03bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x3060,0x3060,0x3060,0x18c0, 0x18c0,0x18c0,0x0d80,0x0d80,0x0700,0x0700,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03bd 0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3000,0x6000,0x6000,0x6000,0x6000,0x6000,0x3000,0x1fc0,0x3000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x3000,0x1fc0,0x0060,0x0030,0x0030,0x0030,0x00e0,0x0000, // u03be 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6060,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, // u03c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x3000,0x1fc0,0x0060,0x0030,0x0030,0x0030,0x00e0,0x0000, // u03c2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff8,0x30c0,0x6060,0x6060,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x01e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x19e0,0x3330,0x6318,0x6318,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x6318,0x3330,0x1fe0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000, // u03c6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x3060,0x3060,0x18c0,0x18c0,0x0d80, 0x0d80,0x0700,0x0700,0x0d80,0x0d80,0x18c0,0x18c0,0x3060,0x3060,0x6030,0x6030,0x0000, // u03c7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x6318,0x3330,0x1fe0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000, // u03c8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1860,0x3030,0x6018,0x6018,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x6318,0x37b0,0x1ce0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c9 0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ca 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03cb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03cc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03cd 0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x0180,0x0300,0x0000,0x1860,0x3030,0x6018,0x6018,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x6318,0x37b0,0x1ce0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ce 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x1860,0x3030,0x3030,0x3030,0x3030,0x1830,0x0ff8,0x0030,0x0030,0xf030,0x3030, 0x3030,0x3030,0x3030,0x3030,0x1860,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x1fe0,0x3330,0x6318,0x6318,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x6318,0x3330,0x1fe0,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000, // u03d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7818,0x0c30,0x0660,0x06c0,0x0380,0x0300,0x0300, 0x0300,0x0700,0x0d80,0x1980,0x30c0,0x6078,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6060,0x7fc0,0x6000,0x6000,0x6000,0x3000,0x1fe0,0x0000, // u03f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f2 0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0000,0x0000,0x01e0,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060, 0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x3060,0x3060,0x3060,0x18c0,0x0f80,0x0000, // u03f3 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1800,0x3000,0x6000,0x6000,0x6000,0x7fc0, 0x6000,0x6000,0x6000,0x3000,0x1800,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x00c0,0x0060,0x0030,0x0030,0x0030,0x1ff0, 0x0030,0x0030,0x0030,0x0060,0x00c0,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f6 0x0c00,0x0600,0x0300,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0400 0x18c0,0x18c0,0x18c0,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0401 0x0000,0x0000,0x0000,0x0000,0xfc00,0x3000,0x3000,0x3000,0x3000,0x3000,0x3fc0,0x3060,0x3030,0x3030,0x3030,0x3030, 0x3030,0x3030,0x3030,0x3030,0x3060,0x31c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0402 0x0180,0x0300,0x0600,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0403 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0404 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6000,0x6000,0x6000,0x3000,0x1fc0,0x0060,0x0030,0x0030, 0x0030,0x0030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0405 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0406 0x18c0,0x18c0,0x18c0,0x0000,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0407 0x0000,0x0000,0x0000,0x0000,0x01f8,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060, 0x6060,0x6060,0x6060,0x6060,0x30c0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0408 0x0000,0x0000,0x0000,0x0000,0x1f00,0x3300,0x6300,0x6300,0x6300,0x6300,0x6300,0x63e0,0x6330,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x6318,0x6330,0xc3e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0409 0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x6300,0x6300,0x6300,0x6300,0x6300,0x63e0,0x7f30,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x6318,0x6330,0x63e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u040a 0x0000,0x0000,0x0000,0x0000,0xfc00,0x3000,0x3000,0x3000,0x3000,0x3000,0x3fc0,0x3060,0x3030,0x3030,0x3030,0x3030, 0x3030,0x3030,0x3030,0x3030,0x3030,0x3030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u040b 0x0180,0x0300,0x0600,0x0000,0x6030,0x6060,0x60c0,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7000,0x7000,0x7800,0x6c00, 0x6600,0x6300,0x6180,0x60c0,0x6060,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u040c 0x0c00,0x0600,0x0300,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6070,0x60f0,0x61b0,0x6330,0x6630,0x6c30,0x7830, 0x7030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u040d 0x18c0,0x18c0,0x0f80,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0060,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u040e 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018, 0x6018,0x6018,0x6018,0x6018,0x6018,0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000, // u040f 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0410 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x6060,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6060,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0411 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6060,0x7fc0,0x6060,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6060,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0412 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0413 0x0000,0x0000,0x0000,0x0000,0x07f0,0x0c30,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830, 0x1830,0x1830,0x1830,0x1830,0x1830,0x7ff8,0x6018,0x6018,0x6018,0x0000,0x0000,0x0000, // u0414 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0415 0x0000,0x0000,0x0000,0x0000,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x3330,0x1b60,0x0fc0,0x1b60,0x3330,0x6318, 0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0416 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x0030,0x0030,0x0030,0x0030,0x0060,0x0fc0,0x0060,0x0030,0x0030, 0x0030,0x0030,0x0030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0417 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6070,0x60f0,0x61b0,0x6330,0x6630,0x6c30,0x7830, 0x7030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0418 0x18c0,0x18c0,0x0f80,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6070,0x60f0,0x61b0,0x6330,0x6630,0x6c30,0x7830, 0x7030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0419 0x0000,0x0000,0x0000,0x0000,0x6030,0x6060,0x60c0,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7000,0x7000,0x7800,0x6c00, 0x6600,0x6300,0x6180,0x60c0,0x6060,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u041a 0x0000,0x0000,0x0000,0x0000,0x07f0,0x0c30,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830, 0x1830,0x1830,0x1830,0x1830,0x3030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u041b 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x7038,0x7878,0x6cd8,0x6cd8,0x6798,0x6318,0x6318,0x6018,0x6018,0x6018, 0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u041c 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u041d 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u041e 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u041f 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6060,0x7fc0,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0420 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0421 0x0000,0x0000,0x0000,0x0000,0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0422 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0060,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0423 0x0000,0x0000,0x0300,0x0300,0x1fe0,0x3330,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x6318,0x3330,0x1fe0,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000, // u0424 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x3060,0x3060,0x18c0,0x18c0,0x0d80,0x0d80,0x0700,0x0700,0x0d80,0x0d80, 0x18c0,0x18c0,0x3060,0x3060,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0425 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff8,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u0426 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0427 0x0000,0x0000,0x0000,0x0000,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x6318,0x3318,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0428 0x0000,0x0000,0x0000,0x0000,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x6318,0x3318,0x1ffc,0x000c,0x000c,0x000c,0x000c,0x0000,0x0000, // u0429 0x0000,0x0000,0x0000,0x0000,0xf000,0xf000,0x3000,0x3000,0x3000,0x3000,0x3fe0,0x3030,0x3018,0x3018,0x3018,0x3018, 0x3018,0x3018,0x3018,0x3018,0x3030,0x3fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u042a 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x7f18,0x6198,0x60d8,0x60d8,0x60d8,0x60d8, 0x60d8,0x60d8,0x60d8,0x60d8,0x6198,0x7f18,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u042b 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6060,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u042c 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0ff0,0x0030,0x0030,0x0030, 0x0030,0x0030,0x0030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u042d 0x0000,0x0000,0x0000,0x0000,0x61e0,0x6330,0x6618,0x6618,0x6618,0x6618,0x6618,0x6618,0x6618,0x7e18,0x6618,0x6618, 0x6618,0x6618,0x6618,0x6618,0x6330,0x61e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u042e 0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x00f0,0x01b0, 0x0330,0x0630,0x0c30,0x1830,0x3030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u042f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x0060,0x0030,0x0030,0x1ff0,0x3030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0430 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6060,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0431 0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x6180,0x7fc0,0x6060,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6060,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0432 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0433 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030,0x0030,0x0030,0x0060,0x3fc0,0x0000, // u0434 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x7ff0, 0x6000,0x6000,0x6000,0x6000,0x3030,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0435 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6318,0x6318,0x6318,0x6318,0x3330,0x1b60,0x0fc0, 0x1b60,0x3330,0x6318,0x6318,0x6318,0x6318,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0436 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x0030,0x0030,0x0060,0x0fc0, 0x0060,0x0030,0x0030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0437 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0438 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x0f80,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0439 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3030,0x3060,0x30c0,0x3180,0x3300,0x3600,0x3c00, 0x3600,0x3300,0x3180,0x30c0,0x3060,0x3030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u043a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07f0,0x0c30,0x1830,0x1830,0x1830,0x1830,0x1830, 0x1830,0x1830,0x1830,0x1830,0x3030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u043b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x7038,0x7878,0x6cd8,0x6cd8,0x6798, 0x6318,0x6318,0x6018,0x6018,0x6018,0x6018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u043c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u043d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u043e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u043f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6060,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, // u0440 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0441 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0442 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030,0x0030,0x0030,0x0060,0x3fc0,0x0000, // u0443 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x1fe0,0x3330,0x6318,0x6318,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x6318,0x3330,0x1fe0,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000, // u0444 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x3060,0x18c0,0x0d80,0x0700,0x0700, 0x0700,0x0d80,0x18c0,0x3060,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0445 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff8,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u0446 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0447 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x6318,0x3318,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0448 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x6318,0x3318,0x1ffc,0x000c,0x000c,0x000c,0x000c,0x0000,0x0000, // u0449 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf000,0xf000,0x3000,0x3000,0x3fc0,0x3060,0x3030, 0x3030,0x3030,0x3030,0x3030,0x3060,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u044a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x6018,0x6018,0x7f18,0x6198,0x60d8, 0x60d8,0x60d8,0x60d8,0x60d8,0x6198,0x7f18,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u044b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3fc0,0x3060,0x3030, 0x3030,0x3030,0x3030,0x3030,0x3060,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u044c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x0030,0x0030,0x0030,0x0ff0, 0x0030,0x0030,0x0030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u044d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x61e0,0x6330,0x6618,0x6618,0x6618,0x6618,0x7e18, 0x6618,0x6618,0x6618,0x6618,0x6330,0x61e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u044e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3030,0x6030,0x6030,0x6030,0x3030,0x1ff0, 0x01b0,0x0330,0x0630,0x0c30,0x1830,0x3030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u044f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0600,0x0300,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x7ff0, 0x6000,0x6000,0x6000,0x6000,0x3030,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0450 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x7ff0, 0x6000,0x6000,0x6000,0x6000,0x3030,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0451 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0xff00,0x6000,0x6000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0030,0x0030,0x0030,0x0060,0x03c0,0x0000, // u0452 0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0453 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6000,0x6000,0x6000,0x7f80, 0x6000,0x6000,0x6000,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0454 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6000,0x6000,0x3000,0x1fc0, 0x0060,0x0030,0x0030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0455 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0456 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0457 0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0000,0x0000,0x01e0,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060, 0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x3060,0x3060,0x3060,0x18c0,0x0f80,0x0000, // u0458 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3300,0x6300,0x6300,0x63e0,0x6330,0x6318, 0x6318,0x6318,0x6318,0x6318,0x6330,0xc3e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0459 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x6300,0x6300,0x63e0,0x6330,0x7f18, 0x6318,0x6318,0x6318,0x6318,0x6330,0x63e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u045a 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0xff00,0x6000,0x6000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u045b 0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x0180,0x0300,0x0000,0x3030,0x3060,0x30c0,0x3180,0x3300,0x3600,0x3c00, 0x3600,0x3300,0x3180,0x30c0,0x3060,0x3030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u045c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0600,0x0300,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u045d 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x0f80,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030,0x0030,0x0030,0x0060,0x3fc0,0x0000, // u045e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018, 0x6018,0x6018,0x6018,0x6018,0x6018,0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000, // u045f 0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0xff00,0x3000,0x3000,0x3000,0x3fe0,0x3030,0x3018,0x3018,0x3018,0x3018, 0x3018,0x3018,0x3018,0x3018,0x3030,0x3fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0462 0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0xff00,0x3000,0x3000,0x3000,0x3000,0x3fc0,0x3060,0x3030, 0x3030,0x3030,0x3030,0x3030,0x3060,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0463 0x0000,0x0000,0x0000,0x0000,0x7ff8,0x6018,0x3030,0x3030,0x1860,0x0cc0,0x0cc0,0x0780,0x0fc0,0x1b60,0x3330,0x6318, 0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u046a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff8,0x6018,0x3030,0x1860,0x0cc0,0x0780,0x0fc0, 0x1b60,0x3330,0x6318,0x6318,0x6318,0x6318,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u046b 0x0000,0x0030,0x0030,0x0030,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0490 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0030,0x0030,0x0030,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0491 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0xff00,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0492 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0xff00, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0493 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x6060,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0030,0x0060,0x00c0,0x0000,0x0000,0x0000, // u0494 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80, 0x60c0,0x6060,0x6060,0x6060,0x6060,0x6060,0x0060,0x00c0,0x0180,0x0000,0x0000,0x0000, // u0495 0x0000,0x0000,0x0000,0x0000,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x3330,0x1b60,0x0fc0,0x1b60,0x3330,0x6318, 0x6318,0x6318,0x6318,0x6318,0x6318,0x631c,0x000c,0x000c,0x000c,0x000c,0x0000,0x0000, // u0496 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6318,0x6318,0x6318,0x6318,0x3330,0x1b60,0x0fc0, 0x1b60,0x3330,0x6318,0x6318,0x6318,0x631c,0x000c,0x000c,0x000c,0x000c,0x0000,0x0000, // u0497 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x0030,0x0030,0x0030,0x0030,0x0060,0x0fc0,0x0060,0x0030,0x0030, 0x0030,0x0030,0x0030,0x6030,0x3060,0x1fc0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000, // u0498 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x0030,0x0030,0x0060,0x0fc0, 0x0060,0x0030,0x0030,0x6030,0x3060,0x1fc0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000, // u0499 0x0000,0x0000,0x0000,0x0000,0x6030,0x6060,0x60c0,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7000,0x7000,0x7800,0x6c00, 0x6600,0x6300,0x6180,0x60c0,0x6060,0x6030,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u049a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3030,0x3060,0x30c0,0x3180,0x3300,0x3600,0x3c00, 0x3600,0x3300,0x3180,0x30c0,0x3060,0x3030,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u049b 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x6030,0x6060,0x6cc0,0x6d80,0x6f00,0x6e00,0x7c00,0x7c00,0x6e00,0x6f00, 0x6d80,0x6cc0,0x6060,0x6030,0x6018,0x6018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u049c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6018,0x6030,0x6c60,0x6cc0,0x6d80,0x6f00,0x7e00, 0x6f00,0x6d80,0x6cc0,0x6c60,0x6030,0x6018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u049d 0x0000,0x0000,0x0000,0x0000,0xf018,0xf030,0x3060,0x30c0,0x3180,0x3300,0x3600,0x3c00,0x3800,0x3800,0x3c00,0x3600, 0x3300,0x3180,0x30c0,0x3060,0x3030,0x3018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf030,0xf060,0x30c0,0x3180,0x3300,0x3600,0x3c00, 0x3600,0x3300,0x3180,0x30c0,0x3060,0x3030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a1 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6038,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u04a2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6038,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u04a3 0x0000,0x0000,0x0000,0x0000,0x60fc,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x60c0,0x60c0,0x60c0, 0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60fc,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0, 0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a5 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000, // u04aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6030,0x3060,0x1fc0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000, // u04ab 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860,0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860, 0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000, // u04af 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860,0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x3ff0, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860, 0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x0300,0x3ff0,0x0300,0x0300,0x0300,0x0300,0x0000, // u04b1 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x3060,0x3060,0x18c0,0x18c0,0x0d80,0x0d80,0x0700,0x0700,0x0d80,0x0d80, 0x18c0,0x18c0,0x3060,0x3060,0x6030,0x6038,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u04b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x3060,0x18c0,0x0d80,0x0700,0x0700, 0x0700,0x0d80,0x18c0,0x3060,0x6030,0x6038,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u04b3 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0038,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u04b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0038,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u04b7 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6330,0x6330,0x6330,0x3330,0x1ff0,0x0330,0x0330, 0x0330,0x0330,0x0030,0x0030,0x0030,0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6330,0x6330,0x3330,0x1ff0, 0x0330,0x0330,0x0330,0x0030,0x0030,0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04b9 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x6060,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x6060, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04bb 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04c0 0x18c0,0x18c0,0x0f80,0x0000,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x3330,0x1b60,0x0fc0,0x1b60,0x3330,0x6318, 0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x0f80,0x0000,0x6318,0x6318,0x6318,0x6318,0x3330,0x1b60,0x0fc0, 0x1b60,0x3330,0x6318,0x6318,0x6318,0x6318,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04c2 0x0000,0x0000,0x0000,0x0000,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04cf 0x18c0,0x18c0,0x0f80,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d0 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x0f80,0x0000,0x1fc0,0x0060,0x0030,0x0030,0x1ff0,0x3030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d1 0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d2 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x0060,0x0030,0x0030,0x1ff0,0x3030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d3 0x0000,0x0000,0x0000,0x0000,0x3ff8,0x6300,0xc300,0xc300,0xc300,0xc300,0xc300,0xc300,0xfff0,0xc300,0xc300,0xc300, 0xc300,0xc300,0xc300,0xc300,0xc300,0xc3f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7de0,0x0730,0x0318,0x0318,0x0318,0x3f18,0x63f8, 0xc300,0xc300,0xc300,0xc300,0x6398,0x3ef0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d5 0x18c0,0x18c0,0x0f80,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d6 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x0f80,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x7ff0, 0x6000,0x6000,0x6000,0x6000,0x3030,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d7 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x0030,0x0030,0x0030,0x0030,0x0030,0x7ff0,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x6060,0x0030,0x0030,0x0030,0x0030,0x7ff0, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d9 0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3060,0x6030,0x0030,0x0030,0x0030,0x0030,0x0030,0x7ff0,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04da 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x3fc0,0x6060,0x0030,0x0030,0x0030,0x0030,0x7ff0, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04db 0x1860,0x1860,0x1860,0x0000,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x3330,0x1b60,0x0fc0,0x1b60,0x3330,0x6318, 0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04dc 0x0000,0x0000,0x0000,0x0000,0x0000,0x1860,0x1860,0x1860,0x0000,0x6318,0x6318,0x6318,0x6318,0x3330,0x1b60,0x0fc0, 0x1b60,0x3330,0x6318,0x6318,0x6318,0x6318,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04dd 0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3060,0x6030,0x0030,0x0030,0x0030,0x0030,0x0060,0x0fc0,0x0060,0x0030,0x0030, 0x0030,0x0030,0x0030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04de 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3060,0x6030,0x0030,0x0030,0x0060,0x0fc0, 0x0060,0x0030,0x0030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04df 0x0000,0x1fc0,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6070,0x60f0,0x61b0,0x6330,0x6630,0x6c30,0x7830, 0x7030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e3 0x18c0,0x18c0,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6070,0x60f0,0x61b0,0x6330,0x6630,0x6c30,0x7830, 0x7030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e4 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e5 0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e6 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e7 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x7ff0, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e9 0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ea 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x7ff0, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04eb 0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3060,0x6030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0ff0,0x0030,0x0030,0x0030, 0x0030,0x0030,0x0030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ec 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3060,0x6030,0x0030,0x0030,0x0030,0x0ff0, 0x0030,0x0030,0x0030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ed 0x0000,0x1fc0,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0060,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ee 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030,0x0030,0x0030,0x0060,0x3fc0,0x0000, // u04ef 0x18c0,0x18c0,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0060,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f0 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030,0x0030,0x0030,0x0060,0x3fc0,0x0000, // u04f1 0x0630,0x0c60,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0060,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0630,0x0c60,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030,0x0030,0x0030,0x0060,0x3fc0,0x0000, // u04f3 0x18c0,0x18c0,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f4 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f5 0x18c0,0x18c0,0x18c0,0x0000,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x7f18,0x6198,0x60d8,0x60d8,0x60d8,0x60d8, 0x60d8,0x60d8,0x60d8,0x60d8,0x6198,0x7f18,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f8 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x6018,0x6018,0x6018,0x6018,0x7f18,0x6198,0x60d8, 0x60d8,0x60d8,0x60d8,0x60d8,0x6198,0x7f18,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f9 0x0000,0x0000,0x0000,0x0000,0x3018,0x3018,0x1818,0x1818,0x0c18,0x0c18,0x0618,0x0e30,0x1b60,0x33c0,0x6180,0x6180, 0x60c0,0x60c0,0x6060,0x6060,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d0 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0060,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0030,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d1 0x0000,0x0000,0x0000,0x0000,0x3e00,0x0300,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0380, 0x06c0,0x0cc0,0x1860,0x3060,0x6030,0xc030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d2 0x0000,0x0000,0x0000,0x0000,0x7ffc,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d3 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0060,0x0030,0x0030,0x0030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d4 0x0000,0x0000,0x0000,0x0000,0x3c00,0x0600,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d5 0x0000,0x0000,0x0000,0x0000,0x1ff0,0x0060,0x00c0,0x0180,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d6 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d7 0x0000,0x0000,0x0000,0x0000,0x63c0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d8 0x0000,0x0000,0x0000,0x0000,0x3c00,0x0600,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d9 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0060,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0000,0x0000, // u05da 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0060,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0060,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05db 0x0000,0x6000,0x6000,0x6000,0x7ff0,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0060,0x00c0,0x0180,0x0300,0x0600, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05dc 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05dd 0x0000,0x0000,0x0000,0x0000,0xe780,0xfce0,0x3830,0x3030,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018, 0x3018,0x3018,0x3018,0x3018,0x3018,0x30f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05de 0x0000,0x0000,0x0000,0x0000,0x3f00,0x0180,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u05df 0x0000,0x0000,0x0000,0x0000,0x3f00,0x0180,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e0 0x0000,0x0000,0x0000,0x0000,0xffe0,0x3030,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018, 0x3018,0x3018,0x3018,0x3018,0x1830,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e1 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x3030,0x3030,0x3030,0x1830,0x1830,0x1860,0x0c60,0x0c60,0x0cc0, 0x06c0,0x06c0,0x0380,0x0700,0x0e00,0x7800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e2 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030,0x3030,0x1e30,0x0030,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0000,0x0000, // u05e3 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030,0x3030,0x1e30,0x0030,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0060,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e4 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x3018,0x3018,0x1818,0x1830,0x0c60,0x0cc0,0x0780,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000, // u05e5 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x3018,0x3018,0x1818,0x1830,0x0c60,0x0cc0,0x0780,0x0300,0x0300,0x0180, 0x0180,0x00c0,0x00c0,0x0060,0x0060,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e6 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x0030,0x0030,0x0030,0x0030,0x6030,0x6030,0x6030,0x6060,0x60c0,0x6180,0x6300, 0x6600,0x6600,0x6600,0x6600,0x6600,0x6600,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000, // u05e7 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0060,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e8 0x0000,0x0000,0x0000,0x0000,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6618,0x7c18,0x6018, 0x6018,0x6018,0x6018,0x6018,0x6030,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e9 0x0000,0x0000,0x0000,0x0000,0xffe0,0x3030,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018, 0x3018,0x3018,0x3018,0x3018,0x3018,0xe018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05ea 0x0000,0x0000,0x0000,0x0000,0x7f00,0x61c0,0x6060,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6060,0x6060,0x61c0,0x7f00,0x0000,0x0600,0x0600,0x0600,0x0000,0x0000, // u1e0c 0x0000,0x0000,0x0000,0x0000,0x0030,0x0030,0x0030,0x0030,0x0030,0x1ff0,0x3030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1e0d 0x0000,0x0000,0x0000,0x0000,0x6030,0x6060,0x60c0,0x6180,0x6300,0x6600,0x6c00,0x7800,0x7000,0x7000,0x7800,0x6c00, 0x6600,0x6300,0x6180,0x60c0,0x6060,0x6030,0x0000,0x0000,0x3fe0,0x0000,0x0000,0x0000, // u1e34 0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3030,0x3060,0x30c0,0x3180,0x3300,0x3600,0x3c00, 0x3600,0x3300,0x3180,0x30c0,0x3060,0x3030,0x0000,0x0000,0x1fe0,0x0000,0x0000,0x0000, // u1e35 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1e36 0x0000,0x0000,0x0000,0x0000,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1e37 0x0300,0x0300,0x0300,0x0000,0x6018,0x6018,0x7038,0x7878,0x6cd8,0x6cd8,0x6798,0x6318,0x6318,0x6018,0x6018,0x6018, 0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e40 0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0000,0x7fe0,0x6330,0x6318,0x6318,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e41 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x7038,0x7878,0x6cd8,0x6cd8,0x6798,0x6318,0x6318,0x6018,0x6018,0x6018, 0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1e42 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x6330,0x6318,0x6318,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1e43 0x0300,0x0300,0x0300,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x7030,0x7830,0x6c30,0x6630,0x6330,0x61b0,0x60f0, 0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e44 0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e45 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x7030,0x7830,0x6c30,0x6630,0x6330,0x61b0,0x60f0, 0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1e46 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1e47 0x0000,0x0000,0x0000,0x0000,0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1e6c 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x0600,0x3fc0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x03e0,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u1e6d 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1eb8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x7ff0, 0x6000,0x6000,0x6000,0x6000,0x3030,0x1fe0,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1eb9 0x1c60,0x3760,0x31c0,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u1ebc 0x0000,0x0000,0x0000,0x0000,0x0000,0x1c60,0x3760,0x31c0,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x7ff0, 0x6000,0x6000,0x6000,0x6000,0x3030,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u1ebd 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1eca 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1ecb 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1ecc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1ecd 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3060,0x1fc0,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1ee4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1ee5 0x1c60,0x3760,0x31c0,0x0000,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860,0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u1ef8 0x0000,0x0000,0x0000,0x0000,0x0000,0x1c60,0x3760,0x31c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x3030,0x1ff0,0x0030,0x0030,0x0030,0x0060,0x3fc0,0x0000, // u1ef9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2001 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2002 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2003 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2004 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2005 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2006 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2007 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2008 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2009 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2010 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2011 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2012 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2013 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff8,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2014 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff8,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2015 0x0000,0x0000,0x0000,0x0000,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2016 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x0000,0x0000,0x7ff0, // u2017 0x0000,0x0000,0x0300,0x0300,0x0600,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2018 0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2019 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u201a 0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201b 0x0000,0x0000,0x0c60,0x0c60,0x18c0,0x18c0,0x18c0,0x18c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201c 0x0000,0x0000,0x0c60,0x0c60,0x0c60,0x0c60,0x18c0,0x18c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x18c0,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000, // u201e 0x0000,0x0000,0x3180,0x3180,0x3180,0x3180,0x18c0,0x18c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201f 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x3ff0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2020 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x3ff0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x3ff0,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2021 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0780,0x0fc0,0x0fc0,0x0fc0,0x0fc0, 0x0780,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2022 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x6318,0x6318,0x6318,0x6318,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2026 0x0000,0x0000,0x0000,0x0000,0x38c0,0x6cc0,0x6d80,0x6d80,0x3b00,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x1800,0x1800, 0x3000,0x3770,0x6dd8,0x6dd8,0xcdd8,0xc770,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2030 0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0200,0x0200,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2032 0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x18c0,0x1080,0x1080,0x1080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2033 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800, 0x0c00,0x0600,0x0300,0x0180,0x00c0,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2039 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x0c00,0x0600,0x0300,0x0180,0x00c0,0x0060, 0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u203a 0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0, 0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x18c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u203c 0x0000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u203e 0x0000,0x0000,0x0f80,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x0f80,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2070 0x0300,0x0300,0x0000,0x0000,0x0700,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0780,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2071 0x0000,0x0000,0x00c0,0x01c0,0x03c0,0x06c0,0x0cc0,0x18c0,0x1fc0,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2074 0x0000,0x0000,0x1fc0,0x1800,0x1800,0x1800,0x1f80,0x00c0,0x00c0,0x00c0,0x18c0,0x0f80,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2075 0x0000,0x0000,0x0780,0x0c00,0x1800,0x1800,0x1f80,0x18c0,0x18c0,0x18c0,0x18c0,0x0f80,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2076 0x0000,0x0000,0x1fc0,0x18c0,0x00c0,0x0180,0x0180,0x0300,0x0300,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2077 0x0000,0x0000,0x0f80,0x18c0,0x18c0,0x18c0,0x0f80,0x18c0,0x18c0,0x18c0,0x18c0,0x0f80,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2078 0x0000,0x0000,0x0f80,0x18c0,0x18c0,0x18c0,0x18c0,0x0fc0,0x00c0,0x00c0,0x0180,0x0f00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2079 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x1fe0,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207b 0x0000,0x0000,0x0000,0x0000,0x0000,0x1fe0,0x0000,0x0000,0x0000,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207c 0x0000,0x0000,0x0180,0x0300,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0300,0x0180,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207d 0x0000,0x0000,0x0600,0x0300,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0300,0x0600,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207e 0x0000,0x0000,0x0000,0x1fc0,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f80,0x18c0, 0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x0f80,0x0000,0x0000,0x0000,0x0000, // u2080 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0700, 0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000, // u2081 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f80,0x18c0, 0x18c0,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x1fc0,0x0000,0x0000,0x0000,0x0000, // u2082 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f80,0x18c0, 0x00c0,0x00c0,0x0780,0x00c0,0x00c0,0x00c0,0x18c0,0x0f80,0x0000,0x0000,0x0000,0x0000, // u2083 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x01c0, 0x03c0,0x06c0,0x0cc0,0x18c0,0x1fc0,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000, // u2084 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x1800, 0x1800,0x1800,0x1f80,0x00c0,0x00c0,0x00c0,0x18c0,0x0f80,0x0000,0x0000,0x0000,0x0000, // u2085 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0780,0x0c00, 0x1800,0x1800,0x1f80,0x18c0,0x18c0,0x18c0,0x18c0,0x0f80,0x0000,0x0000,0x0000,0x0000, // u2086 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x18c0, 0x00c0,0x0180,0x0180,0x0300,0x0300,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u2087 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f80,0x18c0, 0x18c0,0x18c0,0x0f80,0x18c0,0x18c0,0x18c0,0x18c0,0x0f80,0x0000,0x0000,0x0000,0x0000, // u2088 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f80,0x18c0, 0x18c0,0x18c0,0x18c0,0x0fc0,0x00c0,0x00c0,0x0180,0x0f00,0x0000,0x0000,0x0000,0x0000, // u2089 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0300,0x0300,0x0300,0x1fe0,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000, // u208a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u208b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x1fe0,0x0000,0x0000,0x0000,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u208c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0300, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0300,0x0180,0x0000,0x0000,0x0000,0x0000, // u208d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0300, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0300,0x0600,0x0000,0x0000,0x0000,0x0000, // u208e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0, 0x0060,0x0060,0x0fe0,0x1860,0x1860,0x1860,0x1860,0x0fe0,0x0000,0x0000,0x0000,0x0000, // u2090 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0, 0x1860,0x1860,0x1860,0x1fe0,0x1800,0x1800,0x1860,0x0fc0,0x0000,0x0000,0x0000,0x0000, // u2091 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0, 0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x0fc0,0x0000,0x0000,0x0000,0x0000, // u2092 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1860, 0x1860,0x0cc0,0x0780,0x0300,0x0780,0x0cc0,0x1860,0x1860,0x0000,0x0000,0x0000,0x0000, // u2093 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0, 0x1860,0x0060,0x0060,0x1fe0,0x1860,0x1860,0x1860,0x0fc0,0x0000,0x0000,0x0000,0x0000, // u2094 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x1fc0, 0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x0000,0x0000,0x0000,0x0000, // u2095 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x1860, 0x18c0,0x1980,0x1b00,0x1e00,0x1b00,0x1980,0x18c0,0x1860,0x0000,0x0000,0x0000,0x0000, // u2096 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0780,0x0000,0x0000,0x0000,0x0000, // u2097 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fe0, 0x3330,0x3330,0x3330,0x3330,0x3330,0x3330,0x3330,0x3330,0x0000,0x0000,0x0000,0x0000, // u2098 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0, 0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1fc0,0x1800,0x1800,0x1800,0x0000, // u209a 0x0000,0x0000,0x0000,0x0000,0x7f00,0x6180,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x6180,0x7f60,0x6060,0x61f8, 0x6060,0x6060,0x6060,0x6060,0x6060,0x6038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u20a7 0x0000,0x0000,0x0000,0x0000,0xfe18,0xc318,0xc198,0xc198,0xc198,0xcd98,0xcd98,0xcd98,0xcd98,0xcd98,0xcd98,0xcd98, 0xcd98,0xcc18,0xcc18,0xcc18,0xcc30,0xcfe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u20aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x1860,0x3030,0x6000,0x6000,0x6000,0xff80,0x6000,0x6000,0x6000,0xff80, 0x6000,0x6000,0x6000,0x3030,0x1860,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u20ac 0x0000,0x0000,0x0000,0x0000,0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0300,0x0370,0x03c0,0x0f00,0x3b70,0x03c0,0x0f00, 0x3b00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u20ae 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3c60,0x6c30,0x6c30,0x6c30,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, 0x6c00,0x6c30,0x6c30,0x6c30,0x3c60,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2102 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u210e 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0xff00,0x6000,0x6000,0x7fc0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u210f 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x7030,0x7830,0x6c30,0x7630,0x7b30,0x6db0,0x66f0,0x6370,0x61b0, 0x60f0,0x6070,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2115 0x0000,0x0000,0x0000,0x0000,0xc300,0xc338,0xc36c,0xc36c,0xe36c,0xe338,0xf300,0xf300,0xdb00,0xdb00,0xcf00,0xcf00, 0xc77c,0xc700,0xc300,0xc37c,0xc300,0xc300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2116 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3c60,0x6c30,0x6c30,0x6c30,0x6c30,0x6c30,0x6c30,0x6c30,0x6c30,0x6c30,0x6c30, 0x6c30,0x6c30,0x6c30,0x6db0,0x3de0,0x1fc0,0x0060,0x0030,0x0000,0x0000,0x0000,0x0000, // u211a 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x6c60,0x6c30,0x6c30,0x6c30,0x6c30,0x6c30,0x6c30,0x6c60,0x6fc0,0x6f00,0x6d80, 0x6ec0,0x6f60,0x6db0,0x6cd8,0x6c68,0x7c38,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u211d 0x0000,0x0000,0x0000,0x0000,0xfd04,0x318c,0x31fc,0x31ac,0x318c,0x318c,0x318c,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2122 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x0030,0x0030,0x0070,0x00f0,0x01b0,0x0360,0x06c0,0x0d80,0x1b00,0x3600,0x6c00, 0x7800,0x7000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2124 0x0000,0x0000,0x0000,0x0000,0x1fe0,0x3030,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018, 0x3030,0x1860,0x0cc0,0x0cc0,0x0cc0,0x7cf8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2126 0x0000,0x0000,0x0000,0x0000,0x60c0,0x60c0,0x3060,0x3060,0x1830,0x1830,0x0c18,0x1c30,0x3660,0x66c0,0xc380,0xc300, 0xc180,0xc180,0xc0c0,0xc0c0,0x6060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2135 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0c00,0x1800,0x3000,0x6000,0xfff8,0xfff8,0x6000, 0x3000,0x1800,0x0c00,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2190 0x0000,0x0000,0x0000,0x0000,0x0300,0x0780,0x0fc0,0x1b60,0x3330,0x6318,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2191 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0180,0x00c0,0x0060,0x0030,0xfff8,0xfff8,0x0030, 0x0060,0x00c0,0x0180,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2192 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x6318,0x3330,0x1b60,0x0fc0,0x0780,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2193 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0480,0x0cc0,0x1860,0x3030,0x6018,0xfffc,0xfffc,0x6018, 0x3030,0x1860,0x0cc0,0x0480,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2194 0x0000,0x0000,0x0000,0x0000,0x0300,0x0780,0x0fc0,0x1b60,0x3330,0x6318,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x6318,0x3330,0x1b60,0x0fc0,0x0780,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2195 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0418,0x0c18,0x1818,0x3018,0x6018,0xfff8,0xfff8,0x6018, 0x3018,0x1818,0x0c18,0x0418,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc100,0xc180,0xc0c0,0xc060,0xc030,0xfff8,0xfff8,0xc030, 0xc060,0xc0c0,0xc180,0xc100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a6 0x0000,0x0000,0x0000,0x0000,0x0300,0x0780,0x0fc0,0x1b60,0x3330,0x6318,0x0300,0x0300,0x0300,0x0300,0x0300,0x6318, 0x3330,0x1b60,0x0fc0,0x0780,0x0300,0x7ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a8 0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0418,0x0c18,0x1818,0x3018,0x6018,0xfff8, 0xfff8,0x6000,0x3000,0x1800,0x0c00,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x0e00,0x1e20,0x3630,0x6618,0x6018,0x6018,0x6018,0x6018, 0x3030,0x1860,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1800,0x3000,0x6000,0xfff8,0xfff8,0x0000,0x0000,0xfff8, 0xfff8,0x0030,0x0060,0x00c0,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21cb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x00c0,0x0060,0x0030,0xfff8,0xfff8,0x0000,0x0000,0xfff8, 0xfff8,0x6000,0x3000,0x1800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21cc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0c00,0x1800,0x3ff8,0x7ff8,0xe000,0xe000,0x7ff8, 0x3ff8,0x1800,0x0c00,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d0 0x0000,0x0000,0x0000,0x0000,0x0300,0x0780,0x0fc0,0x1ce0,0x3cf0,0x6cd8,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0180,0x00c0,0xffe0,0xfff0,0x0038,0x0038,0xfff0, 0xffe0,0x00c0,0x0180,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d2 0x0000,0x0000,0x0000,0x0000,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, 0x6cd8,0x3cf0,0x1ce0,0x0fc0,0x0780,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0480,0x0cc0,0x1860,0x3ff0,0x7ff8,0xe01c,0xe01c,0x7ff8, 0x3ff0,0x1860,0x0cc0,0x0480,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d4 0x0000,0x0000,0x0000,0x0000,0x0300,0x0780,0x0fc0,0x1ce0,0x3cf0,0x6cd8,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, 0x6cd8,0x3cf0,0x1ce0,0x0fc0,0x0780,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d5 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x3060,0x3060,0x3fe0,0x3060,0x18c0,0x18c0,0x18c0,0x18c0, 0x0d80,0x0d80,0x0d80,0x0700,0x0700,0x0700,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2200 0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x7ff0,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0030,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2203 0x0000,0x0000,0x0000,0x0030,0x0030,0x7ff0,0x0070,0x00f0,0x00f0,0x01b0,0x01b0,0x0330,0x0330,0x7ff0,0x0630,0x0630, 0x0c30,0x0c30,0x1830,0x1830,0x3030,0x7ff0,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, // u2204 0x0000,0x0000,0x0000,0x0000,0x0000,0x0030,0x0060,0x1fc0,0x30e0,0x61b0,0x61b0,0x6330,0x6330,0x6630,0x6630,0x6c30, 0x6c30,0x3860,0x1fc0,0x3000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2205 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0780,0x0780,0x0780,0x0cc0,0x0cc0,0x0cc0,0x1860,0x1860,0x1860, 0x3030,0x3030,0x3030,0x6018,0x6018,0x7ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2206 0x0000,0x0000,0x0000,0x0000,0x7ff8,0x6018,0x6018,0x3030,0x3030,0x3030,0x1860,0x1860,0x1860,0x0cc0,0x0cc0,0x0cc0, 0x0780,0x0780,0x0780,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2207 0x0000,0x0000,0x0000,0x0000,0x0000,0x07f0,0x1c00,0x3000,0x3000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x6000,0x6000, 0x6000,0x6000,0x3000,0x3000,0x1c00,0x07f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2208 0x0000,0x0000,0x0000,0x0018,0x0018,0x07f0,0x1c30,0x3060,0x3060,0x60c0,0x60c0,0x6180,0x6180,0x7ff0,0x6300,0x6300, 0x6600,0x6600,0x2c00,0x3c00,0x1800,0x1ff0,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, // u2209 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1800,0x3000,0x6000,0x6000,0x6000,0x7ff0,0x6000,0x6000, 0x6000,0x3000,0x1800,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u220a 0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x01c0,0x0060,0x0060,0x0030,0x0030,0x0030,0x0030,0x7ff0,0x0030,0x0030, 0x0030,0x0030,0x0060,0x0060,0x01c0,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u220b 0x0000,0x0000,0x0000,0x6000,0x6000,0x3f80,0x30e0,0x1830,0x1830,0x0c18,0x0c18,0x0618,0x0618,0x3ff8,0x0318,0x0318, 0x0198,0x0198,0x00d0,0x00f0,0x0060,0x3fe0,0x0030,0x0030,0x0000,0x0000,0x0000,0x0000, // u220c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x00c0,0x0060,0x0030,0x0030,0x0030,0x7ff0,0x0030,0x0030, 0x0030,0x0060,0x00c0,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u220d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2212 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff8,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300, 0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2213 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300, 0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2214 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0030,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0c00, 0x1800,0x3000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2215 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180,0x00c0, 0x0060,0x0030,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2216 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0f80,0x0f80,0x0f80,0x0700, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2219 0x0000,0x0000,0x0078,0x0078,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x6060,0x6060,0x6060,0x3060, 0x1860,0x0c60,0x0660,0x0360,0x01e0,0x00e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u221a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ce0,0x37b0,0x6318,0x6318,0x6318,0x6318,0x6318, 0x37b0,0x1ce0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u221e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u221f 0x0000,0x0000,0x0000,0x0000,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2225 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0780,0x0780,0x0cc0,0x0cc0,0x1860, 0x1860,0x1860,0x3030,0x3030,0x6018,0x6018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2227 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860,0x1860, 0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2228 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f80,0x18c0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2229 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x3060,0x18c0,0x0f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u222a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c30,0x3630,0x6360,0x61c0,0x0000,0x1c30,0x3630, 0x6360,0x61c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2248 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0030,0x7ff8,0x00c0,0x0180,0x0300,0x0600,0x0c00, 0x7ff8,0x3000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2260 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2261 0x0000,0x0000,0x0000,0x0000,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x1800,0x0c00,0x0600,0x0300, 0x0180,0x00c0,0x0060,0x0000,0x0000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2264 0x0000,0x0000,0x0000,0x0000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180,0x00c0,0x0060,0x00c0,0x0180,0x0300,0x0600, 0x0c00,0x1800,0x3000,0x0000,0x0000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2265 0x0000,0x0000,0x0000,0x0000,0x0000,0x018c,0x0318,0x0630,0x0c60,0x18c0,0x3180,0x6300,0xc600,0xc600,0x6300,0x3180, 0x18c0,0x0c60,0x0630,0x0318,0x018c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u226a 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0x6300,0x3180,0x18c0,0x0c60,0x0630,0x0318,0x018c,0x018c,0x0318,0x0630, 0x0c60,0x18c0,0x3180,0x6300,0xc600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u226b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff8,0x1800,0x3000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x3000,0x1800,0x0ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2282 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0060,0x0030,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018, 0x0030,0x0060,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2283 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff8,0x1800,0x3000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x3000, 0x1800,0x0ff8,0x0000,0x0000,0x7ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2286 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x0060,0x0030,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0030, 0x0060,0x7fc0,0x0000,0x0000,0x7ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2287 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x7ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u22a5 0x0000,0x0000,0x0000,0x0000,0x0f80,0x18c0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u22c2 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x3060,0x18c0,0x0f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u22c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0030,0x0060,0x1fc0,0x30e0,0x61b0,0x61b0,0x6330,0x6330,0x6630,0x6630,0x6c30, 0x6c30,0x3860,0x1fc0,0x3000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2300 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0780,0x0cc0,0x1860,0x3030,0x6018,0x6018,0x6018, 0x6018,0x6018,0x6018,0x6018,0x6018,0x7ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2302 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2308 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2309 0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u230a 0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u230b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2310 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2319 0x0000,0x0000,0x0000,0x0000,0x01f0,0x0318,0x0318,0x0318,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2320 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x6300,0x6300,0x6300,0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2321 0x0030,0x0060,0x00c0,0x0180,0x0300,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x0c00,0x1800,0x1800,0x1800,0x1800,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, // u239b 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, // u239c 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x1800,0x1800,0x1800, 0x1800,0x0c00,0x0c00,0x0c00,0x0600,0x0600,0x0300,0x0300,0x0180,0x00c0,0x0060,0x0030, // u239d 0x3000,0x1800,0x0c00,0x0600,0x0300,0x0300,0x0180,0x0180,0x00c0,0x00c0,0x00c0,0x0060,0x0060,0x0060,0x0060,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, // u239e 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, // u239f 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0060,0x0060,0x0060, 0x0060,0x00c0,0x00c0,0x00c0,0x0180,0x0180,0x0300,0x0300,0x0600,0x0c00,0x1800,0x3000, // u23a0 0x3ff0,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, // u23a1 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, // u23a2 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ff0, // u23a3 0x3ff0,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, // u23a4 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, // u23a5 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x3ff0, // u23a6 0x00f8,0x0380,0x0600,0x0600,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u23a7 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1800,0xf000,0xf000,0x1800, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u23a8 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0600,0x0600,0x0380,0x00f8, // u23a9 0xf800,0x0e00,0x0300,0x0300,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u23ab 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x00c0,0x0078,0x0078,0x00c0, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u23ac 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0300,0x0300,0x0e00,0xf800, // u23ad 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u23ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23af 0xfffc,0xfffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0xfffc,0xfffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc, // u23bd 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u23d0 0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x6300,0x7f00,0x6300,0x6300,0x6300,0x6300,0x0000,0x0000,0x07f8,0x00c0, 0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2409 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x0000,0x0000,0x03f8,0x0300, 0x0300,0x03e0,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u240a 0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x6300,0x6300,0x6300,0x3600,0x1c00,0x0800,0x0000,0x0000,0x07f8,0x00c0, 0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u240b 0x0000,0x0000,0x0000,0x0000,0x7f00,0x6000,0x6000,0x7c00,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x03f8,0x0300, 0x0300,0x03e0,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u240c 0x0000,0x0000,0x0000,0x0000,0x3e00,0x6300,0x6000,0x6000,0x6000,0x6000,0x6300,0x3e00,0x0000,0x0000,0x03f0,0x0318, 0x0318,0x03f0,0x03c0,0x0360,0x0330,0x0318,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u240d 0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x7300,0x7b00,0x6f00,0x6700,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x03f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2424 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2500 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0xfffc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2501 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2502 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u2503 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xedd8,0xedd8,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2508 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xedd8,0xedd8,0xedd8,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2509 0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000, // u250a 0x0700,0x0700,0x0700,0x0700,0x0700,0x0000,0x0000,0x0700,0x0700,0x0700,0x0700,0x0700,0x0000,0x0000,0x0700,0x0700, 0x0700,0x0700,0x0700,0x0000,0x0000,0x0700,0x0700,0x0700,0x0700,0x0700,0x0000,0x0000, // u250b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03fc,0x03fc,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u250c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03fc,0x03fc,0x03fc,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u250d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07fc,0x07fc,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u250e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07fc,0x07fc,0x07fc,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u250f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2510 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2511 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u2512 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u2513 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x03fc,0x03fc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2514 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x03fc,0x03fc,0x03fc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2515 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x07fc,0x07fc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2516 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x07fc,0x07fc,0x07fc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2517 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xff00,0xff00,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2518 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xff00,0xff00,0xff00,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2519 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0xff00,0xff00,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u251a 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0xff00,0xff00,0xff00,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u251b 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x03fc,0x03fc,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u251c 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x03fc,0x03fc,0x03fc,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u251d 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x07fc,0x07fc,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u251e 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x07fc,0x07fc,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u251f 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x07fc,0x07fc,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u2520 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x07fc,0x07fc,0x07fc,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2521 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x07fc,0x07fc,0x07fc,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u2522 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x07fc,0x07fc,0x07fc,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u2523 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xff00,0xff00,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2524 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xff00,0xff00,0xff00,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2525 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0xff00,0xff00,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2526 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xff00,0xff00,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u2527 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0xff00,0xff00,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u2528 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0xff00,0xff00,0xff00,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2529 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xff00,0xff00,0xff00,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u252a 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0xff00,0xff00,0xff00,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u252b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u252c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xfffc,0xfffc,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u252d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03fc,0xfffc,0xfffc,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u252e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0xfffc,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u252f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u2530 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xfffc,0xfffc,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u2531 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07fc,0xfffc,0xfffc,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u2532 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0xfffc,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u2533 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xfffc,0xfffc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2534 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xff00,0xfffc,0xfffc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2535 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x03fc,0xfffc,0xfffc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2536 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xfffc,0xfffc,0xfffc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2537 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0xfffc,0xfffc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2538 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0xff00,0xfffc,0xfffc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2539 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x07fc,0xfffc,0xfffc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u253a 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0xfffc,0xfffc,0xfffc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u253b 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xfffc,0xfffc,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u253c 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xff00,0xfffc,0xfffc,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u253d 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x03fc,0xfffc,0xfffc,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u253e 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xfffc,0xfffc,0xfffc,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u253f 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0xfffc,0xfffc,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2540 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xfffc,0xfffc,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u2541 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0xfffc,0xfffc,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u2542 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0xff00,0xfffc,0xfffc,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2543 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x07fc,0xfffc,0xfffc,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2544 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xff00,0xfffc,0xfffc,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u2545 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x03fc,0xfffc,0xfffc,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u2546 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0xfffc,0xfffc,0xfffc,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2547 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xfffc,0xfffc,0xfffc,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u2548 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0xff00,0xfffc,0xfffc,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u2549 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x07fc,0xfffc,0xfffc,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u254a 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0xfffc,0xfffc,0xfffc,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u254b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0x0000,0x0000,0xfffc, 0xfffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2550 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, // u2551 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03fc,0x03fc,0x0300,0x0300,0x03fc, 0x03fc,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2552 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ffc,0x0ffc,0x0cc0, 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, // u2553 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ffc,0x0ffc,0x0c00,0x0c00,0x0cfc, 0x0cfc,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, // u2554 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x0300,0x0300,0xff00, 0xff00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2555 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x0cc0, 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, // u2556 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x00c0,0x00c0,0xfcc0, 0xfcc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, // u2557 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x03fc,0x03fc,0x0300,0x0300,0x03fc, 0x03fc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2558 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0ffc,0x0ffc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2559 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cfc,0x0cfc,0x0c00,0x0c00,0x0ffc, 0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255a 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xff00,0xff00,0x0300,0x0300,0xff00, 0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255b 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0xffc0,0xffc0,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255c 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0xfcc0,0xfcc0,0x00c0,0x00c0,0xffc0, 0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255d 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x03fc,0x03fc,0x0300,0x0300,0x03fc, 0x03fc,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u255e 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cfc,0x0cfc,0x0cc0, 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, // u255f 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cfc,0x0cfc,0x0c00,0x0c00,0x0cfc, 0x0cfc,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, // u2560 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xff00,0xff00,0x0300,0x0300,0xff00, 0xff00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2561 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0xfcc0,0xfcc0,0x0cc0, 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, // u2562 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0xfcc0,0xfcc0,0x00c0,0x00c0,0xfcc0, 0xfcc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, // u2563 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0x0000,0x0000,0xfffc, 0xfffc,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2564 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0x0cc0, 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, // u2565 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0x0000,0x0000,0xfcfc, 0xfcfc,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, // u2566 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xfffc,0xfffc,0x0000,0x0000,0xfffc, 0xfffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2567 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0xfffc,0xfffc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2568 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0xfcfc,0xfcfc,0x0000,0x0000,0xfffc, 0xfffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2569 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xfffc,0xfffc,0x0300,0x0300,0xfffc, 0xfffc,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u256a 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0xfffc,0xfffc,0x0cc0, 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, // u256b 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0xfcfc,0xfcfc,0x0000,0x0000,0xfcfc, 0xfcfc,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, // u256c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x001c,0x007c,0x00e0, 0x01c0,0x0180,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u256d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xe000,0xf800,0x1c00, 0x0e00,0x0600,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u256e 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0600,0x0e00,0x1c00,0xf800,0xe000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u256f 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0180,0x01c0,0x00e0,0x007c,0x001c,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2570 0x0004,0x0004,0x000c,0x0008,0x0018,0x0010,0x0030,0x0020,0x0060,0x0040,0x00c0,0x0080,0x0180,0x0100,0x0300,0x0200, 0x0600,0x0400,0x0c00,0x0800,0x1800,0x1000,0x3000,0x2000,0x6000,0x4000,0xc000,0x8000, // u2571 0x8000,0xc000,0x4000,0x6000,0x2000,0x3000,0x1000,0x1800,0x0800,0x0c00,0x0400,0x0600,0x0200,0x0300,0x0100,0x0180, 0x0080,0x00c0,0x0040,0x0060,0x0020,0x0030,0x0010,0x0018,0x0008,0x000c,0x0004,0x0004, // u2572 0x8004,0xc004,0x400c,0x6008,0x2018,0x3010,0x1030,0x1820,0x0860,0x0c40,0x04c0,0x0680,0x0380,0x0300,0x0300,0x0380, 0x0680,0x04c0,0x0c40,0x0860,0x1820,0x1030,0x3010,0x2018,0x6008,0x400c,0xc004,0x8004, // u2573 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2574 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2575 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03fc,0x03fc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2576 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2577 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2578 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2579 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03fc,0x03fc,0x03fc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0700,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u257b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03fc,0xfffc,0xfffc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257c 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0700,0x0700,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u257d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xfffc,0xfffc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257e 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u257f 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2580 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0xfffc, // u2581 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, // u2582 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, // u2583 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc, 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, // u2584 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, // u2585 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, // u2586 0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, // u2587 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, // u2588 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, // u2589 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, // u258a 0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80, 0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80, // u258b 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, // u258c 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, // u258d 0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000, 0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000, // u258e 0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000, 0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000, // u258f 0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc, 0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc, // u2590 0xaaa8,0x0000,0xaaa8,0x0000,0xaaa8,0x0000,0xaaa8,0x0000,0xaaa8,0x0000,0xaaa8,0x0000,0xaaa8,0x0000,0xaaa8,0x0000, 0xaaa8,0x0000,0xaaa8,0x0000,0xaaa8,0x0000,0xaaa8,0x0000,0xaaa8,0x0000,0xaaa8,0x0000, // u2591 0xaaa8,0x5554,0xaaa8,0x5554,0xaaa8,0x5554,0xaaa8,0x5554,0xaaa8,0x5554,0xaaa8,0x5554,0xaaa8,0x5554,0xaaa8,0x5554, 0xaaa8,0x5554,0xaaa8,0x5554,0xaaa8,0x5554,0xaaa8,0x5554,0xaaa8,0x5554,0xaaa8,0x5554, // u2592 0xfffc,0xaaa8,0xfffc,0xaaa8,0xfffc,0xaaa8,0xfffc,0xaaa8,0xfffc,0xaaa8,0xfffc,0xaaa8,0xfffc,0xaaa8,0xfffc,0xaaa8, 0xfffc,0xaaa8,0xfffc,0xaaa8,0xfffc,0xaaa8,0xfffc,0xaaa8,0xfffc,0xaaa8,0xfffc,0xaaa8, // u2593 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xfe00, 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, // u2596 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01fc,0x01fc, 0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc, // u2597 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2598 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfffc,0xfffc, 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, // u2599 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0x01fc,0x01fc, 0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc, // u259a 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfe00,0xfe00, 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, // u259b 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0x01fc,0x01fc, 0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc, // u259c 0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u259d 0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0xfe00,0xfe00, 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, // u259e 0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0xfffc,0xfffc, 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, // u259f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fe0,0x3fe0,0x3fe0,0x3fe0,0x3fe0,0x3fe0,0x3fe0,0x3fe0, 0x3fe0,0x3fe0,0x3fe0,0x3fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff8, 0x7ff8,0x7ff8,0x7ff8,0x7ff8,0x7ff8,0x7ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ac 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x7ff0,0x7ff0,0x7ff0,0x7ff0,0x7ff0,0x7ff0,0x7ff0,0x7ff0,0x7ff0,0x7ff0, 0x7ff0,0x7ff0,0x7ff0,0x7ff0,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0780,0x0780,0x0fc0,0x0fc0,0x1fe0,0x1fe0,0x3ff0, 0x3ff0,0x7ff8,0x7ff8,0xfffc,0xfffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xffc0,0xfff0,0xfffc,0xfffc,0xfff0, 0xffc0,0xff00,0xfc00,0xf000,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xffc0,0xfff0,0xfffc,0xfffc,0xfff0, 0xffc0,0xff00,0xfc00,0xf000,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0x7ff8,0x7ff8,0x3ff0,0x3ff0,0x1fe0,0x1fe0,0x0fc0, 0x0fc0,0x0780,0x0780,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x000c,0x003c,0x00fc,0x03fc,0x0ffc,0x3ffc,0xfffc,0xfffc,0x3ffc, 0x0ffc,0x03fc,0x00fc,0x003c,0x000c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25c0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x000c,0x003c,0x00fc,0x03fc,0x0ffc,0x3ffc,0xfffc,0xfffc,0x3ffc, 0x0ffc,0x03fc,0x00fc,0x003c,0x000c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25c4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0200,0x0700,0x0f80,0x1fc0,0x3fe0,0x7ff0,0xfff8,0xfff8,0x7ff0, 0x3fe0,0x1fc0,0x0f80,0x0700,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25c6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0200,0x0700,0x0d80,0x18c0,0x3060,0x6030,0xc018,0xc018,0x6030, 0x3060,0x18c0,0x0d80,0x0700,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ca 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0780,0x0cc0,0x0840,0x0840,0x0cc0, 0x0780,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25cb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0780,0x0fc0,0x0fc0,0x0fc0,0x0fc0, 0x0780,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25cf 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xf87c,0xf03c,0xf03c,0xf03c,0xf03c, 0xf87c,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, // u25d8 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xf87c,0xf33c,0xf7bc,0xf7bc,0xf33c, 0xf87c,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, // u25d9 0x0000,0x0000,0x0000,0x0000,0x3fe0,0x6030,0xc018,0xc018,0xc018,0xddd8,0xddd8,0xc018,0xc018,0xc018,0xc018,0xdfd8, 0xcf98,0xc018,0xc018,0xc018,0x6030,0x3fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u263a 0x0000,0x0000,0x0000,0x0000,0x3fe0,0x7ff0,0xfff8,0xfff8,0xfff8,0xc718,0xc718,0xfff8,0xfff8,0xfff8,0xfff8,0xc018, 0xe038,0xfff8,0xfff8,0xfff8,0x7ff0,0x3fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u263b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x6318,0x3330,0x1b60,0x0fc0,0x0780,0x7cf8,0x0780,0x0fc0, 0x1b60,0x3330,0x6318,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u263c 0x0000,0x0000,0x0000,0x0000,0x1fe0,0x3030,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x3030,0x1fe0,0x0300,0x0300, 0x0300,0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2640 0x0000,0x0000,0x0000,0x0000,0x03f8,0x0038,0x0078,0x00d8,0x0198,0x0318,0x0618,0x3f80,0x60c0,0xc060,0xc060,0xc060, 0xc060,0xc060,0xc060,0xc060,0x60c0,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2642 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0780,0x0fc0,0x1fe0,0x3ff0,0x3ff0,0x7ff8,0x7ff8,0x7ff8,0x7ff8,0x7ff8, 0x7b78,0x3b70,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2660 0x0000,0x0000,0x0000,0x0000,0x0780,0x0fc0,0x0fc0,0x0fc0,0x0fc0,0x0780,0x0300,0x3b70,0x7ff8,0x7ff8,0x7ff8,0x7ff8, 0x7ff8,0x3b70,0x0300,0x0300,0x0300,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2663 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x78f0,0xfdf8,0xfdf8,0xfff8,0xfff8,0xfff8,0xfff8,0x7ff0,0x7ff0, 0x3fe0,0x1fc0,0x0f80,0x0700,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2665 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0200,0x0700,0x0f80,0x1fc0,0x3fe0,0x7ff0,0xfff8,0xfff8,0x7ff0, 0x3fe0,0x1fc0,0x0f80,0x0700,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2666 0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3030,0x3030,0x3030,0x3030,0x3ff0,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0xf000,0xe000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u266a 0x0000,0x0000,0x0000,0x0000,0x7ff8,0x6018,0x6018,0x6018,0x6018,0x7ff8,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018, 0x6018,0x6018,0x6018,0x6078,0xe070,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u266b 0x0000,0x0000,0x0000,0x0000,0x000c,0x000c,0x0018,0x0018,0x0030,0x0030,0x0060,0x0060,0xc0c0,0xc0c0,0x6180,0x6180, 0x3300,0x3300,0x1e00,0x1e00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2713 0x0000,0x0000,0x0000,0x0000,0x001c,0x001c,0x0038,0x0038,0x0070,0x0070,0x00e0,0x00e0,0xc1c0,0xc1c0,0xe380,0xe380, 0x7700,0x7700,0x3e00,0x3e00,0x1c00,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2714 0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x00c0,0x60c0,0x3180,0x1980,0x0f00,0x0700,0x0700,0x0780,0x0cc0,0x0c60, 0x1830,0x1800,0x3000,0x3000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2717 0x0000,0x0000,0x0000,0x0000,0x00e0,0x00e0,0xe1c0,0x71c0,0x3b80,0x1f80,0x0f00,0x0700,0x0f80,0x0fc0,0x1ce0,0x1c70, 0x3830,0x3800,0x7000,0x7000,0xe000,0xe000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2718 0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x0180,0x0180,0x0300,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x0600,0x0600, 0x0300,0x0300,0x0180,0x0180,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u27e8 0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0600,0x0600,0x0300,0x0300,0x0180,0x0180,0x00c0,0x00c0,0x0180,0x0180, 0x0300,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u27e9 0x0000,0x0000,0x0000,0x0000,0x0630,0x0630,0x0c60,0x0c60,0x18c0,0x18c0,0x3180,0x3180,0x6300,0x6300,0x3180,0x3180, 0x18c0,0x18c0,0x0c60,0x0c60,0x0630,0x0630,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u27ea 0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x3180,0x3180,0x18c0,0x18c0,0x0c60,0x0c60,0x0630,0x0630,0x0c60,0x0c60, 0x18c0,0x18c0,0x3180,0x3180,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u27eb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2800 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2801 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2802 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2803 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2804 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2805 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2806 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2807 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2808 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2809 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280a 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280b 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280c 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280d 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280e 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2810 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2811 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2812 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2813 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2814 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2815 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2816 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2817 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2818 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2819 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281a 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281b 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281c 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281d 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281e 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2820 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2821 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2822 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2823 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2824 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2825 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2826 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2827 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2828 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2829 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282a 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282b 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282c 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282d 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282e 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2830 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2831 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2832 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2833 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2834 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2835 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2836 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2837 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2838 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2839 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283a 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283b 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283c 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283d 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283e 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2840 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2841 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2842 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2843 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2844 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2845 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2846 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2847 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2848 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2849 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u284a 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u284b 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u284c 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u284d 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u284e 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u284f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2850 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2851 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2852 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2853 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2854 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2855 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2856 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2857 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2858 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2859 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u285a 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u285b 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u285c 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u285d 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u285e 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u285f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2860 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2861 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2862 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2863 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2864 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2865 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2866 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2867 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2868 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2869 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u286a 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u286b 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u286c 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u286d 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u286e 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u286f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2870 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2871 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2872 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2873 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2874 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2875 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2876 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2877 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2878 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2879 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u287a 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u287b 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u287c 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u287d 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u287e 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u287f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2880 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2881 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2882 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2883 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2884 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2885 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2886 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2887 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2888 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2889 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u288a 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u288b 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u288c 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u288d 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u288e 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u288f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2890 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2891 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2892 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2893 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2894 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2895 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2896 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2897 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2898 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2899 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u289a 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u289b 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u289c 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u289d 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u289e 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u289f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28a0 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28a1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28a2 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28a4 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28a5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28a6 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28a7 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28a8 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28a9 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28aa 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28ab 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28ac 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28ad 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28ae 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28af 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28b0 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28b1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28b2 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28b4 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28b6 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28b7 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28b8 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28b9 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28ba 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28bb 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28bc 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28bd 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28be 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28c0 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28c2 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28c4 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28c6 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28c7 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28c8 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28c9 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28ca 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28cb 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28cc 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28cd 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28ce 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28cf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28d0 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28d2 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28d4 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28d6 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28d7 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28d8 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28d9 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28da 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28db 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28dc 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28dd 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28de 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28df 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28e0 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28e1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28e2 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28e3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28e4 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28e6 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28e7 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28e8 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28e9 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28ea 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28eb 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28ec 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28ed 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28ee 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28ef 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28f0 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28f2 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28f3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28f4 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28f6 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28f7 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28f8 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28f9 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28fa 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28fb 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28fc 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28fd 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28fe 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28ff 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000, 0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2e2c 0xc000,0xc000,0xc000,0xc180,0xc3c0,0xc7e0,0xcdb0,0xd998,0xc180,0xc180,0xc180,0xc180,0xc180,0xc300,0x8600,0x0c00, 0x1800,0x3000,0x6000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000, // ue0a0 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000,0x0000,0x0618, 0x0618,0x0718,0x0798,0x06d8,0x0678,0x0638,0x0618,0x0618,0x0618,0x0000,0x0000,0x0000, // ue0a1 0x0000,0x0000,0x0000,0x0f80,0x18c0,0x3060,0x3060,0x3060,0x3060,0x3060,0x3060,0x3060,0x7ff0,0xfff8,0xfff8,0xfff8, 0xf8f8,0xf078,0xf078,0xf078,0xf8f8,0xfff8,0xfff8,0xfff8,0xfff8,0x0000,0x0000,0x0000, // ue0a2 0x8000,0xc000,0xe000,0xf000,0xf800,0xfc00,0xfe00,0xff00,0xff80,0xffc0,0xffe0,0xfff0,0xfff8,0xfffc,0xfffc,0xfff8, 0xfff0,0xffe0,0xffc0,0xff80,0xff00,0xfe00,0xfc00,0xf800,0xf000,0xe000,0xc000,0x8000, // ue0b0 0x8000,0xc000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180,0x00c0,0x0060,0x0030,0x0018,0x000c,0x000c,0x0018, 0x0030,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0xc000,0x8000, // ue0b1 0x0004,0x000c,0x001c,0x003c,0x007c,0x00fc,0x01fc,0x03fc,0x07fc,0x0ffc,0x1ffc,0x3ffc,0x7ffc,0xfffc,0xfffc,0x7ffc, 0x3ffc,0x1ffc,0x0ffc,0x07fc,0x03fc,0x01fc,0x00fc,0x007c,0x003c,0x001c,0x000c,0x0004, // ue0b2 0x0004,0x000c,0x0018,0x0030,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0xc000,0xc000,0x6000, 0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180,0x00c0,0x0060,0x0030,0x0018,0x000c,0x0004, // ue0b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01e0,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060, 0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x3060,0x3060,0x3060,0x18c0,0x0f80,0x0000, // uf6be 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 // ufffd }; // codepoints array constexpr std::array fixedfont_codepoints = { 0x0000,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e, 0x002f,0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e, 0x003f,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e, 0x004f,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e, 0x005f,0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e, 0x006f,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e, 0x00a0,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af, 0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf, 0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf, 0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df, 0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef, 0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff, 0x0100,0x0101,0x0102,0x0103,0x0104,0x0105,0x0106,0x0107,0x0108,0x0109,0x010a,0x010b,0x010c,0x010d,0x010e,0x010f, 0x0110,0x0111,0x0112,0x0113,0x0114,0x0115,0x0116,0x0117,0x0118,0x0119,0x011a,0x011b,0x011c,0x011d,0x011e,0x011f, 0x0120,0x0121,0x0122,0x0123,0x0124,0x0125,0x0126,0x0127,0x0128,0x0129,0x012a,0x012b,0x012c,0x012d,0x012e,0x012f, 0x0130,0x0131,0x0132,0x0133,0x0134,0x0135,0x0136,0x0137,0x0138,0x0139,0x013a,0x013b,0x013c,0x013d,0x013e,0x013f, 0x0140,0x0141,0x0142,0x0143,0x0144,0x0145,0x0146,0x0147,0x0148,0x0149,0x014a,0x014b,0x014c,0x014d,0x014e,0x014f, 0x0150,0x0151,0x0152,0x0153,0x0154,0x0155,0x0156,0x0157,0x0158,0x0159,0x015a,0x015b,0x015c,0x015d,0x015e,0x015f, 0x0160,0x0161,0x0162,0x0163,0x0164,0x0165,0x0166,0x0167,0x0168,0x0169,0x016a,0x016b,0x016c,0x016d,0x016e,0x016f, 0x0170,0x0171,0x0172,0x0173,0x0174,0x0175,0x0176,0x0177,0x0178,0x0179,0x017a,0x017b,0x017c,0x017d,0x017e,0x017f, 0x0186,0x018e,0x018f,0x0190,0x0192,0x019d,0x019e,0x01b5,0x01b6,0x01b7,0x01cd,0x01ce,0x01cf,0x01d0,0x01d1,0x01d2, 0x01d3,0x01d4,0x01e2,0x01e3,0x01e4,0x01e5,0x01e6,0x01e7,0x01e8,0x01e9,0x01ea,0x01eb,0x01ec,0x01ed,0x01ee,0x01ef, 0x01f0,0x01f4,0x01f5,0x01fc,0x01fd,0x01fe,0x01ff,0x0218,0x0219,0x021a,0x021b,0x0232,0x0233,0x0237,0x0254,0x0258, 0x0259,0x025b,0x0272,0x0292,0x02bb,0x02bc,0x02bd,0x02c6,0x02c7,0x02d8,0x02d9,0x02db,0x02dc,0x02dd,0x0300,0x0301, 0x0302,0x0303,0x0304,0x0305,0x0306,0x0307,0x0308,0x030a,0x030b,0x030c,0x0329,0x0384,0x0385,0x0386,0x0387,0x0388, 0x0389,0x038a,0x038c,0x038e,0x038f,0x0390,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039a, 0x039b,0x039c,0x039d,0x039e,0x039f,0x03a0,0x03a1,0x03a3,0x03a4,0x03a5,0x03a6,0x03a7,0x03a8,0x03a9,0x03aa,0x03ab, 0x03ac,0x03ad,0x03ae,0x03af,0x03b0,0x03b1,0x03b2,0x03b3,0x03b4,0x03b5,0x03b6,0x03b7,0x03b8,0x03b9,0x03ba,0x03bb, 0x03bc,0x03bd,0x03be,0x03bf,0x03c0,0x03c1,0x03c2,0x03c3,0x03c4,0x03c5,0x03c6,0x03c7,0x03c8,0x03c9,0x03ca,0x03cb, 0x03cc,0x03cd,0x03ce,0x03d1,0x03d5,0x03f0,0x03f1,0x03f2,0x03f3,0x03f4,0x03f5,0x03f6,0x0400,0x0401,0x0402,0x0403, 0x0404,0x0405,0x0406,0x0407,0x0408,0x0409,0x040a,0x040b,0x040c,0x040d,0x040e,0x040f,0x0410,0x0411,0x0412,0x0413, 0x0414,0x0415,0x0416,0x0417,0x0418,0x0419,0x041a,0x041b,0x041c,0x041d,0x041e,0x041f,0x0420,0x0421,0x0422,0x0423, 0x0424,0x0425,0x0426,0x0427,0x0428,0x0429,0x042a,0x042b,0x042c,0x042d,0x042e,0x042f,0x0430,0x0431,0x0432,0x0433, 0x0434,0x0435,0x0436,0x0437,0x0438,0x0439,0x043a,0x043b,0x043c,0x043d,0x043e,0x043f,0x0440,0x0441,0x0442,0x0443, 0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,0x044a,0x044b,0x044c,0x044d,0x044e,0x044f,0x0450,0x0451,0x0452,0x0453, 0x0454,0x0455,0x0456,0x0457,0x0458,0x0459,0x045a,0x045b,0x045c,0x045d,0x045e,0x045f,0x0462,0x0463,0x046a,0x046b, 0x0490,0x0491,0x0492,0x0493,0x0494,0x0495,0x0496,0x0497,0x0498,0x0499,0x049a,0x049b,0x049c,0x049d,0x04a0,0x04a1, 0x04a2,0x04a3,0x04a4,0x04a5,0x04aa,0x04ab,0x04ae,0x04af,0x04b0,0x04b1,0x04b2,0x04b3,0x04b6,0x04b7,0x04b8,0x04b9, 0x04ba,0x04bb,0x04c0,0x04c1,0x04c2,0x04cf,0x04d0,0x04d1,0x04d2,0x04d3,0x04d4,0x04d5,0x04d6,0x04d7,0x04d8,0x04d9, 0x04da,0x04db,0x04dc,0x04dd,0x04de,0x04df,0x04e2,0x04e3,0x04e4,0x04e5,0x04e6,0x04e7,0x04e8,0x04e9,0x04ea,0x04eb, 0x04ec,0x04ed,0x04ee,0x04ef,0x04f0,0x04f1,0x04f2,0x04f3,0x04f4,0x04f5,0x04f8,0x04f9,0x05d0,0x05d1,0x05d2,0x05d3, 0x05d4,0x05d5,0x05d6,0x05d7,0x05d8,0x05d9,0x05da,0x05db,0x05dc,0x05dd,0x05de,0x05df,0x05e0,0x05e1,0x05e2,0x05e3, 0x05e4,0x05e5,0x05e6,0x05e7,0x05e8,0x05e9,0x05ea,0x1e0c,0x1e0d,0x1e34,0x1e35,0x1e36,0x1e37,0x1e40,0x1e41,0x1e42, 0x1e43,0x1e44,0x1e45,0x1e46,0x1e47,0x1e6c,0x1e6d,0x1eb8,0x1eb9,0x1ebc,0x1ebd,0x1eca,0x1ecb,0x1ecc,0x1ecd,0x1ee4, 0x1ee5,0x1ef8,0x1ef9,0x2000,0x2001,0x2002,0x2003,0x2004,0x2005,0x2006,0x2007,0x2008,0x2009,0x200a,0x200b,0x200c, 0x200d,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x2015,0x2016,0x2017,0x2018,0x2019,0x201a,0x201b,0x201c, 0x201d,0x201e,0x201f,0x2020,0x2021,0x2022,0x2026,0x2030,0x2032,0x2033,0x2039,0x203a,0x203c,0x203e,0x2070,0x2071, 0x2074,0x2075,0x2076,0x2077,0x2078,0x2079,0x207a,0x207b,0x207c,0x207d,0x207e,0x207f,0x2080,0x2081,0x2082,0x2083, 0x2084,0x2085,0x2086,0x2087,0x2088,0x2089,0x208a,0x208b,0x208c,0x208d,0x208e,0x2090,0x2091,0x2092,0x2093,0x2094, 0x2095,0x2096,0x2097,0x2098,0x209a,0x20a7,0x20aa,0x20ac,0x20ae,0x2102,0x210e,0x210f,0x2115,0x2116,0x211a,0x211d, 0x2122,0x2124,0x2126,0x2135,0x2190,0x2191,0x2192,0x2193,0x2194,0x2195,0x21a4,0x21a6,0x21a8,0x21b5,0x21bb,0x21cb, 0x21cc,0x21d0,0x21d1,0x21d2,0x21d3,0x21d4,0x21d5,0x2200,0x2203,0x2204,0x2205,0x2206,0x2207,0x2208,0x2209,0x220a, 0x220b,0x220c,0x220d,0x2212,0x2213,0x2214,0x2215,0x2216,0x2219,0x221a,0x221e,0x221f,0x2225,0x2227,0x2228,0x2229, 0x222a,0x2248,0x2260,0x2261,0x2264,0x2265,0x226a,0x226b,0x2282,0x2283,0x2286,0x2287,0x22a5,0x22c2,0x22c3,0x2300, 0x2302,0x2308,0x2309,0x230a,0x230b,0x2310,0x2319,0x2320,0x2321,0x239b,0x239c,0x239d,0x239e,0x239f,0x23a0,0x23a1, 0x23a2,0x23a3,0x23a4,0x23a5,0x23a6,0x23a7,0x23a8,0x23a9,0x23ab,0x23ac,0x23ad,0x23ae,0x23af,0x23ba,0x23bb,0x23bc, 0x23bd,0x23d0,0x2409,0x240a,0x240b,0x240c,0x240d,0x2424,0x2500,0x2501,0x2502,0x2503,0x2508,0x2509,0x250a,0x250b, 0x250c,0x250d,0x250e,0x250f,0x2510,0x2511,0x2512,0x2513,0x2514,0x2515,0x2516,0x2517,0x2518,0x2519,0x251a,0x251b, 0x251c,0x251d,0x251e,0x251f,0x2520,0x2521,0x2522,0x2523,0x2524,0x2525,0x2526,0x2527,0x2528,0x2529,0x252a,0x252b, 0x252c,0x252d,0x252e,0x252f,0x2530,0x2531,0x2532,0x2533,0x2534,0x2535,0x2536,0x2537,0x2538,0x2539,0x253a,0x253b, 0x253c,0x253d,0x253e,0x253f,0x2540,0x2541,0x2542,0x2543,0x2544,0x2545,0x2546,0x2547,0x2548,0x2549,0x254a,0x254b, 0x2550,0x2551,0x2552,0x2553,0x2554,0x2555,0x2556,0x2557,0x2558,0x2559,0x255a,0x255b,0x255c,0x255d,0x255e,0x255f, 0x2560,0x2561,0x2562,0x2563,0x2564,0x2565,0x2566,0x2567,0x2568,0x2569,0x256a,0x256b,0x256c,0x256d,0x256e,0x256f, 0x2570,0x2571,0x2572,0x2573,0x2574,0x2575,0x2576,0x2577,0x2578,0x2579,0x257a,0x257b,0x257c,0x257d,0x257e,0x257f, 0x2580,0x2581,0x2582,0x2583,0x2584,0x2585,0x2586,0x2587,0x2588,0x2589,0x258a,0x258b,0x258c,0x258d,0x258e,0x258f, 0x2590,0x2591,0x2592,0x2593,0x2596,0x2597,0x2598,0x2599,0x259a,0x259b,0x259c,0x259d,0x259e,0x259f,0x25a0,0x25ac, 0x25ae,0x25b2,0x25b6,0x25ba,0x25bc,0x25c0,0x25c4,0x25c6,0x25ca,0x25cb,0x25cf,0x25d8,0x25d9,0x263a,0x263b,0x263c, 0x2640,0x2642,0x2660,0x2663,0x2665,0x2666,0x266a,0x266b,0x2713,0x2714,0x2717,0x2718,0x27e8,0x27e9,0x27ea,0x27eb, 0x2800,0x2801,0x2802,0x2803,0x2804,0x2805,0x2806,0x2807,0x2808,0x2809,0x280a,0x280b,0x280c,0x280d,0x280e,0x280f, 0x2810,0x2811,0x2812,0x2813,0x2814,0x2815,0x2816,0x2817,0x2818,0x2819,0x281a,0x281b,0x281c,0x281d,0x281e,0x281f, 0x2820,0x2821,0x2822,0x2823,0x2824,0x2825,0x2826,0x2827,0x2828,0x2829,0x282a,0x282b,0x282c,0x282d,0x282e,0x282f, 0x2830,0x2831,0x2832,0x2833,0x2834,0x2835,0x2836,0x2837,0x2838,0x2839,0x283a,0x283b,0x283c,0x283d,0x283e,0x283f, 0x2840,0x2841,0x2842,0x2843,0x2844,0x2845,0x2846,0x2847,0x2848,0x2849,0x284a,0x284b,0x284c,0x284d,0x284e,0x284f, 0x2850,0x2851,0x2852,0x2853,0x2854,0x2855,0x2856,0x2857,0x2858,0x2859,0x285a,0x285b,0x285c,0x285d,0x285e,0x285f, 0x2860,0x2861,0x2862,0x2863,0x2864,0x2865,0x2866,0x2867,0x2868,0x2869,0x286a,0x286b,0x286c,0x286d,0x286e,0x286f, 0x2870,0x2871,0x2872,0x2873,0x2874,0x2875,0x2876,0x2877,0x2878,0x2879,0x287a,0x287b,0x287c,0x287d,0x287e,0x287f, 0x2880,0x2881,0x2882,0x2883,0x2884,0x2885,0x2886,0x2887,0x2888,0x2889,0x288a,0x288b,0x288c,0x288d,0x288e,0x288f, 0x2890,0x2891,0x2892,0x2893,0x2894,0x2895,0x2896,0x2897,0x2898,0x2899,0x289a,0x289b,0x289c,0x289d,0x289e,0x289f, 0x28a0,0x28a1,0x28a2,0x28a3,0x28a4,0x28a5,0x28a6,0x28a7,0x28a8,0x28a9,0x28aa,0x28ab,0x28ac,0x28ad,0x28ae,0x28af, 0x28b0,0x28b1,0x28b2,0x28b3,0x28b4,0x28b5,0x28b6,0x28b7,0x28b8,0x28b9,0x28ba,0x28bb,0x28bc,0x28bd,0x28be,0x28bf, 0x28c0,0x28c1,0x28c2,0x28c3,0x28c4,0x28c5,0x28c6,0x28c7,0x28c8,0x28c9,0x28ca,0x28cb,0x28cc,0x28cd,0x28ce,0x28cf, 0x28d0,0x28d1,0x28d2,0x28d3,0x28d4,0x28d5,0x28d6,0x28d7,0x28d8,0x28d9,0x28da,0x28db,0x28dc,0x28dd,0x28de,0x28df, 0x28e0,0x28e1,0x28e2,0x28e3,0x28e4,0x28e5,0x28e6,0x28e7,0x28e8,0x28e9,0x28ea,0x28eb,0x28ec,0x28ed,0x28ee,0x28ef, 0x28f0,0x28f1,0x28f2,0x28f3,0x28f4,0x28f5,0x28f6,0x28f7,0x28f8,0x28f9,0x28fa,0x28fb,0x28fc,0x28fd,0x28fe,0x28ff, 0x2e2c,0xe0a0,0xe0a1,0xe0a2,0xe0b0,0xe0b1,0xe0b2,0xe0b3,0xf6be,0xfffd }; } // namespace // -- end of autogenerated text --- namespace fixed_font_28b { // -- start of autogenerated text --- // definition section for font: ter-u28b.bdf constexpr int CHARCOUNT = 1354; constexpr int WIDTH = 14; constexpr int HEIGHT = 28; constexpr int OFFSET_X = 0; constexpr int OFFSET_Y = 0; constexpr FixedFont_info_t fixedfont_info = { "Terminus", // font name "ter-u28b.bdf", // font name internal CHARCOUNT, // num of chars WIDTH, HEIGHT, OFFSET_X, OFFSET_Y, true // bold }; // font bitmap definitions constexpr std::array fixedfont_bitmap = { 0x0000,0x0000,0x0000,0x0000,0x78f0,0x78f0,0x6030,0x6030,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x0000, 0x0000,0x0000,0x6030,0x6030,0x78f0,0x78f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0020 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0021 0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0022 0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x18c0,0x7ff0,0x7ff0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0, 0x7ff0,0x7ff0,0x18c0,0x18c0,0x18c0,0x18c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0023 0x0000,0x0000,0x0300,0x0300,0x0300,0x1fe0,0x3ff0,0x7338,0x6318,0x6300,0x6300,0x7300,0x3fe0,0x1ff0,0x0338,0x0318, 0x0318,0x6318,0x7338,0x3ff0,0x1fe0,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000, // u0024 0x0000,0x0000,0x0000,0x0000,0x3c30,0x7e30,0x6660,0x7e60,0x3cc0,0x00c0,0x0180,0x0180,0x0300,0x0300,0x0600,0x0600, 0x0c00,0x0cf0,0x19f8,0x1998,0x31f8,0x30f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0025 0x0000,0x0000,0x0000,0x0000,0x0f00,0x1f80,0x39c0,0x30c0,0x30c0,0x39c0,0x1f80,0x0f00,0x0e00,0x1f18,0x3bb8,0x71f0, 0x60e0,0x60e0,0x60e0,0x71f0,0x3fb8,0x1f18,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0026 0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0027 0x0000,0x0000,0x0000,0x0000,0x0180,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0600,0x0600,0x0300,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0028 0x0000,0x0000,0x0000,0x0000,0x0c00,0x0600,0x0300,0x0300,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0300,0x0300,0x0600,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0029 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x38e0,0x1dc0,0x0f80,0x0700,0x7ff0,0x7ff0,0x0700,0x0f80, 0x1dc0,0x38e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x7ff8,0x7ff8,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0600,0x0c00,0x0000,0x0000,0x0000,0x0000, // u002c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002e 0x0000,0x0000,0x0000,0x0000,0x0030,0x0030,0x0060,0x0060,0x00c0,0x00c0,0x0180,0x0180,0x0300,0x0300,0x0600,0x0600, 0x0c00,0x0c00,0x1800,0x1800,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002f 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6070,0x60f0,0x61f0,0x63b0,0x6730,0x6e30,0x7c30,0x7830, 0x7030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0030 0x0000,0x0000,0x0000,0x0000,0x0300,0x0700,0x0f00,0x1f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x1fe0,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0031 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x0030,0x0070,0x00e0,0x01c0,0x0380,0x0700, 0x0e00,0x1c00,0x3800,0x7000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0032 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x0030,0x0030,0x0030,0x0070,0x0fe0,0x0fe0,0x0070,0x0030, 0x0030,0x0030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0033 0x0000,0x0000,0x0000,0x0000,0x0030,0x0070,0x00f0,0x01f0,0x03b0,0x0730,0x0e30,0x1c30,0x3830,0x7030,0x6030,0x6030, 0x7ff0,0x7ff0,0x0030,0x0030,0x0030,0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0034 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x7fe0,0x0070,0x0030,0x0030, 0x0030,0x0030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0035 0x0000,0x0000,0x0000,0x0000,0x1fe0,0x3fe0,0x7000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0036 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x6030,0x6030,0x6030,0x0060,0x0060,0x00c0,0x00c0,0x0180,0x0180,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0037 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x7070,0x3fe0,0x3fe0,0x7070,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0038 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030, 0x0030,0x0030,0x0030,0x0070,0x3fe0,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0039 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0600,0x0c00,0x0000,0x0000,0x0000,0x0000, // u003b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800,0x7000,0x3800,0x1c00, 0x0e00,0x0700,0x0380,0x01c0,0x00e0,0x0070,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x7ff0, 0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003d 0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x3800,0x1c00,0x0e00,0x0700,0x0380,0x01c0,0x00e0,0x0070,0x00e0,0x01c0, 0x0380,0x0700,0x0e00,0x1c00,0x3800,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003e 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x0070,0x00e0,0x01c0,0x0380,0x0300,0x0300, 0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003f 0x0000,0x0000,0x0000,0x0000,0x1fe0,0x3ff0,0x7038,0x6018,0x61f8,0x63f8,0x6718,0x6618,0x6618,0x6618,0x6618,0x6718, 0x63f8,0x61e8,0x6000,0x7000,0x3ff8,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0040 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x7ff0,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0041 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6060,0x7fc0,0x7fc0,0x6060,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6070,0x7fe0,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0042 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0043 0x0000,0x0000,0x0000,0x0000,0x7f00,0x7fc0,0x60e0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6060,0x60e0,0x7fc0,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0044 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x7f80,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0045 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x7f80,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0046 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6000,0x6000,0x6000,0x63f0,0x63f0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0047 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0048 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0049 0x0000,0x0000,0x0000,0x0000,0x01f8,0x01f8,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060, 0x6060,0x6060,0x6060,0x70e0,0x3fc0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u004a 0x0000,0x0000,0x0000,0x0000,0x6030,0x6070,0x60e0,0x61c0,0x6380,0x6700,0x6e00,0x7c00,0x7800,0x7800,0x7c00,0x6e00, 0x6700,0x6380,0x61c0,0x60e0,0x6070,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u004b 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u004c 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x7038,0x7878,0x7cf8,0x6fd8,0x6798,0x6318,0x6018,0x6018,0x6018,0x6018, 0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u004d 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x7030,0x7830,0x7c30,0x6e30,0x6730,0x63b0,0x61f0,0x60f0, 0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u004e 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u004f 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6070,0x7fe0,0x7fc0,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0050 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x63b0,0x71f0,0x3fe0,0x1fe0,0x0070,0x0038,0x0000,0x0000,0x0000,0x0000, // u0051 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6070,0x7fe0,0x7fc0,0x7c00, 0x6e00,0x6700,0x6380,0x61c0,0x60e0,0x6070,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0052 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6000,0x6000,0x6000,0x7000,0x3fc0,0x1fe0,0x0070,0x0030, 0x0030,0x0030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0053 0x0000,0x0000,0x0000,0x0000,0x7ff8,0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0054 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0055 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x3060,0x3060,0x3060,0x3060,0x18c0,0x18c0,0x18c0,0x18c0, 0x0d80,0x0d80,0x0d80,0x0700,0x0700,0x0700,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0056 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6318,0x6798, 0x6fd8,0x7cf8,0x7878,0x7038,0x6018,0x6018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0057 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x3060,0x3060,0x18c0,0x18c0,0x0d80,0x0d80,0x0700,0x0700,0x0d80,0x0d80, 0x18c0,0x18c0,0x3060,0x3060,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0058 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860,0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0059 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x0030,0x0030,0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800, 0x7000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005a 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005b 0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x1800,0x1800,0x0c00,0x0c00,0x0600,0x0600,0x0300,0x0300,0x0180,0x0180, 0x00c0,0x00c0,0x0060,0x0060,0x0030,0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005c 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0fc0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x00c0,0x00c0,0x00c0,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005d 0x0000,0x0000,0x0200,0x0700,0x0f80,0x1dc0,0x38e0,0x7070,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000, // u005f 0x1c00,0x0e00,0x0700,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0060 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x1fe0,0x0070,0x0030,0x1ff0,0x3ff0,0x7030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0061 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6070,0x7fe0,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0062 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0063 0x0000,0x0000,0x0000,0x0000,0x0030,0x0030,0x0030,0x0030,0x0030,0x1ff0,0x3ff0,0x7030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0064 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x7ff0,0x7ff0, 0x6000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0065 0x0000,0x0000,0x0000,0x0000,0x03f0,0x07f0,0x0600,0x0600,0x0600,0x3fc0,0x3fc0,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0066 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff0,0x7030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030,0x0030,0x0070,0x3fe0,0x3fc0,0x0000, // u0067 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0068 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000,0x0f00,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0069 0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0000,0x0000,0x01e0,0x01e0,0x0060,0x0060,0x0060,0x0060,0x0060, 0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x3060,0x3060,0x38e0,0x1fc0,0x0f80,0x0000, // u006a 0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3070,0x30e0,0x31c0,0x3380,0x3700,0x3e00,0x3c00, 0x3e00,0x3700,0x3380,0x31c0,0x30e0,0x3070,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u006b 0x0000,0x0000,0x0000,0x0000,0x0f00,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u006c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x7ff0,0x6338,0x6318,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u006d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u006e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u006f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6070,0x7fe0,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, // u0070 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff0,0x7030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030,0x0030,0x0030,0x0030,0x0030,0x0000, // u0071 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x67f0,0x6ff0,0x7c00,0x7800,0x7000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0072 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6000,0x7000,0x3fc0,0x1fe0, 0x0070,0x0030,0x0030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0073 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x0600,0x3fc0,0x3fc0,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x07e0,0x03e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0074 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0075 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x3060,0x3060,0x3060,0x18c0, 0x18c0,0x18c0,0x0d80,0x0d80,0x0700,0x0700,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0076 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x6018,0x6018,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x7338,0x3ff0,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0077 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x7070,0x38e0,0x1dc0,0x0f80,0x0700, 0x0f80,0x1dc0,0x38e0,0x7070,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0078 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030,0x0030,0x0070,0x3fe0,0x3fc0,0x0000, // u0079 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x0070,0x00e0,0x01c0,0x0380,0x0700, 0x0e00,0x1c00,0x3800,0x7000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007a 0x0000,0x0000,0x0000,0x0000,0x01c0,0x03c0,0x0700,0x0600,0x0600,0x0600,0x0600,0x0600,0x1c00,0x1c00,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0700,0x03c0,0x01c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007b 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007c 0x0000,0x0000,0x0000,0x0000,0x1c00,0x1e00,0x0700,0x0300,0x0300,0x0300,0x0300,0x0300,0x01c0,0x01c0,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0700,0x1e00,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007d 0x0000,0x0000,0x3c30,0x7e30,0x6730,0x63f0,0x61e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a0 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0fc0,0x1fe0,0x3330,0x3300,0x3300,0x3300,0x3300, 0x3300,0x3300,0x3300,0x3330,0x1fe0,0x0fc0,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000, // u00a2 0x0000,0x0000,0x0000,0x0000,0x0780,0x0fc0,0x1c60,0x1860,0x1800,0x1800,0x1800,0x1800,0x3f80,0x3f80,0x1800,0x1800, 0x1800,0x1800,0x1830,0x1830,0x3ff0,0x3ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6018,0x7038,0x3ff0,0x1fe0,0x3870,0x3030,0x3030,0x3030,0x3870, 0x1fe0,0x3ff0,0x7038,0x6018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a4 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860,0x0cc0,0x0cc0,0x0780,0x0300,0x3ff0,0x3ff0, 0x0300,0x0300,0x3ff0,0x3ff0,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a5 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a6 0x0000,0x0000,0x0000,0x0780,0x0fc0,0x1ce0,0x1800,0x1c00,0x0f00,0x0f80,0x19c0,0x18e0,0x1860,0x1860,0x1c60,0x0e60, 0x07c0,0x03c0,0x00e0,0x0060,0x1ce0,0x0fc0,0x0780,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a7 0x18c0,0x18c0,0x18c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fe0,0x7ff0,0xe038,0xcf98,0xdfd8,0xd8d8,0xd818,0xd818,0xd8d8, 0xdfd8,0xcf98,0xe038,0x7ff0,0x3fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a9 0x0000,0x1fc0,0x1fe0,0x0070,0x0ff0,0x1ff0,0x3830,0x3030,0x3830,0x1ff0,0x0ff0,0x0000,0x3ff0,0x3ff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x039c,0x0738,0x0e70,0x1ce0,0x39c0,0x7380,0xe700, 0x7380,0x39c0,0x1ce0,0x0e70,0x0738,0x039c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ab 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x0030,0x0030,0x0030,0x0030, 0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ac 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ad 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fe0,0x7ff0,0xe038,0xdf98,0xdfd8,0xd8d8,0xd8d8,0xdf98,0xdf18, 0xd998,0xd8d8,0xe038,0x7ff0,0x3fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ae 0x1fc0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00af 0x0000,0x0000,0x0f80,0x1fc0,0x18c0,0x18c0,0x18c0,0x1fc0,0x0f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x7ff8,0x7ff8,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0000,0x0000,0x7ff8,0x7ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b1 0x0000,0x0000,0x0f80,0x1fc0,0x18c0,0x00c0,0x01c0,0x0380,0x0700,0x0e00,0x1fc0,0x1fc0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b2 0x0000,0x0000,0x0f80,0x1fc0,0x00c0,0x00c0,0x0780,0x07c0,0x00c0,0x00c0,0x1fc0,0x0f80,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b3 0x01c0,0x0380,0x0700,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6070,0x60f0,0x61f0,0x7fb0,0x7f30,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, // u00b5 0x0000,0x0000,0x0000,0x0000,0x3ff8,0x7ff8,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x7f18,0x3f18,0x0318, 0x0318,0x0318,0x0318,0x0318,0x0318,0x0318,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0c00,0x1800,0x0000, // u00b8 0x0000,0x0000,0x0300,0x0700,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b9 0x0000,0x0fc0,0x1fe0,0x3870,0x3030,0x3030,0x3030,0x3030,0x3870,0x1fe0,0x0fc0,0x0000,0x3ff0,0x3ff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xe700,0x7380,0x39c0,0x1ce0,0x0e70,0x0738,0x039c, 0x0738,0x0e70,0x1ce0,0x39c0,0x7380,0xe700,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00bb 0x0000,0x0000,0x0000,0x0000,0x1800,0x3800,0x7800,0x1818,0x1838,0x1870,0x18e0,0x19c0,0x0380,0x0730,0x0e70,0x1cf0, 0x39b0,0x7330,0x67f0,0x07f0,0x0030,0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00bc 0x0000,0x0000,0x0000,0x0000,0x1800,0x3800,0x7818,0x1838,0x1870,0x18e0,0x19c0,0x1b80,0x0700,0x0e00,0x1df0,0x3bf8, 0x7318,0x6030,0x0060,0x00c0,0x01f8,0x03f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00bd 0x0000,0x0000,0x0000,0x0000,0x3e00,0x7f00,0x0300,0x1e00,0x1f18,0x0338,0x7f70,0x3ee0,0x01c0,0x0398,0x0738,0x0e78, 0x1cd8,0x3998,0x73f8,0x63f8,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00be 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x0000,0x0000,0x0600,0x0600,0x0600,0x0c00,0x1800,0x3000, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00bf 0x1c00,0x0e00,0x0700,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x7ff0,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c0 0x01c0,0x0380,0x0700,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x7ff0,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c1 0x0700,0x0f80,0x1dc0,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x7ff0,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c2 0x1e60,0x3fe0,0x33c0,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x7ff0,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c3 0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x7ff0,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c4 0x0780,0x0cc0,0x0cc0,0x0780,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x7ff0,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c5 0x0000,0x0000,0x0000,0x0000,0x3ff8,0x7ff8,0xe300,0xc300,0xc300,0xc300,0xc300,0xc300,0xfff0,0xfff0,0xc300,0xc300, 0xc300,0xc300,0xc300,0xc300,0xc3f8,0xc3f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c6 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0600,0x0600,0x0600,0x0c00,0x1800,0x0000, // u00c7 0x1c00,0x0e00,0x0700,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x7f80,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c8 0x01c0,0x0380,0x0700,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x7f80,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c9 0x0700,0x0f80,0x1dc0,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x7f80,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ca 0x18c0,0x18c0,0x18c0,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x7f80,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cb 0x0e00,0x0700,0x0380,0x0000,0x0fc0,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cc 0x01c0,0x0380,0x0700,0x0000,0x0fc0,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cd 0x0700,0x0f80,0x1dc0,0x0000,0x0fc0,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ce 0x18c0,0x18c0,0x18c0,0x0000,0x0fc0,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cf 0x0000,0x0000,0x0000,0x0000,0x7f00,0x7fc0,0x60e0,0x6060,0x6030,0x6030,0x6030,0x6030,0xfe30,0xfe30,0x6030,0x6030, 0x6030,0x6030,0x6060,0x60e0,0x7fc0,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d0 0x1e60,0x3fe0,0x33c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x7030,0x7830,0x7c30,0x6e30,0x6730,0x63b0,0x61f0,0x60f0, 0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d1 0x1c00,0x0e00,0x0700,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d2 0x01c0,0x0380,0x0700,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d3 0x0700,0x0f80,0x1dc0,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d4 0x1e60,0x3fe0,0x33c0,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d5 0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x7070,0x38e0,0x1dc0,0x0f80,0x0700,0x0f80,0x1dc0, 0x38e0,0x7070,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d7 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6038,0x6078,0x60f0,0x61f0,0x63b0,0x6730,0x6e30,0x7c30,0x7830, 0x7030,0xe030,0xe030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d8 0x1c00,0x0e00,0x0700,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d9 0x01c0,0x0380,0x0700,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00da 0x0700,0x0f80,0x1dc0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00db 0x18c0,0x18c0,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00dc 0x01c0,0x0380,0x0700,0x0000,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860,0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00dd 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6070, 0x7fe0,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00de 0x0000,0x0000,0x0000,0x0000,0x3f80,0x7fc0,0x60e0,0x6060,0x6060,0x6060,0x60c0,0x7fc0,0x7fe0,0x6070,0x6030,0x6030, 0x6030,0x6030,0x7030,0x7870,0x6fe0,0x67c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00df 0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0e00,0x0700,0x0000,0x1fc0,0x1fe0,0x0070,0x0030,0x1ff0,0x3ff0,0x7030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e0 0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x0380,0x0700,0x0000,0x1fc0,0x1fe0,0x0070,0x0030,0x1ff0,0x3ff0,0x7030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0f80,0x1dc0,0x0000,0x1fc0,0x1fe0,0x0070,0x0030,0x1ff0,0x3ff0,0x7030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e2 0x0000,0x0000,0x0000,0x0000,0x0000,0x1e60,0x3fe0,0x33c0,0x0000,0x1fc0,0x1fe0,0x0070,0x0030,0x1ff0,0x3ff0,0x7030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e3 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x1fe0,0x0070,0x0030,0x1ff0,0x3ff0,0x7030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0780,0x0cc0,0x0cc0,0x0780,0x1fc0,0x1fe0,0x0070,0x0030,0x1ff0,0x3ff0,0x7030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7de0,0x7ff0,0x0738,0x0318,0x3f18,0x7ff8,0xe3f8, 0xc300,0xc300,0xc300,0xe398,0x7ff8,0x3ef0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0600,0x0600,0x0600,0x0c00,0x1800,0x0000, // u00e7 0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0e00,0x0700,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x7ff0,0x7ff0, 0x6000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e8 0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x0380,0x0700,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x7ff0,0x7ff0, 0x6000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0f80,0x1dc0,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x7ff0,0x7ff0, 0x6000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ea 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x7ff0,0x7ff0, 0x6000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00eb 0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0e00,0x0700,0x0000,0x0f00,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ec 0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x0380,0x0700,0x0000,0x0f00,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ed 0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0f80,0x1dc0,0x0000,0x0f00,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ee 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x0f00,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ef 0x0000,0x0000,0x0000,0x0000,0x3980,0x1f00,0x1e00,0x3700,0x0380,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f0 0x0000,0x0000,0x0000,0x0000,0x0000,0x3c60,0x7fe0,0x63c0,0x0000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0e00,0x0700,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f2 0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x0380,0x0700,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0f80,0x1dc0,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f4 0x0000,0x0000,0x0000,0x0000,0x0000,0x1e60,0x3fe0,0x33c0,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x7ff8,0x7ff8,0x0000,0x0000, 0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fd8,0x3ff8,0x6070,0x60f0,0x61f0,0x63b0,0x6730, 0x6e30,0x7c30,0x7830,0x7030,0xffe0,0xdfc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f8 0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0e00,0x0700,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f9 0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x0380,0x0700,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00fa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0f80,0x1dc0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00fb 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00fc 0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x0380,0x0700,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030,0x0030,0x0070,0x3fe0,0x3fc0,0x0000, // u00fd 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6070,0x7fe0,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, // u00fe 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030,0x0030,0x0070,0x3fe0,0x3fc0,0x0000, // u00ff 0x1fc0,0x1fc0,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x7ff0,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0100 0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x1fc0,0x0000,0x0000,0x1fc0,0x1fe0,0x0070,0x0030,0x1ff0,0x3ff0,0x7030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0101 0x18c0,0x1fc0,0x0f80,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x7ff0,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0102 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x1fc0,0x0f80,0x0000,0x1fc0,0x1fe0,0x0070,0x0030,0x1ff0,0x3ff0,0x7030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0103 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x7ff0,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0060,0x00c0,0x00c0,0x00f8,0x0078,0x0000, // u0104 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x1fe0,0x0070,0x0030,0x1ff0,0x3ff0,0x7030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0060,0x00c0,0x00c0,0x00f8,0x0078,0x0000, // u0105 0x01c0,0x0380,0x0700,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0106 0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x0380,0x0700,0x0000,0x1fc0,0x3fe0,0x7070,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0107 0x0700,0x0f80,0x1dc0,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0108 0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0f80,0x1dc0,0x0000,0x1fc0,0x3fe0,0x7070,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0109 0x0300,0x0300,0x0300,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u010a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0000,0x1fc0,0x3fe0,0x7070,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u010b 0x1dc0,0x0f80,0x0700,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u010c 0x0000,0x0000,0x0000,0x0000,0x0000,0x1dc0,0x0f80,0x0700,0x0000,0x1fc0,0x3fe0,0x7070,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u010d 0x1dc0,0x0f80,0x0700,0x0000,0x7f00,0x7fc0,0x60e0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6060,0x60e0,0x7fc0,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u010e 0x1dc0,0x0f80,0x0700,0x0000,0x0030,0x0030,0x0030,0x0030,0x0030,0x1ff0,0x3ff0,0x7030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u010f 0x0000,0x0000,0x0000,0x0000,0x7f00,0x7fc0,0x60e0,0x6060,0x6030,0x6030,0x6030,0x6030,0xfe30,0xfe30,0x6030,0x6030, 0x6030,0x6030,0x6060,0x60e0,0x7fc0,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0110 0x0000,0x0000,0x0000,0x0000,0x0030,0x07f8,0x07f8,0x0030,0x0030,0x1ff0,0x3ff0,0x7030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0111 0x1fc0,0x1fc0,0x0000,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x7f80,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0112 0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x1fc0,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x7ff0,0x7ff0, 0x6000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0113 0x18c0,0x1fc0,0x0f80,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x7f80,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0114 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x1fc0,0x0f80,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x7ff0,0x7ff0, 0x6000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0115 0x0300,0x0300,0x0300,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x7f80,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0116 0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x7ff0,0x7ff0, 0x6000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0117 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x7f80,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0060,0x00c0,0x00c0,0x00f8,0x0078,0x0000, // u0118 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x7ff0,0x7ff0, 0x6000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0380,0x0600,0x0600,0x07c0,0x03c0,0x0000, // u0119 0x1dc0,0x0f80,0x0700,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x7f80,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u011a 0x0000,0x0000,0x0000,0x0000,0x0000,0x1dc0,0x0f80,0x0700,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x7ff0,0x7ff0, 0x6000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u011b 0x0700,0x0f80,0x1dc0,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6000,0x6000,0x6000,0x63f0,0x63f0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u011c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0f80,0x1dc0,0x0000,0x1ff0,0x3ff0,0x7030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030,0x0030,0x0070,0x3fe0,0x3fc0,0x0000, // u011d 0x18c0,0x1fc0,0x0f80,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6000,0x6000,0x6000,0x63f0,0x63f0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u011e 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x1fc0,0x0f80,0x0000,0x1ff0,0x3ff0,0x7030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030,0x0030,0x0070,0x3fe0,0x3fc0,0x0000, // u011f 0x0300,0x0300,0x0300,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6000,0x6000,0x6000,0x63f0,0x63f0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0120 0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0000,0x1ff0,0x3ff0,0x7030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030,0x0030,0x0070,0x3fe0,0x3fc0,0x0000, // u0121 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6000,0x6000,0x6000,0x63f0,0x63f0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0600,0x0600,0x0600,0x0c00,0x1800, // u0122 0x0000,0x0000,0x0000,0x0000,0x0180,0x0380,0x0300,0x0300,0x0000,0x1ff0,0x3ff0,0x7030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030,0x0030,0x0070,0x3fe0,0x3fc0,0x0000, // u0123 0x0700,0x0f80,0x1dc0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0124 0x0700,0x0f80,0x1dc0,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0125 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0xfff8,0xfff8,0x6030,0x6030,0x6030,0x7ff0,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0126 0x0000,0x0000,0x0000,0x0000,0x6000,0xff00,0xff00,0x6000,0x6000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0127 0x1e60,0x3fe0,0x33c0,0x0000,0x0fc0,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0128 0x0000,0x0000,0x0000,0x0000,0x0000,0x1e60,0x3fe0,0x33c0,0x0000,0x0f00,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0129 0x1fc0,0x1fc0,0x0000,0x0000,0x0fc0,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u012a 0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x1fc0,0x0000,0x0000,0x0f00,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u012b 0x18c0,0x1fc0,0x0f80,0x0000,0x0fc0,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u012c 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x1fc0,0x0f80,0x0000,0x0f00,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u012d 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0300,0x0600,0x0600,0x07c0,0x03c0,0x0000, // u012e 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000,0x0f00,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0300,0x0600,0x0600,0x07c0,0x03c0,0x0000, // u012f 0x0300,0x0300,0x0300,0x0000,0x0fc0,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0130 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f00,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0131 0x0000,0x0000,0x0000,0x0000,0xf078,0xf078,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6630,0x6630,0x6630,0x6630,0xf7f0,0xf3e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0132 0x0000,0x0000,0x0000,0x0000,0x3018,0x3018,0x3018,0x0000,0x0000,0x7038,0x7038,0x3018,0x3018,0x3018,0x3018,0x3018, 0x3018,0x3018,0x3018,0x3018,0x7818,0x7818,0x0018,0x0318,0x0318,0x03f8,0x01f0,0x0000, // u0133 0x00e0,0x01f0,0x03b8,0x0000,0x01f8,0x01f8,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060, 0x6060,0x6060,0x6060,0x70e0,0x3fc0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0134 0x0000,0x0000,0x0000,0x0000,0x0000,0x00e0,0x01f0,0x03b8,0x0000,0x01e0,0x01e0,0x0060,0x0060,0x0060,0x0060,0x0060, 0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x3060,0x3060,0x38e0,0x1fc0,0x0f80,0x0000, // u0135 0x0000,0x0000,0x0000,0x0000,0x6030,0x6070,0x60e0,0x61c0,0x6380,0x6700,0x6e00,0x7c00,0x7800,0x7800,0x7c00,0x6e00, 0x6700,0x6380,0x61c0,0x60e0,0x6070,0x6030,0x0000,0x0600,0x0600,0x0600,0x0c00,0x1800, // u0136 0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3070,0x30e0,0x31c0,0x3380,0x3700,0x3e00,0x3c00, 0x3e00,0x3700,0x3380,0x31c0,0x30e0,0x3070,0x0000,0x0600,0x0600,0x0600,0x0c00,0x1800, // u0137 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3070,0x30e0,0x31c0,0x3380,0x3700,0x3e00,0x3c00, 0x3e00,0x3700,0x3380,0x31c0,0x30e0,0x3070,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0138 0x1c00,0x3800,0x7000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0139 0x01c0,0x0380,0x0700,0x0000,0x0f00,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u013a 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0000,0x0600,0x0600,0x0600,0x0c00,0x1800, // u013b 0x0000,0x0000,0x0000,0x0000,0x0f00,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0300,0x0300,0x0300,0x0600,0x0c00, // u013c 0x1dc0,0x0f80,0x0700,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u013d 0x1dc0,0x0f80,0x0700,0x0000,0x0f00,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u013e 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x60c0,0x60c0,0x60c0,0x60c0,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u013f 0x0000,0x0000,0x0000,0x0000,0x0f00,0x0f00,0x0300,0x0300,0x0300,0x0300,0x030c,0x030c,0x030c,0x030c,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0140 0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3300,0x3600,0x3c00,0x3800,0x3000,0x7000,0xf000, 0x3000,0x3000,0x3000,0x3000,0x3ff8,0x3ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0141 0x0000,0x0000,0x0000,0x0000,0x0f00,0x0f00,0x0300,0x0300,0x0300,0x0360,0x03c0,0x0380,0x0300,0x0700,0x0f00,0x1b00, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0142 0x01c0,0x0380,0x0700,0x0000,0x6030,0x6030,0x6030,0x6030,0x7030,0x7830,0x7c30,0x6e30,0x6730,0x63b0,0x61f0,0x60f0, 0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0143 0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x0380,0x0700,0x0000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0144 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x7030,0x7830,0x7c30,0x6e30,0x6730,0x63b0,0x61f0,0x60f0, 0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0600,0x0600,0x0600,0x0c00,0x1800, // u0145 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0600,0x0600,0x0600,0x0c00,0x1800, // u0146 0x1dc0,0x0f80,0x0700,0x0000,0x6030,0x6030,0x6030,0x6030,0x7030,0x7830,0x7c30,0x6e30,0x6730,0x63b0,0x61f0,0x60f0, 0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0147 0x0000,0x0000,0x0000,0x0000,0x0000,0x1dc0,0x0f80,0x0700,0x0000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0148 0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0xc000,0xc000,0x0000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0149 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x7030,0x7830,0x7c30,0x6e30,0x6730,0x63b0,0x61f0,0x60f0, 0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x0030,0x0030,0x0070,0x03e0,0x03c0,0x0000, // u014a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0030,0x0030,0x0070,0x03e0,0x03c0,0x0000, // u014b 0x1fc0,0x1fc0,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u014c 0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x1fc0,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u014d 0x18c0,0x1fc0,0x0f80,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u014e 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x1fc0,0x0f80,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u014f 0x0738,0x0e70,0x1ce0,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0150 0x0000,0x0000,0x0000,0x0000,0x0000,0x0738,0x0e70,0x1ce0,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0151 0x0000,0x0000,0x0000,0x0000,0x3ff8,0x7ff8,0xe300,0xc300,0xc300,0xc300,0xc300,0xc300,0xc3f0,0xc3f0,0xc300,0xc300, 0xc300,0xc300,0xc300,0xe300,0x7ff8,0x3ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0152 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fe0,0x7ff0,0xc318,0xc318,0xc318,0xc3f8,0xc3f8, 0xc300,0xc300,0xc300,0xc318,0x7ff8,0x3ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0153 0x01c0,0x0380,0x0700,0x0000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6070,0x7fe0,0x7fc0,0x7c00, 0x6e00,0x6700,0x6380,0x61c0,0x60e0,0x6070,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0154 0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x0380,0x0700,0x0000,0x67f0,0x6ff0,0x7c00,0x7800,0x7000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0155 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6070,0x7fe0,0x7fc0,0x7c00, 0x6e00,0x6700,0x6380,0x61c0,0x60e0,0x6070,0x0000,0x0600,0x0600,0x0600,0x0c00,0x1800, // u0156 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x33f8,0x37f8,0x3e00,0x3c00,0x3800,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000,0x3000,0x3000,0x3000,0x6000,0xc000, // u0157 0x1dc0,0x0f80,0x0700,0x0000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6070,0x7fe0,0x7fc0,0x7c00, 0x6e00,0x6700,0x6380,0x61c0,0x60e0,0x6070,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0158 0x0000,0x0000,0x0000,0x0000,0x0000,0x1dc0,0x0f80,0x0700,0x0000,0x67f0,0x6ff0,0x7c00,0x7800,0x7000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0159 0x01c0,0x0380,0x0700,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6000,0x6000,0x6000,0x7000,0x3fc0,0x1fe0,0x0070,0x0030, 0x0030,0x0030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u015a 0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x0380,0x0700,0x0000,0x1fc0,0x3fe0,0x7070,0x6000,0x7000,0x3fc0,0x1fe0, 0x0070,0x0030,0x0030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u015b 0x0700,0x0f80,0x1dc0,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6000,0x6000,0x6000,0x7000,0x3fc0,0x1fe0,0x0070,0x0030, 0x0030,0x0030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u015c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0f80,0x1dc0,0x0000,0x1fc0,0x3fe0,0x7070,0x6000,0x7000,0x3fc0,0x1fe0, 0x0070,0x0030,0x0030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u015d 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6000,0x6000,0x6000,0x7000,0x3fc0,0x1fe0,0x0070,0x0030, 0x0030,0x0030,0x6030,0x7070,0x3fe0,0x1fc0,0x0600,0x0600,0x0600,0x0c00,0x1800,0x0000, // u015e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6000,0x7000,0x3fc0,0x1fe0, 0x0070,0x0030,0x0030,0x7070,0x3fe0,0x1fc0,0x0600,0x0600,0x0600,0x0c00,0x1800,0x0000, // u015f 0x1dc0,0x0f80,0x0700,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6000,0x6000,0x6000,0x7000,0x3fc0,0x1fe0,0x0070,0x0030, 0x0030,0x0030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0160 0x0000,0x0000,0x0000,0x0000,0x0000,0x1dc0,0x0f80,0x0700,0x0000,0x1fc0,0x3fe0,0x7070,0x6000,0x7000,0x3fc0,0x1fe0, 0x0070,0x0030,0x0030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0161 0x0000,0x0000,0x0000,0x0000,0x7ff8,0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0180,0x0180,0x0180,0x0300,0x0600,0x0000, // u0162 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x0600,0x3fc0,0x3fc0,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x07e0,0x03e0,0x0180,0x0180,0x0180,0x0300,0x0600,0x0000, // u0163 0x1dc0,0x0f80,0x0700,0x0000,0x7ff8,0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0164 0x3b80,0x1f00,0x0e00,0x0000,0x0600,0x0600,0x0600,0x0600,0x0600,0x3fc0,0x3fc0,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x07e0,0x03e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0165 0x0000,0x0000,0x0000,0x0000,0x7ff8,0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x1fe0,0x1fe0,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0166 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x0600,0x3fc0,0x3fc0,0x0600,0x0600,0x1f80,0x1f80,0x0600, 0x0600,0x0600,0x0600,0x0600,0x07e0,0x03e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0167 0x1e60,0x3fe0,0x33c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0168 0x0000,0x0000,0x0000,0x0000,0x0000,0x1e60,0x3fe0,0x33c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0169 0x1fc0,0x1fc0,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u016a 0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x1fc0,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u016b 0x18c0,0x1fc0,0x0f80,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u016c 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x1fc0,0x0f80,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u016d 0x0780,0x0cc0,0x0cc0,0x0780,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u016e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0780,0x0cc0,0x0cc0,0x0780,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u016f 0x0738,0x0e70,0x1ce0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0170 0x0000,0x0000,0x0000,0x0000,0x0000,0x0738,0x0e70,0x1ce0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0171 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0380,0x0600,0x0600,0x07c0,0x03c0,0x0000, // u0172 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0060,0x00c0,0x00c0,0x00f8,0x0078,0x0000, // u0173 0x0700,0x0f80,0x1dc0,0x0000,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6318,0x6798, 0x6fd8,0x7cf8,0x7878,0x7038,0x6018,0x6018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0174 0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0f80,0x1dc0,0x0000,0x6018,0x6018,0x6018,0x6018,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x7338,0x3ff0,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0175 0x0700,0x0f80,0x1dc0,0x0000,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860,0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0176 0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0f80,0x1dc0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030,0x0030,0x0070,0x3fe0,0x3fc0,0x0000, // u0177 0x18c0,0x18c0,0x18c0,0x0000,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860,0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0178 0x01c0,0x0380,0x0700,0x0000,0x7ff0,0x7ff0,0x0030,0x0030,0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800, 0x7000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0179 0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x0380,0x0700,0x0000,0x7ff0,0x7ff0,0x0070,0x00e0,0x01c0,0x0380,0x0700, 0x0e00,0x1c00,0x3800,0x7000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u017a 0x0300,0x0300,0x0300,0x0000,0x7ff0,0x7ff0,0x0030,0x0030,0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800, 0x7000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u017b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0000,0x7ff0,0x7ff0,0x0070,0x00e0,0x01c0,0x0380,0x0700, 0x0e00,0x1c00,0x3800,0x7000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u017c 0x1dc0,0x0f80,0x0700,0x0000,0x7ff0,0x7ff0,0x0030,0x0030,0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800, 0x7000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u017d 0x0000,0x0000,0x0000,0x0000,0x0000,0x1dc0,0x0f80,0x0700,0x0000,0x7ff0,0x7ff0,0x0070,0x00e0,0x01c0,0x0380,0x0700, 0x0e00,0x1c00,0x3800,0x7000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u017e 0x0000,0x0000,0x0000,0x0000,0x03f0,0x07f0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u017f 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, 0x0030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0186 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0ff0,0x0ff0,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u018e 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x0030,0x0030,0x0030,0x0030,0x7ff0,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u018f 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6000,0x6000,0x6000,0x6000,0x3f80,0x3f80,0x6000,0x6000, 0x6000,0x6000,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0190 0x0000,0x0000,0x0000,0x0000,0x01e0,0x03f0,0x0330,0x0330,0x0300,0x0300,0x0300,0x1fe0,0x1fe0,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x3300,0x3300,0x3f00,0x1e00,0x0000,0x0000, // u0192 0x0000,0x0000,0x0000,0x0000,0x3018,0x3018,0x3018,0x3018,0x3818,0x3c18,0x3e18,0x3718,0x3398,0x31d8,0x30f8,0x3078, 0x3038,0x3018,0x3018,0x3018,0x3018,0x3018,0x3000,0x3000,0x3000,0x7000,0xe000,0x0000, // u019d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0000, // u019e 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x0030,0x0030,0x0070,0x00e0,0x01c0,0x0380,0x7ff0,0x7ff0,0x0e00,0x1c00, 0x3800,0x7000,0x6000,0x6000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x00e0,0x01c0,0x0380,0x7ff0,0x7ff0, 0x0e00,0x1c00,0x3800,0x7000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01b6 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0fc0,0x0fe0,0x0070,0x0030,0x0030, 0x0030,0x0030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01b7 0x1dc0,0x0f80,0x0700,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x7ff0,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01cd 0x0000,0x0000,0x0000,0x0000,0x0000,0x1dc0,0x0f80,0x0700,0x0000,0x1fc0,0x1fe0,0x0070,0x0030,0x1ff0,0x3ff0,0x7030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01ce 0x1dc0,0x0f80,0x0700,0x0000,0x0fc0,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01cf 0x0000,0x0000,0x0000,0x0000,0x0000,0x1dc0,0x0f80,0x0700,0x0000,0x0f00,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d0 0x1dc0,0x0f80,0x0700,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x1dc0,0x0f80,0x0700,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d2 0x1dc0,0x0f80,0x0700,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x1dc0,0x0f80,0x0700,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d4 0x3ff0,0x3ff0,0x0000,0x0000,0x3ff8,0x7ff8,0xe300,0xc300,0xc300,0xc300,0xc300,0xc300,0xfff0,0xfff0,0xc300,0xc300, 0xc300,0xc300,0xc300,0xc300,0xc3f8,0xc3f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e2 0x0000,0x0000,0x0000,0x0000,0x0000,0x3fe0,0x3fe0,0x0000,0x0000,0x7de0,0x7ff0,0x0738,0x0318,0x3f18,0x7ff8,0xe3f8, 0xc300,0xc300,0xc300,0xe398,0x7ff8,0x3ef0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e3 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6000,0x6000,0x6000,0x63f0,0x63f0,0x6030,0x6030, 0x61fc,0x61fc,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff0,0x7030,0x6030,0x6030,0x61fc,0x61fc, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030,0x0030,0x0070,0x3fe0,0x3fc0,0x0000, // u01e5 0x1dc0,0x0f80,0x0700,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6000,0x6000,0x6000,0x63f0,0x63f0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e6 0x0000,0x0000,0x0000,0x0000,0x0000,0x1dc0,0x0f80,0x0700,0x0000,0x1ff0,0x3ff0,0x7030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030,0x0030,0x0070,0x3fe0,0x3fc0,0x0000, // u01e7 0x1dc0,0x0f80,0x0700,0x0000,0x6030,0x6070,0x60e0,0x61c0,0x6380,0x6700,0x6e00,0x7c00,0x7800,0x7800,0x7c00,0x6e00, 0x6700,0x6380,0x61c0,0x60e0,0x6070,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e8 0x1dc0,0x0f80,0x0700,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3070,0x30e0,0x31c0,0x3380,0x3700,0x3e00,0x3c00, 0x3e00,0x3700,0x3380,0x31c0,0x30e0,0x3070,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e9 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0380,0x0600,0x0600,0x07c0,0x03c0,0x0000, // u01ea 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0380,0x0600,0x0600,0x07c0,0x03c0,0x0000, // u01eb 0x1fc0,0x1fc0,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0380,0x0600,0x0600,0x07c0,0x03c0,0x0000, // u01ec 0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x1fc0,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0380,0x0600,0x0600,0x07c0,0x03c0,0x0000, // u01ed 0x1dc0,0x0f80,0x0700,0x0000,0x7ff0,0x7ff0,0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0fc0,0x0fe0,0x0070,0x0030,0x0030, 0x0030,0x0030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01ee 0x0000,0x0000,0x0000,0x0000,0x0000,0x1dc0,0x0f80,0x0700,0x0000,0x7ff0,0x7ff0,0x0070,0x00e0,0x01c0,0x0380,0x0700, 0x0fc0,0x0fe0,0x0070,0x0030,0x0030,0x0030,0x0030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000, // u01ef 0x0000,0x0000,0x0000,0x0000,0x0000,0x03b8,0x01f0,0x00e0,0x0000,0x01e0,0x01e0,0x0060,0x0060,0x0060,0x0060,0x0060, 0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x3060,0x3060,0x38e0,0x1fc0,0x0f80,0x0000, // u01f0 0x01c0,0x0380,0x0700,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6000,0x6000,0x6000,0x63f0,0x63f0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01f4 0x0000,0x0000,0x0000,0x0000,0x0000,0x00e0,0x01c0,0x0380,0x0000,0x1ff0,0x3ff0,0x7030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030,0x0030,0x0070,0x3fe0,0x3fc0,0x0000, // u01f5 0x01c0,0x0380,0x0700,0x0000,0x3ff8,0x7ff8,0xe300,0xc300,0xc300,0xc300,0xc300,0xc300,0xfff0,0xfff0,0xc300,0xc300, 0xc300,0xc300,0xc300,0xc300,0xc3f8,0xc3f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01fc 0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x0380,0x0700,0x0000,0x7de0,0x7ff0,0x0738,0x0318,0x3f18,0x7ff8,0xe3f8, 0xc300,0xc300,0xc300,0xe398,0x7ff8,0x3ef0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01fd 0x01c0,0x0380,0x0700,0x0000,0x1fc0,0x3fe0,0x7070,0x6038,0x6078,0x60f0,0x61f0,0x63b0,0x6730,0x6e30,0x7c30,0x7830, 0x7030,0xe030,0xe030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01fe 0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x0380,0x0700,0x0000,0x1fd8,0x3ff8,0x6070,0x60f0,0x61f0,0x63b0,0x6730, 0x6e30,0x7c30,0x7830,0x7030,0xffe0,0xdfc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01ff 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6000,0x6000,0x6000,0x7000,0x3fc0,0x1fe0,0x0070,0x0030, 0x0030,0x0030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0600,0x0600,0x0600,0x0c00,0x1800, // u0218 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6000,0x7000,0x3fc0,0x1fe0, 0x0070,0x0030,0x0030,0x7070,0x3fe0,0x1fc0,0x0000,0x0600,0x0600,0x0600,0x0c00,0x1800, // u0219 0x0000,0x0000,0x0000,0x0000,0x7ff8,0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0300,0x0300,0x0300,0x0600,0x0c00, // u021a 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x0600,0x3fc0,0x3fc0,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x07e0,0x03e0,0x0000,0x0180,0x0180,0x0180,0x0300,0x0600, // u021b 0x1fc0,0x1fc0,0x0000,0x0000,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860,0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0232 0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x1fc0,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030,0x0030,0x0070,0x3fe0,0x3fc0,0x0000, // u0233 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01e0,0x01e0,0x0060,0x0060,0x0060,0x0060,0x0060, 0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x3060,0x3060,0x38e0,0x1fc0,0x0f80,0x0000, // u0237 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x0030,0x0030,0x0030,0x0030, 0x0030,0x0030,0x0030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0254 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x7ff0,0x7ff0, 0x0030,0x0030,0x0030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0258 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x0030,0x0030,0x0030,0x7ff0, 0x7ff0,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0259 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6000,0x7000,0x3f80,0x3f80, 0x7000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u025b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fe0,0x3ff0,0x3038,0x3018,0x3018,0x3018,0x3018, 0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3000,0x3000,0x3000,0x7000,0xe000,0x0000, // u0272 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x0070,0x00e0,0x01c0,0x0380,0x0700, 0x0fc0,0x0fe0,0x0070,0x0030,0x0030,0x0030,0x0030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000, // u0292 0x0300,0x0700,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bb 0x0300,0x0300,0x0700,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bc 0x0600,0x0600,0x0700,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bd 0x0700,0x0f80,0x1dc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02c6 0x1dc0,0x0f80,0x0700,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02c7 0x18c0,0x1fc0,0x0f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02d8 0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02d9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0600,0x0600,0x07c0,0x03c0,0x0000, // u02db 0x1e60,0x3fe0,0x33c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02dc 0x0738,0x0e70,0x1ce0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02dd 0x1c00,0x0e00,0x0700,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0300 0x01c0,0x0380,0x0700,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0301 0x0700,0x0f80,0x1dc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0302 0x1e60,0x3fe0,0x33c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0303 0x1fc0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0304 0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0305 0x18c0,0x1fc0,0x0f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0306 0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0307 0x18c0,0x18c0,0x18c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0308 0x0780,0x0cc0,0x0cc0,0x0780,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030a 0x0738,0x0e70,0x1ce0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030b 0x1dc0,0x0f80,0x0700,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u0329 0x0000,0x3800,0x7000,0xe000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0384 0x01c0,0x0380,0x0700,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0385 0x0000,0x3800,0x7000,0xe000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x7ff0,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0386 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0387 0x0000,0x3800,0x7000,0xe000,0x3ff8,0x3ff8,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3fc0,0x3fc0,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3ff8,0x3ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0388 0x0000,0x3800,0x7000,0xe000,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3ff8,0x3ff8,0x3018,0x3018, 0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0389 0x0000,0x3800,0x7000,0xe000,0x0fc0,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u038a 0x0000,0x3800,0x7000,0xe000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u038c 0x0000,0x3800,0x7000,0xe000,0x300c,0x300c,0x1818,0x1818,0x0c30,0x0c30,0x0660,0x0660,0x03c0,0x03c0,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u038e 0x0000,0x3800,0x7000,0xe000,0x1fe0,0x3ff0,0x7038,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x7038, 0x3870,0x1ce0,0x0cc0,0x0cc0,0x7cf8,0x7cf8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u038f 0x0380,0x0700,0x0e00,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x1e00,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x07c0,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0390 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x7ff0,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0391 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6060,0x7fc0,0x7fc0,0x6060,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6070,0x7fe0,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0392 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0393 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0780,0x0780,0x0780,0x0cc0,0x0cc0,0x0cc0,0x1860,0x1860,0x1860, 0x3030,0x3030,0x3030,0x6018,0x7ff8,0x7ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0394 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x7f80,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0395 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x0030,0x0030,0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800, 0x7000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0396 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0397 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6fb0,0x6fb0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0398 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0399 0x0000,0x0000,0x0000,0x0000,0x6030,0x6070,0x60e0,0x61c0,0x6380,0x6700,0x6e00,0x7c00,0x7800,0x7800,0x7c00,0x6e00, 0x6700,0x6380,0x61c0,0x60e0,0x6070,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u039a 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0780,0x0780,0x0780,0x0cc0,0x0cc0,0x0cc0,0x1860,0x1860,0x1860, 0x3030,0x3030,0x3030,0x6018,0x6018,0x6018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u039b 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x7038,0x7878,0x7cf8,0x6fd8,0x6798,0x6318,0x6018,0x6018,0x6018,0x6018, 0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u039c 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x7030,0x7830,0x7c30,0x6e30,0x6730,0x63b0,0x61f0,0x60f0, 0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u039d 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x1fc0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u039e 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u039f 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a0 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6070,0x7fe0,0x7fc0,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a1 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x7000,0x3800,0x1c00,0x0e00,0x0700,0x0380,0x01c0,0x01c0,0x0380,0x0700, 0x0e00,0x1c00,0x3800,0x7000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a3 0x0000,0x0000,0x0000,0x0000,0x7ff8,0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a4 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860,0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a5 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x1fe0,0x3ff0,0x7338,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318, 0x6318,0x7338,0x3ff0,0x1fe0,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a6 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x3060,0x3060,0x18c0,0x18c0,0x0d80,0x0d80,0x0700,0x0700,0x0d80,0x0d80, 0x18c0,0x18c0,0x3060,0x3060,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a7 0x0000,0x0000,0x0000,0x0000,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x7338, 0x3ff0,0x1fe0,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a8 0x0000,0x0000,0x0000,0x0000,0x1fe0,0x3ff0,0x7038,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x7038, 0x3870,0x1ce0,0x0cc0,0x0cc0,0x7cf8,0x7cf8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a9 0x18c0,0x18c0,0x18c0,0x0000,0x0fc0,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03aa 0x18c0,0x18c0,0x18c0,0x0000,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860,0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ab 0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x0380,0x0700,0x0000,0x1f98,0x3ff8,0x70f0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x70f0,0x3ff8,0x1f98,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ac 0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x0380,0x0700,0x0000,0x1fc0,0x3fe0,0x7070,0x6000,0x7000,0x3f80,0x3f80, 0x7000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ad 0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x0380,0x0700,0x0000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0000, // u03ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0700,0x0e00,0x0000,0x1e00,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x07c0,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03af 0x01c0,0x0380,0x0700,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f98,0x3ff8,0x70f0,0x6060,0x6060,0x6060,0x6060, 0x6060,0x6060,0x6060,0x70f0,0x3ff8,0x1f98,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b1 0x0000,0x0000,0x0000,0x0000,0x3f80,0x7fc0,0x60e0,0x6060,0x6060,0x6060,0x60e0,0x7fc0,0x7fc0,0x60e0,0x6070,0x6030, 0x6030,0x6030,0x6030,0x6070,0x7fe0,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, // u03b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860, 0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000, // u03b3 0x0000,0x0000,0x0000,0x0000,0x1fe0,0x1fe0,0x0e00,0x0700,0x0380,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6000,0x7000,0x3f80,0x3f80, 0x7000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b5 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800,0x3000,0x7000,0x6000, 0x6000,0x6000,0x6000,0x7000,0x3fc0,0x1fe0,0x0070,0x0030,0x0030,0x00f0,0x00e0,0x0000, // u03b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0000, // u03b7 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x1fe0,0x3870,0x3030,0x3030,0x3030,0x3030,0x3030,0x3ff0,0x3ff0,0x3030,0x3030, 0x3030,0x3030,0x3030,0x3870,0x1fe0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x07c0,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3070,0x30e0,0x31c0,0x3380,0x3700,0x3e00,0x3c00, 0x3e00,0x3700,0x3380,0x31c0,0x30e0,0x3070,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ba 0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x0c00,0x0c00,0x0600,0x0600,0x0700,0x0700,0x0d80,0x0d80,0x18c0,0x18c0, 0x3060,0x3060,0x3060,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6070,0x60f0,0x61f0,0x7fb0,0x7f30,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, // u03bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x3060,0x3060,0x3060,0x18c0, 0x18c0,0x18c0,0x0d80,0x0d80,0x0700,0x0700,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03bd 0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff0,0x7000,0x6000,0x6000,0x6000,0x3000,0x1fc0,0x1fc0,0x3800,0x7000,0x6000, 0x6000,0x6000,0x6000,0x7000,0x3fc0,0x1fe0,0x0070,0x0030,0x0030,0x00f0,0x00e0,0x0000, // u03be 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6070,0x7fe0,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, // u03c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x7000,0x3fc0,0x1fe0,0x0070,0x0030,0x0030,0x00f0,0x00e0,0x0000, // u03c2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff8,0x3ff8,0x71c0,0x60e0,0x6070,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff8,0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x03e0,0x01e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x19e0,0x3bf0,0x7338,0x6318,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x7338,0x3ff0,0x1fe0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000, // u03c6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x3060,0x3060,0x18c0,0x18c0,0x0d80, 0x0d80,0x0700,0x0700,0x0d80,0x0d80,0x18c0,0x18c0,0x3060,0x3060,0x6030,0x6030,0x0000, // u03c7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x7338,0x3ff0,0x1fe0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000, // u03c8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1860,0x3870,0x7038,0x6018,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x77b8,0x3ff0,0x1ce0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c9 0x0000,0x0000,0x0000,0x0000,0x0000,0x3180,0x3180,0x3180,0x0000,0x1e00,0x1e00,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x07c0,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ca 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03cb 0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x0380,0x0700,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03cc 0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x0380,0x0700,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03cd 0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x0380,0x0700,0x0000,0x1860,0x3870,0x7038,0x6018,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x77b8,0x3ff0,0x1ce0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ce 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x1fe0,0x3870,0x3030,0x3030,0x3030,0x3830,0x1ff8,0x0ff8,0x0030,0x0030,0xf030, 0xf030,0x3030,0x3030,0x3870,0x1fe0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x1fe0,0x3ff0,0x7338,0x6318,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x7338,0x3ff0,0x1fe0,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000, // u03d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7818,0x7c38,0x0e70,0x06e0,0x03c0,0x0380,0x0300, 0x0700,0x0f00,0x1d80,0x39c0,0x70f8,0x6078,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6070,0x7fe0,0x7fc0,0x6000,0x6000,0x7000,0x3fe0,0x1fe0,0x0000, // u03f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f2 0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0000,0x0000,0x01e0,0x01e0,0x0060,0x0060,0x0060,0x0060,0x0060, 0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x3060,0x3060,0x38e0,0x1fc0,0x0f80,0x0000, // u03f3 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07f0,0x1ff0,0x3800,0x3000,0x6000,0x7fc0,0x7fc0, 0x6000,0x6000,0x3000,0x3800,0x1ff0,0x07f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x7fc0,0x00e0,0x0060,0x0030,0x1ff0,0x1ff0, 0x0030,0x0030,0x0060,0x00e0,0x7fc0,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f6 0x1c00,0x0e00,0x0700,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x7f80,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0400 0x18c0,0x18c0,0x18c0,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x7f80,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0401 0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0x3000,0x3000,0x3000,0x3000,0x3fc0,0x3fe0,0x3070,0x3030,0x3030,0x3030, 0x3030,0x3030,0x3030,0x3070,0x31e0,0x31c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0402 0x01c0,0x0380,0x0700,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0403 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6000,0x6000,0x6000,0x6000,0x7f80,0x7f80,0x6000,0x6000, 0x6000,0x6000,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0404 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6000,0x6000,0x6000,0x7000,0x3fc0,0x1fe0,0x0070,0x0030, 0x0030,0x0030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0405 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0406 0x18c0,0x18c0,0x18c0,0x0000,0x0fc0,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0407 0x0000,0x0000,0x0000,0x0000,0x01f8,0x01f8,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060, 0x6060,0x6060,0x6060,0x70e0,0x3fc0,0x1f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0408 0x0000,0x0000,0x0000,0x0000,0x1f00,0x3f00,0x7300,0x6300,0x6300,0x6300,0x6300,0x63e0,0x63f0,0x6338,0x6318,0x6318, 0x6318,0x6318,0x6318,0x6338,0xe3f0,0xc3e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0409 0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x6300,0x6300,0x6300,0x6300,0x6300,0x63e0,0x7ff0,0x7f38,0x6318,0x6318, 0x6318,0x6318,0x6318,0x6338,0x63f0,0x63e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u040a 0x0000,0x0000,0x0000,0x0000,0xfc00,0xfc00,0x3000,0x3000,0x3000,0x3000,0x3fc0,0x3fe0,0x3070,0x3030,0x3030,0x3030, 0x3030,0x3030,0x3030,0x3030,0x3030,0x3030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u040b 0x01c0,0x0380,0x0700,0x0000,0x6030,0x6070,0x60e0,0x61c0,0x6380,0x6700,0x6e00,0x7c00,0x7800,0x7800,0x7c00,0x6e00, 0x6700,0x6380,0x61c0,0x60e0,0x6070,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u040c 0x1c00,0x0e00,0x0700,0x0000,0x6030,0x6030,0x6030,0x6030,0x6070,0x60f0,0x61f0,0x63b0,0x6730,0x6e30,0x7c30,0x7830, 0x7030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u040d 0x18c0,0x1fc0,0x0f80,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030, 0x0030,0x0030,0x0030,0x0070,0x3fe0,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u040e 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018, 0x6018,0x6018,0x6018,0x6018,0x7ff8,0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000, // u040f 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x7ff0,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0410 0x0000,0x0000,0x0000,0x0000,0x7fe0,0x7fe0,0x6000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6070,0x7fe0,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0411 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6060,0x7fc0,0x7fc0,0x6060,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6070,0x7fe0,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0412 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0413 0x0000,0x0000,0x0000,0x0000,0x07f0,0x0ff0,0x1c30,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830, 0x1830,0x1830,0x1830,0x1830,0x3ff0,0x7ff8,0x6018,0x6018,0x6018,0x0000,0x0000,0x0000, // u0414 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x7f80,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0415 0x0000,0x0000,0x0000,0x0000,0x6318,0x6318,0x6318,0x6318,0x6318,0x7338,0x3b70,0x1fe0,0x0fc0,0x1fe0,0x3b70,0x7338, 0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0416 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x0030,0x0030,0x0030,0x0070,0x0fe0,0x0fe0,0x0070,0x0030, 0x0030,0x0030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0417 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6070,0x60f0,0x61f0,0x63b0,0x6730,0x6e30,0x7c30,0x7830, 0x7030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0418 0x18c0,0x1fc0,0x0f80,0x0000,0x6030,0x6030,0x6030,0x6030,0x6070,0x60f0,0x61f0,0x63b0,0x6730,0x6e30,0x7c30,0x7830, 0x7030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0419 0x0000,0x0000,0x0000,0x0000,0x6030,0x6070,0x60e0,0x61c0,0x6380,0x6700,0x6e00,0x7c00,0x7800,0x7800,0x7c00,0x6e00, 0x6700,0x6380,0x61c0,0x60e0,0x6070,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u041a 0x0000,0x0000,0x0000,0x0000,0x07f0,0x0ff0,0x1c30,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830, 0x1830,0x1830,0x1830,0x1830,0x3830,0x7030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u041b 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x7038,0x7878,0x7cf8,0x6fd8,0x6798,0x6318,0x6018,0x6018,0x6018,0x6018, 0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u041c 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u041d 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u041e 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u041f 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6070,0x7fe0,0x7fc0,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0420 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0421 0x0000,0x0000,0x0000,0x0000,0x7ff8,0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0422 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030, 0x0030,0x0030,0x0030,0x0070,0x3fe0,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0423 0x0000,0x0000,0x0300,0x0300,0x1fe0,0x3ff0,0x7338,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x7338,0x3ff0,0x1fe0,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000, // u0424 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x3060,0x3060,0x18c0,0x18c0,0x0d80,0x0d80,0x0700,0x0700,0x0d80,0x0d80, 0x18c0,0x18c0,0x3060,0x3060,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0425 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff8,0x1ff8,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u0426 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0427 0x0000,0x0000,0x0000,0x0000,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x7318,0x3ff8,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0428 0x0000,0x0000,0x0000,0x0000,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x7318,0x3ffc,0x1ffc,0x000c,0x000c,0x000c,0x000c,0x0000,0x0000, // u0429 0x0000,0x0000,0x0000,0x0000,0xf000,0xf000,0x3000,0x3000,0x3000,0x3000,0x3fe0,0x3ff0,0x3038,0x3018,0x3018,0x3018, 0x3018,0x3018,0x3018,0x3038,0x3ff0,0x3fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u042a 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x7f18,0x7f98,0x61d8,0x60d8,0x60d8,0x60d8, 0x60d8,0x60d8,0x60d8,0x61d8,0x7f98,0x7f18,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u042b 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6070,0x7fe0,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u042c 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x0030,0x0030,0x0030,0x0030,0x0ff0,0x0ff0,0x0030,0x0030, 0x0030,0x0030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u042d 0x0000,0x0000,0x0000,0x0000,0x61e0,0x63f0,0x6738,0x6618,0x6618,0x6618,0x6618,0x6618,0x7e18,0x7e18,0x6618,0x6618, 0x6618,0x6618,0x6618,0x6738,0x63f0,0x61e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u042e 0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff0,0x7030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x01f0, 0x03b0,0x0730,0x0e30,0x1c30,0x3830,0x7030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u042f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x1fe0,0x0070,0x0030,0x1ff0,0x3ff0,0x7030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0430 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fc0,0x7000,0x6000,0x6000,0x6000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6070,0x7fe0,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0431 0x0000,0x0000,0x0000,0x0000,0x3f00,0x7f80,0x61c0,0x60c0,0x60c0,0x60c0,0x6180,0x7fc0,0x7fe0,0x6070,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6070,0x7fe0,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0432 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0433 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff0,0x7030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030,0x0030,0x0070,0x3fe0,0x3fc0,0x0000, // u0434 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x7ff0,0x7ff0, 0x6000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0435 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6318,0x6318,0x6318,0x7338,0x3b70,0x1fe0,0x0fc0, 0x1fe0,0x3b70,0x7338,0x6318,0x6318,0x6318,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0436 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x0030,0x0070,0x0fe0,0x0fe0, 0x0070,0x0030,0x0030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0437 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0438 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x1fc0,0x0f80,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0439 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3070,0x30e0,0x31c0,0x3380,0x3700,0x3e00,0x3c00, 0x3e00,0x3700,0x3380,0x31c0,0x30e0,0x3070,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u043a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07f0,0x0ff0,0x1c30,0x1830,0x1830,0x1830,0x1830, 0x1830,0x1830,0x1830,0x1830,0x3830,0x7030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u043b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6018,0x7038,0x7878,0x7cf8,0x6fd8,0x6798,0x6318, 0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u043c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x7ff0, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u043d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u043e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u043f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6070,0x7fe0,0x7fc0,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, // u0440 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0441 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff8,0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0442 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030,0x0030,0x0070,0x3fe0,0x3fc0,0x0000, // u0443 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x1fe0,0x3ff0,0x7338,0x6318,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x7338,0x3ff0,0x1fe0,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000, // u0444 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x7070,0x38e0,0x1dc0,0x0f80,0x0700, 0x0f80,0x1dc0,0x38e0,0x7070,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0445 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff8,0x1ff8,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u0446 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0447 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x7318,0x3ff8,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0448 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x7318,0x3ffc,0x1ffc,0x000c,0x000c,0x000c,0x000c,0x0000,0x0000, // u0449 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf000,0xf000,0x3000,0x3000,0x3fc0,0x3fe0,0x3070, 0x3030,0x3030,0x3030,0x3070,0x3fe0,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u044a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x6018,0x6018,0x7f18,0x7f98,0x61d8, 0x60d8,0x60d8,0x60d8,0x61d8,0x7f98,0x7f18,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u044b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3fc0,0x3fe0,0x3070, 0x3030,0x3030,0x3030,0x3070,0x3fe0,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u044c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x0030,0x0030,0x0ff0,0x0ff0, 0x0030,0x0030,0x0030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u044d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x61e0,0x63f0,0x6738,0x6618,0x6618,0x6618,0x7e18, 0x7e18,0x6618,0x6618,0x6738,0x63f0,0x61e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u044e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff0,0x7030,0x6030,0x6030,0x7030,0x3ff0, 0x1ff0,0x03b0,0x0730,0x0e30,0x1c30,0x3830,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u044f 0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0e00,0x0700,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x7ff0,0x7ff0, 0x6000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0450 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x7ff0,0x7ff0, 0x6000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0451 0x0000,0x0000,0x0000,0x0000,0x6000,0xff00,0xff00,0x6000,0x6000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0030,0x0030,0x0070,0x03e0,0x03c0,0x0000, // u0452 0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x0380,0x0700,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0453 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6000,0x6000,0x7f80,0x7f80, 0x6000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0454 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6000,0x7000,0x3fc0,0x1fe0, 0x0070,0x0030,0x0030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0455 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000,0x0f00,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0456 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x0f00,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0457 0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0000,0x0000,0x01e0,0x01e0,0x0060,0x0060,0x0060,0x0060,0x0060, 0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x3060,0x3060,0x38e0,0x1fc0,0x0f80,0x0000, // u0458 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3f00,0x7300,0x6300,0x63e0,0x63f0,0x6338, 0x6318,0x6318,0x6318,0x6338,0xe3f0,0xc3e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0459 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x6300,0x6300,0x63e0,0x7ff0,0x7f38, 0x6318,0x6318,0x6318,0x6338,0x63f0,0x63e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u045a 0x0000,0x0000,0x0000,0x0000,0x6000,0xff00,0xff00,0x6000,0x6000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u045b 0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x0380,0x0700,0x0000,0x3070,0x30e0,0x31c0,0x3380,0x3700,0x3e00,0x3c00, 0x3e00,0x3700,0x3380,0x31c0,0x30e0,0x3070,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u045c 0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0e00,0x0700,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u045d 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x1fc0,0x0f80,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030,0x0030,0x0070,0x3fe0,0x3fc0,0x0000, // u045e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018, 0x6018,0x6018,0x6018,0x6018,0x7ff8,0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000, // u045f 0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0xff00,0xff00,0x3000,0x3000,0x3fe0,0x3ff0,0x3038,0x3018,0x3018,0x3018, 0x3018,0x3018,0x3018,0x3038,0x3ff0,0x3fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0462 0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0xff00,0xff00,0x3000,0x3000,0x3000,0x3fc0,0x3fe0,0x3070, 0x3030,0x3030,0x3030,0x3070,0x3fe0,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0463 0x0000,0x0000,0x0000,0x0000,0x7ff8,0x7ff8,0x6018,0x7038,0x3870,0x1ce0,0x0fc0,0x0780,0x0fc0,0x1fe0,0x3b70,0x7338, 0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u046a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff8,0x7ff8,0x7038,0x3870,0x1ce0,0x0fc0,0x0fc0, 0x1fe0,0x3b70,0x7338,0x6318,0x6318,0x6318,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u046b 0x0000,0x0030,0x0030,0x0030,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0490 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0030,0x0030,0x0030,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0491 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0xff00,0xff00,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0492 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0xff00, 0xff00,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0493 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x7fe0,0x6070, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0030,0x0060,0x00c0,0x0000,0x0000,0x0000, // u0494 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x7f80, 0x7fc0,0x60e0,0x6060,0x6060,0x6060,0x6060,0x0060,0x00c0,0x0180,0x0000,0x0000,0x0000, // u0495 0x0000,0x0000,0x0000,0x0000,0x6318,0x6318,0x6318,0x6318,0x6318,0x7338,0x3b70,0x1fe0,0x0fc0,0x1fe0,0x3b70,0x7338, 0x6318,0x6318,0x6318,0x6318,0x631c,0x631c,0x000c,0x000c,0x000c,0x000c,0x0000,0x0000, // u0496 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6318,0x6318,0x6318,0x7338,0x3b70,0x1fe0,0x0fc0, 0x1fe0,0x3b70,0x7338,0x6318,0x631c,0x631c,0x000c,0x000c,0x000c,0x000c,0x0000,0x0000, // u0497 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x0030,0x0030,0x0030,0x0070,0x0fe0,0x0fe0,0x0070,0x0030, 0x0030,0x0030,0x6030,0x7070,0x3fe0,0x1fc0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000, // u0498 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x0030,0x0070,0x0fe0,0x0fe0, 0x0070,0x0030,0x0030,0x7070,0x3fe0,0x1fc0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000, // u0499 0x0000,0x0000,0x0000,0x0000,0x6030,0x6070,0x60e0,0x61c0,0x6380,0x6700,0x6e00,0x7c00,0x7800,0x7800,0x7c00,0x6e00, 0x6700,0x6380,0x61c0,0x60e0,0x6070,0x6038,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u049a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3070,0x30e0,0x31c0,0x3380,0x3700,0x3e00,0x3c00, 0x3e00,0x3700,0x3380,0x31c0,0x30e0,0x3070,0x0030,0x0030,0x0030,0x0030,0x0000,0x0000, // u049b 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x6038,0x6070,0x6ce0,0x6dc0,0x6f80,0x6f00,0x7e00,0x7e00,0x6f00,0x6f80, 0x6dc0,0x6ce0,0x6070,0x6038,0x6018,0x6018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u049c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6018,0x6038,0x6c70,0x6ce0,0x6dc0,0x7f80,0x7f00, 0x7f80,0x6dc0,0x6ce0,0x6c70,0x6038,0x6018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u049d 0x0000,0x0000,0x0000,0x0000,0xf018,0xf038,0x3070,0x30e0,0x31c0,0x3380,0x3700,0x3e00,0x3c00,0x3c00,0x3e00,0x3700, 0x3380,0x31c0,0x30e0,0x3070,0x3038,0x3018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf070,0xf0e0,0x31c0,0x3380,0x3700,0x3e00,0x3c00, 0x3e00,0x3700,0x3380,0x31c0,0x30e0,0x3070,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a1 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6038,0x6038,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u04a2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x7ff0, 0x6030,0x6030,0x6030,0x6030,0x6038,0x6038,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u04a3 0x0000,0x0000,0x0000,0x0000,0x60fc,0x60fc,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7fc0,0x7fc0,0x60c0,0x60c0, 0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60fc,0x60fc,0x60c0,0x60c0,0x60c0,0x7fc0,0x7fc0, 0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a5 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000, // u04aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0600,0x0600,0x0600,0x0600,0x0600,0x0000, // u04ab 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860,0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860, 0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000, // u04af 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860,0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x3ff0, 0x3ff0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860, 0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x3ff0,0x3ff0,0x0300,0x0300,0x0300,0x0300,0x0000, // u04b1 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x3060,0x3060,0x18c0,0x18c0,0x0d80,0x0d80,0x0700,0x0700,0x0d80,0x0d80, 0x18c0,0x18c0,0x3060,0x3060,0x6038,0x6038,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u04b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x7070,0x38e0,0x1dc0,0x0f80,0x0700, 0x0f80,0x1dc0,0x38e0,0x7070,0x6038,0x6038,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u04b3 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0038,0x0038,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u04b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0, 0x0030,0x0030,0x0030,0x0030,0x0038,0x0038,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u04b7 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6330,0x6330,0x6330,0x7330,0x3ff0,0x1ff0,0x0330,0x0330, 0x0330,0x0330,0x0030,0x0030,0x0030,0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6330,0x6330,0x7330,0x3ff0,0x1ff0, 0x0330,0x0330,0x0330,0x0030,0x0030,0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04b9 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x7fe0, 0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04bb 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04c0 0x18c0,0x1fc0,0x0f80,0x0000,0x6318,0x6318,0x6318,0x6318,0x6318,0x7338,0x3b70,0x1fe0,0x0fc0,0x1fe0,0x3b70,0x7338, 0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x1fc0,0x0f80,0x0000,0x6318,0x6318,0x6318,0x7338,0x3b70,0x1fe0,0x0fc0, 0x1fe0,0x3b70,0x7338,0x6318,0x6318,0x6318,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04c2 0x0000,0x0000,0x0000,0x0000,0x0f00,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04cf 0x18c0,0x1fc0,0x0f80,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x7ff0,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d0 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x1fc0,0x0f80,0x0000,0x1fc0,0x1fe0,0x0070,0x0030,0x1ff0,0x3ff0,0x7030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d1 0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x7ff0,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d2 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x1fe0,0x0070,0x0030,0x1ff0,0x3ff0,0x7030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d3 0x0000,0x0000,0x0000,0x0000,0x3ff8,0x7ff8,0xe300,0xc300,0xc300,0xc300,0xc300,0xc300,0xfff0,0xfff0,0xc300,0xc300, 0xc300,0xc300,0xc300,0xc300,0xc3f8,0xc3f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7de0,0x7ff0,0x0738,0x0318,0x3f18,0x7ff8,0xe3f8, 0xc300,0xc300,0xc300,0xe398,0x7ff8,0x3ef0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d5 0x18c0,0x1fc0,0x0f80,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x7f80,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d6 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x1fc0,0x0f80,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x7ff0,0x7ff0, 0x6000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d7 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x0030,0x0030,0x0030,0x0030,0x7ff0,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x0030,0x0030,0x0030,0x7ff0, 0x7ff0,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d9 0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x0030,0x0030,0x0030,0x0030,0x7ff0,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04da 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3fe0,0x7070,0x0030,0x0030,0x0030,0x7ff0, 0x7ff0,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04db 0x1860,0x1860,0x1860,0x0000,0x6318,0x6318,0x6318,0x6318,0x6318,0x7338,0x3b70,0x1fe0,0x0fc0,0x1fe0,0x3b70,0x7338, 0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04dc 0x0000,0x0000,0x0000,0x0000,0x0000,0x1860,0x1860,0x1860,0x0000,0x6318,0x6318,0x6318,0x7338,0x3b70,0x1fe0,0x0fc0, 0x1fe0,0x3b70,0x7338,0x6318,0x6318,0x6318,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04dd 0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x0030,0x0030,0x0030,0x0070,0x0fe0,0x0fe0,0x0070,0x0030, 0x0030,0x0030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04de 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3fe0,0x7070,0x0030,0x0070,0x0fe0,0x0fe0, 0x0070,0x0030,0x0030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04df 0x1fc0,0x1fc0,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6070,0x60f0,0x61f0,0x63b0,0x6730,0x6e30,0x7c30,0x7830, 0x7030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e2 0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x1fc0,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e3 0x18c0,0x18c0,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6070,0x60f0,0x61f0,0x63b0,0x6730,0x6e30,0x7c30,0x7830, 0x7030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e4 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e5 0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e6 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e7 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x7ff0,0x7ff0, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e9 0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x7ff0,0x7ff0,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ea 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x7ff0,0x7ff0, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04eb 0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x0030,0x0030,0x0030,0x0030,0x0ff0,0x0ff0,0x0030,0x0030, 0x0030,0x0030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ec 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x1fc0,0x3fe0,0x7070,0x0030,0x0030,0x0ff0,0x0ff0, 0x0030,0x0030,0x0030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ed 0x1fc0,0x1fc0,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030, 0x0030,0x0030,0x0030,0x0070,0x3fe0,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ee 0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x1fc0,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030,0x0030,0x0070,0x3fe0,0x3fc0,0x0000, // u04ef 0x18c0,0x18c0,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030, 0x0030,0x0030,0x0030,0x0070,0x3fe0,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f0 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030,0x0030,0x0070,0x3fe0,0x3fc0,0x0000, // u04f1 0x0738,0x0e70,0x1ce0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030, 0x0030,0x0030,0x0030,0x0070,0x3fe0,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0738,0x0e70,0x1ce0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030,0x0030,0x0070,0x3fe0,0x3fc0,0x0000, // u04f3 0x18c0,0x18c0,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f4 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f5 0x18c0,0x18c0,0x18c0,0x0000,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x7f18,0x7f98,0x61d8,0x60d8,0x60d8,0x60d8, 0x60d8,0x60d8,0x60d8,0x61d8,0x7f98,0x7f18,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f8 0x0000,0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x0000,0x6018,0x6018,0x6018,0x6018,0x7f18,0x7f98,0x61d8, 0x60d8,0x60d8,0x60d8,0x61d8,0x7f98,0x7f18,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f9 0x0000,0x0000,0x0000,0x0000,0x3018,0x3018,0x1818,0x1818,0x0c18,0x0c18,0x0638,0x0e70,0x1fe0,0x3bc0,0x7180,0x6180, 0x60c0,0x60c0,0x6060,0x6060,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d0 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7fe0,0x0070,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d1 0x0000,0x0000,0x0000,0x0000,0x3e00,0x3f00,0x0380,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0380, 0x07c0,0x0ec0,0x1c60,0x3860,0x7030,0xe030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d2 0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d3 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7fe0,0x0070,0x0030,0x0030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d4 0x0000,0x0000,0x0000,0x0000,0x3c00,0x3e00,0x0700,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d5 0x0000,0x0000,0x0000,0x0000,0x1ff0,0x1ff0,0x00e0,0x01c0,0x0380,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d6 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d7 0x0000,0x0000,0x0000,0x0000,0x63c0,0x63e0,0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d8 0x0000,0x0000,0x0000,0x0000,0x3c00,0x3e00,0x0700,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d9 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7fe0,0x0070,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0000,0x0000, // u05da 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7fe0,0x0070,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0070,0x7fe0,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05db 0x0000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0030,0x0030,0x0030,0x0030,0x0030,0x0070,0x00e0,0x01c0,0x0380,0x0700, 0x0e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05dc 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05dd 0x0000,0x0000,0x0000,0x0000,0xe780,0xffe0,0x3870,0x3030,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018, 0x3018,0x3018,0x3018,0x3018,0x30f8,0x30f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05de 0x0000,0x0000,0x0000,0x0000,0x3f00,0x3f80,0x01c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x0000,0x0000, // u05df 0x0000,0x0000,0x0000,0x0000,0x3f00,0x3f80,0x01c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x00c0,0x00c0,0x00c0,0x3fc0,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e0 0x0000,0x0000,0x0000,0x0000,0xffe0,0xfff0,0x3038,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018, 0x3018,0x3018,0x3018,0x3838,0x1ff0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e1 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x3030,0x3030,0x3030,0x1830,0x1830,0x1860,0x0c60,0x0c60,0x0cc0, 0x06c0,0x06c0,0x0380,0x0700,0x7e00,0x7800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e2 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030,0x7030,0x3e30,0x1e30,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0000,0x0000, // u05e3 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030,0x7030,0x3e30,0x1e30,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0070,0x7fe0,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e4 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x3018,0x3018,0x1838,0x1870,0x0ce0,0x0dc0,0x0780,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000, // u05e5 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x3018,0x3018,0x1838,0x1870,0x0ce0,0x0dc0,0x0780,0x0300,0x0300,0x0180, 0x0180,0x00c0,0x00c0,0x0060,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e6 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x0030,0x0030,0x0030,0x6030,0x6030,0x6030,0x6070,0x60e0,0x61c0,0x6380, 0x6700,0x6600,0x6600,0x6600,0x6600,0x6600,0x6000,0x6000,0x6000,0x6000,0x0000,0x0000, // u05e7 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7fe0,0x0070,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e8 0x0000,0x0000,0x0000,0x0000,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x6718,0x7e18,0x7c18,0x6018, 0x6018,0x6018,0x6018,0x6038,0x7ff0,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e9 0x0000,0x0000,0x0000,0x0000,0xffe0,0xfff0,0x3038,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018, 0x3018,0x3018,0x3018,0x3018,0xf018,0xe018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05ea 0x0000,0x0000,0x0000,0x0000,0x7f00,0x7fc0,0x60e0,0x6060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6060,0x60e0,0x7fc0,0x7f00,0x0000,0x0600,0x0600,0x0600,0x0000,0x0000, // u1e0c 0x0000,0x0000,0x0000,0x0000,0x0030,0x0030,0x0030,0x0030,0x0030,0x1ff0,0x3ff0,0x7030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1e0d 0x0000,0x0000,0x0000,0x0000,0x6030,0x6070,0x60e0,0x61c0,0x6380,0x6700,0x6e00,0x7c00,0x7800,0x7800,0x7c00,0x6e00, 0x6700,0x6380,0x61c0,0x60e0,0x6070,0x6030,0x0000,0x0000,0x3fe0,0x3fe0,0x0000,0x0000, // u1e34 0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3070,0x30e0,0x31c0,0x3380,0x3700,0x3e00,0x3c00, 0x3e00,0x3700,0x3380,0x31c0,0x30e0,0x3070,0x0000,0x0000,0x1fe0,0x1fe0,0x0000,0x0000, // u1e35 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1e36 0x0000,0x0000,0x0000,0x0000,0x0f00,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1e37 0x0300,0x0300,0x0300,0x0000,0x6018,0x6018,0x7038,0x7878,0x7cf8,0x6fd8,0x6798,0x6318,0x6018,0x6018,0x6018,0x6018, 0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e40 0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0000,0x7fe0,0x7ff0,0x6338,0x6318,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e41 0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x7038,0x7878,0x7cf8,0x6fd8,0x6798,0x6318,0x6018,0x6018,0x6018,0x6018, 0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1e42 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x7ff0,0x6338,0x6318,0x6318,0x6318,0x6318, 0x6318,0x6318,0x6318,0x6318,0x6318,0x6318,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1e43 0x0300,0x0300,0x0300,0x0000,0x6030,0x6030,0x6030,0x6030,0x7030,0x7830,0x7c30,0x6e30,0x6730,0x63b0,0x61f0,0x60f0, 0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e44 0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e45 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x7030,0x7830,0x7c30,0x6e30,0x6730,0x63b0,0x61f0,0x60f0, 0x6070,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1e46 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1e47 0x0000,0x0000,0x0000,0x0000,0x7ff8,0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1e6c 0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x0600,0x3fc0,0x3fc0,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x07e0,0x03e0,0x0000,0x0180,0x0180,0x0180,0x0000,0x0000, // u1e6d 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x7f80,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1eb8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x7ff0,0x7ff0, 0x6000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1eb9 0x1e60,0x3fe0,0x33c0,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x7f80,0x6000,0x6000, 0x6000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u1ebc 0x0000,0x0000,0x0000,0x0000,0x0000,0x1e60,0x3fe0,0x33c0,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x7ff0,0x7ff0, 0x6000,0x6000,0x6000,0x7070,0x3fe0,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u1ebd 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1eca 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000,0x0f00,0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1ecb 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1ecc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x7070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1ecd 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7070,0x3fe0,0x1fc0,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1ee4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0000,0x0300,0x0300,0x0300,0x0000,0x0000, // u1ee5 0x1e60,0x3fe0,0x33c0,0x0000,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860,0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u1ef8 0x0000,0x0000,0x0000,0x0000,0x0000,0x1e60,0x3fe0,0x33c0,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x7030,0x3ff0,0x1ff0,0x0030,0x0030,0x0070,0x3fe0,0x3fc0,0x0000, // u1ef9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2001 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2002 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2003 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2004 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2005 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2006 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2007 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2008 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2009 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2010 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2011 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2012 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2013 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff8,0x7ff8,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2014 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff8,0x7ff8,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2015 0x0000,0x0000,0x0000,0x0000,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2016 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x0000,0x7ff0,0x7ff0, // u2017 0x0000,0x0000,0x0300,0x0300,0x0600,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2018 0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2019 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u201a 0x0000,0x0000,0x0600,0x0600,0x0600,0x0600,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201b 0x0000,0x0000,0x0c60,0x0c60,0x18c0,0x18c0,0x18c0,0x18c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201c 0x0000,0x0000,0x0c60,0x0c60,0x0c60,0x0c60,0x18c0,0x18c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x18c0,0x3180,0x3180,0x0000,0x0000,0x0000,0x0000, // u201e 0x0000,0x0000,0x3180,0x3180,0x3180,0x3180,0x18c0,0x18c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201f 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x3ff0,0x3ff0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2020 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x3ff0,0x3ff0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x3ff0,0x3ff0,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2021 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0780,0x0fc0,0x0fc0,0x0fc0,0x0fc0, 0x0780,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2022 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x6318,0x6318,0x6318,0x6318,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2026 0x0000,0x0000,0x0000,0x0000,0x38c0,0x7cc0,0x6d80,0x7d80,0x3b00,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x1800,0x1800, 0x3000,0x3770,0x6ff8,0x6dd8,0xcff8,0xc770,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2030 0x0000,0x0000,0x0380,0x0380,0x0380,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2032 0x0000,0x0000,0x1ce0,0x1ce0,0x1ce0,0x18c0,0x18c0,0x18c0,0x18c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2033 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800, 0x1c00,0x0e00,0x0700,0x0380,0x01c0,0x00e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2039 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x1c00,0x0e00,0x0700,0x0380,0x01c0,0x00e0, 0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u203a 0x0000,0x0000,0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0, 0x0000,0x0000,0x18c0,0x18c0,0x18c0,0x18c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u203c 0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u203e 0x0000,0x0000,0x0f80,0x1fc0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x1fc0,0x0f80,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2070 0x0300,0x0300,0x0000,0x0700,0x0700,0x0300,0x0300,0x0300,0x0300,0x0300,0x0780,0x0780,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2071 0x0000,0x0000,0x00c0,0x01c0,0x03c0,0x07c0,0x0ec0,0x1cc0,0x1fc0,0x1fc0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2074 0x0000,0x0000,0x1f80,0x1f80,0x1800,0x1800,0x1f80,0x1fc0,0x00c0,0x00c0,0x1fc0,0x0f80,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2075 0x0000,0x0000,0x0780,0x0f80,0x1800,0x1800,0x1f80,0x1fc0,0x18c0,0x18c0,0x1fc0,0x0f80,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2076 0x0000,0x0000,0x1fc0,0x1fc0,0x00c0,0x0180,0x0180,0x0300,0x0300,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2077 0x0000,0x0000,0x0f80,0x1fc0,0x18c0,0x18c0,0x0f80,0x1fc0,0x18c0,0x18c0,0x1fc0,0x0f80,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2078 0x0000,0x0000,0x0f80,0x1fc0,0x18c0,0x18c0,0x1fc0,0x0fc0,0x00c0,0x00c0,0x0f80,0x0f00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2079 0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x1fe0,0x1fe0,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fe0,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207b 0x0000,0x0000,0x0000,0x0000,0x1fe0,0x1fe0,0x0000,0x0000,0x1fe0,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207c 0x0000,0x0000,0x0180,0x0300,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0300,0x0180,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207d 0x0000,0x0000,0x0600,0x0300,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0300,0x0600,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207e 0x0000,0x0000,0x0000,0x1fc0,0x1fe0,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f80,0x1fc0, 0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x1fc0,0x0f80,0x0000,0x0000,0x0000,0x0000, // u2080 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0700, 0x0f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000, // u2081 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f80,0x1fc0, 0x18c0,0x00c0,0x01c0,0x0380,0x0700,0x0e00,0x1fc0,0x1fc0,0x0000,0x0000,0x0000,0x0000, // u2082 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f80,0x1fc0, 0x00c0,0x00c0,0x0780,0x07c0,0x00c0,0x00c0,0x1fc0,0x0f80,0x0000,0x0000,0x0000,0x0000, // u2083 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x01c0, 0x03c0,0x07c0,0x0ec0,0x1cc0,0x1fc0,0x1fc0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000, // u2084 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x1f80, 0x1800,0x1800,0x1f80,0x1fc0,0x00c0,0x00c0,0x1fc0,0x0f80,0x0000,0x0000,0x0000,0x0000, // u2085 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0780,0x0f80, 0x1800,0x1800,0x1f80,0x1fc0,0x18c0,0x18c0,0x1fc0,0x0f80,0x0000,0x0000,0x0000,0x0000, // u2086 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x1fc0, 0x00c0,0x0180,0x0180,0x0300,0x0300,0x0600,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000, // u2087 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f80,0x1fc0, 0x18c0,0x18c0,0x0f80,0x1fc0,0x18c0,0x18c0,0x1fc0,0x0f80,0x0000,0x0000,0x0000,0x0000, // u2088 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f80,0x1fc0, 0x18c0,0x18c0,0x1fc0,0x0fc0,0x00c0,0x00c0,0x0f80,0x0f00,0x0000,0x0000,0x0000,0x0000, // u2089 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300, 0x0300,0x0300,0x1fe0,0x1fe0,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000, // u208a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1fe0,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u208b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x1fe0,0x1fe0,0x0000,0x0000,0x1fe0,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u208c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0300, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0300,0x0180,0x0000,0x0000,0x0000,0x0000, // u208d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0300, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0300,0x0600,0x0000,0x0000,0x0000,0x0000, // u208e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0, 0x0fe0,0x0060,0x0fe0,0x1fe0,0x1860,0x1860,0x1fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000, // u2090 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0, 0x1fe0,0x1860,0x1fe0,0x1fe0,0x1800,0x1800,0x1fe0,0x0fc0,0x0000,0x0000,0x0000,0x0000, // u2091 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0, 0x1fe0,0x1860,0x1860,0x1860,0x1860,0x1860,0x1fe0,0x0fc0,0x0000,0x0000,0x0000,0x0000, // u2092 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1860, 0x1860,0x1ce0,0x0fc0,0x0780,0x0fc0,0x1ce0,0x1860,0x1860,0x0000,0x0000,0x0000,0x0000, // u2093 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0, 0x1fe0,0x0060,0x0060,0x1fe0,0x1fe0,0x1860,0x1fe0,0x0fc0,0x0000,0x0000,0x0000,0x0000, // u2094 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x1fc0, 0x1fe0,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x0000,0x0000,0x0000,0x0000, // u2095 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x18e0, 0x19c0,0x1b80,0x1f00,0x1e00,0x1f00,0x1b80,0x19c0,0x18e0,0x0000,0x0000,0x0000,0x0000, // u2096 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0700,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0780,0x0780,0x0000,0x0000,0x0000,0x0000, // u2097 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fe0, 0x3ff0,0x3330,0x3330,0x3330,0x3330,0x3330,0x3330,0x3330,0x0000,0x0000,0x0000,0x0000, // u2098 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0, 0x1fe0,0x1860,0x1860,0x1860,0x1860,0x1860,0x1fe0,0x1fc0,0x1800,0x1800,0x1800,0x0000, // u209a 0x0000,0x0000,0x0000,0x0000,0xfe00,0xff00,0xc380,0xc180,0xc180,0xc180,0xc180,0xc380,0xff60,0xfe60,0xc1f8,0xc1f8, 0xc060,0xc060,0xc060,0xc060,0xc078,0xc038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u20a7 0x0000,0x0000,0x0000,0x0000,0xfe18,0xff18,0xc398,0xc198,0xc198,0xcd98,0xcd98,0xcd98,0xcd98,0xcd98,0xcd98,0xcd98, 0xcd98,0xcc18,0xcc18,0xcc38,0xcff0,0xcfe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u20aa 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x1fe0,0x3870,0x7000,0x6000,0x6000,0xff80,0xff80,0x6000,0x6000,0xff80,0xff80, 0x6000,0x6000,0x7000,0x3870,0x1fe0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u20ac 0x0000,0x0000,0x0000,0x0000,0x7ff8,0x7ff8,0x0300,0x0300,0x0300,0x0300,0x03f0,0x03c0,0x0f00,0x3ff0,0x03c0,0x0f00, 0x3f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u20ae 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3c60,0x6c30,0x6c30,0x6c30,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00,0x6c00, 0x6c00,0x6c30,0x6c30,0x6c30,0x3c60,0x1fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2102 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u210e 0x0000,0x0000,0x0000,0x0000,0x6000,0xff00,0xff00,0x6000,0x6000,0x7fc0,0x7fe0,0x6070,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u210f 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x7030,0x7830,0x6c30,0x7630,0x7b30,0x6db0,0x66f0,0x6370,0x61b0, 0x60f0,0x6070,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2115 0x0000,0x0000,0x0000,0x0000,0xc300,0xc338,0xc37c,0xc36c,0xe37c,0xe338,0xf300,0xf300,0xdb00,0xdb00,0xcf00,0xcf00, 0xc77c,0xc77c,0xc300,0xc37c,0xc37c,0xc300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2116 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3c60,0x6c30,0x6c30,0x6c30,0x6c30,0x6c30,0x6c30,0x6c30,0x6c30,0x6c30,0x6c30, 0x6c30,0x6c30,0x6c30,0x6db0,0x3de0,0x1fc0,0x0060,0x0030,0x0000,0x0000,0x0000,0x0000, // u211a 0x0000,0x0000,0x0000,0x0000,0x7fc0,0x6c60,0x6c30,0x6c30,0x6c30,0x6c30,0x6c30,0x6c30,0x6c60,0x6fc0,0x6f00,0x6d80, 0x6ec0,0x6f60,0x6db0,0x6cd8,0x6c68,0x7c38,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u211d 0x0000,0x0000,0x0000,0x0000,0xfd04,0xfd8c,0x31fc,0x31ac,0x318c,0x318c,0x318c,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2122 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x0030,0x0030,0x0070,0x00f0,0x01b0,0x0360,0x06c0,0x0d80,0x1b00,0x3600,0x6c00, 0x7800,0x7000,0x6000,0x6000,0x6000,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2124 0x0000,0x0000,0x0000,0x0000,0x1fe0,0x3ff0,0x7038,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x7038, 0x3870,0x1ce0,0x0cc0,0x0cc0,0x7cf8,0x7cf8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2126 0x0000,0x0000,0x0000,0x0000,0x60c0,0x60c0,0x3060,0x3060,0x1830,0x1830,0x0c18,0x1c38,0x3e70,0x76e0,0xe3c0,0xc380, 0xc180,0xc180,0xc0c0,0xe0c0,0x7060,0x3860,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2135 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0c00,0x1c00,0x3800,0x7000,0xfff8,0xfff8,0x7000, 0x3800,0x1c00,0x0c00,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2190 0x0000,0x0000,0x0000,0x0000,0x0300,0x0780,0x0fc0,0x1fe0,0x3b70,0x7338,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2191 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0180,0x01c0,0x00e0,0x0070,0xfff8,0xfff8,0x0070, 0x00e0,0x01c0,0x0180,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2192 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x7338,0x3b70,0x1fe0,0x0fc0,0x0780,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2193 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0480,0x0cc0,0x1ce0,0x3870,0x7038,0xfffc,0xfffc,0x7038, 0x3870,0x1ce0,0x0cc0,0x0480,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2194 0x0000,0x0000,0x0000,0x0000,0x0300,0x0780,0x0fc0,0x1fe0,0x3b70,0x7338,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x7338,0x3b70,0x1fe0,0x0fc0,0x0780,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2195 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0418,0x0c18,0x1c18,0x3818,0x7018,0xfff8,0xfff8,0x7018, 0x3818,0x1c18,0x0c18,0x0418,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc100,0xc180,0xc1c0,0xc0e0,0xc070,0xfff8,0xfff8,0xc070, 0xc0e0,0xc1c0,0xc180,0xc100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a6 0x0000,0x0000,0x0000,0x0000,0x0300,0x0780,0x0fc0,0x1fe0,0x3b70,0x7338,0x0300,0x0300,0x0300,0x0300,0x0300,0x7338, 0x3b70,0x1fe0,0x0fc0,0x0780,0x7ff8,0x7ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a8 0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0418,0x0c18,0x1c18,0x3818,0x7018,0xfff8, 0xfff8,0x7000,0x3800,0x1c00,0x0c00,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,0x7e00,0x1e00,0x3e30,0x7638,0x6618,0x6018,0x6018,0x6018, 0x7038,0x3870,0x1fe0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1800,0x3800,0x7000,0xfff8,0xfff8,0x0000,0x0000,0xfff8, 0xfff8,0x0070,0x00e0,0x00c0,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21cb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x00c0,0x00e0,0x0070,0xfff8,0xfff8,0x0000,0x0000,0xfff8, 0xfff8,0x7000,0x3800,0x1800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21cc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0400,0x0c00,0x1c00,0x3ff8,0x7ff8,0xf000,0xf000,0x7ff8, 0x3ff8,0x1c00,0x0c00,0x0400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d0 0x0000,0x0000,0x0000,0x0000,0x0300,0x0780,0x0fc0,0x1fe0,0x3cf0,0x7cf8,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0180,0x01c0,0xffe0,0xfff0,0x0078,0x0078,0xfff0, 0xffe0,0x01c0,0x0180,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d2 0x0000,0x0000,0x0000,0x0000,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, 0x7cf8,0x3cf0,0x1fe0,0x0fc0,0x0780,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0480,0x0cc0,0x1ce0,0x3ff0,0x7ff8,0xf03c,0xf03c,0x7ff8, 0x3ff0,0x1ce0,0x0cc0,0x0480,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d4 0x0000,0x0000,0x0000,0x0000,0x0300,0x0780,0x0fc0,0x1fe0,0x3cf0,0x7cf8,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, 0x7cf8,0x3cf0,0x1fe0,0x0fc0,0x0780,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d5 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x3060,0x3fe0,0x3fe0,0x3060,0x18c0,0x18c0,0x18c0,0x18c0, 0x0d80,0x0d80,0x0d80,0x0700,0x0700,0x0700,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2200 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x7ff0,0x7ff0,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2203 0x0000,0x0000,0x0030,0x0030,0x7ff0,0x7ff0,0x00f0,0x00f0,0x01b0,0x01b0,0x0330,0x0330,0x7ff0,0x7ff0,0x0630,0x0c30, 0x0c30,0x1830,0x1830,0x3030,0x7ff0,0x7ff0,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000, // u2204 0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x1fc0,0x3fe0,0x71f0,0x61b0,0x6330,0x6330,0x6630,0x6630,0x6c30, 0x7c70,0x3fe0,0x1fc0,0x3800,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2205 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0780,0x0780,0x0780,0x0cc0,0x0cc0,0x0cc0,0x1860,0x1860,0x1860, 0x3030,0x3030,0x3030,0x6018,0x7ff8,0x7ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2206 0x0000,0x0000,0x0000,0x0000,0x7ff8,0x7ff8,0x6018,0x3030,0x3030,0x3030,0x1860,0x1860,0x1860,0x0cc0,0x0cc0,0x0cc0, 0x0780,0x0780,0x0780,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2207 0x0000,0x0000,0x0000,0x0000,0x07f0,0x1ff0,0x3800,0x3000,0x6000,0x6000,0x6000,0x6000,0x7ff0,0x7ff0,0x6000,0x6000, 0x6000,0x6000,0x3000,0x3800,0x1ff0,0x07f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2208 0x0000,0x0000,0x0018,0x0018,0x07f0,0x1ff0,0x3860,0x3060,0x60c0,0x60c0,0x6180,0x6180,0x7ff0,0x7ff0,0x6300,0x6300, 0x6600,0x6600,0x3c00,0x3c00,0x1ff0,0x1ff0,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, // u2209 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07f0,0x1ff0,0x3800,0x3000,0x6000,0x6000,0x7ff0,0x7ff0,0x6000,0x6000, 0x3000,0x3800,0x1ff0,0x07f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u220a 0x0000,0x0000,0x0000,0x0000,0x7f00,0x7fc0,0x00e0,0x0060,0x0030,0x0030,0x0030,0x0030,0x7ff0,0x7ff0,0x0030,0x0030, 0x0030,0x0030,0x0060,0x00e0,0x7fc0,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u220b 0x0000,0x0000,0x6000,0x6000,0x3f80,0x3fe0,0x1870,0x1830,0x0c18,0x0c18,0x0618,0x0618,0x3ff8,0x3ff8,0x0318,0x0318, 0x0198,0x0198,0x00f0,0x00f0,0x3fe0,0x3fe0,0x0030,0x0030,0x0000,0x0000,0x0000,0x0000, // u220c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x7fc0,0x00e0,0x0060,0x0030,0x0030,0x7ff0,0x7ff0,0x0030,0x0030, 0x0060,0x00e0,0x7fc0,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u220d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2212 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff8,0x7ff8,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x7ff8, 0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2213 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x7ff8, 0x7ff8,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2214 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0038,0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00, 0x3800,0x7000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2215 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x7000,0x3800,0x1c00,0x0e00,0x0700,0x0380,0x01c0,0x00e0, 0x0070,0x0038,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2216 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0f80,0x0f80,0x0f80,0x0700, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2219 0x0000,0x0000,0x0078,0x0078,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x6060,0x6060,0x6060,0x7060, 0x3860,0x1c60,0x0e60,0x0760,0x03e0,0x01e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u221a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ce0,0x3ff0,0x77b8,0x6318,0x6318,0x6318,0x77b8, 0x3ff0,0x1ce0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u221e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u221f 0x0000,0x0000,0x0000,0x0000,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2225 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0780,0x0780,0x0cc0,0x0cc0,0x1860, 0x1860,0x1860,0x3030,0x3030,0x6018,0x6018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2227 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860,0x1860, 0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2228 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f80,0x1fc0,0x38e0,0x3060,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2229 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x3060,0x38e0,0x1fc0,0x0f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u222a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e18,0x3f38,0x73f0,0x61e0,0x0000,0x1e18,0x3f38, 0x73f0,0x60e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2248 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0070,0x7ff8,0x7ff8,0x01c0,0x0380,0x0700,0x0e00,0x7ff8, 0x7ff8,0x3800,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2260 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x0000,0x0000, 0x0000,0x0000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2261 0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800,0x1c00,0x0e00,0x0700,0x0380, 0x01c0,0x00e0,0x0070,0x0000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2264 0x0000,0x0000,0x0000,0x0000,0x7000,0x3800,0x1c00,0x0e00,0x0700,0x0380,0x01c0,0x00e0,0x01c0,0x0380,0x0700,0x0e00, 0x1c00,0x3800,0x7000,0x0000,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2265 0x0000,0x0000,0x0000,0x0000,0x0000,0x018c,0x039c,0x0738,0x0e70,0x1ce0,0x39c0,0x7380,0xe700,0xe700,0x7380,0x39c0, 0x1ce0,0x0e70,0x0738,0x039c,0x018c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u226a 0x0000,0x0000,0x0000,0x0000,0x0000,0xc600,0xe700,0x7380,0x39c0,0x1ce0,0x0e70,0x0738,0x039c,0x039c,0x0738,0x0e70, 0x1ce0,0x39c0,0x7380,0xe700,0xc600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u226b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07f8,0x1ff8,0x3800,0x7000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x7000,0x3800,0x1ff8,0x07f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2282 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x7fe0,0x0070,0x0038,0x0018,0x0018,0x0018,0x0018,0x0018, 0x0038,0x0070,0x7fe0,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2283 0x0000,0x0000,0x0000,0x0000,0x0000,0x07f8,0x1ff8,0x3800,0x7000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7000,0x3800, 0x1ff8,0x07f8,0x0000,0x0000,0x7ff8,0x7ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2286 0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x7fe0,0x0070,0x0038,0x0018,0x0018,0x0018,0x0018,0x0018,0x0038,0x0070, 0x7fe0,0x7f80,0x0000,0x0000,0x7ff8,0x7ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2287 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x7ff8,0x7ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u22a5 0x0000,0x0000,0x0000,0x0000,0x0f80,0x1fc0,0x38e0,0x3060,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u22c2 0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x3060,0x38e0,0x1fc0,0x0f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u22c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x1fc0,0x3fe0,0x71f0,0x61b0,0x6330,0x6330,0x6630,0x6630,0x6c30, 0x7c70,0x3fe0,0x1fc0,0x3800,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2300 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0780,0x0fc0,0x1ce0,0x3870,0x7038,0x6018,0x6018,0x6018, 0x6018,0x6018,0x6018,0x6018,0x7ff8,0x7ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2302 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0fc0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2308 0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0fc0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2309 0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u230a 0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x00c0,0x00c0,0x00c0,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u230b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x6000,0x6000,0x6000,0x6000, 0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2310 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7ff0, 0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2319 0x0000,0x0000,0x0000,0x0000,0x01f0,0x03f8,0x0318,0x0318,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2320 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x6300,0x6300,0x7f00,0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2321 0x0030,0x0060,0x00c0,0x0180,0x0300,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x0c00,0x1800,0x1800,0x1800,0x1800,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, // u239b 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, // u239c 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x1800,0x1800,0x1800, 0x1800,0x0c00,0x0c00,0x0c00,0x0600,0x0600,0x0300,0x0300,0x0180,0x00c0,0x0060,0x0030, // u239d 0x3000,0x1800,0x0c00,0x0600,0x0300,0x0300,0x0180,0x0180,0x00c0,0x00c0,0x00c0,0x0060,0x0060,0x0060,0x0060,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, // u239e 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, // u239f 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0060,0x0060,0x0060, 0x0060,0x00c0,0x00c0,0x00c0,0x0180,0x0180,0x0300,0x0300,0x0600,0x0c00,0x1800,0x3000, // u23a0 0x3ff0,0x3ff0,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, // u23a1 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, // u23a2 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ff0,0x3ff0, // u23a3 0x3ff0,0x3ff0,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, // u23a4 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, // u23a5 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x3ff0,0x3ff0, // u23a6 0x00f8,0x03f8,0x0700,0x0600,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u23a7 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x1800,0xf000,0xf000,0x1800, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, // u23a8 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0600,0x0700,0x03f8,0x00f8, // u23a9 0xf800,0xfe00,0x0700,0x0300,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u23ab 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x00c0,0x0078,0x0078,0x00c0, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u23ac 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0300,0x0700,0xfe00,0xf800, // u23ad 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u23ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23af 0xfffc,0xfffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0xfffc,0xfffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc, // u23bd 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u23d0 0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x6300,0x7f00,0x7f00,0x6300,0x6300,0x6300,0x0000,0x0000,0x07f8,0x07f8, 0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2409 0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f00,0x7f00,0x0000,0x0000,0x03f8,0x03f8, 0x0300,0x03e0,0x03e0,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u240a 0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x6300,0x6300,0x6300,0x3600,0x1c00,0x0800,0x0000,0x0000,0x07f8,0x07f8, 0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u240b 0x0000,0x0000,0x0000,0x0000,0x7f00,0x7f00,0x6000,0x7c00,0x7c00,0x6000,0x6000,0x6000,0x0000,0x0000,0x03f8,0x03f8, 0x0300,0x03e0,0x03e0,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u240c 0x0000,0x0000,0x0000,0x0000,0x3e00,0x7f00,0x6300,0x6000,0x6000,0x6300,0x7f00,0x3e00,0x0000,0x0000,0x03f0,0x03f8, 0x0318,0x0318,0x03f0,0x03e0,0x0330,0x0318,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u240d 0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x7300,0x7b00,0x6f00,0x6700,0x6300,0x6300,0x0000,0x0000,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x03f8,0x03f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2424 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2500 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0xfffc,0xfffc, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2501 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2502 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780, 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780, // u2503 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xedd8,0xedd8,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2508 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xedd8,0xedd8,0xedd8,0xedd8, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2509 0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000, // u250a 0x0780,0x0780,0x0780,0x0780,0x0780,0x0000,0x0000,0x0780,0x0780,0x0780,0x0780,0x0780,0x0000,0x0000,0x0780,0x0780, 0x0780,0x0780,0x0780,0x0000,0x0000,0x0780,0x0780,0x0780,0x0780,0x0780,0x0000,0x0000, // u250b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03fc,0x03fc,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u250c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03fc,0x03fc,0x03fc,0x03fc, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u250d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07fc,0x07fc,0x0780, 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780, // u250e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07fc,0x07fc,0x07fc,0x07fc, 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780, // u250f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2510 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0xff00, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2511 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff80,0xff80,0x0780, 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780, // u2512 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff80,0xff80,0xff80,0xff80, 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780, // u2513 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x03fc,0x03fc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2514 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x03fc,0x03fc,0x03fc,0x03fc, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2515 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x07fc,0x07fc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2516 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x07fc,0x07fc,0x07fc,0x07fc, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2517 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xff00,0xff00,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2518 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xff00,0xff00,0xff00,0xff00, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2519 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0xff80,0xff80,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u251a 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0xff80,0xff80,0xff80,0xff80, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u251b 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x03fc,0x03fc,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u251c 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x03fc,0x03fc,0x03fc,0x03fc, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u251d 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x07fc,0x07fc,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u251e 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x07fc,0x07fc,0x0780, 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780, // u251f 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x07fc,0x07fc,0x0780, 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780, // u2520 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x07fc,0x07fc,0x07fc,0x07fc, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2521 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x07fc,0x07fc,0x07fc,0x07fc, 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780, // u2522 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x07fc,0x07fc,0x07fc,0x07fc, 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780, // u2523 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xff00,0xff00,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2524 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xff00,0xff00,0xff00,0xff00, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2525 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0xff80,0xff80,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2526 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xff80,0xff80,0x0780, 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780, // u2527 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0xff80,0xff80,0x0780, 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780, // u2528 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0xff80,0xff80,0xff80,0xff80, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2529 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xff80,0xff80,0xff80,0xff80, 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780, // u252a 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0xff80,0xff80,0xff80,0xff80, 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780, // u252b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u252c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xfffc,0xfffc,0xff00, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u252d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03fc,0xfffc,0xfffc,0x03fc, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u252e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0xfffc,0xfffc, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u252f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0x0780, 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780, // u2530 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff80,0xfffc,0xfffc,0xff80, 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780, // u2531 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07fc,0xfffc,0xfffc,0x07fc, 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780, // u2532 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0xfffc,0xfffc, 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780, // u2533 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xfffc,0xfffc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2534 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xff00,0xfffc,0xfffc,0xff00, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2535 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x03fc,0xfffc,0xfffc,0x03fc, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2536 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xfffc,0xfffc,0xfffc,0xfffc, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2537 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0xfffc,0xfffc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2538 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0xff80,0xfffc,0xfffc,0xff80, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2539 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x07fc,0xfffc,0xfffc,0x07fc, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u253a 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0xfffc,0xfffc,0xfffc,0xfffc, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u253b 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xfffc,0xfffc,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u253c 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xff00,0xfffc,0xfffc,0xff00, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u253d 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x03fc,0xfffc,0xfffc,0x03fc, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u253e 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xfffc,0xfffc,0xfffc,0xfffc, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u253f 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0xfffc,0xfffc,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2540 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xfffc,0xfffc,0x0780, 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780, // u2541 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0xfffc,0xfffc,0x0780, 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780, // u2542 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0xff80,0xfffc,0xfffc,0xff00, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2543 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x07fc,0xfffc,0xfffc,0x03fc, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2544 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xff00,0xfffc,0xfffc,0xff80, 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780, // u2545 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x03fc,0xfffc,0xfffc,0x07fc, 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780, // u2546 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0xfffc,0xfffc,0xfffc,0xfffc, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2547 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xfffc,0xfffc,0xfffc,0xfffc, 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780, // u2548 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0xff80,0xfffc,0xfffc,0xff80, 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780, // u2549 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x07fc,0xfffc,0xfffc,0x07fc, 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780, // u254a 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0xfffc,0xfffc,0xfffc,0xfffc, 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780, // u254b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0x0000,0x0000,0xfffc, 0xfffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2550 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, // u2551 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03fc,0x03fc,0x0300,0x0300,0x03fc, 0x03fc,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2552 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ffc,0x0ffc,0x0cc0, 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, // u2553 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ffc,0x0ffc,0x0c00,0x0c00,0x0cfc, 0x0cfc,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, // u2554 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x0300,0x0300,0xff00, 0xff00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2555 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x0cc0, 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, // u2556 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0x00c0,0x00c0,0xfcc0, 0xfcc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, // u2557 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x03fc,0x03fc,0x0300,0x0300,0x03fc, 0x03fc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2558 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0ffc,0x0ffc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2559 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cfc,0x0cfc,0x0c00,0x0c00,0x0ffc, 0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255a 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xff00,0xff00,0x0300,0x0300,0xff00, 0xff00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255b 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0xffc0,0xffc0,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255c 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0xfcc0,0xfcc0,0x00c0,0x00c0,0xffc0, 0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255d 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x03fc,0x03fc,0x0300,0x0300,0x03fc, 0x03fc,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u255e 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cfc,0x0cfc,0x0cc0, 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, // u255f 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cfc,0x0cfc,0x0c00,0x0c00,0x0cfc, 0x0cfc,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, // u2560 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xff00,0xff00,0x0300,0x0300,0xff00, 0xff00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2561 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0xfcc0,0xfcc0,0x0cc0, 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, // u2562 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0xfcc0,0xfcc0,0x00c0,0x00c0,0xfcc0, 0xfcc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, // u2563 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0x0000,0x0000,0xfffc, 0xfffc,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2564 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0x0cc0, 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, // u2565 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0x0000,0x0000,0xfcfc, 0xfcfc,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, // u2566 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xfffc,0xfffc,0x0000,0x0000,0xfffc, 0xfffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2567 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0xfffc,0xfffc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2568 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0xfcfc,0xfcfc,0x0000,0x0000,0xfffc, 0xfffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2569 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0xfffc,0xfffc,0x0300,0x0300,0xfffc, 0xfffc,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u256a 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0xfffc,0xfffc,0x0cc0, 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, // u256b 0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0xfcfc,0xfcfc,0x0000,0x0000,0xfcfc, 0xfcfc,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0,0x0cc0, // u256c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x001c,0x007c,0x00e0, 0x01c0,0x0180,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u256d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xe000,0xf800,0x1c00, 0x0e00,0x0600,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u256e 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0600,0x0e00,0x1c00,0xf800,0xe000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u256f 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0180,0x01c0,0x00e0,0x007c,0x001c,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2570 0x0004,0x000c,0x000c,0x0018,0x0018,0x0030,0x0030,0x0060,0x0060,0x00c0,0x00c0,0x0180,0x0180,0x0300,0x0300,0x0600, 0x0600,0x0c00,0x0c00,0x1800,0x1800,0x3000,0x3000,0x6000,0x6000,0xc000,0xc000,0x8000, // u2571 0x8000,0xc000,0xc000,0x6000,0x6000,0x3000,0x3000,0x1800,0x1800,0x0c00,0x0c00,0x0600,0x0600,0x0300,0x0300,0x0180, 0x0180,0x00c0,0x00c0,0x0060,0x0060,0x0030,0x0030,0x0018,0x0018,0x000c,0x000c,0x0004, // u2572 0x8004,0xc00c,0xc00c,0x6018,0x6018,0x3030,0x3030,0x1860,0x1860,0x0cc0,0x0cc0,0x0780,0x0780,0x0300,0x0300,0x0780, 0x0780,0x0cc0,0x0cc0,0x1860,0x1860,0x3030,0x3030,0x6018,0x6018,0xc00c,0xc00c,0x8004, // u2573 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2574 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2575 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03fc,0x03fc,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2576 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u2577 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0xff00,0xff00, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2578 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2579 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03fc,0x03fc,0x03fc,0x03fc, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0780,0x0780,0x0780, 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780, // u257b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03fc,0xfffc,0xfffc,0x03fc, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257c 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0780,0x0780,0x0780, 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780, // u257d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xfffc,0xfffc,0xff00, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257e 0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // u257f 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2580 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0xfffc,0xfffc, // u2581 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, // u2582 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, // u2583 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc, 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, // u2584 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, // u2585 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, // u2586 0x0000,0x0000,0x0000,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, // u2587 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, // u2588 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, // u2589 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, 0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0,0xffe0, // u258a 0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80, 0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80,0xff80, // u258b 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, // u258c 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, 0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800, // u258d 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, // u258e 0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000, 0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000, // u258f 0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc, 0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc, // u2590 0xaaa8,0x0000,0xaaa8,0x0000,0xaaa8,0x0000,0xaaa8,0x0000,0xaaa8,0x0000,0xaaa8,0x0000,0xaaa8,0x0000,0xaaa8,0x0000, 0xaaa8,0x0000,0xaaa8,0x0000,0xaaa8,0x0000,0xaaa8,0x0000,0xaaa8,0x0000,0xaaa8,0x0000, // u2591 0xaaa8,0x5554,0xaaa8,0x5554,0xaaa8,0x5554,0xaaa8,0x5554,0xaaa8,0x5554,0xaaa8,0x5554,0xaaa8,0x5554,0xaaa8,0x5554, 0xaaa8,0x5554,0xaaa8,0x5554,0xaaa8,0x5554,0xaaa8,0x5554,0xaaa8,0x5554,0xaaa8,0x5554, // u2592 0xfffc,0xaaa8,0xfffc,0xaaa8,0xfffc,0xaaa8,0xfffc,0xaaa8,0xfffc,0xaaa8,0xfffc,0xaaa8,0xfffc,0xaaa8,0xfffc,0xaaa8, 0xfffc,0xaaa8,0xfffc,0xaaa8,0xfffc,0xaaa8,0xfffc,0xaaa8,0xfffc,0xaaa8,0xfffc,0xaaa8, // u2593 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfe00,0xfe00, 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, // u2596 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01fc,0x01fc, 0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc, // u2597 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2598 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfffc,0xfffc, 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, // u2599 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0x01fc,0x01fc, 0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc, // u259a 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfe00,0xfe00, 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, // u259b 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0x01fc,0x01fc, 0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc, // u259c 0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u259d 0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0xfe00,0xfe00, 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, // u259e 0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0x01fc,0xfffc,0xfffc, 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, // u259f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fe0,0x3fe0,0x3fe0,0x3fe0,0x3fe0,0x3fe0,0x3fe0,0x3fe0, 0x3fe0,0x3fe0,0x3fe0,0x3fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff8, 0x7ff8,0x7ff8,0x7ff8,0x7ff8,0x7ff8,0x7ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ac 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x7ff0,0x7ff0,0x7ff0,0x7ff0,0x7ff0,0x7ff0,0x7ff0,0x7ff0,0x7ff0,0x7ff0, 0x7ff0,0x7ff0,0x7ff0,0x7ff0,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0780,0x0780,0x0fc0,0x0fc0,0x1fe0,0x1fe0,0x3ff0, 0x3ff0,0x7ff8,0x7ff8,0xfffc,0xfffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xffc0,0xfff0,0xfffc,0xfffc,0xfff0, 0xffc0,0xff00,0xfc00,0xf000,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xffc0,0xfff0,0xfffc,0xfffc,0xfff0, 0xffc0,0xff00,0xfc00,0xf000,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffc,0xfffc,0x7ff8,0x7ff8,0x3ff0,0x3ff0,0x1fe0,0x1fe0,0x0fc0, 0x0fc0,0x0780,0x0780,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x000c,0x003c,0x00fc,0x03fc,0x0ffc,0x3ffc,0xfffc,0xfffc,0x3ffc, 0x0ffc,0x03fc,0x00fc,0x003c,0x000c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25c0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x000c,0x003c,0x00fc,0x03fc,0x0ffc,0x3ffc,0xfffc,0xfffc,0x3ffc, 0x0ffc,0x03fc,0x00fc,0x003c,0x000c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25c4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0200,0x0700,0x0f80,0x1fc0,0x3fe0,0x7ff0,0xfff8,0xfff8,0x7ff0, 0x3fe0,0x1fc0,0x0f80,0x0700,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25c6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0200,0x0700,0x0f80,0x1dc0,0x38e0,0x7070,0xe038,0xe038,0x7070, 0x38e0,0x1dc0,0x0f80,0x0700,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ca 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0780,0x0fc0,0x0cc0,0x0cc0,0x0fc0, 0x0780,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25cb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0780,0x0fc0,0x0fc0,0x0fc0,0x0fc0, 0x0780,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25cf 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xf87c,0xf03c,0xf03c,0xf03c,0xf03c, 0xf87c,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, // u25d8 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xf87c,0xf03c,0xf33c,0xf33c,0xf03c, 0xf87c,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, // u25d9 0x0000,0x0000,0x0000,0x0000,0x3fe0,0x7ff0,0xc018,0xc018,0xc018,0xddd8,0xddd8,0xc018,0xc018,0xc018,0xc018,0xdfd8, 0xcf98,0xc018,0xc018,0xc018,0x7ff0,0x3fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u263a 0x0000,0x0000,0x0000,0x0000,0x3fe0,0x7ff0,0xfff8,0xfff8,0xfff8,0xc718,0xc718,0xfff8,0xfff8,0xfff8,0xfff8,0xc018, 0xe038,0xfff8,0xfff8,0xfff8,0x7ff0,0x3fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u263b 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x6318,0x7338,0x3b70,0x1fe0,0x0fc0,0x7cf8,0x7cf8,0x0fc0,0x1fe0, 0x3b70,0x7338,0x6318,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u263c 0x0000,0x0000,0x0000,0x0000,0x1fe0,0x3ff0,0x7038,0x6018,0x6018,0x6018,0x6018,0x6018,0x7038,0x3ff0,0x1fe0,0x0300, 0x0300,0x7ff8,0x7ff8,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2640 0x0000,0x0000,0x0000,0x0000,0x03f8,0x03f8,0x0078,0x00f8,0x01d8,0x0398,0x0718,0x3f80,0x7fc0,0xe0e0,0xc060,0xc060, 0xc060,0xc060,0xc060,0xe0e0,0x7fc0,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2642 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0780,0x0fc0,0x1fe0,0x3ff0,0x3ff0,0x7ff8,0x7ff8,0x7ff8,0x7ff8,0x7ff8, 0x7b78,0x3b70,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2660 0x0000,0x0000,0x0000,0x0000,0x0780,0x0fc0,0x0fc0,0x0fc0,0x0fc0,0x0780,0x0300,0x3b70,0x7ff8,0x7ff8,0x7ff8,0x7ff8, 0x7ff8,0x3b70,0x0300,0x0300,0x0fc0,0x0fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2663 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x78f0,0xfdf8,0xfdf8,0xfff8,0xfff8,0xfff8,0xfff8,0x7ff0,0x7ff0, 0x3fe0,0x1fc0,0x0f80,0x0700,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2665 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0200,0x0700,0x0f80,0x1fc0,0x3fe0,0x7ff0,0xfff8,0xfff8,0x7ff0, 0x3fe0,0x1fc0,0x0f80,0x0700,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2666 0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff0,0x3030,0x3030,0x3030,0x3ff0,0x3ff0,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0xf000,0xe000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u266a 0x0000,0x0000,0x0000,0x0000,0x7ff8,0x7ff8,0x6018,0x6018,0x6018,0x7ff8,0x7ff8,0x6018,0x6018,0x6018,0x6018,0x6018, 0x6018,0x6018,0x6018,0x6078,0xe070,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u266b 0x0000,0x0000,0x0000,0x0000,0x000c,0x000c,0x0018,0x0018,0x0030,0x0030,0x0060,0x0060,0xc0c0,0xc0c0,0x6180,0x6180, 0x3300,0x3300,0x1e00,0x1e00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2713 0x0000,0x0000,0x0000,0x0000,0x001c,0x001c,0x0038,0x0038,0x0070,0x0070,0x00e0,0x00e0,0xc1c0,0xc1c0,0xe380,0xe380, 0x7700,0x7700,0x3e00,0x3e00,0x1c00,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2714 0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x00c0,0x60c0,0x3180,0x1980,0x0f00,0x0700,0x0700,0x0780,0x0cc0,0x0c60, 0x1830,0x1800,0x3000,0x3000,0x6000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2717 0x0000,0x0000,0x0000,0x0000,0x00e0,0x00e0,0xe1c0,0x71c0,0x3b80,0x1f80,0x0f00,0x0700,0x0f80,0x0fc0,0x1ce0,0x1c70, 0x3830,0x3800,0x7000,0x7000,0xe000,0xe000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2718 0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x0180,0x0180,0x0300,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x0600,0x0600, 0x0300,0x0300,0x0180,0x0180,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u27e8 0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0600,0x0600,0x0300,0x0300,0x0180,0x0180,0x00c0,0x00c0,0x0180,0x0180, 0x0300,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u27e9 0x0000,0x0000,0x0000,0x0000,0x0630,0x0630,0x0c60,0x0c60,0x18c0,0x18c0,0x3180,0x3180,0x6300,0x6300,0x3180,0x3180, 0x18c0,0x18c0,0x0c60,0x0c60,0x0630,0x0630,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u27ea 0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x3180,0x3180,0x18c0,0x18c0,0x0c60,0x0c60,0x0630,0x0630,0x0c60,0x0c60, 0x18c0,0x18c0,0x3180,0x3180,0x6300,0x6300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u27eb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2800 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2801 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2802 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2803 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2804 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2805 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2806 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2807 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2808 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2809 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280a 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280b 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280c 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280d 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280e 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2810 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2811 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2812 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2813 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2814 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2815 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2816 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2817 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2818 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2819 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281a 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281b 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281c 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281d 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281e 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2820 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2821 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2822 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2823 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2824 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2825 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2826 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2827 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2828 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2829 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282a 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282b 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282c 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282d 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282e 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2830 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2831 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2832 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2833 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2834 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2835 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2836 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2837 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2838 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2839 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283a 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283b 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283c 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283d 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283e 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2840 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2841 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2842 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2843 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2844 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2845 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2846 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2847 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2848 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2849 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u284a 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u284b 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u284c 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u284d 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u284e 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u284f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2850 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2851 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2852 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2853 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2854 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2855 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2856 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2857 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2858 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2859 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u285a 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u285b 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u285c 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u285d 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u285e 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u285f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2860 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2861 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2862 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2863 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2864 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2865 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2866 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2867 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2868 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2869 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u286a 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u286b 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u286c 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u286d 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u286e 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u286f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2870 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2871 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2872 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2873 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2874 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2875 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2876 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2877 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2878 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u2879 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u287a 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u287b 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u287c 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u287d 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u287e 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000, // u287f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2880 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2881 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2882 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2883 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2884 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2885 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2886 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2887 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2888 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2889 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u288a 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u288b 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u288c 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u288d 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u288e 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u288f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2890 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2891 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2892 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2893 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2894 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2895 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2896 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2897 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2898 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u2899 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u289a 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u289b 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u289c 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u289d 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u289e 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u289f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28a0 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28a1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28a2 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28a4 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28a5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28a6 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28a7 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28a8 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28a9 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28aa 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28ab 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28ac 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28ad 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28ae 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28af 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28b0 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28b1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28b2 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28b4 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28b6 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28b7 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28b8 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28b9 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28ba 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28bb 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28bc 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28bd 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28be 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000, // u28bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28c0 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28c2 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28c4 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28c6 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28c7 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28c8 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28c9 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28ca 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28cb 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28cc 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28cd 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28ce 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28cf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28d0 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28d2 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28d4 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28d6 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28d7 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28d8 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28d9 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28da 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28db 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28dc 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28dd 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28de 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000, 0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28df 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28e0 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28e1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28e2 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28e3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28e4 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28e6 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28e7 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28e8 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28e9 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28ea 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28eb 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28ec 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28ed 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28ee 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28ef 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28f0 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28f2 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28f3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28f4 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28f6 0x0000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28f7 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28f8 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28f9 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28fa 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060, 0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28fb 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28fc 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28fd 0x0000,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28fe 0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060, 0x3060,0x3060,0x3060,0x0000,0x0000,0x0000,0x3060,0x3060,0x3060,0x3060,0x0000,0x0000, // u28ff 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000, 0x0000,0x0000,0x6030,0x6030,0x6030,0x6030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2e2c 0xc000,0xc000,0xc000,0xc180,0xc3c0,0xc7e0,0xcff0,0xddb8,0xc180,0xc180,0xc180,0xc180,0xc180,0xc300,0x8600,0x0c00, 0x1800,0x3000,0x6000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000, // ue0a0 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x7f80,0x0000,0x0000,0x0618, 0x0618,0x0718,0x0798,0x07d8,0x06f8,0x0678,0x0638,0x0618,0x0618,0x0000,0x0000,0x0000, // ue0a1 0x0000,0x0000,0x0000,0x0f80,0x1fc0,0x3060,0x3060,0x3060,0x3060,0x3060,0x3060,0x3060,0x7ff0,0xfff8,0xfff8,0xfff8, 0xf8f8,0xf078,0xf078,0xf078,0xf8f8,0xfff8,0xfff8,0xfff8,0xfff8,0x0000,0x0000,0x0000, // ue0a2 0x8000,0xc000,0xe000,0xf000,0xf800,0xfc00,0xfe00,0xff00,0xff80,0xffc0,0xffe0,0xfff0,0xfff8,0xfffc,0xfffc,0xfff8, 0xfff0,0xffe0,0xffc0,0xff80,0xff00,0xfe00,0xfc00,0xf800,0xf000,0xe000,0xc000,0x8000, // ue0b0 0x8000,0xc000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180,0x00c0,0x0060,0x0030,0x0018,0x000c,0x000c,0x0018, 0x0030,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0xc000,0x8000, // ue0b1 0x0004,0x000c,0x001c,0x003c,0x007c,0x00fc,0x01fc,0x03fc,0x07fc,0x0ffc,0x1ffc,0x3ffc,0x7ffc,0xfffc,0xfffc,0x7ffc, 0x3ffc,0x1ffc,0x0ffc,0x07fc,0x03fc,0x01fc,0x00fc,0x007c,0x003c,0x001c,0x000c,0x0004, // ue0b2 0x0004,0x000c,0x0018,0x0030,0x0060,0x00c0,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0xc000,0xc000,0x6000, 0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180,0x00c0,0x0060,0x0030,0x0018,0x000c,0x0004, // ue0b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01e0,0x01e0,0x0060,0x0060,0x0060,0x0060,0x0060, 0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x3060,0x3060,0x38e0,0x1fc0,0x0f80,0x0000, // uf6be 0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff0,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030, 0x6030,0x6030,0x6030,0x6030,0x7ff0,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 // ufffd }; // codepoints array constexpr std::array fixedfont_codepoints = { 0x0000,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e, 0x002f,0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e, 0x003f,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e, 0x004f,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e, 0x005f,0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e, 0x006f,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e, 0x00a0,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af, 0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf, 0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf, 0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df, 0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef, 0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff, 0x0100,0x0101,0x0102,0x0103,0x0104,0x0105,0x0106,0x0107,0x0108,0x0109,0x010a,0x010b,0x010c,0x010d,0x010e,0x010f, 0x0110,0x0111,0x0112,0x0113,0x0114,0x0115,0x0116,0x0117,0x0118,0x0119,0x011a,0x011b,0x011c,0x011d,0x011e,0x011f, 0x0120,0x0121,0x0122,0x0123,0x0124,0x0125,0x0126,0x0127,0x0128,0x0129,0x012a,0x012b,0x012c,0x012d,0x012e,0x012f, 0x0130,0x0131,0x0132,0x0133,0x0134,0x0135,0x0136,0x0137,0x0138,0x0139,0x013a,0x013b,0x013c,0x013d,0x013e,0x013f, 0x0140,0x0141,0x0142,0x0143,0x0144,0x0145,0x0146,0x0147,0x0148,0x0149,0x014a,0x014b,0x014c,0x014d,0x014e,0x014f, 0x0150,0x0151,0x0152,0x0153,0x0154,0x0155,0x0156,0x0157,0x0158,0x0159,0x015a,0x015b,0x015c,0x015d,0x015e,0x015f, 0x0160,0x0161,0x0162,0x0163,0x0164,0x0165,0x0166,0x0167,0x0168,0x0169,0x016a,0x016b,0x016c,0x016d,0x016e,0x016f, 0x0170,0x0171,0x0172,0x0173,0x0174,0x0175,0x0176,0x0177,0x0178,0x0179,0x017a,0x017b,0x017c,0x017d,0x017e,0x017f, 0x0186,0x018e,0x018f,0x0190,0x0192,0x019d,0x019e,0x01b5,0x01b6,0x01b7,0x01cd,0x01ce,0x01cf,0x01d0,0x01d1,0x01d2, 0x01d3,0x01d4,0x01e2,0x01e3,0x01e4,0x01e5,0x01e6,0x01e7,0x01e8,0x01e9,0x01ea,0x01eb,0x01ec,0x01ed,0x01ee,0x01ef, 0x01f0,0x01f4,0x01f5,0x01fc,0x01fd,0x01fe,0x01ff,0x0218,0x0219,0x021a,0x021b,0x0232,0x0233,0x0237,0x0254,0x0258, 0x0259,0x025b,0x0272,0x0292,0x02bb,0x02bc,0x02bd,0x02c6,0x02c7,0x02d8,0x02d9,0x02db,0x02dc,0x02dd,0x0300,0x0301, 0x0302,0x0303,0x0304,0x0305,0x0306,0x0307,0x0308,0x030a,0x030b,0x030c,0x0329,0x0384,0x0385,0x0386,0x0387,0x0388, 0x0389,0x038a,0x038c,0x038e,0x038f,0x0390,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039a, 0x039b,0x039c,0x039d,0x039e,0x039f,0x03a0,0x03a1,0x03a3,0x03a4,0x03a5,0x03a6,0x03a7,0x03a8,0x03a9,0x03aa,0x03ab, 0x03ac,0x03ad,0x03ae,0x03af,0x03b0,0x03b1,0x03b2,0x03b3,0x03b4,0x03b5,0x03b6,0x03b7,0x03b8,0x03b9,0x03ba,0x03bb, 0x03bc,0x03bd,0x03be,0x03bf,0x03c0,0x03c1,0x03c2,0x03c3,0x03c4,0x03c5,0x03c6,0x03c7,0x03c8,0x03c9,0x03ca,0x03cb, 0x03cc,0x03cd,0x03ce,0x03d1,0x03d5,0x03f0,0x03f1,0x03f2,0x03f3,0x03f4,0x03f5,0x03f6,0x0400,0x0401,0x0402,0x0403, 0x0404,0x0405,0x0406,0x0407,0x0408,0x0409,0x040a,0x040b,0x040c,0x040d,0x040e,0x040f,0x0410,0x0411,0x0412,0x0413, 0x0414,0x0415,0x0416,0x0417,0x0418,0x0419,0x041a,0x041b,0x041c,0x041d,0x041e,0x041f,0x0420,0x0421,0x0422,0x0423, 0x0424,0x0425,0x0426,0x0427,0x0428,0x0429,0x042a,0x042b,0x042c,0x042d,0x042e,0x042f,0x0430,0x0431,0x0432,0x0433, 0x0434,0x0435,0x0436,0x0437,0x0438,0x0439,0x043a,0x043b,0x043c,0x043d,0x043e,0x043f,0x0440,0x0441,0x0442,0x0443, 0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,0x044a,0x044b,0x044c,0x044d,0x044e,0x044f,0x0450,0x0451,0x0452,0x0453, 0x0454,0x0455,0x0456,0x0457,0x0458,0x0459,0x045a,0x045b,0x045c,0x045d,0x045e,0x045f,0x0462,0x0463,0x046a,0x046b, 0x0490,0x0491,0x0492,0x0493,0x0494,0x0495,0x0496,0x0497,0x0498,0x0499,0x049a,0x049b,0x049c,0x049d,0x04a0,0x04a1, 0x04a2,0x04a3,0x04a4,0x04a5,0x04aa,0x04ab,0x04ae,0x04af,0x04b0,0x04b1,0x04b2,0x04b3,0x04b6,0x04b7,0x04b8,0x04b9, 0x04ba,0x04bb,0x04c0,0x04c1,0x04c2,0x04cf,0x04d0,0x04d1,0x04d2,0x04d3,0x04d4,0x04d5,0x04d6,0x04d7,0x04d8,0x04d9, 0x04da,0x04db,0x04dc,0x04dd,0x04de,0x04df,0x04e2,0x04e3,0x04e4,0x04e5,0x04e6,0x04e7,0x04e8,0x04e9,0x04ea,0x04eb, 0x04ec,0x04ed,0x04ee,0x04ef,0x04f0,0x04f1,0x04f2,0x04f3,0x04f4,0x04f5,0x04f8,0x04f9,0x05d0,0x05d1,0x05d2,0x05d3, 0x05d4,0x05d5,0x05d6,0x05d7,0x05d8,0x05d9,0x05da,0x05db,0x05dc,0x05dd,0x05de,0x05df,0x05e0,0x05e1,0x05e2,0x05e3, 0x05e4,0x05e5,0x05e6,0x05e7,0x05e8,0x05e9,0x05ea,0x1e0c,0x1e0d,0x1e34,0x1e35,0x1e36,0x1e37,0x1e40,0x1e41,0x1e42, 0x1e43,0x1e44,0x1e45,0x1e46,0x1e47,0x1e6c,0x1e6d,0x1eb8,0x1eb9,0x1ebc,0x1ebd,0x1eca,0x1ecb,0x1ecc,0x1ecd,0x1ee4, 0x1ee5,0x1ef8,0x1ef9,0x2000,0x2001,0x2002,0x2003,0x2004,0x2005,0x2006,0x2007,0x2008,0x2009,0x200a,0x200b,0x200c, 0x200d,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x2015,0x2016,0x2017,0x2018,0x2019,0x201a,0x201b,0x201c, 0x201d,0x201e,0x201f,0x2020,0x2021,0x2022,0x2026,0x2030,0x2032,0x2033,0x2039,0x203a,0x203c,0x203e,0x2070,0x2071, 0x2074,0x2075,0x2076,0x2077,0x2078,0x2079,0x207a,0x207b,0x207c,0x207d,0x207e,0x207f,0x2080,0x2081,0x2082,0x2083, 0x2084,0x2085,0x2086,0x2087,0x2088,0x2089,0x208a,0x208b,0x208c,0x208d,0x208e,0x2090,0x2091,0x2092,0x2093,0x2094, 0x2095,0x2096,0x2097,0x2098,0x209a,0x20a7,0x20aa,0x20ac,0x20ae,0x2102,0x210e,0x210f,0x2115,0x2116,0x211a,0x211d, 0x2122,0x2124,0x2126,0x2135,0x2190,0x2191,0x2192,0x2193,0x2194,0x2195,0x21a4,0x21a6,0x21a8,0x21b5,0x21bb,0x21cb, 0x21cc,0x21d0,0x21d1,0x21d2,0x21d3,0x21d4,0x21d5,0x2200,0x2203,0x2204,0x2205,0x2206,0x2207,0x2208,0x2209,0x220a, 0x220b,0x220c,0x220d,0x2212,0x2213,0x2214,0x2215,0x2216,0x2219,0x221a,0x221e,0x221f,0x2225,0x2227,0x2228,0x2229, 0x222a,0x2248,0x2260,0x2261,0x2264,0x2265,0x226a,0x226b,0x2282,0x2283,0x2286,0x2287,0x22a5,0x22c2,0x22c3,0x2300, 0x2302,0x2308,0x2309,0x230a,0x230b,0x2310,0x2319,0x2320,0x2321,0x239b,0x239c,0x239d,0x239e,0x239f,0x23a0,0x23a1, 0x23a2,0x23a3,0x23a4,0x23a5,0x23a6,0x23a7,0x23a8,0x23a9,0x23ab,0x23ac,0x23ad,0x23ae,0x23af,0x23ba,0x23bb,0x23bc, 0x23bd,0x23d0,0x2409,0x240a,0x240b,0x240c,0x240d,0x2424,0x2500,0x2501,0x2502,0x2503,0x2508,0x2509,0x250a,0x250b, 0x250c,0x250d,0x250e,0x250f,0x2510,0x2511,0x2512,0x2513,0x2514,0x2515,0x2516,0x2517,0x2518,0x2519,0x251a,0x251b, 0x251c,0x251d,0x251e,0x251f,0x2520,0x2521,0x2522,0x2523,0x2524,0x2525,0x2526,0x2527,0x2528,0x2529,0x252a,0x252b, 0x252c,0x252d,0x252e,0x252f,0x2530,0x2531,0x2532,0x2533,0x2534,0x2535,0x2536,0x2537,0x2538,0x2539,0x253a,0x253b, 0x253c,0x253d,0x253e,0x253f,0x2540,0x2541,0x2542,0x2543,0x2544,0x2545,0x2546,0x2547,0x2548,0x2549,0x254a,0x254b, 0x2550,0x2551,0x2552,0x2553,0x2554,0x2555,0x2556,0x2557,0x2558,0x2559,0x255a,0x255b,0x255c,0x255d,0x255e,0x255f, 0x2560,0x2561,0x2562,0x2563,0x2564,0x2565,0x2566,0x2567,0x2568,0x2569,0x256a,0x256b,0x256c,0x256d,0x256e,0x256f, 0x2570,0x2571,0x2572,0x2573,0x2574,0x2575,0x2576,0x2577,0x2578,0x2579,0x257a,0x257b,0x257c,0x257d,0x257e,0x257f, 0x2580,0x2581,0x2582,0x2583,0x2584,0x2585,0x2586,0x2587,0x2588,0x2589,0x258a,0x258b,0x258c,0x258d,0x258e,0x258f, 0x2590,0x2591,0x2592,0x2593,0x2596,0x2597,0x2598,0x2599,0x259a,0x259b,0x259c,0x259d,0x259e,0x259f,0x25a0,0x25ac, 0x25ae,0x25b2,0x25b6,0x25ba,0x25bc,0x25c0,0x25c4,0x25c6,0x25ca,0x25cb,0x25cf,0x25d8,0x25d9,0x263a,0x263b,0x263c, 0x2640,0x2642,0x2660,0x2663,0x2665,0x2666,0x266a,0x266b,0x2713,0x2714,0x2717,0x2718,0x27e8,0x27e9,0x27ea,0x27eb, 0x2800,0x2801,0x2802,0x2803,0x2804,0x2805,0x2806,0x2807,0x2808,0x2809,0x280a,0x280b,0x280c,0x280d,0x280e,0x280f, 0x2810,0x2811,0x2812,0x2813,0x2814,0x2815,0x2816,0x2817,0x2818,0x2819,0x281a,0x281b,0x281c,0x281d,0x281e,0x281f, 0x2820,0x2821,0x2822,0x2823,0x2824,0x2825,0x2826,0x2827,0x2828,0x2829,0x282a,0x282b,0x282c,0x282d,0x282e,0x282f, 0x2830,0x2831,0x2832,0x2833,0x2834,0x2835,0x2836,0x2837,0x2838,0x2839,0x283a,0x283b,0x283c,0x283d,0x283e,0x283f, 0x2840,0x2841,0x2842,0x2843,0x2844,0x2845,0x2846,0x2847,0x2848,0x2849,0x284a,0x284b,0x284c,0x284d,0x284e,0x284f, 0x2850,0x2851,0x2852,0x2853,0x2854,0x2855,0x2856,0x2857,0x2858,0x2859,0x285a,0x285b,0x285c,0x285d,0x285e,0x285f, 0x2860,0x2861,0x2862,0x2863,0x2864,0x2865,0x2866,0x2867,0x2868,0x2869,0x286a,0x286b,0x286c,0x286d,0x286e,0x286f, 0x2870,0x2871,0x2872,0x2873,0x2874,0x2875,0x2876,0x2877,0x2878,0x2879,0x287a,0x287b,0x287c,0x287d,0x287e,0x287f, 0x2880,0x2881,0x2882,0x2883,0x2884,0x2885,0x2886,0x2887,0x2888,0x2889,0x288a,0x288b,0x288c,0x288d,0x288e,0x288f, 0x2890,0x2891,0x2892,0x2893,0x2894,0x2895,0x2896,0x2897,0x2898,0x2899,0x289a,0x289b,0x289c,0x289d,0x289e,0x289f, 0x28a0,0x28a1,0x28a2,0x28a3,0x28a4,0x28a5,0x28a6,0x28a7,0x28a8,0x28a9,0x28aa,0x28ab,0x28ac,0x28ad,0x28ae,0x28af, 0x28b0,0x28b1,0x28b2,0x28b3,0x28b4,0x28b5,0x28b6,0x28b7,0x28b8,0x28b9,0x28ba,0x28bb,0x28bc,0x28bd,0x28be,0x28bf, 0x28c0,0x28c1,0x28c2,0x28c3,0x28c4,0x28c5,0x28c6,0x28c7,0x28c8,0x28c9,0x28ca,0x28cb,0x28cc,0x28cd,0x28ce,0x28cf, 0x28d0,0x28d1,0x28d2,0x28d3,0x28d4,0x28d5,0x28d6,0x28d7,0x28d8,0x28d9,0x28da,0x28db,0x28dc,0x28dd,0x28de,0x28df, 0x28e0,0x28e1,0x28e2,0x28e3,0x28e4,0x28e5,0x28e6,0x28e7,0x28e8,0x28e9,0x28ea,0x28eb,0x28ec,0x28ed,0x28ee,0x28ef, 0x28f0,0x28f1,0x28f2,0x28f3,0x28f4,0x28f5,0x28f6,0x28f7,0x28f8,0x28f9,0x28fa,0x28fb,0x28fc,0x28fd,0x28fe,0x28ff, 0x2e2c,0xe0a0,0xe0a1,0xe0a2,0xe0b0,0xe0b1,0xe0b2,0xe0b3,0xf6be,0xfffd }; } // namespace // -- end of autogenerated text --- namespace fixed_font_32n { // -- start of autogenerated text --- // definition section for font: ter-u32n.bdf constexpr int CHARCOUNT = 1354; constexpr int WIDTH = 16; constexpr int HEIGHT = 32; constexpr int OFFSET_X = 0; constexpr int OFFSET_Y = 0; constexpr FixedFont_info_t fixedfont_info = { "Terminus", // font name "ter-u32n.bdf", // font name internal CHARCOUNT, // num of chars WIDTH, HEIGHT, OFFSET_X, OFFSET_Y, false // bold }; // font bitmap definitions constexpr std::array fixedfont_bitmap = { 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3c3c,0x3c3c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x300c,0x300c, 0x300c,0x300c,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x3c3c,0x3c3c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0020 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0021 0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0022 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0c30,0x3ffc,0x3ffc,0x0c30,0x0c30,0x0c30, 0x0c30,0x0c30,0x0c30,0x3ffc,0x3ffc,0x0c30,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0023 0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0ff0,0x1ff8,0x399c,0x318c,0x3180,0x3180,0x3180,0x3980,0x1ff0, 0x0ff8,0x019c,0x018c,0x018c,0x018c,0x318c,0x399c,0x1ff8,0x0ff0,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000, // u0024 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e18,0x3f18,0x3330,0x3330,0x3f60,0x1e60,0x00c0,0x00c0,0x0180,0x0180, 0x0300,0x0300,0x0600,0x0600,0x0cf0,0x0df8,0x1998,0x1998,0x31f8,0x30f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0025 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f80,0x1fc0,0x38e0,0x3060,0x3060,0x3060,0x38e0,0x1dc0,0x0f80,0x0f00, 0x1f8c,0x39dc,0x70f8,0x6070,0x6030,0x6030,0x6070,0x70f8,0x3fdc,0x1f8c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0026 0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0027 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x00e0,0x01c0,0x0380,0x0300,0x0700,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0700,0x0300,0x0380,0x01c0,0x00e0,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0028 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0700,0x0380,0x01c0,0x00c0,0x00e0,0x0060,0x0060,0x0060,0x0060, 0x0060,0x0060,0x0060,0x0060,0x00e0,0x00c0,0x01c0,0x0380,0x0700,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0029 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x1c70,0x0ee0,0x07c0,0x0380,0x7ffc, 0x7ffc,0x0380,0x07c0,0x0ee0,0x1c70,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0180,0x3ffc, 0x3ffc,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0380,0x0300,0x0600,0x0000,0x0000,0x0000,0x0000, // u002c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc, 0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0030,0x0030,0x0060,0x0060,0x00c0,0x00c0,0x0180,0x0180, 0x0300,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x301c,0x303c,0x307c,0x30ec,0x31cc, 0x338c,0x370c,0x3e0c,0x3c0c,0x380c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0030 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0380,0x0780,0x0f80,0x0d80,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0ff0,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0031 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x000c,0x001c,0x0038, 0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0032 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x000c,0x000c,0x000c,0x001c,0x07f8, 0x07f8,0x001c,0x000c,0x000c,0x000c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0033 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x000c,0x001c,0x003c,0x007c,0x00ec,0x01cc,0x038c,0x070c,0x0e0c,0x1c0c, 0x380c,0x300c,0x300c,0x3ffc,0x3ffc,0x000c,0x000c,0x000c,0x000c,0x000c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0034 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ff0,0x3ff8, 0x001c,0x000c,0x000c,0x000c,0x000c,0x000c,0x300c,0x380c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0035 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff8,0x1ff8,0x3800,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ff0,0x3ff8, 0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0036 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x300c,0x300c,0x300c,0x3018,0x0018,0x0030,0x0030,0x0060, 0x0060,0x00c0,0x00c0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0037 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8, 0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0038 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c, 0x1ffc,0x0ffc,0x000c,0x000c,0x000c,0x000c,0x000c,0x001c,0x1ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0039 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0380,0x0300,0x0600,0x0000,0x0000,0x0000,0x0000, // u003b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x001c,0x0038,0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800, 0x3800,0x1c00,0x0e00,0x0700,0x0380,0x01c0,0x00e0,0x0070,0x0038,0x001c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x0000,0x0000, 0x0000,0x0000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x1c00,0x0e00,0x0700,0x0380,0x01c0,0x00e0,0x0070,0x0038,0x001c, 0x001c,0x0038,0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x001c,0x0038,0x0070, 0x00e0,0x01c0,0x0180,0x0180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x701c,0x600c,0x61fc,0x63fc,0x670c,0x660c,0x660c,0x660c, 0x660c,0x660c,0x660c,0x671c,0x63fc,0x61ec,0x6000,0x7000,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0040 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x3ffc,0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0041 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x301c,0x300c,0x300c,0x300c,0x300c,0x3018,0x3ff0,0x3ff0, 0x3038,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x301c,0x3ff8,0x3ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0042 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0043 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x3ff0,0x3038,0x3018,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x3018,0x3038,0x3ff0,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0044 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3fe0, 0x3fe0,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0045 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3fe0, 0x3fe0,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0046 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x3000,0x3000,0x3000,0x3000,0x30fc, 0x30fc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0047 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x3ffc, 0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0048 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07e0,0x07e0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0049 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x007e,0x007e,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018, 0x0018,0x0018,0x0018,0x0018,0x3018,0x3018,0x3018,0x3838,0x1ff0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u004a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x301c,0x3038,0x3070,0x30e0,0x31c0,0x3380,0x3700,0x3e00,0x3c00, 0x3c00,0x3e00,0x3700,0x3380,0x31c0,0x30e0,0x3070,0x3038,0x301c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u004b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u004c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x600c,0x600c,0x701c,0x783c,0x6c6c,0x6c6c,0x67cc,0x638c,0x638c,0x610c, 0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u004d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x3c0c,0x3e0c,0x370c,0x338c, 0x31cc,0x30ec,0x307c,0x303c,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u004e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u004f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x301c, 0x3ff8,0x3ff0,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0050 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x31cc,0x38fc,0x1ff8,0x0ff8,0x001c,0x000e,0x0000,0x0000,0x0000,0x0000, // u0051 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x301c, 0x3ff8,0x3ff0,0x3700,0x3380,0x31c0,0x30e0,0x3070,0x3038,0x301c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0052 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x3000,0x3000,0x3000,0x3800,0x1ff0, 0x0ff8,0x001c,0x000c,0x000c,0x000c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0053 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0054 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0055 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x1818,0x1818,0x1818,0x1818,0x1818, 0x0c30,0x0c30,0x0c30,0x0c30,0x0660,0x0660,0x0660,0x03c0,0x03c0,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0056 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c, 0x610c,0x638c,0x638c,0x67cc,0x6c6c,0x6c6c,0x783c,0x701c,0x600c,0x600c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0057 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x1818,0x1818,0x0c30,0x0c30,0x0660,0x0660,0x03c0,0x03c0, 0x03c0,0x03c0,0x0660,0x0660,0x0c30,0x0c30,0x1818,0x1818,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0058 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x1818,0x1818,0x0c30,0x0c30,0x0660,0x0660,0x03c0, 0x03c0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0059 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x000c,0x000c,0x000c,0x001c,0x0038,0x0070,0x00e0,0x01c0, 0x0380,0x0700,0x0e00,0x1c00,0x3800,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0x0fe0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x1800,0x1800,0x0c00,0x0c00,0x0600,0x0600,0x0300,0x0300, 0x0180,0x0180,0x00c0,0x00c0,0x0060,0x0060,0x0030,0x0030,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0x0fe0,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060, 0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005d 0x0000,0x0000,0x0000,0x0000,0x0180,0x03c0,0x07e0,0x0e70,0x1c38,0x381c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000, // u005f 0x0000,0x0e00,0x0700,0x0380,0x01c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0060 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x1ff8,0x001c,0x000c, 0x000c,0x0ffc,0x1ffc,0x380c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0061 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ff0,0x3ff8,0x301c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x301c,0x3ff8,0x3ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0062 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0063 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x0ffc,0x1ffc,0x380c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0064 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x380c,0x1ffc,0x0ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0065 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x007e,0x00fe,0x01c0,0x0180,0x0180,0x0180,0x1ff8,0x1ff8,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0066 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ffc,0x1ffc,0x380c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x000c,0x000c,0x001c,0x1ff8,0x1ff0,0x0000, // u0067 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ff0,0x3ff8,0x301c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0068 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0780,0x0780,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0069 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0078,0x0078,0x0018,0x0018, 0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x1818,0x1818,0x1c38,0x0ff0,0x07e0,0x0000, // u006a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x181c,0x1838,0x1870,0x18e0, 0x19c0,0x1b80,0x1f00,0x1f00,0x1b80,0x19c0,0x18e0,0x1870,0x1838,0x181c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u006b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0780,0x0780,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u006c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x319c,0x318c, 0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u006d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x301c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u006e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u006f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x301c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x301c,0x3ff8,0x3ff0,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000, // u0070 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ffc,0x1ffc,0x380c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x000c,0x000c,0x000c,0x000c,0x000c,0x0000, // u0071 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x33fc,0x37fc,0x3e00,0x3c00, 0x3800,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0072 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x3000, 0x3000,0x3800,0x1ff0,0x0ff8,0x001c,0x000c,0x000c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0073 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x3ff0,0x3ff0,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0380,0x01fc,0x00fc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0074 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0075 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x1818, 0x1818,0x1818,0x0c30,0x0c30,0x0c30,0x0660,0x0660,0x03c0,0x03c0,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0076 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x399c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0077 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x381c,0x1c38, 0x0e70,0x07e0,0x03c0,0x03c0,0x07e0,0x0e70,0x1c38,0x381c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0078 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x000c,0x000c,0x001c,0x1ff8,0x1ff0,0x0000, // u0079 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x001c,0x0038, 0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00f0,0x01f0,0x0380,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x1e00, 0x1e00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0380,0x01f0,0x00f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x1f00,0x0380,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x00f0, 0x00f0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0380,0x1f00,0x1e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007d 0x0000,0x0000,0x0000,0x0000,0x0e0c,0x1f0c,0x3b8c,0x31dc,0x30f8,0x3070,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0ff0,0x1ff8,0x399c,0x318c, 0x3180,0x3180,0x3180,0x3180,0x3180,0x3180,0x318c,0x399c,0x1ff8,0x0ff0,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000, // u00a2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03e0,0x07f0,0x0e38,0x0c18,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x3fe0, 0x3fe0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c0c,0x0c0c,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x381c,0x1c38,0x0ff0,0x0ff0,0x1c38,0x1818,0x1818, 0x1818,0x1818,0x1c38,0x0ff0,0x0ff0,0x1c38,0x381c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x1818,0x1818,0x0c30,0x0c30,0x0660,0x0660,0x03c0,0x03c0, 0x0180,0x0180,0x1ff8,0x1ff8,0x0180,0x0180,0x1ff8,0x1ff8,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000, 0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a6 0x0000,0x0000,0x0000,0x0000,0x07c0,0x0fe0,0x1c70,0x1830,0x1800,0x1c00,0x0f80,0x0fc0,0x18e0,0x1870,0x1830,0x1830, 0x1830,0x1c30,0x0e30,0x07e0,0x03e0,0x0070,0x0030,0x1830,0x1c70,0x0fe0,0x07c0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a7 0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff8,0x3ffc,0x700e,0x67e6,0x6ff6,0x6c36,0x6c06,0x6c06, 0x6c06,0x6c06,0x6c36,0x6ff6,0x67e6,0x700e,0x3ffc,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a9 0x0000,0x0000,0x0fe0,0x0ff0,0x0038,0x0018,0x07f8,0x0ff8,0x1c18,0x1818,0x1c18,0x0ff8,0x07f8,0x0000,0x0000,0x1ff8, 0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01ce,0x039c,0x0738,0x0e70, 0x1ce0,0x39c0,0x7380,0x7380,0x39c0,0x1ce0,0x0e70,0x0738,0x039c,0x01ce,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ab 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x000c,0x000c, 0x000c,0x000c,0x000c,0x000c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ac 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff8, 0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ad 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff8,0x3ffc,0x700e,0x6fe6,0x6ff6,0x6c36,0x6c36,0x6c36, 0x6fe6,0x6fc6,0x6dc6,0x6ce6,0x6c76,0x700e,0x3ffc,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ae 0x0000,0x0000,0x0ff0,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00af 0x0000,0x0000,0x0000,0x0000,0x07e0,0x0ff0,0x0c30,0x0c30,0x0c30,0x0c30,0x0ff0,0x07e0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0180,0x3ffc, 0x3ffc,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b1 0x0000,0x0000,0x0000,0x07e0,0x0ff0,0x0c30,0x0c30,0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0ff0,0x0ff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b2 0x0000,0x0000,0x0000,0x07e0,0x0ff0,0x0c30,0x0030,0x01e0,0x01e0,0x0030,0x0030,0x0c30,0x0ff0,0x07e0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b3 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x301c,0x303c,0x307c,0x3fec,0x3fcc,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000, // u00b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ffc,0x3ffc,0x718c,0x618c,0x618c,0x618c,0x618c,0x618c,0x718c,0x3f8c, 0x1f8c,0x018c,0x018c,0x018c,0x018c,0x018c,0x018c,0x018c,0x018c,0x018c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180, 0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0380,0x0300,0x0600,0x0000, // u00b8 0x0000,0x0000,0x0000,0x0180,0x0380,0x0780,0x0780,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b9 0x0000,0x0000,0x07e0,0x0ff0,0x1c38,0x1818,0x1818,0x1818,0x1818,0x1818,0x1c38,0x0ff0,0x07e0,0x0000,0x0000,0x1ff8, 0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7380,0x39c0,0x1ce0,0x0e70, 0x0738,0x039c,0x01ce,0x01ce,0x039c,0x0738,0x0e70,0x1ce0,0x39c0,0x7380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x1c00,0x3c00,0x0c00,0x0c06,0x0c0e,0x0c1c,0x0c38,0x0c70,0x00e0, 0x01c6,0x038e,0x071e,0x0e36,0x1c66,0x38c6,0x71fe,0x61fe,0x0006,0x0006,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x3800,0x7806,0x180e,0x181c,0x1838,0x1870,0x18e0,0x19c0,0x0380, 0x0700,0x0e7c,0x1cfe,0x38c6,0x70c6,0x600c,0x0018,0x0030,0x007e,0x00fe,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00bd 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x7f80,0x6180,0x0f00,0x0f00,0x0186,0x618e,0x7f9c,0x3f38,0x0070, 0x00e6,0x01ce,0x039e,0x0736,0x0e66,0x1cc6,0x39fe,0x71fe,0x6006,0x0006,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00be 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0300, 0x0600,0x0c00,0x1800,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00bf 0x0000,0x0e00,0x0700,0x0380,0x01c0,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x3ffc,0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c0 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x3ffc,0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c1 0x0000,0x0180,0x03c0,0x07e0,0x0e70,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x3ffc,0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c2 0x0000,0x0f18,0x1b98,0x19d8,0x18f0,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x3ffc,0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c3 0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x3ffc,0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c4 0x0000,0x03c0,0x0660,0x0660,0x0660,0x03c0,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x3ffc,0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fff,0x3fff,0x70c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7ffe, 0x7ffe,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60ff,0x60ff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0180,0x0180,0x0380,0x0300,0x0600,0x0000, // u00c7 0x0000,0x0e00,0x0700,0x0380,0x01c0,0x0000,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3fe0, 0x3fe0,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c8 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3fe0, 0x3fe0,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c9 0x0000,0x0180,0x03c0,0x07e0,0x0e70,0x0000,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3fe0, 0x3fe0,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ca 0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3fe0, 0x3fe0,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cb 0x0000,0x0e00,0x0700,0x0380,0x01c0,0x0000,0x07e0,0x07e0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cc 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x07e0,0x07e0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cd 0x0000,0x0180,0x03c0,0x07e0,0x0e70,0x0000,0x07e0,0x07e0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ce 0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x07e0,0x07e0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x3ff0,0x3038,0x3018,0x300c,0x300c,0x300c,0x300c,0x300c,0x7f8c, 0x7f8c,0x300c,0x300c,0x300c,0x300c,0x300c,0x3018,0x3038,0x3ff0,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d0 0x0000,0x0f18,0x1b98,0x19d8,0x18f0,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x3c0c,0x3e0c,0x370c,0x338c, 0x31cc,0x30ec,0x307c,0x303c,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d1 0x0000,0x0e00,0x0700,0x0380,0x01c0,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d2 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d3 0x0000,0x0180,0x03c0,0x07e0,0x0e70,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d4 0x0000,0x0f18,0x1b98,0x19d8,0x18f0,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d5 0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x3838,0x1c70,0x0ee0,0x07c0, 0x0380,0x07c0,0x0ee0,0x1c70,0x3838,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300e,0x300e,0x301c,0x303c,0x307c,0x30ec,0x31cc, 0x338c,0x370c,0x3e0c,0x3c0c,0x380c,0x700c,0x700c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d8 0x0000,0x0e00,0x0700,0x0380,0x01c0,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d9 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00da 0x0000,0x0180,0x03c0,0x07e0,0x0e70,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00db 0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00dc 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x300c,0x300c,0x300c,0x1818,0x1818,0x0c30,0x0c30,0x0660,0x0660,0x03c0, 0x03c0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00dd 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3ff0,0x3ff8,0x301c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x301c,0x3ff8,0x3ff0,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00de 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fe0,0x3ff0,0x3038,0x3018,0x3018,0x3018,0x3018,0x3030,0x3ff0,0x3ff0, 0x3038,0x301c,0x300c,0x300c,0x300c,0x300c,0x380c,0x3c1c,0x37f8,0x33f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00df 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x0700,0x0380,0x01c0,0x0000,0x0000,0x1ff0,0x1ff8,0x001c,0x000c, 0x000c,0x0ffc,0x1ffc,0x380c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x1ff0,0x1ff8,0x001c,0x000c, 0x000c,0x0ffc,0x1ffc,0x380c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x03c0,0x07e0,0x0e70,0x0000,0x0000,0x1ff0,0x1ff8,0x001c,0x000c, 0x000c,0x0ffc,0x1ffc,0x380c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f18,0x1b98,0x19d8,0x18f0,0x0000,0x0000,0x1ff0,0x1ff8,0x001c,0x000c, 0x000c,0x0ffc,0x1ffc,0x380c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x1ff0,0x1ff8,0x001c,0x000c, 0x000c,0x0ffc,0x1ffc,0x380c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03c0,0x0660,0x0660,0x0660,0x03c0,0x0000,0x1ff0,0x1ff8,0x001c,0x000c, 0x000c,0x0ffc,0x1ffc,0x380c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ef8,0x3ffc,0x018e,0x0186, 0x0186,0x1f86,0x3ffe,0x71fe,0x6180,0x6180,0x6180,0x71c6,0x3ffe,0x1f7c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x300c,0x381c,0x1ff8,0x0ff0,0x0180,0x0180,0x0380,0x0300,0x0600,0x0000, // u00e7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x0700,0x0380,0x01c0,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x380c,0x1ffc,0x0ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x380c,0x1ffc,0x0ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x03c0,0x07e0,0x0e70,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x380c,0x1ffc,0x0ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ea 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x380c,0x1ffc,0x0ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00eb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0e00,0x0700,0x0380,0x0000,0x0000,0x0780,0x0780,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ec 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x0780,0x0780,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ed 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x03c0,0x07e0,0x0e70,0x0000,0x0000,0x0780,0x0780,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ee 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x0780,0x0780,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ef 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1dc0,0x0f80,0x1f00,0x3b80,0x01c0,0x00e0,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f18,0x1b98,0x19d8,0x18f0,0x0000,0x0000,0x3ff0,0x3ff8,0x301c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x0700,0x0380,0x01c0,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x03c0,0x07e0,0x0e70,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f18,0x1b98,0x19d8,0x18f0,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x3ffc, 0x3ffc,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff6,0x1ffe,0x381c,0x303c, 0x307c,0x30ec,0x31cc,0x338c,0x370c,0x3e0c,0x3c0c,0x381c,0x7ff8,0x6ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x0700,0x0380,0x01c0,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00fa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x03c0,0x07e0,0x0e70,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00fb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00fc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x000c,0x000c,0x001c,0x1ff8,0x1ff0,0x0000, // u00fd 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ff0,0x3ff8,0x301c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x301c,0x3ff8,0x3ff0,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000, // u00fe 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x000c,0x000c,0x001c,0x1ff8,0x1ff0,0x0000, // u00ff 0x0000,0x0000,0x0ff0,0x0ff0,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x3ffc,0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0100 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x0ff0,0x0000,0x0000,0x1ff0,0x1ff8,0x001c,0x000c, 0x000c,0x0ffc,0x1ffc,0x380c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0101 0x0000,0x0c30,0x0c30,0x07e0,0x03c0,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x3ffc,0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0102 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x07e0,0x03c0,0x0000,0x0000,0x1ff0,0x1ff8,0x001c,0x000c, 0x000c,0x0ffc,0x1ffc,0x380c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0103 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x3ffc,0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x003c,0x0070,0x0060,0x007c,0x003c,0x0000, // u0104 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x1ff8,0x001c,0x000c, 0x000c,0x0ffc,0x1ffc,0x380c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x003c,0x0070,0x0060,0x007c,0x003c,0x0000, // u0105 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0106 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0107 0x0000,0x0180,0x03c0,0x07e0,0x0e70,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0108 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x03c0,0x07e0,0x0e70,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0109 0x0000,0x0180,0x0180,0x0180,0x0180,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u010a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u010b 0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u010c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u010d 0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x3fc0,0x3ff0,0x3038,0x3018,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x3018,0x3038,0x3ff0,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u010e 0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x0ffc,0x1ffc,0x380c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u010f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x3ff0,0x3038,0x3018,0x300c,0x300c,0x300c,0x300c,0x300c,0x7f8c, 0x7f8c,0x300c,0x300c,0x300c,0x300c,0x300c,0x3018,0x3038,0x3ff0,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0110 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x000c,0x000c,0x01ff,0x01ff,0x000c,0x000c,0x0ffc,0x1ffc,0x380c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0111 0x0000,0x0000,0x0ff0,0x0ff0,0x0000,0x0000,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3fe0, 0x3fe0,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0112 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x0ff0,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x380c,0x1ffc,0x0ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0113 0x0000,0x0c30,0x0c30,0x07e0,0x03c0,0x0000,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3fe0, 0x3fe0,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0114 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x07e0,0x03c0,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x380c,0x1ffc,0x0ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0115 0x0000,0x0180,0x0180,0x0180,0x0180,0x0000,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3fe0, 0x3fe0,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0116 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x380c,0x1ffc,0x0ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0117 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3fe0, 0x3fe0,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x003c,0x0070,0x0060,0x007c,0x003c,0x0000, // u0118 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x380c,0x1ffc,0x0ff8,0x01c0,0x0380,0x0300,0x03e0,0x01e0,0x0000, // u0119 0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3fe0, 0x3fe0,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u011a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x380c,0x1ffc,0x0ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u011b 0x0000,0x0180,0x03c0,0x07e0,0x0e70,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x3000,0x3000,0x3000,0x3000,0x30fc, 0x30fc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u011c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x03c0,0x07e0,0x0e70,0x0000,0x0000,0x0ffc,0x1ffc,0x380c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x000c,0x000c,0x001c,0x1ff8,0x1ff0,0x0000, // u011d 0x0000,0x0c30,0x0c30,0x07e0,0x03c0,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x3000,0x3000,0x3000,0x3000,0x30fc, 0x30fc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u011e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x07e0,0x03c0,0x0000,0x0000,0x0ffc,0x1ffc,0x380c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x000c,0x000c,0x001c,0x1ff8,0x1ff0,0x0000, // u011f 0x0000,0x0180,0x0180,0x0180,0x0180,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x3000,0x3000,0x3000,0x3000,0x30fc, 0x30fc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0120 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0ffc,0x1ffc,0x380c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x000c,0x000c,0x001c,0x1ff8,0x1ff0,0x0000, // u0121 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x3000,0x3000,0x3000,0x3000,0x30fc, 0x30fc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0180,0x0180,0x0380,0x0300,0x0600, // u0122 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0030,0x0060,0x00e0,0x00c0,0x00c0,0x0000,0x0ffc,0x1ffc,0x380c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x000c,0x000c,0x001c,0x1ff8,0x1ff0,0x0000, // u0123 0x0000,0x0180,0x03c0,0x07e0,0x0e70,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x3ffc, 0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0124 0x0000,0x0180,0x03c0,0x07e0,0x0e70,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ff0,0x3ff8,0x301c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0125 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x7ffe,0x7ffe,0x300c,0x300c,0x300c,0x300c,0x3ffc, 0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0126 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0xff80,0xff80,0x3000,0x3000,0x3ff0,0x3ff8,0x301c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0127 0x0000,0x0f18,0x1b98,0x19d8,0x18f0,0x0000,0x07e0,0x07e0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0128 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f18,0x1b98,0x19d8,0x18f0,0x0000,0x0000,0x0780,0x0780,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0129 0x0000,0x0000,0x0ff0,0x0ff0,0x0000,0x0000,0x07e0,0x07e0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u012a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x0ff0,0x0000,0x0000,0x0780,0x0780,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u012b 0x0000,0x0c30,0x0c30,0x07e0,0x03c0,0x0000,0x07e0,0x07e0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u012c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x07e0,0x03c0,0x0000,0x0000,0x0780,0x0780,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u012d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07e0,0x07e0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0180,0x0380,0x0300,0x03e0,0x01e0,0x0000, // u012e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0780,0x0780,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0180,0x0380,0x0300,0x03e0,0x01e0,0x0000, // u012f 0x0000,0x0180,0x0180,0x0180,0x0180,0x0000,0x07e0,0x07e0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0130 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0780,0x0780,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0131 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf01e,0xf01e,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c, 0x600c,0x600c,0x600c,0x600c,0x630c,0x630c,0x630c,0x639c,0xf1f8,0xf0f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0132 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3006,0x3006,0x3006,0x3006,0x0000,0x0000,0x701e,0x701e,0x3006,0x3006, 0x3006,0x3006,0x3006,0x3006,0x3006,0x3006,0x3006,0x3006,0x7806,0x7806,0x0186,0x0186,0x01ce,0x00fc,0x0078,0x0000, // u0133 0x0000,0x0018,0x003c,0x007e,0x00e7,0x0000,0x007e,0x007e,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018, 0x0018,0x0018,0x0018,0x0018,0x3018,0x3018,0x3018,0x3838,0x1ff0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0134 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x003c,0x007e,0x00e7,0x0000,0x0000,0x0078,0x0078,0x0018,0x0018, 0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x1818,0x1818,0x1c38,0x0ff0,0x07e0,0x0000, // u0135 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x301c,0x3038,0x3070,0x30e0,0x31c0,0x3380,0x3700,0x3e00,0x3c00, 0x3c00,0x3e00,0x3700,0x3380,0x31c0,0x30e0,0x3070,0x3038,0x301c,0x300c,0x0000,0x0180,0x0180,0x0380,0x0300,0x0600, // u0136 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x181c,0x1838,0x1870,0x18e0, 0x19c0,0x1b80,0x1f00,0x1f00,0x1b80,0x19c0,0x18e0,0x1870,0x1838,0x181c,0x0000,0x0180,0x0180,0x0380,0x0300,0x0600, // u0137 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x181c,0x1838,0x1870,0x18e0, 0x19c0,0x1b80,0x1f00,0x1f00,0x1b80,0x19c0,0x18e0,0x1870,0x1838,0x181c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0138 0x0000,0x0700,0x0e00,0x1c00,0x3800,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0139 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0780,0x0780,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u013a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0180,0x0180,0x0380,0x0300,0x0600, // u013b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0780,0x0780,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0180,0x0180,0x0380,0x0300,0x0600, // u013c 0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u013d 0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x0780,0x0780,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u013e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3030,0x3030, 0x3030,0x3030,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u013f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0780,0x0780,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0183,0x0183, 0x0183,0x0183,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0140 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3300,0x3600,0x3c00, 0x3800,0x7000,0xf000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0141 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0780,0x0780,0x0180,0x0180,0x0180,0x0180,0x0180,0x01b0,0x01e0,0x01c0, 0x0380,0x0780,0x0d80,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0142 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x3c0c,0x3e0c,0x370c,0x338c, 0x31cc,0x30ec,0x307c,0x303c,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0143 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x3ff0,0x3ff8,0x301c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0144 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x3c0c,0x3e0c,0x370c,0x338c, 0x31cc,0x30ec,0x307c,0x303c,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0180,0x0180,0x0380,0x0300,0x0600, // u0145 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x301c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0180,0x0180,0x0380,0x0300,0x0600, // u0146 0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x3c0c,0x3e0c,0x370c,0x338c, 0x31cc,0x30ec,0x307c,0x303c,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0147 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x0000,0x3ff0,0x3ff8,0x301c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0148 0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x6000,0x6000,0x0000,0x0000,0x3ff0,0x3ff8,0x301c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0149 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x3c0c,0x3e0c,0x370c,0x338c, 0x31cc,0x30ec,0x307c,0x303c,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x000c,0x000c,0x001c,0x00f8,0x00f0,0x0000, // u014a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x301c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x000c,0x000c,0x001c,0x00f8,0x00f0,0x0000, // u014b 0x0000,0x0000,0x0ff0,0x0ff0,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u014c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x0ff0,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u014d 0x0000,0x0c30,0x0c30,0x07e0,0x03c0,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u014e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x07e0,0x03c0,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u014f 0x0000,0x01ce,0x039c,0x0738,0x0e70,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0150 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01ce,0x039c,0x0738,0x0e70,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0151 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fff,0x3fff,0x70c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60fe, 0x60fe,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x70c0,0x3fff,0x1fff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0152 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff8,0x3ffc,0x718e,0x6186, 0x6186,0x6186,0x61fe,0x61fe,0x6180,0x6180,0x6180,0x7186,0x3ffe,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0153 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x3ff0,0x3ff8,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x301c, 0x3ff8,0x3ff0,0x3700,0x3380,0x31c0,0x30e0,0x3070,0x3038,0x301c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0154 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x33fc,0x37fc,0x3e00,0x3c00, 0x3800,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0155 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x301c, 0x3ff8,0x3ff0,0x3700,0x3380,0x31c0,0x30e0,0x3070,0x3038,0x301c,0x300c,0x0000,0x0180,0x0180,0x0380,0x0300,0x0600, // u0156 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x31fc,0x33fc,0x3600,0x3c00, 0x3800,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000,0x3000,0x3000,0x7000,0x6000,0xc000, // u0157 0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x3ff0,0x3ff8,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x301c, 0x3ff8,0x3ff0,0x3700,0x3380,0x31c0,0x30e0,0x3070,0x3038,0x301c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0158 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x0000,0x33fc,0x37fc,0x3e00,0x3c00, 0x3800,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0159 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x3000,0x3000,0x3000,0x3800,0x1ff0, 0x0ff8,0x001c,0x000c,0x000c,0x000c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u015a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x3000, 0x3000,0x3800,0x1ff0,0x0ff8,0x001c,0x000c,0x000c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u015b 0x0000,0x0180,0x03c0,0x07e0,0x0e70,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x3000,0x3000,0x3000,0x3800,0x1ff0, 0x0ff8,0x001c,0x000c,0x000c,0x000c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u015c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x03c0,0x07e0,0x0e70,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x3000, 0x3000,0x3800,0x1ff0,0x0ff8,0x001c,0x000c,0x000c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u015d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x3000,0x3000,0x3000,0x3800,0x1ff0, 0x0ff8,0x001c,0x000c,0x000c,0x000c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0180,0x0180,0x0380,0x0300,0x0600,0x0000, // u015e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x3000, 0x3000,0x3800,0x1ff0,0x0ff8,0x001c,0x000c,0x000c,0x381c,0x1ff8,0x0ff0,0x0180,0x0180,0x0380,0x0300,0x0600,0x0000, // u015f 0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x3000,0x3000,0x3000,0x3800,0x1ff0, 0x0ff8,0x001c,0x000c,0x000c,0x000c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0160 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x3000, 0x3000,0x3800,0x1ff0,0x0ff8,0x001c,0x000c,0x000c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0161 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x00c0,0x00c0,0x01c0,0x0180,0x0300,0x0000, // u0162 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x3ff0,0x3ff0,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0380,0x01fc,0x00fc,0x0030,0x0030,0x0070,0x0060,0x00c0,0x0000, // u0163 0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x3ffc,0x3ffc,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0164 0x0000,0x1ce0,0x0fc0,0x0780,0x0300,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x3ff0,0x3ff0,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0380,0x01fc,0x00fc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0165 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0ff0, 0x0ff0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0166 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x3ff0,0x3ff0,0x0300,0x0300, 0x0fc0,0x0fc0,0x0300,0x0300,0x0300,0x0300,0x0300,0x0380,0x01fc,0x00fc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0167 0x0000,0x0f18,0x1b98,0x19d8,0x18f0,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0168 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f18,0x1b98,0x19d8,0x18f0,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0169 0x0000,0x0000,0x0ff0,0x0ff0,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u016a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x0ff0,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u016b 0x0000,0x0c30,0x0c30,0x07e0,0x03c0,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u016c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x07e0,0x03c0,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u016d 0x0000,0x03c0,0x0660,0x0660,0x0660,0x03c0,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u016e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03c0,0x0660,0x0660,0x0660,0x03c0,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u016f 0x0000,0x01ce,0x039c,0x0738,0x0e70,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0170 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01ce,0x039c,0x0738,0x0e70,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0171 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x01c0,0x0380,0x0300,0x03e0,0x01e0,0x0000, // u0172 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x003c,0x0070,0x0060,0x007c,0x003c,0x0000, // u0173 0x0000,0x0180,0x03c0,0x07e0,0x0e70,0x0000,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c, 0x610c,0x638c,0x638c,0x67cc,0x6c6c,0x6c6c,0x783c,0x701c,0x600c,0x600c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0174 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x03c0,0x07e0,0x0e70,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x399c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0175 0x0000,0x0180,0x03c0,0x07e0,0x0e70,0x0000,0x300c,0x300c,0x300c,0x1818,0x1818,0x0c30,0x0c30,0x0660,0x0660,0x03c0, 0x03c0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0176 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x03c0,0x07e0,0x0e70,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x000c,0x000c,0x001c,0x1ff8,0x1ff0,0x0000, // u0177 0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x300c,0x300c,0x300c,0x1818,0x1818,0x0c30,0x0c30,0x0660,0x0660,0x03c0, 0x03c0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0178 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x3ffc,0x3ffc,0x000c,0x000c,0x000c,0x001c,0x0038,0x0070,0x00e0,0x01c0, 0x0380,0x0700,0x0e00,0x1c00,0x3800,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0179 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x3ffc,0x3ffc,0x001c,0x0038, 0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u017a 0x0000,0x0180,0x0180,0x0180,0x0180,0x0000,0x3ffc,0x3ffc,0x000c,0x000c,0x000c,0x001c,0x0038,0x0070,0x00e0,0x01c0, 0x0380,0x0700,0x0e00,0x1c00,0x3800,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u017b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x3ffc,0x3ffc,0x001c,0x0038, 0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u017c 0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x3ffc,0x3ffc,0x000c,0x000c,0x000c,0x001c,0x0038,0x0070,0x00e0,0x01c0, 0x0380,0x0700,0x0e00,0x1c00,0x3800,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u017d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x0000,0x3ffc,0x3ffc,0x001c,0x0038, 0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u017e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00fc,0x01fc,0x0380,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u017f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x000c,0x000c,0x000c,0x000c,0x000c, 0x000c,0x000c,0x000c,0x000c,0x000c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0186 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x07fc, 0x07fc,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u018e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x000c,0x000c,0x000c,0x000c,0x3ffc, 0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u018f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x3000,0x3000,0x3000,0x3800,0x1fe0, 0x1fe0,0x3800,0x3000,0x3000,0x3000,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0190 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00f8,0x01fc,0x018c,0x018c,0x0180,0x0180,0x0180,0x0180,0x0ff0,0x0ff0, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x3180,0x3180,0x3f80,0x1f00,0x0000,0x0000, // u0192 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x3c0c,0x3e0c,0x370c,0x338c, 0x31cc,0x30ec,0x307c,0x303c,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x3000,0x3000,0x3000,0x7000,0xe000,0x0000, // u019d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x301c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x000c,0x000c,0x000c,0x000c,0x000c,0x0000, // u019e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x000c,0x000c,0x000c,0x001c,0x0038,0x0070,0x00e0,0x3ffc, 0x3ffc,0x0380,0x0700,0x0e00,0x1c00,0x3800,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x0038,0x0070, 0x00e0,0x01c0,0x3ff8,0x3ff8,0x0700,0x0e00,0x1c00,0x3800,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x001c,0x0038,0x0070,0x00e0,0x01c0,0x0380,0x07f0,0x07f8, 0x001c,0x000c,0x000c,0x000c,0x000c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01b7 0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x3ffc,0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01cd 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x0000,0x1ff0,0x1ff8,0x001c,0x000c, 0x000c,0x0ffc,0x1ffc,0x380c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01ce 0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x07e0,0x07e0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01cf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x0000,0x0780,0x0780,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d0 0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d2 0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d4 0x0000,0x0000,0x1ffc,0x1ffc,0x0000,0x0000,0x1fff,0x3fff,0x70c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7ffe, 0x7ffe,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60ff,0x60ff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff8,0x1ff8,0x0000,0x0000,0x3ef8,0x3ffc,0x018e,0x0186, 0x0186,0x1f86,0x3ffe,0x71fe,0x6180,0x6180,0x6180,0x71c6,0x3ffe,0x1f7c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x3000,0x3000,0x3000,0x3000,0x30fc, 0x30fc,0x300c,0x300c,0x30ff,0x30ff,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ffc,0x1ffc,0x380c,0x300c, 0x300c,0x300c,0x30ff,0x30ff,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x000c,0x000c,0x001c,0x1ff8,0x1ff0,0x0000, // u01e5 0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x3000,0x3000,0x3000,0x3000,0x30fc, 0x30fc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x0000,0x0ffc,0x1ffc,0x380c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x000c,0x000c,0x001c,0x1ff8,0x1ff0,0x0000, // u01e7 0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x300c,0x301c,0x3038,0x3070,0x30e0,0x31c0,0x3380,0x3700,0x3e00,0x3c00, 0x3c00,0x3e00,0x3700,0x3380,0x31c0,0x30e0,0x3070,0x3038,0x301c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e8 0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x181c,0x1838,0x1870,0x18e0, 0x19c0,0x1b80,0x1f00,0x1f00,0x1b80,0x19c0,0x18e0,0x1870,0x1838,0x181c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x01c0,0x0380,0x0300,0x03e0,0x01e0,0x0000, // u01ea 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x01c0,0x0380,0x0300,0x03e0,0x01e0,0x0000, // u01eb 0x0000,0x0000,0x0ff0,0x0ff0,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x01c0,0x0380,0x0300,0x03e0,0x01e0,0x0000, // u01ec 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x0ff0,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x01c0,0x0380,0x0300,0x03e0,0x01e0,0x0000, // u01ed 0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x3ffc,0x3ffc,0x001c,0x0038,0x0070,0x00e0,0x01c0,0x0380,0x07f0,0x07f8, 0x001c,0x000c,0x000c,0x000c,0x000c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01ee 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x0000,0x3ffc,0x3ffc,0x001c,0x0038, 0x0070,0x00e0,0x01c0,0x0380,0x07f0,0x07f8,0x001c,0x000c,0x000c,0x000c,0x000c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000, // u01ef 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00e7,0x007e,0x003c,0x0018,0x0000,0x0000,0x0078,0x0078,0x0018,0x0018, 0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x1818,0x1818,0x1c38,0x0ff0,0x07e0,0x0000, // u01f0 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x3000,0x3000,0x3000,0x3000,0x30fc, 0x30fc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01f4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0070,0x00e0,0x01c0,0x0000,0x0000,0x0ffc,0x1ffc,0x380c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x000c,0x000c,0x001c,0x1ff8,0x1ff0,0x0000, // u01f5 0x0000,0x0038,0x0070,0x00e0,0x01c0,0x0000,0x1fff,0x3fff,0x70c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7ffe, 0x7ffe,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60ff,0x60ff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01fc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x3ef8,0x3ffc,0x018e,0x0186, 0x0186,0x1f86,0x3ffe,0x71fe,0x6180,0x6180,0x6180,0x71c6,0x3ffe,0x1f7c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01fd 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0ff0,0x1ff8,0x381c,0x300e,0x300e,0x301c,0x303c,0x307c,0x30ec,0x31cc, 0x338c,0x370c,0x3e0c,0x3c0c,0x380c,0x700c,0x700c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01fe 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x0ff6,0x1ffe,0x381c,0x303c, 0x307c,0x30ec,0x31cc,0x338c,0x370c,0x3e0c,0x3c0c,0x381c,0x7ff8,0x6ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01ff 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x3000,0x3000,0x3000,0x3800,0x1ff0, 0x0ff8,0x001c,0x000c,0x000c,0x000c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0180,0x0180,0x0380,0x0300,0x0600, // u0218 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x3000, 0x3000,0x3800,0x1ff0,0x0ff8,0x001c,0x000c,0x000c,0x381c,0x1ff8,0x0ff0,0x0000,0x0180,0x0180,0x0380,0x0300,0x0600, // u0219 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0180,0x0180,0x0380,0x0300,0x0600, // u021a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x3ff0,0x3ff0,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0380,0x01fc,0x00fc,0x0000,0x0030,0x0030,0x0070,0x0060,0x00c0, // u021b 0x0000,0x0000,0x0ff0,0x0ff0,0x0000,0x0000,0x300c,0x300c,0x300c,0x1818,0x1818,0x0c30,0x0c30,0x0660,0x0660,0x03c0, 0x03c0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0232 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x0ff0,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x000c,0x000c,0x001c,0x1ff8,0x1ff0,0x0000, // u0233 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0078,0x0078,0x0018,0x0018, 0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x1818,0x1818,0x1c38,0x0ff0,0x07e0,0x0000, // u0237 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0254 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x3ffc,0x3ffc,0x000c,0x000c,0x000c,0x301c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0258 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x301c,0x000c, 0x000c,0x000c,0x3ffc,0x3ffc,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0259 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x3000,0x3800,0x1fc0,0x1fc0,0x3800,0x3000,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u025b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x301c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x3000,0x3000,0x3000,0x7000,0xe000,0x0000, // u0272 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x001c,0x0038, 0x0070,0x00e0,0x01c0,0x0380,0x07f0,0x07f8,0x001c,0x000c,0x000c,0x000c,0x000c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000, // u0292 0x0000,0x0060,0x00c0,0x01c0,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bb 0x0000,0x0180,0x0180,0x0380,0x0300,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bc 0x0000,0x0180,0x0180,0x01c0,0x00c0,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bd 0x0000,0x0180,0x03c0,0x07e0,0x0e70,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02c6 0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02c7 0x0000,0x0c30,0x0c30,0x07e0,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02d8 0x0000,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02d9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x0380,0x0300,0x03e0,0x01e0,0x0000, // u02db 0x0000,0x0f18,0x1b98,0x19d8,0x18f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02dc 0x0000,0x01ce,0x039c,0x0738,0x0e70,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02dd 0x0000,0x0e00,0x0700,0x0380,0x01c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0300 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0301 0x0000,0x0180,0x03c0,0x07e0,0x0e70,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0302 0x0000,0x0f18,0x1b98,0x19d8,0x18f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0303 0x0000,0x0000,0x0ff0,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0304 0x0000,0x0000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0305 0x0000,0x0c30,0x0c30,0x07e0,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0306 0x0000,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0307 0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0308 0x0000,0x03c0,0x0660,0x0660,0x0660,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030a 0x0000,0x01ce,0x039c,0x0738,0x0e70,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030b 0x0000,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000, // u0329 0x0000,0x0000,0x1c00,0x3800,0x7000,0xe000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0384 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0385 0x0000,0x0000,0x1c00,0x3800,0x7000,0xe000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x3ffc,0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0386 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0387 0x0000,0x0000,0x1c00,0x3800,0x7000,0xe000,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3fe0, 0x3fe0,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0388 0x0000,0x0000,0x1c00,0x3800,0x7000,0xe000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x3ffc, 0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0389 0x0000,0x0000,0x1c00,0x3800,0x7000,0xe000,0x07e0,0x07e0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u038a 0x0000,0x0000,0x1c00,0x3800,0x7000,0xe000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u038c 0x0000,0x0000,0x1c00,0x3800,0x7000,0xe000,0x1806,0x1806,0x1806,0x0c0c,0x0c0c,0x0618,0x0618,0x0330,0x0330,0x01e0, 0x01e0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u038e 0x0000,0x0000,0x1c00,0x3800,0x7000,0xe000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x381c,0x1c38,0x0e70,0x0660,0x0660,0x3e7c,0x3e7c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u038f 0x0000,0x00e0,0x01c0,0x0380,0x0700,0x0000,0x1860,0x1860,0x1860,0x1860,0x0000,0x0000,0x0f00,0x0f00,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0380,0x01f0,0x00f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0390 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x3ffc,0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0391 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x301c,0x300c,0x300c,0x300c,0x300c,0x3018,0x3ff0,0x3ff0, 0x3038,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x301c,0x3ff8,0x3ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0392 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0393 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x03c0,0x03c0,0x03c0,0x0660,0x0660,0x0660,0x0c30, 0x0c30,0x0c30,0x1818,0x1818,0x1818,0x300c,0x300c,0x300c,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0394 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3fe0, 0x3fe0,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0395 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x000c,0x000c,0x000c,0x001c,0x0038,0x0070,0x00e0,0x01c0, 0x0380,0x0700,0x0e00,0x1c00,0x3800,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0396 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x3ffc, 0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0397 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x37ec, 0x37ec,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0398 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07e0,0x07e0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0399 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x301c,0x3038,0x3070,0x30e0,0x31c0,0x3380,0x3700,0x3e00,0x3c00, 0x3c00,0x3e00,0x3700,0x3380,0x31c0,0x30e0,0x3070,0x3038,0x301c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u039a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x03c0,0x03c0,0x03c0,0x0660,0x0660,0x0660,0x0c30, 0x0c30,0x0c30,0x1818,0x1818,0x1818,0x1818,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u039b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x600c,0x600c,0x701c,0x783c,0x6c6c,0x6c6c,0x67cc,0x638c,0x638c,0x610c, 0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u039c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x3c0c,0x3e0c,0x370c,0x338c, 0x31cc,0x30ec,0x307c,0x303c,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u039d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0, 0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u039e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u039f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x301c, 0x3ff8,0x3ff0,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x3800,0x1c00,0x0e00,0x0700,0x0380,0x01c0,0x00e0,0x0070, 0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x1818,0x1818,0x0c30,0x0c30,0x0660,0x0660,0x03c0, 0x03c0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0ff0,0x1ff8,0x399c,0x318c,0x318c,0x318c,0x318c,0x318c, 0x318c,0x318c,0x318c,0x318c,0x318c,0x399c,0x1ff8,0x0ff0,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x1818,0x1818,0x0c30,0x0c30,0x0660,0x0660,0x03c0,0x03c0, 0x03c0,0x03c0,0x0660,0x0660,0x0c30,0x0c30,0x1818,0x1818,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c, 0x318c,0x318c,0x318c,0x399c,0x1ff8,0x0ff0,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x381c,0x1c38,0x0e70,0x0660,0x0660,0x3e7c,0x3e7c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a9 0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x07e0,0x07e0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03aa 0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x300c,0x300c,0x300c,0x1818,0x1818,0x0c30,0x0c30,0x0660,0x0660,0x03c0, 0x03c0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ab 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x1fcc,0x3ffc,0x7038,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7038,0x3ffc,0x1fcc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ac 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x3000,0x3800,0x1fc0,0x1fc0,0x3800,0x3000,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ad 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x3ff0,0x3ff8,0x301c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x000c,0x000c,0x000c,0x000c,0x000c,0x0000, // u03ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00e0,0x01c0,0x0380,0x0700,0x0000,0x0000,0x0f00,0x0f00,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0380,0x01f0,0x00f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03af 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fcc,0x3ffc,0x7038,0x6030, 0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x6030,0x7038,0x3ffc,0x1fcc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fe0,0x3ff0,0x3038,0x3018,0x3018,0x3018,0x3018,0x3030,0x3ff0,0x3ff0, 0x3038,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x301c,0x3ff8,0x3ff0,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000, // u03b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x1818, 0x1818,0x1818,0x0c30,0x0c30,0x0660,0x0660,0x03c0,0x03c0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000, // u03b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x1ff0,0x0e00,0x0700,0x0380,0x01c0,0x07e0,0x0ff0,0x1818,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x3000,0x3800,0x1fc0,0x1fc0,0x3800,0x3000,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x0038,0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00, 0x1800,0x3800,0x3000,0x3000,0x3000,0x3000,0x3000,0x3800,0x1ff0,0x0ff8,0x001c,0x000c,0x001c,0x0078,0x0070,0x0000, // u03b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x301c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x000c,0x000c,0x000c,0x000c,0x000c,0x0000, // u03b7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07e0,0x0ff0,0x1c38,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1ff8, 0x1ff8,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1c38,0x0ff0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f00,0x0f00,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0380,0x01f0,0x00f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x181c,0x1838,0x1870,0x18e0, 0x19c0,0x1b80,0x1f00,0x1f00,0x1b80,0x19c0,0x18e0,0x1870,0x1838,0x181c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0300,0x0300,0x0180,0x0180,0x03c0,0x03c0,0x0660,0x0660, 0x0660,0x0c30,0x0c30,0x0c30,0x1818,0x1818,0x1818,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x301c,0x303c,0x307c,0x3fec,0x3fcc,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000, // u03bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x1818, 0x1818,0x1818,0x0c30,0x0c30,0x0c30,0x0660,0x0660,0x03c0,0x03c0,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03bd 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ffc,0x1ffc,0x3800,0x3000,0x3000,0x3000,0x3000,0x1800,0x0ff0,0x0ff0, 0x1c00,0x3800,0x3000,0x3000,0x3000,0x3000,0x3000,0x3800,0x1ff0,0x0ff8,0x001c,0x000c,0x001c,0x0078,0x0070,0x0000, // u03be 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x301c,0x3ff8,0x3ff0,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000, // u03c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3800,0x1ff0,0x0ff8,0x001c,0x000c,0x001c,0x0078,0x0070,0x0000, // u03c2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ffe,0x1ffe,0x3870,0x3038, 0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x01c0,0x00f8,0x0078,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0cf0,0x1df8,0x399c,0x318c, 0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x399c,0x1ff8,0x0ff0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000, // u03c6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x1818,0x1818, 0x0c30,0x0c30,0x0660,0x0660,0x03c0,0x03c0,0x03c0,0x0660,0x0660,0x0c30,0x0c30,0x1818,0x1818,0x300c,0x300c,0x0000, // u03c7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x318c,0x318c,0x318c,0x318c, 0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x399c,0x1ff8,0x0ff0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000, // u03c8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x1c38,0x381c,0x300c, 0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x3bdc,0x1ff8,0x0e70,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1860,0x1860,0x1860,0x1860,0x0000,0x0000,0x0f00,0x0f00,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0380,0x01f0,0x00f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ca 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03cb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03cc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03cd 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x0c30,0x1c38,0x381c,0x300c, 0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x3bdc,0x1ff8,0x0e70,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ce 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07e0,0x0ff0,0x1c38,0x1818,0x1818,0x1818,0x1818,0x0ffe,0x07fe,0x0018, 0x0018,0x0018,0x7818,0x7818,0x1818,0x1818,0x1818,0x1c38,0x0ff0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0ff0,0x1ff8,0x399c,0x318c, 0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x399c,0x1ff8,0x0ff0,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000, // u03d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x780c,0x7c1c,0x0e38,0x0670, 0x03e0,0x03c0,0x0380,0x0380,0x0780,0x0f80,0x1cc0,0x38e0,0x707c,0x603c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x301c,0x3ff8,0x3ff0,0x3000,0x3000,0x3800,0x1ff8,0x0ff8,0x0000, // u03f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0078,0x0078,0x0018,0x0018, 0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x1818,0x1818,0x1c38,0x0ff0,0x07e0,0x0000, // u03f3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x3ffc, 0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03fc,0x0ffc,0x1c00,0x1800, 0x3000,0x3000,0x3ff0,0x3ff0,0x3000,0x3000,0x1800,0x1c00,0x0ffc,0x03fc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x3ff0,0x0038,0x0018, 0x000c,0x000c,0x0ffc,0x0ffc,0x000c,0x000c,0x0018,0x0038,0x3ff0,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f6 0x0000,0x0e00,0x0700,0x0380,0x01c0,0x0000,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3fe0, 0x3fe0,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0400 0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3fe0, 0x3fe0,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0401 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1ff0,0x1ff8,0x181c, 0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x181c,0x18f8,0x18f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0402 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0403 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x3000,0x3000,0x3000,0x3000,0x3fe0, 0x3fe0,0x3000,0x3000,0x3000,0x3000,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0404 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x3000,0x3000,0x3000,0x3800,0x1ff0, 0x0ff8,0x001c,0x000c,0x000c,0x000c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0405 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07e0,0x07e0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0406 0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x07e0,0x07e0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0407 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x007e,0x007e,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018, 0x0018,0x0018,0x0018,0x0018,0x3018,0x3018,0x3018,0x3838,0x1ff0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0408 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x3f80,0x7180,0x6180,0x6180,0x6180,0x6180,0x61f8,0x61fc,0x618e, 0x6186,0x6186,0x6186,0x6186,0x6186,0x6186,0x6186,0x618e,0xe1fc,0xc1f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0409 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x61f8,0x61fc,0x7f8e, 0x7f86,0x6186,0x6186,0x6186,0x6186,0x6186,0x6186,0x618e,0x61fc,0x61f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u040a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1ff0,0x1ff8,0x181c, 0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u040b 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x300c,0x301c,0x3038,0x3070,0x30e0,0x31c0,0x3380,0x3700,0x3e00,0x3c00, 0x3c00,0x3e00,0x3700,0x3380,0x31c0,0x30e0,0x3070,0x3038,0x301c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u040c 0x0000,0x0e00,0x0700,0x0380,0x01c0,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x301c,0x303c,0x307c,0x30ec,0x31cc, 0x338c,0x370c,0x3e0c,0x3c0c,0x380c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u040d 0x0000,0x0c30,0x0c30,0x07e0,0x03c0,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c, 0x1ffc,0x0ffc,0x000c,0x000c,0x000c,0x000c,0x000c,0x001c,0x1ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u040e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x3ffc,0x3ffc,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000, // u040f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x3ffc,0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0410 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff8,0x3ff8,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ff0,0x3ff8,0x301c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x301c,0x3ff8,0x3ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0411 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x301c,0x300c,0x300c,0x300c,0x300c,0x3018,0x3ff0,0x3ff0, 0x3038,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x301c,0x3ff8,0x3ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0412 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0413 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07f8,0x0ff8,0x1c18,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818, 0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x3ffc,0x7ffe,0x6006,0x6006,0x6006,0x6006,0x0000,0x0000, // u0414 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3fe0, 0x3fe0,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0415 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x399c,0x1db8,0x0ff0,0x07e0, 0x0ff0,0x1db8,0x399c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0416 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x000c,0x000c,0x000c,0x001c,0x07f8, 0x07f8,0x001c,0x000c,0x000c,0x000c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0417 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x301c,0x303c,0x307c,0x30ec,0x31cc, 0x338c,0x370c,0x3e0c,0x3c0c,0x380c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0418 0x0000,0x0c30,0x0c30,0x07e0,0x03c0,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x301c,0x303c,0x307c,0x30ec,0x31cc, 0x338c,0x370c,0x3e0c,0x3c0c,0x380c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0419 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x301c,0x3038,0x3070,0x30e0,0x31c0,0x3380,0x3700,0x3e00,0x3c00, 0x3c00,0x3e00,0x3700,0x3380,0x31c0,0x30e0,0x3070,0x3038,0x301c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u041a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03fc,0x07fc,0x0e0c,0x0c0c,0x0c0c,0x0c0c,0x0c0c,0x0c0c,0x0c0c,0x0c0c, 0x0c0c,0x0c0c,0x0c0c,0x0c0c,0x0c0c,0x0c0c,0x0c0c,0x0c0c,0x1c0c,0x380c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u041b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x600c,0x600c,0x701c,0x783c,0x6c6c,0x6c6c,0x67cc,0x638c,0x638c,0x610c, 0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u041c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x3ffc, 0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u041d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u041e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u041f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x301c, 0x3ff8,0x3ff0,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0420 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0421 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0422 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c, 0x1ffc,0x0ffc,0x000c,0x000c,0x000c,0x000c,0x000c,0x001c,0x1ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0423 0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0ff0,0x1ff8,0x399c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c, 0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x399c,0x1ff8,0x0ff0,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000, // u0424 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x1818,0x1818,0x0c30,0x0c30,0x0660,0x0660,0x03c0,0x03c0, 0x03c0,0x03c0,0x0660,0x0660,0x0c30,0x0c30,0x1818,0x1818,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0425 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380e,0x1fff,0x0fff,0x0003,0x0003,0x0003,0x0003,0x0003,0x0000, // u0426 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c, 0x1ffc,0x0ffc,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0427 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c, 0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x398c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0428 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c, 0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x398c,0x1ffe,0x0fff,0x0003,0x0003,0x0003,0x0003,0x0003,0x0000, // u0429 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf000,0xf000,0x3000,0x3000,0x3000,0x3000,0x3fe0,0x3ff0,0x3038,0x3018, 0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3038,0x3ff0,0x3fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u042a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x7f0c,0x7f8c,0x61cc,0x60cc, 0x60cc,0x60cc,0x60cc,0x60cc,0x60cc,0x60cc,0x60cc,0x61cc,0x7f8c,0x7f0c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u042b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3fe0,0x3ff0,0x3038,0x3018, 0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3038,0x3ff0,0x3fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u042c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x000c,0x000c,0x000c,0x000c,0x07fc, 0x07fc,0x000c,0x000c,0x000c,0x000c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u042d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60f0,0x61f8,0x639c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x7f0c, 0x7f0c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x639c,0x61f8,0x60f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u042e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ffc,0x1ffc,0x380c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c, 0x1ffc,0x0ffc,0x00ec,0x01cc,0x038c,0x070c,0x0e0c,0x1c0c,0x380c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u042f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x1ff8,0x001c,0x000c, 0x000c,0x0ffc,0x1ffc,0x380c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0430 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff0,0x3800,0x3000,0x3000,0x3000,0x3000,0x3ff0,0x3ff8,0x301c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x301c,0x3ff8,0x3ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0431 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x3fe0,0x3070,0x3030,0x3030,0x3030,0x3030,0x3070,0x3fe0,0x3ff0, 0x3038,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x301c,0x3ff8,0x3ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0432 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0433 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ffc,0x1ffc,0x380c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x000c,0x000c,0x001c,0x1ff8,0x1ff0,0x0000, // u0434 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x380c,0x1ffc,0x0ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0435 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x318c,0x318c,0x318c,0x399c, 0x1db8,0x0ff0,0x07e0,0x0ff0,0x1db8,0x399c,0x318c,0x318c,0x318c,0x318c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0436 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x000c,0x001c,0x03f8,0x03f8,0x001c,0x000c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0437 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0438 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x07e0,0x03c0,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0439 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x181c,0x1838,0x1870,0x18e0, 0x19c0,0x1b80,0x1f00,0x1f00,0x1b80,0x19c0,0x18e0,0x1870,0x1838,0x181c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u043a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03fc,0x07fc,0x0e0c,0x0c0c, 0x0c0c,0x0c0c,0x0c0c,0x0c0c,0x0c0c,0x0c0c,0x0c0c,0x0c0c,0x1c0c,0x380c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u043b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x600c,0x701c,0x783c,0x7c7c, 0x6eec,0x67cc,0x638c,0x610c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u043c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x3ffc,0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u043d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u043e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u043f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x301c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x301c,0x3ff8,0x3ff0,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000, // u0440 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0441 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0442 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x000c,0x000c,0x001c,0x1ff8,0x1ff0,0x0000, // u0443 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0ff0,0x1ff8,0x399c,0x318c, 0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x399c,0x1ff8,0x0ff0,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000, // u0444 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x381c,0x1c38, 0x0e70,0x07e0,0x03c0,0x03c0,0x07e0,0x0e70,0x1c38,0x381c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0445 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffe,0x0fff,0x0003,0x0003,0x0003,0x0003,0x0003,0x0000, // u0446 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x380c,0x1ffc,0x0ffc,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0447 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x318c,0x318c,0x318c,0x318c, 0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x398c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0448 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x318c,0x318c,0x318c,0x318c, 0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x398c,0x1ffe,0x0fff,0x0003,0x0003,0x0003,0x0003,0x0003,0x0000, // u0449 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3c00,0x3c00,0x0c00,0x0c00, 0x0ff0,0x0ff8,0x0c1c,0x0c0c,0x0c0c,0x0c0c,0x0c0c,0x0c1c,0x0ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u044a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x600c,0x600c,0x600c,0x600c, 0x7f0c,0x7f8c,0x61cc,0x60cc,0x60cc,0x60cc,0x60cc,0x61cc,0x7f8c,0x7f0c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u044b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800, 0x1fe0,0x1ff0,0x1838,0x1818,0x1818,0x1818,0x1818,0x1838,0x1ff0,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u044c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x000c,0x000c,0x03fc,0x03fc,0x000c,0x000c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u044d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60f0,0x61f8,0x630c,0x630c, 0x630c,0x630c,0x7f0c,0x7f0c,0x630c,0x630c,0x630c,0x630c,0x61f8,0x60f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u044e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ffc,0x1ffc,0x380c,0x300c, 0x300c,0x380c,0x1ffc,0x0ffc,0x00ec,0x01cc,0x038c,0x070c,0x0e0c,0x1c0c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u044f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x0700,0x0380,0x01c0,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x380c,0x1ffc,0x0ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0450 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x380c,0x1ffc,0x0ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0451 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0xff80,0xff80,0x3000,0x3000,0x3ff0,0x3ff8,0x301c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x000c,0x000c,0x001c,0x00f8,0x00f0,0x0000, // u0452 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x3ffc,0x3ffc,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0453 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x3000,0x3000,0x3fc0,0x3fc0,0x3000,0x3000,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0454 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x3000, 0x3000,0x3800,0x1ff0,0x0ff8,0x001c,0x000c,0x000c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0455 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0780,0x0780,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0456 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x0780,0x0780,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0457 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0078,0x0078,0x0018,0x0018, 0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x1818,0x1818,0x1c38,0x0ff0,0x07e0,0x0000, // u0458 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f80,0x1f80,0x3980,0x3180, 0x31f8,0x31fc,0x318e,0x3186,0x3186,0x3186,0x3186,0x318e,0x71fc,0x61f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0459 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180, 0x61f8,0x61fc,0x7f8e,0x7f86,0x6186,0x6186,0x6186,0x618e,0x61fc,0x61f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u045a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0xff80,0xff80,0x3000,0x3000,0x3ff0,0x3ff8,0x301c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u045b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x181c,0x1838,0x1870,0x18e0, 0x19c0,0x1b80,0x1f00,0x1f00,0x1b80,0x19c0,0x18e0,0x1870,0x1838,0x181c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u045c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x0700,0x0380,0x01c0,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u045d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x07e0,0x03c0,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x000c,0x000c,0x001c,0x1ff8,0x1ff0,0x0000, // u045e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x3ffc,0x3ffc,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000, // u045f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0xff00,0xff00,0x3000,0x3000,0x3fe0,0x3ff0,0x3038,0x3018, 0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3018,0x3038,0x3ff0,0x3fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0462 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x3fc0,0x3fc0,0x0c00,0x0c00,0x0c00,0x0c00, 0x0ff0,0x0ff8,0x0c1c,0x0c0c,0x0c0c,0x0c0c,0x0c0c,0x0c1c,0x0ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0463 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x300c,0x1818,0x1818,0x0c30,0x0c30,0x0660,0x03c0,0x07e0, 0x0ff0,0x1db8,0x399c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u046a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x300c,0x381c, 0x1c38,0x0e70,0x07e0,0x0ff0,0x1db8,0x399c,0x318c,0x318c,0x318c,0x318c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u046b 0x0000,0x0000,0x000c,0x000c,0x000c,0x000c,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0490 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x000c,0x000c,0x000c,0x000c,0x3ffc,0x3ffc,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0491 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x7f80, 0x7f80,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0492 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x3000,0x3000, 0x3000,0x3000,0x7f80,0x7f80,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0493 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3ff0,0x3ff8,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x000c,0x000c,0x0018,0x0030,0x0000,0x0000, // u0494 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3fc0,0x3fe0,0x3070,0x3030,0x3030,0x3030,0x3030,0x0030,0x0030,0x0060,0x00c0,0x0000,0x0000, // u0495 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x399c,0x1db8,0x0ff0,0x07e0, 0x0ff0,0x1db8,0x399c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318e,0x318f,0x0003,0x0003,0x0003,0x0003,0x0003,0x0000, // u0496 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x318c,0x318c,0x318c,0x399c, 0x1db8,0x0ff0,0x07e0,0x0ff0,0x1db8,0x399c,0x318c,0x318c,0x318e,0x318f,0x0003,0x0003,0x0003,0x0003,0x0003,0x0000, // u0497 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x000c,0x000c,0x000c,0x001c,0x07f8, 0x07f8,0x001c,0x000c,0x000c,0x000c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000, // u0498 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x000c,0x001c,0x03f8,0x03f8,0x001c,0x000c,0x300c,0x381c,0x1ff8,0x0ff0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000, // u0499 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x301c,0x3038,0x3070,0x30e0,0x31c0,0x3380,0x3700,0x3e00,0x3c00, 0x3c00,0x3e00,0x3700,0x3380,0x31c0,0x30e0,0x3070,0x3038,0x301c,0x300e,0x0006,0x0006,0x0006,0x0006,0x0006,0x0000, // u049a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x181c,0x1838,0x1870,0x18e0, 0x19c0,0x1b80,0x1f00,0x1f00,0x1b80,0x19c0,0x18e0,0x1870,0x1838,0x181c,0x000c,0x000c,0x000c,0x000c,0x000c,0x0000, // u049b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x600c,0x600c,0x601c,0x6038,0x6c70,0x6ce0,0x6dc0,0x6f80,0x6f00,0x7e00, 0x7e00,0x6f00,0x6f80,0x6dc0,0x6ce0,0x6c70,0x6038,0x601c,0x600c,0x600c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u049c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x301c,0x3638,0x3670, 0x36e0,0x37c0,0x3f80,0x3f80,0x37c0,0x36e0,0x3670,0x3638,0x301c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u049d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf00c,0xf01c,0x3038,0x3070,0x30e0,0x31c0,0x3380,0x3700,0x3e00,0x3c00, 0x3c00,0x3e00,0x3700,0x3380,0x31c0,0x30e0,0x3070,0x3038,0x301c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x781c,0x7838,0x1870,0x18e0, 0x19c0,0x1b80,0x1f00,0x1f00,0x1b80,0x19c0,0x18e0,0x1870,0x1838,0x181c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x3ffc, 0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300e,0x300f,0x0003,0x0003,0x0003,0x0003,0x0003,0x0000, // u04a2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x3ffc,0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300e,0x300f,0x0003,0x0003,0x0003,0x0003,0x0003,0x0000, // u04a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x607f,0x607f,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x7fe0, 0x7fe0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x607f,0x607f,0x6060,0x6060, 0x6060,0x6060,0x7fe0,0x7fe0,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000, // u04aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x300c,0x381c,0x1ff8,0x0ff0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000, // u04ab 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x1818,0x1818,0x0c30,0x0c30,0x0660,0x0660,0x03c0, 0x03c0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x1818, 0x1818,0x1818,0x0c30,0x0c30,0x0660,0x0660,0x03c0,0x03c0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000, // u04af 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x1818,0x1818,0x0c30,0x0c30,0x0660,0x0660,0x03c0, 0x03c0,0x0180,0x1ff8,0x1ff8,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x1818, 0x1818,0x1818,0x0c30,0x0c30,0x0660,0x0660,0x03c0,0x03c0,0x0180,0x1ff8,0x1ff8,0x0180,0x0180,0x0180,0x0180,0x0000, // u04b1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x1818,0x1818,0x0c30,0x0c30,0x0660,0x0660,0x03c0,0x03c0, 0x03c0,0x03c0,0x0660,0x0660,0x0c30,0x0c30,0x1818,0x1818,0x300e,0x300f,0x0003,0x0003,0x0003,0x0003,0x0003,0x0000, // u04b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x381c,0x1c38, 0x0e70,0x07e0,0x03c0,0x03c0,0x07e0,0x0e70,0x1c38,0x381c,0x300e,0x300f,0x0003,0x0003,0x0003,0x0003,0x0003,0x0000, // u04b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c, 0x1ffc,0x0ffc,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000e,0x000f,0x0003,0x0003,0x0003,0x0003,0x0003,0x0000, // u04b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x380c,0x1ffc,0x0ffc,0x000c,0x000c,0x000c,0x000c,0x000e,0x000f,0x0003,0x0003,0x0003,0x0003,0x0003,0x0000, // u04b7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x318c,0x318c,0x318c,0x398c, 0x1ffc,0x0ffc,0x018c,0x018c,0x018c,0x018c,0x000c,0x000c,0x000c,0x000c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x318c, 0x318c,0x398c,0x1ffc,0x0ffc,0x018c,0x018c,0x018c,0x000c,0x000c,0x000c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04b9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ff0,0x3ff8, 0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3ff0,0x3ff8,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07e0,0x07e0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04c0 0x0000,0x0c30,0x0c30,0x07e0,0x03c0,0x0000,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x399c,0x1db8,0x0ff0,0x07e0, 0x0ff0,0x1db8,0x399c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x07e0,0x03c0,0x0000,0x0000,0x318c,0x318c,0x318c,0x399c, 0x1db8,0x0ff0,0x07e0,0x0ff0,0x1db8,0x399c,0x318c,0x318c,0x318c,0x318c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04c2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0780,0x0780,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04cf 0x0000,0x0c30,0x0c30,0x07e0,0x03c0,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x3ffc,0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x07e0,0x03c0,0x0000,0x0000,0x1ff0,0x1ff8,0x001c,0x000c, 0x000c,0x0ffc,0x1ffc,0x380c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d1 0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x3ffc,0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x1ff0,0x1ff8,0x001c,0x000c, 0x000c,0x0ffc,0x1ffc,0x380c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fff,0x3fff,0x70c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x7ffe, 0x7ffe,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60ff,0x60ff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ef8,0x3ffc,0x018e,0x0186, 0x0186,0x1f86,0x3ffe,0x71fe,0x6180,0x6180,0x6180,0x71c6,0x3ffe,0x1f7c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d5 0x0000,0x0c30,0x0c30,0x07e0,0x03c0,0x0000,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3fe0, 0x3fe0,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x07e0,0x03c0,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x380c,0x1ffc,0x0ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x000c,0x000c,0x000c,0x000c,0x3ffc, 0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x301c,0x000c, 0x000c,0x000c,0x3ffc,0x3ffc,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d9 0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x000c,0x000c,0x000c,0x000c,0x3ffc, 0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04da 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x1ff0,0x3ff8,0x301c,0x000c, 0x000c,0x000c,0x3ffc,0x3ffc,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04db 0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x399c,0x1db8,0x0ff0,0x07e0, 0x0ff0,0x1db8,0x399c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04dc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x318c,0x318c,0x318c,0x399c, 0x1db8,0x0ff0,0x07e0,0x0ff0,0x1db8,0x399c,0x318c,0x318c,0x318c,0x318c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04dd 0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x000c,0x000c,0x000c,0x001c,0x07f8, 0x07f8,0x001c,0x000c,0x000c,0x000c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04de 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x000c,0x001c,0x03f8,0x03f8,0x001c,0x000c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04df 0x0000,0x0000,0x0ff0,0x0ff0,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x301c,0x303c,0x307c,0x30ec,0x31cc, 0x338c,0x370c,0x3e0c,0x3c0c,0x380c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x0ff0,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e3 0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x301c,0x303c,0x307c,0x30ec,0x31cc, 0x338c,0x370c,0x3e0c,0x3c0c,0x380c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e5 0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x3ffc, 0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x3ffc,0x3ffc,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e9 0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x3ffc, 0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ea 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x3ffc,0x3ffc,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04eb 0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x000c,0x000c,0x000c,0x000c,0x07fc, 0x07fc,0x000c,0x000c,0x000c,0x000c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ec 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x000c,0x000c,0x03fc,0x03fc,0x000c,0x000c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ed 0x0000,0x0000,0x0ff0,0x0ff0,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c, 0x1ffc,0x0ffc,0x000c,0x000c,0x000c,0x000c,0x000c,0x001c,0x1ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ee 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x0ff0,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x000c,0x000c,0x001c,0x1ff8,0x1ff0,0x0000, // u04ef 0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c, 0x1ffc,0x0ffc,0x000c,0x000c,0x000c,0x000c,0x000c,0x001c,0x1ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x000c,0x000c,0x001c,0x1ff8,0x1ff0,0x0000, // u04f1 0x0000,0x01ce,0x039c,0x0738,0x0e70,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c, 0x1ffc,0x0ffc,0x000c,0x000c,0x000c,0x000c,0x000c,0x001c,0x1ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01ce,0x039c,0x0738,0x0e70,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x000c,0x000c,0x001c,0x1ff8,0x1ff0,0x0000, // u04f3 0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c, 0x1ffc,0x0ffc,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x380c,0x1ffc,0x0ffc,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f5 0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x7f0c,0x7f8c,0x61cc,0x60cc, 0x60cc,0x60cc,0x60cc,0x60cc,0x60cc,0x60cc,0x60cc,0x61cc,0x7f8c,0x7f0c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x600c,0x600c,0x600c,0x600c, 0x7f0c,0x7f8c,0x61cc,0x60cc,0x60cc,0x60cc,0x60cc,0x61cc,0x7f8c,0x7f0c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x180c,0x180c,0x0c0c,0x0c0c,0x060c,0x061c,0x0338,0x07f0, 0x0fe0,0x1cc0,0x3860,0x3060,0x3030,0x3030,0x3018,0x3018,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x7ff0,0x0038,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018, 0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x7ffe,0x7ffe,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x1fc0,0x00e0,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060, 0x0060,0x0060,0x00f0,0x01f0,0x0398,0x0718,0x0e0c,0x1c0c,0x3806,0x7006,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffe,0x7ffe,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018, 0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x001c,0x000c,0x000c,0x000c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x1f00,0x0380,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff8,0x1ff8,0x0070,0x00e0,0x01c0,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30f0,0x30f8,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x1f00,0x0380,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x001c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c, 0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x0000, // u05da 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x001c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c, 0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x001c,0x3ff8,0x3ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05db 0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x001c,0x0038, 0x0070,0x00e0,0x01c0,0x0380,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05dc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05dd 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xe7c0,0xfff0,0x7838,0x3018,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x30fc,0x30fc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05de 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x1fc0,0x00e0,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060, 0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0000, // u05df 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x0fe0,0x0070,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0ff0,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff8,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x180c,0x180c,0x180c,0x0c0c,0x0c0c,0x0c0c,0x0618, 0x0618,0x0618,0x0330,0x0330,0x0330,0x01e0,0x01c0,0x0380,0x3f00,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1f0c, 0x0f0c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x0000, // u05e3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1f0c, 0x0f0c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x001c,0x3ff8,0x3ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x180c,0x180c,0x0c0c,0x0c1c,0x0638,0x0670,0x03e0,0x03c0, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000, // u05e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x180c,0x180c,0x0c0c,0x0c1c,0x0638,0x0670,0x03e0,0x03c0, 0x0180,0x0180,0x00c0,0x00c0,0x0060,0x0060,0x0030,0x0030,0x3ff8,0x3ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x000c,0x000c,0x000c,0x000c,0x300c,0x300c,0x301c,0x3038, 0x3070,0x30e0,0x31c0,0x3380,0x3300,0x3300,0x3300,0x3300,0x3300,0x3300,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000, // u05e7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x001c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c, 0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x338c, 0x3f0c,0x3e0c,0x300c,0x300c,0x300c,0x300c,0x300c,0x301c,0x3ff8,0x3ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff8,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0xf00c,0xe00c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05ea 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x3ff0,0x3038,0x3018,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x3018,0x3038,0x3ff0,0x3fc0,0x0000,0x0300,0x0300,0x0300,0x0300,0x0000, // u1e0c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x0ffc,0x1ffc,0x380c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x00c0,0x00c0,0x00c0,0x00c0,0x0000, // u1e0d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x301c,0x3038,0x3070,0x30e0,0x31c0,0x3380,0x3700,0x3e00,0x3c00, 0x3c00,0x3e00,0x3700,0x3380,0x31c0,0x30e0,0x3070,0x3038,0x301c,0x300c,0x0000,0x0000,0x0ff0,0x0ff0,0x0000,0x0000, // u1e34 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x181c,0x1838,0x1870,0x18e0, 0x19c0,0x1b80,0x1f00,0x1f00,0x1b80,0x19c0,0x18e0,0x1870,0x1838,0x181c,0x0000,0x0000,0x07f0,0x07f0,0x0000,0x0000, // u1e35 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000, // u1e36 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0780,0x0780,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000, // u1e37 0x0000,0x0180,0x0180,0x0180,0x0180,0x0000,0x600c,0x600c,0x701c,0x783c,0x6c6c,0x6c6c,0x67cc,0x638c,0x638c,0x610c, 0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e40 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x3ff0,0x3ff8,0x319c,0x318c, 0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e41 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x600c,0x600c,0x701c,0x783c,0x6c6c,0x6c6c,0x67cc,0x638c,0x638c,0x610c, 0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x600c,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000, // u1e42 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x319c,0x318c, 0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000, // u1e43 0x0000,0x0180,0x0180,0x0180,0x0180,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x3c0c,0x3e0c,0x370c,0x338c, 0x31cc,0x30ec,0x307c,0x303c,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e44 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x3ff0,0x3ff8,0x301c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e45 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x3c0c,0x3e0c,0x370c,0x338c, 0x31cc,0x30ec,0x307c,0x303c,0x301c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000, // u1e46 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x301c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000, // u1e47 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000, // u1e6c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x3ff0,0x3ff0,0x0300,0x0300, 0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0380,0x01fc,0x00fc,0x0000,0x0030,0x0030,0x0030,0x0030,0x0000, // u1e6d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3fe0, 0x3fe0,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000, // u1eb8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x380c,0x1ffc,0x0ff8,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000, // u1eb9 0x0000,0x0f18,0x1b98,0x19d8,0x18f0,0x0000,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3fe0, 0x3fe0,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u1ebc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f18,0x1b98,0x19d8,0x18f0,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x3ffc,0x3ffc,0x3000,0x3000,0x3000,0x380c,0x1ffc,0x0ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u1ebd 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07e0,0x07e0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000, // u1eca 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0780,0x0780,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000, // u1ecb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000, // u1ecc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000, // u1ecd 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8,0x0ff0,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000, // u1ee4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x0000,0x00c0,0x00c0,0x00c0,0x00c0,0x0000, // u1ee5 0x0000,0x0f18,0x1b98,0x19d8,0x18f0,0x0000,0x300c,0x300c,0x300c,0x1818,0x1818,0x0c30,0x0c30,0x0660,0x0660,0x03c0, 0x03c0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u1ef8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f18,0x1b98,0x19d8,0x18f0,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x380c,0x1ffc,0x0ffc,0x000c,0x000c,0x001c,0x1ff8,0x1ff0,0x0000, // u1ef9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2001 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2002 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2003 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2004 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2005 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2006 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2007 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2008 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2009 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff8, 0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2010 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff8, 0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2011 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc, 0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2012 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc, 0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2013 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc, 0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2014 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc, 0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2015 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660, 0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2016 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x0000,0x0000,0x3ffc,0x3ffc, // u2017 0x0000,0x0000,0x0000,0x0000,0x00c0,0x00c0,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2018 0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2019 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000, // u201a 0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x00c0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201b 0x0000,0x0000,0x0000,0x0000,0x0618,0x0618,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201c 0x0000,0x0000,0x0000,0x0000,0x0618,0x0618,0x0618,0x0618,0x0c30,0x0c30,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x1860,0x1860,0x0000,0x0000,0x0000,0x0000, // u201e 0x0000,0x0000,0x0000,0x0000,0x1860,0x1860,0x1860,0x1860,0x0c30,0x0c30,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x1ff8,0x1ff8,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2020 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x1ff8,0x1ff8,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x1ff8,0x1ff8,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2021 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03c0,0x07e0,0x07e0, 0x07e0,0x07e0,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2022 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x318c,0x318c,0x318c,0x318c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2026 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c30,0x3e30,0x3660,0x3660,0x3ec0,0x1cc0,0x0180,0x0180,0x0300,0x0300, 0x0600,0x0600,0x0c00,0x0c00,0x19dc,0x1bfe,0x3376,0x3376,0x63fe,0x61dc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2030 0x0000,0x0000,0x0000,0x0000,0x01c0,0x01c0,0x01c0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2032 0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x1c70,0x1860,0x1860,0x1860,0x1860,0x1860,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2033 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380, 0x0700,0x0e00,0x1c00,0x1c00,0x0e00,0x0700,0x0380,0x01c0,0x00e0,0x0070,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2039 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0e00,0x0700,0x0380, 0x01c0,0x00e0,0x0070,0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u203a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0c30,0x0c30,0x0c30,0x0c30,0x0c30,0x0c30, 0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x0000,0x0c30,0x0c30,0x0c30,0x0c30,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u203c 0x0000,0x0000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u203e 0x0000,0x0000,0x0000,0x03c0,0x07e0,0x0c30,0x0c30,0x0c30,0x0c30,0x0c30,0x0c30,0x0c30,0x07e0,0x03c0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2070 0x0180,0x0180,0x0180,0x0000,0x0780,0x0780,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2071 0x0000,0x0000,0x0000,0x0030,0x0070,0x00f0,0x01f0,0x03b0,0x0730,0x0e30,0x0ff0,0x0ff0,0x0030,0x0030,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2074 0x0000,0x0000,0x0000,0x0fe0,0x0fe0,0x0c00,0x0c00,0x0fe0,0x0ff0,0x0030,0x0030,0x0c30,0x0ff0,0x07e0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2075 0x0000,0x0000,0x0000,0x03e0,0x07e0,0x0c00,0x0c00,0x0fe0,0x0ff0,0x0c30,0x0c30,0x0c30,0x0ff0,0x07e0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2076 0x0000,0x0000,0x0000,0x0ff0,0x0ff0,0x0c30,0x0030,0x0060,0x0060,0x00c0,0x00c0,0x0180,0x0180,0x0180,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2077 0x0000,0x0000,0x0000,0x07e0,0x0ff0,0x0c30,0x0c30,0x0ff0,0x07e0,0x0c30,0x0c30,0x0c30,0x0ff0,0x07e0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2078 0x0000,0x0000,0x0000,0x07e0,0x0ff0,0x0c30,0x0c30,0x0c30,0x0ff0,0x07f0,0x0030,0x0030,0x07e0,0x07c0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2079 0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0ff0,0x0ff0,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207b 0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x1ff0,0x0000,0x0000,0x0000,0x1ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207c 0x0000,0x0000,0x0000,0x00c0,0x0180,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0180,0x00c0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207d 0x0000,0x0000,0x0000,0x0300,0x0180,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x0180,0x0300,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207e 0x0000,0x0000,0x0000,0x0000,0x1fc0,0x1fe0,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x03c0,0x07e0,0x0c30,0x0c30,0x0c30,0x0c30,0x0c30,0x0c30,0x0c30,0x07e0,0x03c0,0x0000,0x0000,0x0000, // u2080 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0180,0x0380,0x0780,0x0780,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000, // u2081 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x07e0,0x0ff0,0x0c30,0x0c30,0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0ff0,0x0ff0,0x0000,0x0000,0x0000, // u2082 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x07e0,0x0ff0,0x0c30,0x0030,0x01e0,0x01e0,0x0030,0x0030,0x0c30,0x0ff0,0x07e0,0x0000,0x0000,0x0000, // u2083 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0030,0x0070,0x00f0,0x01f0,0x03b0,0x0730,0x0e30,0x0ff0,0x0ff0,0x0030,0x0030,0x0000,0x0000,0x0000, // u2084 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0fe0,0x0fe0,0x0c00,0x0c00,0x0fe0,0x0ff0,0x0030,0x0030,0x0c30,0x0ff0,0x07e0,0x0000,0x0000,0x0000, // u2085 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x03e0,0x07e0,0x0c00,0x0c00,0x0fe0,0x0ff0,0x0c30,0x0c30,0x0c30,0x0ff0,0x07e0,0x0000,0x0000,0x0000, // u2086 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0ff0,0x0ff0,0x0c30,0x0030,0x0060,0x0060,0x00c0,0x00c0,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000, // u2087 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x07e0,0x0ff0,0x0c30,0x0c30,0x0ff0,0x07e0,0x0c30,0x0c30,0x0c30,0x0ff0,0x07e0,0x0000,0x0000,0x0000, // u2088 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x07e0,0x0ff0,0x0c30,0x0c30,0x0c30,0x0ff0,0x07f0,0x0030,0x0030,0x07e0,0x07c0,0x0000,0x0000,0x0000, // u2089 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0ff0,0x0ff0,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000, // u208a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u208b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x1ff0,0x1ff0,0x0000,0x0000,0x0000,0x1ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000, // u208c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x00c0,0x0180,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0180,0x00c0,0x0000,0x0000,0x0000, // u208d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0300,0x0180,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x0180,0x0300,0x0000,0x0000,0x0000, // u208e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0fc0,0x0fe0,0x0030,0x0030,0x0ff0,0x1ff0,0x1830,0x1830,0x1ff0,0x0ff0,0x0000,0x0000,0x0000, // u2090 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x07c0,0x0fe0,0x1830,0x1830,0x1ff0,0x1ff0,0x1800,0x1800,0x0ff0,0x07e0,0x0000,0x0000,0x0000, // u2091 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x07c0,0x0fe0,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x0fe0,0x07c0,0x0000,0x0000,0x0000, // u2092 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x1830,0x1c70,0x0ee0,0x07c0,0x0380,0x0380,0x07c0,0x0ee0,0x1c70,0x1830,0x0000,0x0000,0x0000, // u2093 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0fc0,0x1fe0,0x0030,0x0030,0x1ff0,0x1ff0,0x1830,0x1830,0x0fe0,0x07c0,0x0000,0x0000,0x0000, // u2094 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800, 0x1800,0x1800,0x1800,0x1fc0,0x1fe0,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x0000,0x0000,0x0000, // u2095 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c38,0x0c70,0x0ce0,0x0dc0,0x0f80,0x0f80,0x0dc0,0x0ce0,0x0c70,0x0c38,0x0000,0x0000,0x0000, // u2096 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0780, 0x0780,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000, // u2097 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x318c,0x0000,0x0000,0x0000, // u2098 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x1fc0,0x1fe0,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1fe0,0x1fc0,0x1800,0x1800,0x1800, // u209a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x7f80,0x61c0,0x60c0,0x60c0,0x60c0,0x60c0,0x60c0,0x61c0,0x7fb0, 0x7f30,0x6030,0x61fe,0x61fe,0x6030,0x6030,0x6030,0x6030,0x603e,0x601e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u20a7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f86,0x7fc6,0x60e6,0x6066,0x6066,0x6066,0x6666,0x6666,0x6666,0x6666, 0x6666,0x6666,0x6666,0x6666,0x6606,0x6606,0x6606,0x660e,0x67fc,0x67f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u20aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03f0,0x07f8,0x0e1c,0x1c0e,0x3800,0x3000,0x3000,0xffc0,0xffc0,0x3000, 0x3000,0xffc0,0xffc0,0x3000,0x3000,0x3800,0x1c0e,0x0e1c,0x07f8,0x03f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u20ac 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x0180,0x0180,0x0180,0x0180,0x0180,0x01b8,0x01f0,0x03c0, 0x0fb8,0x1df0,0x03c0,0x0f80,0x1d80,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u20ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x3e1c,0x360c,0x360c,0x3600,0x3600,0x3600,0x3600,0x3600, 0x3600,0x3600,0x3600,0x3600,0x3600,0x360c,0x360c,0x3e1c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2102 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3ff0,0x3ff8,0x301c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u210e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0xff80,0xff80,0x3000,0x3000,0x3ff0,0x3ff8,0x301c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u210f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x380c,0x3c0c,0x360c,0x3b0c,0x3d8c,0x36cc, 0x336c,0x31bc,0x30dc,0x306c,0x303c,0x301c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2115 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc180,0xc19c,0xc1be,0xe1b6,0xe1b6,0xf1be,0xf19c,0xf980,0xd980,0xdd80, 0xcd80,0xcf80,0xc780,0xc7be,0xc3be,0xc380,0xc1be,0xc1be,0xc180,0xc180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2116 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x3e1c,0x360c,0x360c,0x360c,0x360c,0x360c,0x360c,0x360c, 0x360c,0x360c,0x360c,0x360c,0x360c,0x360c,0x36cc,0x3efc,0x1ff8,0x0ff8,0x001c,0x000e,0x0000,0x0000,0x0000,0x0000, // u211a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x361c,0x360c,0x360c,0x360c,0x360c,0x360c,0x360c,0x361c, 0x37f8,0x37f0,0x36c0,0x3760,0x37b0,0x36d8,0x366c,0x3636,0x361a,0x3e0e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u211d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e82,0x7ec6,0x18fe,0x18d6,0x18c6,0x18c6,0x18c6,0x18c6,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2122 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x000c,0x000c,0x001c,0x003c,0x006c,0x00d8,0x01b0,0x0360, 0x06c0,0x0d80,0x1b00,0x3600,0x3c00,0x3800,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2124 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x381c,0x1c38,0x0e70,0x0660,0x0660,0x3e7c,0x3e7c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2126 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3030,0x3030,0x1818,0x1818,0x0c0c,0x0c0c,0x0606,0x0e0e,0x1f1c,0x3b38, 0x71f0,0x61e0,0x60c0,0x60c0,0x6060,0x6060,0x6030,0x7030,0x3818,0x1c18,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2135 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0700,0x0e00,0x1c00,0x3800,0x7ffe, 0x7ffe,0x3800,0x1c00,0x0e00,0x0700,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2190 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x03c0,0x07e0,0x0ff0,0x1db8,0x399c,0x318c,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2191 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00e0,0x0070,0x0038,0x001c,0x7ffe, 0x7ffe,0x001c,0x0038,0x0070,0x00e0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2192 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x318c,0x399c,0x1db8,0x0ff0,0x07e0,0x03c0,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2193 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0660,0x0e70,0x1c38,0x381c,0x700e,0xffff, 0xffff,0x700e,0x381c,0x1c38,0x0e70,0x0660,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2194 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x03c0,0x07e0,0x0ff0,0x1db8,0x399c,0x318c,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x318c,0x399c,0x1db8,0x0ff0,0x07e0,0x03c0,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2195 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0306,0x0706,0x0e06,0x1c06,0x3806,0x7ffe, 0x7ffe,0x3806,0x1c06,0x0e06,0x0706,0x0306,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x60e0,0x6070,0x6038,0x601c,0x7ffe, 0x7ffe,0x601c,0x6038,0x6070,0x60e0,0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x03c0,0x07e0,0x0ff0,0x1db8,0x399c,0x318c,0x0180,0x0180,0x0180, 0x0180,0x318c,0x399c,0x1db8,0x0ff0,0x07e0,0x03c0,0x0180,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x030c,0x070c, 0x0e0c,0x1c0c,0x380c,0x7ffc,0x7ffc,0x3800,0x1c00,0x0e00,0x0700,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f00,0x7f00,0x1f00,0x3b18,0x3318,0x630c,0x600c, 0x600c,0x600c,0x600c,0x3018,0x3838,0x1ff0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1800,0x3800,0x7000,0xfffe,0xfffe,0x0000, 0x0000,0xfffe,0xfffe,0x001c,0x0038,0x0030,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21cb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0030,0x0038,0x001c,0xfffe,0xfffe,0x0000, 0x0000,0xfffe,0xfffe,0x7000,0x3800,0x1800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21cc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0e00,0x1c00,0x3ffe,0x7ffe,0xf000, 0xf000,0x7ffe,0x3ffe,0x1c00,0x0e00,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x03c0,0x07e0,0x0ff0,0x1e78,0x3e7c,0x366c,0x0660,0x0660,0x0660, 0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00e0,0x0070,0xfff8,0xfffc,0x001e, 0x001e,0xfffc,0xfff8,0x0070,0x00e0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660, 0x0660,0x0660,0x0660,0x366c,0x3e7c,0x1e78,0x0ff0,0x07e0,0x03c0,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0660,0x0e70,0x1c38,0x3ffc,0x7ffe,0xf00f, 0xf00f,0x7ffe,0x3ffc,0x1c38,0x0e70,0x0660,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x03c0,0x07e0,0x0ff0,0x1e78,0x3e7c,0x366c,0x0660,0x0660,0x0660, 0x0660,0x0660,0x0660,0x366c,0x3e7c,0x1e78,0x0ff0,0x07e0,0x03c0,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x600c,0x600c,0x600c,0x600c,0x3018,0x3018,0x3ff8,0x3ff8,0x1830,0x1830, 0x1830,0x0c60,0x0c60,0x0c60,0x06c0,0x06c0,0x06c0,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2200 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x3ffc, 0x3ffc,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x000c,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2203 0x0000,0x0000,0x0000,0x000c,0x000c,0x001c,0x3ffc,0x3ffc,0x003c,0x006c,0x006c,0x00cc,0x00cc,0x018c,0x018c,0x3ffc, 0x3ffc,0x030c,0x030c,0x060c,0x060c,0x0c0c,0x0c0c,0x180c,0x3ffc,0x3ffc,0x3000,0x6000,0x6000,0x0000,0x0000,0x0000, // u2204 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0030,0x0030,0x0fe0,0x1ff0,0x30d8,0x30d8,0x3198,0x3198, 0x3318,0x3318,0x3618,0x3618,0x1ff0,0x0fe0,0x1800,0x1800,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2205 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x03c0,0x03c0,0x03c0,0x0660,0x0660,0x0660,0x0c30, 0x0c30,0x0c30,0x1818,0x1818,0x1818,0x300c,0x300c,0x300c,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2206 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x300c,0x300c,0x300c,0x1818,0x1818,0x1818,0x0c30,0x0c30, 0x0c30,0x0660,0x0660,0x0660,0x03c0,0x03c0,0x03c0,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2207 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01fc,0x07fc,0x0e00,0x1800,0x1800,0x3000,0x3000,0x3000,0x3000,0x3ffc, 0x3ffc,0x3000,0x3000,0x3000,0x3000,0x1800,0x1800,0x0e00,0x07fc,0x01fc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2208 0x0000,0x0000,0x0000,0x0006,0x0006,0x000c,0x01fc,0x07fc,0x0e18,0x1830,0x1830,0x3060,0x3060,0x30c0,0x30c0,0x3ffc, 0x3ffc,0x3180,0x3180,0x3300,0x3300,0x1600,0x1e00,0x0e00,0x0ffc,0x19fc,0x1800,0x3000,0x3000,0x0000,0x0000,0x0000, // u2209 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03fc,0x0ffc,0x1c00,0x1800,0x3000,0x3000,0x3ffc, 0x3ffc,0x3000,0x3000,0x1800,0x1c00,0x0ffc,0x03fc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u220a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x3fe0,0x0070,0x0018,0x0018,0x000c,0x000c,0x000c,0x000c,0x3ffc, 0x3ffc,0x000c,0x000c,0x000c,0x000c,0x0018,0x0018,0x0070,0x3fe0,0x3f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u220b 0x0000,0x0000,0x0000,0x6000,0x6000,0x3000,0x3f80,0x3fe0,0x1870,0x0c18,0x0c18,0x060c,0x060c,0x030c,0x030c,0x3ffc, 0x3ffc,0x018c,0x018c,0x00cc,0x00cc,0x0068,0x0078,0x0070,0x3ff0,0x3f98,0x0018,0x000c,0x000c,0x0000,0x0000,0x0000, // u220c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x3ff0,0x0038,0x0018,0x000c,0x000c,0x3ffc, 0x3ffc,0x000c,0x000c,0x0018,0x0038,0x3ff0,0x3fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u220d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc, 0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2212 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x0000,0x0000,0x0180,0x0180, 0x0180,0x0180,0x0180,0x3ffc,0x3ffc,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2213 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0180,0x0180, 0x0180,0x0180,0x0180,0x3ffc,0x3ffc,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2214 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x000c,0x001c,0x0038,0x0070,0x00e0,0x01c0, 0x0380,0x0700,0x0e00,0x1c00,0x3800,0x7000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2215 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x7000,0x3800,0x1c00,0x0e00,0x0700, 0x0380,0x01c0,0x00e0,0x0070,0x0038,0x001c,0x000c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2216 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x07c0,0x07c0, 0x07c0,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2219 0x0000,0x0000,0x0000,0x001e,0x001e,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x3018, 0x3018,0x3018,0x3818,0x1c18,0x0e18,0x0718,0x0398,0x01d8,0x00f8,0x0078,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u221a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e78,0x3ffc,0x73ce,0x6186,0x6186, 0x6186,0x6186,0x73ce,0x3ffc,0x1e78,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u221e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u221f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660, 0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2225 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x03c0,0x03c0, 0x0660,0x0660,0x0c30,0x0c30,0x0c30,0x1818,0x1818,0x1818,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2227 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x1818,0x1818, 0x1818,0x0c30,0x0c30,0x0c30,0x0660,0x0660,0x03c0,0x03c0,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2228 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07e0,0x0ff0,0x1c38,0x1818,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2229 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x1818,0x1c38,0x0ff0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u222a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f0c,0x3f9c,0x39fc,0x30f8,0x0000, 0x0000,0x1f0c,0x3f9c,0x39fc,0x30f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2248 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x001c,0x0038,0x7ffc,0x7ffc,0x00e0,0x01c0, 0x0380,0x0700,0x7ffc,0x7ffc,0x3800,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2260 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x3ffc, 0x3ffc,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2261 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x1c00,0x0e00, 0x0700,0x0380,0x01c0,0x00e0,0x0070,0x0038,0x0000,0x0000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2264 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0e00,0x0700,0x0380,0x01c0,0x00e0,0x0070,0x0038,0x0038,0x0070, 0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x0000,0x0000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2265 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c3,0x01c7,0x038e,0x071c,0x0e38,0x1c70,0x38e0,0x71c0,0xe380, 0xe380,0x71c0,0x38e0,0x1c70,0x0e38,0x071c,0x038e,0x01c7,0x00c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u226a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc300,0xe380,0x71c0,0x38e0,0x1c70,0x0e38,0x071c,0x038e,0x01c7, 0x01c7,0x038e,0x071c,0x0e38,0x1c70,0x38e0,0x71c0,0xe380,0xc300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u226b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07fc,0x1ffc,0x3800,0x7000,0x6000,0x6000,0x6000, 0x6000,0x6000,0x6000,0x7000,0x3800,0x1ffc,0x07fc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2282 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7ff0,0x0038,0x001c,0x000c,0x000c,0x000c, 0x000c,0x000c,0x000c,0x001c,0x0038,0x7ff0,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2283 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07fc,0x1ffc,0x3800,0x7000,0x6000,0x6000,0x6000,0x6000,0x6000, 0x6000,0x7000,0x3800,0x1ffc,0x07fc,0x0000,0x0000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2286 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7ff0,0x0038,0x001c,0x000c,0x000c,0x000c,0x000c,0x000c, 0x000c,0x001c,0x0038,0x7ff0,0x7fc0,0x0000,0x0000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2287 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u22a5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07e0,0x0ff0,0x1c38,0x1818,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u22c2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x1818,0x1c38,0x0ff0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u22c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0030,0x0030,0x0fe0,0x1ff0,0x30d8,0x30d8,0x3198,0x3198, 0x3318,0x3318,0x3618,0x3618,0x1ff0,0x0fe0,0x1800,0x1800,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2300 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x03c0,0x07e0,0x0e70,0x1c38,0x381c, 0x700e,0x6006,0x6006,0x6006,0x6006,0x6006,0x6006,0x6006,0x7ffe,0x7ffe,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2302 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0x0fe0,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2308 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0x0fe0,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060, 0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2309 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00, 0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u230a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060, 0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u230b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x3000,0x3000, 0x3000,0x3000,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2310 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x3000,0x3000,0x3000, 0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2319 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00f8,0x01fc,0x018c,0x018c,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u2320 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x3180,0x3180,0x3f80,0x1f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2321 0x0018,0x0030,0x0060,0x00c0,0x0180,0x0180,0x0300,0x0300,0x0600,0x0600,0x0600,0x0c00,0x0c00,0x0c00,0x0c00,0x1800, 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u239b 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u239c 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, 0x1800,0x0c00,0x0c00,0x0c00,0x0c00,0x0600,0x0600,0x0600,0x0300,0x0300,0x0180,0x0180,0x00c0,0x0060,0x0030,0x0018, // u239d 0x1800,0x0c00,0x0600,0x0300,0x0180,0x0180,0x00c0,0x00c0,0x0060,0x0060,0x0060,0x0030,0x0030,0x0030,0x0030,0x0018, 0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018, // u239e 0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018, 0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018, // u239f 0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018, 0x0018,0x0030,0x0030,0x0030,0x0030,0x0060,0x0060,0x0060,0x00c0,0x00c0,0x0180,0x0180,0x0300,0x0600,0x0c00,0x1800, // u23a0 0x1ff8,0x1ff8,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u23a1 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, // u23a2 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1ff8,0x1ff8, // u23a3 0x1ff8,0x1ff8,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018, 0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018, // u23a4 0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018, 0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018, // u23a5 0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018, 0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x1ff8,0x1ff8, // u23a6 0x007e,0x01fe,0x0380,0x0300,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u23a7 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0e00,0x1c00,0xf800, 0xf800,0x1c00,0x0e00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, // u23a8 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600, 0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0600,0x0300,0x0380,0x01fe,0x007e, // u23a9 0xfc00,0xff00,0x0380,0x0180,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, // u23ab 0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x0060,0x003e, 0x003e,0x0060,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, // u23ac 0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0, 0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x00c0,0x0180,0x0380,0xff00,0xfc00, // u23ad 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u23ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff, 0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23af 0xffff,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff, // u23bd 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u23d0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x7f80,0x7f80,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x03fc,0x03fc,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2409 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x7f80,0x0000, 0x0000,0x03fc,0x03fc,0x0300,0x0300,0x03f0,0x03f0,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u240a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300,0x1e00,0x0c00,0x0000, 0x0000,0x03fc,0x03fc,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u240b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x7f80,0x6000,0x6000,0x7e00,0x7e00,0x6000,0x6000,0x6000,0x0000, 0x0000,0x03fc,0x03fc,0x0300,0x0300,0x03f0,0x03f0,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u240c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x7f80,0x6180,0x6000,0x6000,0x6000,0x6180,0x7f80,0x3f00,0x0000, 0x0000,0x03f8,0x03fc,0x030c,0x030c,0x03f8,0x03e0,0x0370,0x0338,0x031c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u240d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x7180,0x7980,0x6d80,0x6780,0x6380,0x6180,0x6180,0x0000, 0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x03fc,0x03fc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2424 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff, 0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2500 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff, 0xffff,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2501 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u2502 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, // u2503 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf7de, 0xf7de,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2508 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf7de,0xf7de, 0xf7de,0xf7de,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2509 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000, // u250a 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x0000,0x0000,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x0000,0x0000, 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x0000,0x0000,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x0000,0x0000, // u250b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01ff, 0x01ff,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u250c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01ff,0x01ff, 0x01ff,0x01ff,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u250d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03ff, 0x03ff,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, // u250e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03ff,0x03ff, 0x03ff,0x03ff,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, // u250f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff80, 0xff80,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u2510 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff80,0xff80, 0xff80,0xff80,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u2511 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0, 0xffc0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, // u2512 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0, 0xffc0,0xffc0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, // u2513 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x01ff, 0x01ff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2514 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x01ff,0x01ff, 0x01ff,0x01ff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2515 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03ff, 0x03ff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2516 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03ff,0x03ff, 0x03ff,0x03ff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2517 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0xff80, 0xff80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2518 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0xff80,0xff80, 0xff80,0xff80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2519 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0xffc0, 0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u251a 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0xffc0,0xffc0, 0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u251b 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x01ff, 0x01ff,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u251c 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x01ff,0x01ff, 0x01ff,0x01ff,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u251d 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03ff, 0x03ff,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u251e 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x03ff, 0x03ff,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, // u251f 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03ff, 0x03ff,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, // u2520 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03ff,0x03ff, 0x03ff,0x03ff,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u2521 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x03ff,0x03ff, 0x03ff,0x03ff,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, // u2522 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03ff,0x03ff, 0x03ff,0x03ff,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, // u2523 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0xff80, 0xff80,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u2524 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0xff80,0xff80, 0xff80,0xff80,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u2525 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0xffc0, 0xffc0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u2526 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0xffc0, 0xffc0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, // u2527 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0xffc0, 0xffc0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, // u2528 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0xffc0,0xffc0, 0xffc0,0xffc0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u2529 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0xffc0,0xffc0, 0xffc0,0xffc0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, // u252a 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0xffc0,0xffc0, 0xffc0,0xffc0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, // u252b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff, 0xffff,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u252c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff80,0xffff, 0xffff,0xff80,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u252d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01ff,0xffff, 0xffff,0x01ff,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u252e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff, 0xffff,0xffff,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u252f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff, 0xffff,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, // u2530 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffff, 0xffff,0xffc0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, // u2531 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03ff,0xffff, 0xffff,0x03ff,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, // u2532 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff, 0xffff,0xffff,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, // u2533 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0xffff, 0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2534 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0xff80,0xffff, 0xffff,0xff80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2535 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x01ff,0xffff, 0xffff,0x01ff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2536 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0xffff,0xffff, 0xffff,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2537 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0xffff, 0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2538 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0xffc0,0xffff, 0xffff,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2539 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03ff,0xffff, 0xffff,0x03ff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u253a 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0xffff,0xffff, 0xffff,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u253b 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0xffff, 0xffff,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u253c 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0xff80,0xffff, 0xffff,0xff80,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u253d 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x01ff,0xffff, 0xffff,0x01ff,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u253e 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0xffff,0xffff, 0xffff,0xffff,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u253f 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0xffff, 0xffff,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u2540 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0xffff, 0xffff,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, // u2541 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0xffff, 0xffff,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, // u2542 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0xffc0,0xffff, 0xffff,0xff80,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u2543 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03ff,0xffff, 0xffff,0x01ff,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u2544 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0xff80,0xffff, 0xffff,0xffc0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, // u2545 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x01ff,0xffff, 0xffff,0x03ff,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, // u2546 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0xffff,0xffff, 0xffff,0xffff,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u2547 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0xffff,0xffff, 0xffff,0xffff,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, // u2548 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0xffc0,0xffff, 0xffff,0xffc0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, // u2549 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03ff,0xffff, 0xffff,0x03ff,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, // u254a 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0xffff,0xffff, 0xffff,0xffff,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, // u254b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0x0000, 0x0000,0xffff,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2550 0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660, 0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660, // u2551 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01ff,0x01ff,0x0180, 0x0180,0x01ff,0x01ff,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u2552 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07ff, 0x07ff,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660, // u2553 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07ff,0x07ff,0x0600, 0x0600,0x067f,0x067f,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660, // u2554 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff80,0xff80,0x0180, 0x0180,0xff80,0xff80,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u2555 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0, 0xffe0,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660, // u2556 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xffe0,0x0060, 0x0060,0xfe60,0xfe60,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660, // u2557 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x01ff,0x01ff,0x0180, 0x0180,0x01ff,0x01ff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2558 0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x07ff, 0x07ff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2559 0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x067f,0x067f,0x0600, 0x0600,0x07ff,0x07ff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255a 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0xff80,0xff80,0x0180, 0x0180,0xff80,0xff80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255b 0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0xffe0, 0xffe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255c 0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0xfe60,0xfe60,0x0060, 0x0060,0xffe0,0xffe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255d 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x01ff,0x01ff,0x0180, 0x0180,0x01ff,0x01ff,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u255e 0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x067f, 0x067f,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660, // u255f 0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x067f,0x067f,0x0600, 0x0600,0x067f,0x067f,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660, // u2560 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0xff80,0xff80,0x0180, 0x0180,0xff80,0xff80,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u2561 0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0xfe60, 0xfe60,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660, // u2562 0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0xfe60,0xfe60,0x0060, 0x0060,0xfe60,0xfe60,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660, // u2563 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0x0000, 0x0000,0xffff,0xffff,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u2564 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff, 0xffff,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660, // u2565 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0x0000, 0x0000,0xfe7f,0xfe7f,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660, // u2566 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0xffff,0xffff,0x0000, 0x0000,0xffff,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2567 0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0xffff, 0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2568 0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0xfe7f,0xfe7f,0x0000, 0x0000,0xffff,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2569 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0xffff,0xffff,0x0180, 0x0180,0xffff,0xffff,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u256a 0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0xffff, 0xffff,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660, // u256b 0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0xfe7f,0xfe7f,0x0000, 0x0000,0xfe7f,0xfe7f,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660,0x0660, // u256c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x000f, 0x003f,0x0078,0x00e0,0x00c0,0x01c0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u256d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf000, 0xfc00,0x1e00,0x0700,0x0300,0x0380,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u256e 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0380,0x0300,0x0700,0x1e00,0xfc00, 0xf000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u256f 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x01c0,0x00c0,0x00e0,0x0078,0x003f, 0x000f,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2570 0x0001,0x0003,0x0003,0x0006,0x0006,0x000c,0x000c,0x0018,0x0018,0x0030,0x0030,0x0060,0x0060,0x00c0,0x00c0,0x0180, 0x0180,0x0300,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x3000,0x3000,0x6000,0x6000,0xc000,0xc000,0x8000, // u2571 0x8000,0xc000,0xc000,0x6000,0x6000,0x3000,0x3000,0x1800,0x1800,0x0c00,0x0c00,0x0600,0x0600,0x0300,0x0300,0x0180, 0x0180,0x00c0,0x00c0,0x0060,0x0060,0x0030,0x0030,0x0018,0x0018,0x000c,0x000c,0x0006,0x0006,0x0003,0x0003,0x0001, // u2572 0x8001,0xc003,0xc003,0x6006,0x6006,0x300c,0x300c,0x1818,0x1818,0x0c30,0x0c30,0x0660,0x0660,0x03c0,0x03c0,0x0180, 0x0180,0x03c0,0x03c0,0x0660,0x0660,0x0c30,0x0c30,0x1818,0x1818,0x300c,0x300c,0x6006,0x6006,0xc003,0xc003,0x8001, // u2573 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff80, 0xff80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2574 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, 0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2575 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01ff, 0x01ff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2576 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180, 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u2577 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff80,0xff80, 0xff80,0xff80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2578 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, 0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2579 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01ff,0x01ff, 0x01ff,0x01ff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03c0, 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, // u257b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01ff,0xffff, 0xffff,0x01ff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257c 0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x03c0, 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, // u257d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff80,0xffff, 0xffff,0xff80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257e 0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0,0x03c0, 0x03c0,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180, // u257f 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2580 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff,0xffff, // u2581 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, // u2582 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, // u2583 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, // u2584 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff,0xffff, 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, // u2585 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, // u2586 0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, // u2587 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, // u2588 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, // u2589 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, // u258a 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, // u258b 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u258c 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, // u258d 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, // u258e 0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000, 0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000, // u258f 0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff, 0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff, // u2590 0xaaaa,0x0000,0xaaaa,0x0000,0xaaaa,0x0000,0xaaaa,0x0000,0xaaaa,0x0000,0xaaaa,0x0000,0xaaaa,0x0000,0xaaaa,0x0000, 0xaaaa,0x0000,0xaaaa,0x0000,0xaaaa,0x0000,0xaaaa,0x0000,0xaaaa,0x0000,0xaaaa,0x0000,0xaaaa,0x0000,0xaaaa,0x0000, // u2591 0xaaaa,0x5555,0xaaaa,0x5555,0xaaaa,0x5555,0xaaaa,0x5555,0xaaaa,0x5555,0xaaaa,0x5555,0xaaaa,0x5555,0xaaaa,0x5555, 0xaaaa,0x5555,0xaaaa,0x5555,0xaaaa,0x5555,0xaaaa,0x5555,0xaaaa,0x5555,0xaaaa,0x5555,0xaaaa,0x5555,0xaaaa,0x5555, // u2592 0xffff,0xaaaa,0xffff,0xaaaa,0xffff,0xaaaa,0xffff,0xaaaa,0xffff,0xaaaa,0xffff,0xaaaa,0xffff,0xaaaa,0xffff,0xaaaa, 0xffff,0xaaaa,0xffff,0xaaaa,0xffff,0xaaaa,0xffff,0xaaaa,0xffff,0xaaaa,0xffff,0xaaaa,0xffff,0xaaaa,0xffff,0xaaaa, // u2593 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u2596 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff, // u2597 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2598 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, // u2599 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, 0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff, // u259a 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u259b 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, 0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff, // u259c 0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u259d 0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff, 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u259e 0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff, 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, // u259f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x1ff0,0x1ff0,0x1ff0,0x1ff0,0x1ff0, 0x1ff0,0x1ff0,0x1ff0,0x1ff0,0x1ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x7ffc,0x7ffc,0x7ffc,0x7ffc,0x7ffc,0x7ffc,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ac 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x3ffc,0x3ffc,0x3ffc,0x3ffc,0x3ffc,0x3ffc,0x3ffc,0x3ffc, 0x3ffc,0x3ffc,0x3ffc,0x3ffc,0x3ffc,0x3ffc,0x3ffc,0x3ffc,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0100,0x0100,0x0380,0x0380,0x07c0,0x07c0,0x0fe0,0x0fe0, 0x1ff0,0x1ff0,0x3ff8,0x3ff8,0x7ffc,0x7ffc,0xfffe,0xfffe,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xffc0,0xfff0,0xfffc,0xffff, 0xfffc,0xfff0,0xffc0,0xff00,0xfc00,0xf000,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xffc0,0xfff0,0xfffc,0xffff, 0xfffc,0xfff0,0xffc0,0xff00,0xfc00,0xf000,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffe,0xfffe,0x7ffc,0x7ffc,0x3ff8,0x3ff8,0x1ff0,0x1ff0, 0x0fe0,0x0fe0,0x07c0,0x07c0,0x0380,0x0380,0x0100,0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0003,0x000f,0x003f,0x00ff,0x03ff,0x0fff,0x3fff,0xffff, 0x3fff,0x0fff,0x03ff,0x00ff,0x003f,0x000f,0x0003,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25c0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0003,0x000f,0x003f,0x00ff,0x03ff,0x0fff,0x3fff,0xffff, 0x3fff,0x0fff,0x03ff,0x00ff,0x003f,0x000f,0x0003,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25c4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x03c0,0x07e0,0x0ff0,0x1ff8,0x3ffc,0x7ffe, 0x7ffe,0x3ffc,0x1ff8,0x0ff0,0x07e0,0x03c0,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25c6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x03c0,0x07e0,0x0e70,0x1c38,0x381c,0x700e, 0x700e,0x381c,0x1c38,0x0e70,0x07e0,0x03c0,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ca 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03c0,0x07e0,0x0660, 0x0660,0x07e0,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25cb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03c0,0x07e0,0x07e0, 0x07e0,0x07e0,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25cf 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xfc3f,0xf81f,0xf81f, 0xf81f,0xf81f,0xfc3f,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, // u25d8 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xfc3f,0xf81f,0xf99f, 0xf99f,0xf81f,0xfc3f,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, // u25d9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff8,0x3ffc,0x700e,0x6006,0x6006,0x6006,0x6e76,0x6e76,0x6006,0x6006, 0x6006,0x6006,0x6ff6,0x67e6,0x6006,0x6006,0x6006,0x700e,0x3ffc,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u263a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff8,0x3ffc,0x7ffe,0x7ffe,0x7ffe,0x7ffe,0x718e,0x718e,0x7ffe,0x7ffe, 0x7ffe,0x7ffe,0x700e,0x781e,0x7c3e,0x7ffe,0x7ffe,0x7ffe,0x3ffc,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u263b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0180,0x318c,0x399c,0x1db8,0x0ff0,0x07e0,0x3e7c, 0x3e7c,0x07e0,0x0ff0,0x1db8,0x399c,0x318c,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u263c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x381c,0x300c,0x300c,0x300c,0x300c,0x300c,0x381c,0x1ff8, 0x0ff0,0x0180,0x0180,0x0180,0x3ffc,0x3ffc,0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2640 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01fe,0x01fe,0x001e,0x003e,0x0076,0x00e6,0x01c6,0x0386,0x1fe0,0x3ff0, 0x7038,0x6018,0x6018,0x6018,0x6018,0x6018,0x6018,0x7038,0x3ff0,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2642 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x03c0,0x07e0,0x0ff0,0x1ff8,0x3ffc,0x3ffc,0x7ffe,0x7ffe, 0x7ffe,0x7ffe,0x7ffe,0x3dbc,0x1db8,0x0180,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2660 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03c0,0x07e0,0x07e0,0x07e0,0x07e0,0x07e0,0x03c0,0x0180,0x1db8,0x3ffc, 0x7ffe,0x7ffe,0x7ffe,0x7ffe,0x3ffc,0x1db8,0x0180,0x0180,0x07e0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2663 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3c3c,0x7e7e,0x7e7e,0x7ffe,0x7ffe,0x7ffe,0x7ffe,0x7ffe, 0x3ffc,0x3ffc,0x1ff8,0x0ff0,0x07e0,0x03c0,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2665 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x03c0,0x07e0,0x0ff0,0x1ff8,0x3ffc,0x7ffe, 0x7ffe,0x3ffc,0x1ff8,0x0ff0,0x07e0,0x03c0,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2666 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ffc,0x1ffc,0x180c,0x180c,0x180c,0x180c,0x1ffc,0x1ffc,0x1800,0x1800, 0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x7800,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u266a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffe,0x3ffe,0x3006,0x3006,0x3006,0x3006,0x3ffe,0x3ffe,0x3006,0x3006, 0x3006,0x3006,0x3006,0x3006,0x3006,0x3006,0x3006,0x301e,0xf01c,0xe000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u266b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0003,0x0003,0x0006,0x0006,0x000c,0x000c,0x0018,0x0018,0xc030,0xc030, 0x6060,0x6060,0x30c0,0x30c0,0x1980,0x1980,0x0f00,0x0f00,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2713 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0007,0x0007,0x000e,0x000e,0x001c,0x001c,0x0038,0x0038,0xc070,0xc070, 0xe0e0,0xe0e0,0x71c0,0x71c0,0x3b80,0x3b80,0x1f00,0x1f00,0x0e00,0x0e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2714 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0030,0x3030,0x1860,0x0c60,0x06c0,0x03c0,0x0180,0x01c0, 0x0360,0x0330,0x0618,0x060c,0x0c00,0x0c00,0x1800,0x1800,0x3000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2717 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x7070,0x3870,0x1ce0,0x0ee0,0x07c0,0x03c0,0x03c0,0x03e0, 0x0770,0x0738,0x0e1c,0x0e0c,0x1c00,0x1c00,0x3800,0x3800,0x7000,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2718 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0060,0x0060,0x00c0,0x00c0,0x0180,0x0180,0x0300,0x0300,0x0600,0x0600, 0x0600,0x0600,0x0300,0x0300,0x0180,0x0180,0x00c0,0x00c0,0x0060,0x0060,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u27e8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0600,0x0300,0x0300,0x0180,0x0180,0x00c0,0x00c0,0x0060,0x0060, 0x0060,0x0060,0x00c0,0x00c0,0x0180,0x0180,0x0300,0x0300,0x0600,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u27e9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x030c,0x030c,0x0618,0x0618,0x0c30,0x0c30,0x1860,0x1860,0x30c0,0x30c0, 0x30c0,0x30c0,0x1860,0x1860,0x0c30,0x0c30,0x0618,0x0618,0x030c,0x030c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u27ea 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30c0,0x30c0,0x1860,0x1860,0x0c30,0x0c30,0x0618,0x0618,0x030c,0x030c, 0x030c,0x030c,0x0618,0x0618,0x0c30,0x0c30,0x1860,0x1860,0x30c0,0x30c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u27eb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2800 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2801 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2802 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2803 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2804 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2805 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2806 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2807 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2808 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2809 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280a 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280b 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280c 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280d 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280e 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2810 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2811 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2812 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2813 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2814 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2815 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2816 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2817 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2818 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2819 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281a 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281b 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281c 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281d 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281e 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2820 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2821 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2822 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2823 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2824 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2825 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2826 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2827 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2828 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2829 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282a 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282b 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282c 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282d 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282e 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2830 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2831 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2832 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2833 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2834 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2835 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2836 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2837 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2838 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2839 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283a 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283b 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283c 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283d 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283e 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2840 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2841 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2842 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2843 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2844 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2845 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2846 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2847 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2848 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2849 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u284a 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u284b 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u284c 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u284d 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u284e 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u284f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2850 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2851 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2852 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2853 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2854 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2855 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2856 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2857 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2858 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2859 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u285a 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u285b 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u285c 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u285d 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u285e 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u285f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2860 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2861 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2862 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2863 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2864 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2865 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2866 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2867 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2868 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2869 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u286a 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u286b 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u286c 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u286d 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u286e 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u286f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2870 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2871 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2872 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2873 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2874 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2875 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2876 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2877 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2878 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u2879 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u287a 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u287b 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u287c 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u287d 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u287e 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, // u287f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u2880 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u2881 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u2882 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u2883 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u2884 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u2885 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u2886 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u2887 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u2888 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u2889 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u288a 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u288b 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u288c 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u288d 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u288e 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u288f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u2890 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u2891 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u2892 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u2893 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u2894 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u2895 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u2896 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u2897 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u2898 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u2899 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u289a 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u289b 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u289c 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u289d 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u289e 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u289f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28a0 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28a1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28a2 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28a4 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28a5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28a6 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28a7 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28a8 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28a9 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28aa 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28ab 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28ac 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28ad 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28ae 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28af 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28b0 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28b1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28b2 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28b4 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28b6 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28b7 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28b8 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28b9 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28ba 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28bb 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28bc 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28bd 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28be 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, // u28bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28c0 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28c2 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28c4 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28c6 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28c7 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28c8 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28c9 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28ca 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28cb 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28cc 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28cd 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28ce 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28cf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28d0 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28d2 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28d4 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28d6 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28d7 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28d8 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28d9 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28da 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28db 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28dc 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28dd 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28de 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28df 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28e0 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28e1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28e2 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28e3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28e4 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28e6 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28e7 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28e8 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28e9 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28ea 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28eb 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28ec 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28ed 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28ee 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28ef 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28f0 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28f2 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28f3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28f4 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28f6 0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28f7 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28f8 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28f9 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28fa 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28fb 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28fc 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28fd 0x0000,0x0000,0x0018,0x0018,0x0018,0x0018,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28fe 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, 0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000,0x0000,0x0000,0x1818,0x1818,0x1818,0x1818,0x0000,0x0000, // u28ff 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2e2c 0x6000,0x6000,0x6000,0x6060,0x60f0,0x61f8,0x63fc,0x676e,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x6060,0x60c0, 0x4180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000, // ue0a0 0x0000,0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7fc0,0x7fc0,0x0000,0x0000, 0x060c,0x060c,0x070c,0x078c,0x06cc,0x066c,0x063c,0x061c,0x060c,0x060c,0x060c,0x0000,0x0000,0x0000,0x0000,0x0000, // ue0a1 0x0000,0x0000,0x0000,0x0000,0x07e0,0x0ff0,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x3ffc,0x7ffe, 0x7ffe,0x7ffe,0x7c3e,0x781e,0x781e,0x781e,0x7c3e,0x7ffe,0x7ffe,0x7ffe,0x7ffe,0x7ffe,0x0000,0x0000,0x0000,0x0000, // ue0a2 0x8000,0xc000,0xe000,0xf000,0xf800,0xfc00,0xfe00,0xff00,0xff80,0xffc0,0xffe0,0xfff0,0xfff8,0xfffc,0xfffe,0xffff, 0xffff,0xfffe,0xfffc,0xfff8,0xfff0,0xffe0,0xffc0,0xff80,0xff00,0xfe00,0xfc00,0xf800,0xf000,0xe000,0xc000,0x8000, // ue0b0 0x8000,0xc000,0xe000,0x7000,0x3800,0x1c00,0x0e00,0x0700,0x0380,0x01c0,0x00e0,0x0070,0x0038,0x001c,0x000e,0x0007, 0x0007,0x000e,0x001c,0x0038,0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800,0x7000,0xe000,0xc000,0x8000, // ue0b1 0x0001,0x0003,0x0007,0x000f,0x001f,0x003f,0x007f,0x00ff,0x01ff,0x03ff,0x07ff,0x0fff,0x1fff,0x3fff,0x7fff,0xffff, 0xffff,0x7fff,0x3fff,0x1fff,0x0fff,0x07ff,0x03ff,0x01ff,0x00ff,0x007f,0x003f,0x001f,0x000f,0x0007,0x0003,0x0001, // ue0b2 0x0001,0x0003,0x0007,0x000e,0x001c,0x0038,0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800,0x7000,0xe000, 0xe000,0x7000,0x3800,0x1c00,0x0e00,0x0700,0x0380,0x01c0,0x00e0,0x0070,0x0038,0x001c,0x000e,0x0007,0x0003,0x0001, // ue0b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0078,0x0078,0x0018,0x0018, 0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x0018,0x1818,0x1818,0x1c38,0x0ff0,0x07e0,0x0000, // uf6be 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c, 0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x300c,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 // ufffd }; // codepoints array constexpr std::array fixedfont_codepoints = { 0x0000,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e, 0x002f,0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e, 0x003f,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e, 0x004f,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e, 0x005f,0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e, 0x006f,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e, 0x00a0,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af, 0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf, 0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf, 0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df, 0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef, 0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff, 0x0100,0x0101,0x0102,0x0103,0x0104,0x0105,0x0106,0x0107,0x0108,0x0109,0x010a,0x010b,0x010c,0x010d,0x010e,0x010f, 0x0110,0x0111,0x0112,0x0113,0x0114,0x0115,0x0116,0x0117,0x0118,0x0119,0x011a,0x011b,0x011c,0x011d,0x011e,0x011f, 0x0120,0x0121,0x0122,0x0123,0x0124,0x0125,0x0126,0x0127,0x0128,0x0129,0x012a,0x012b,0x012c,0x012d,0x012e,0x012f, 0x0130,0x0131,0x0132,0x0133,0x0134,0x0135,0x0136,0x0137,0x0138,0x0139,0x013a,0x013b,0x013c,0x013d,0x013e,0x013f, 0x0140,0x0141,0x0142,0x0143,0x0144,0x0145,0x0146,0x0147,0x0148,0x0149,0x014a,0x014b,0x014c,0x014d,0x014e,0x014f, 0x0150,0x0151,0x0152,0x0153,0x0154,0x0155,0x0156,0x0157,0x0158,0x0159,0x015a,0x015b,0x015c,0x015d,0x015e,0x015f, 0x0160,0x0161,0x0162,0x0163,0x0164,0x0165,0x0166,0x0167,0x0168,0x0169,0x016a,0x016b,0x016c,0x016d,0x016e,0x016f, 0x0170,0x0171,0x0172,0x0173,0x0174,0x0175,0x0176,0x0177,0x0178,0x0179,0x017a,0x017b,0x017c,0x017d,0x017e,0x017f, 0x0186,0x018e,0x018f,0x0190,0x0192,0x019d,0x019e,0x01b5,0x01b6,0x01b7,0x01cd,0x01ce,0x01cf,0x01d0,0x01d1,0x01d2, 0x01d3,0x01d4,0x01e2,0x01e3,0x01e4,0x01e5,0x01e6,0x01e7,0x01e8,0x01e9,0x01ea,0x01eb,0x01ec,0x01ed,0x01ee,0x01ef, 0x01f0,0x01f4,0x01f5,0x01fc,0x01fd,0x01fe,0x01ff,0x0218,0x0219,0x021a,0x021b,0x0232,0x0233,0x0237,0x0254,0x0258, 0x0259,0x025b,0x0272,0x0292,0x02bb,0x02bc,0x02bd,0x02c6,0x02c7,0x02d8,0x02d9,0x02db,0x02dc,0x02dd,0x0300,0x0301, 0x0302,0x0303,0x0304,0x0305,0x0306,0x0307,0x0308,0x030a,0x030b,0x030c,0x0329,0x0384,0x0385,0x0386,0x0387,0x0388, 0x0389,0x038a,0x038c,0x038e,0x038f,0x0390,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039a, 0x039b,0x039c,0x039d,0x039e,0x039f,0x03a0,0x03a1,0x03a3,0x03a4,0x03a5,0x03a6,0x03a7,0x03a8,0x03a9,0x03aa,0x03ab, 0x03ac,0x03ad,0x03ae,0x03af,0x03b0,0x03b1,0x03b2,0x03b3,0x03b4,0x03b5,0x03b6,0x03b7,0x03b8,0x03b9,0x03ba,0x03bb, 0x03bc,0x03bd,0x03be,0x03bf,0x03c0,0x03c1,0x03c2,0x03c3,0x03c4,0x03c5,0x03c6,0x03c7,0x03c8,0x03c9,0x03ca,0x03cb, 0x03cc,0x03cd,0x03ce,0x03d1,0x03d5,0x03f0,0x03f1,0x03f2,0x03f3,0x03f4,0x03f5,0x03f6,0x0400,0x0401,0x0402,0x0403, 0x0404,0x0405,0x0406,0x0407,0x0408,0x0409,0x040a,0x040b,0x040c,0x040d,0x040e,0x040f,0x0410,0x0411,0x0412,0x0413, 0x0414,0x0415,0x0416,0x0417,0x0418,0x0419,0x041a,0x041b,0x041c,0x041d,0x041e,0x041f,0x0420,0x0421,0x0422,0x0423, 0x0424,0x0425,0x0426,0x0427,0x0428,0x0429,0x042a,0x042b,0x042c,0x042d,0x042e,0x042f,0x0430,0x0431,0x0432,0x0433, 0x0434,0x0435,0x0436,0x0437,0x0438,0x0439,0x043a,0x043b,0x043c,0x043d,0x043e,0x043f,0x0440,0x0441,0x0442,0x0443, 0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,0x044a,0x044b,0x044c,0x044d,0x044e,0x044f,0x0450,0x0451,0x0452,0x0453, 0x0454,0x0455,0x0456,0x0457,0x0458,0x0459,0x045a,0x045b,0x045c,0x045d,0x045e,0x045f,0x0462,0x0463,0x046a,0x046b, 0x0490,0x0491,0x0492,0x0493,0x0494,0x0495,0x0496,0x0497,0x0498,0x0499,0x049a,0x049b,0x049c,0x049d,0x04a0,0x04a1, 0x04a2,0x04a3,0x04a4,0x04a5,0x04aa,0x04ab,0x04ae,0x04af,0x04b0,0x04b1,0x04b2,0x04b3,0x04b6,0x04b7,0x04b8,0x04b9, 0x04ba,0x04bb,0x04c0,0x04c1,0x04c2,0x04cf,0x04d0,0x04d1,0x04d2,0x04d3,0x04d4,0x04d5,0x04d6,0x04d7,0x04d8,0x04d9, 0x04da,0x04db,0x04dc,0x04dd,0x04de,0x04df,0x04e2,0x04e3,0x04e4,0x04e5,0x04e6,0x04e7,0x04e8,0x04e9,0x04ea,0x04eb, 0x04ec,0x04ed,0x04ee,0x04ef,0x04f0,0x04f1,0x04f2,0x04f3,0x04f4,0x04f5,0x04f8,0x04f9,0x05d0,0x05d1,0x05d2,0x05d3, 0x05d4,0x05d5,0x05d6,0x05d7,0x05d8,0x05d9,0x05da,0x05db,0x05dc,0x05dd,0x05de,0x05df,0x05e0,0x05e1,0x05e2,0x05e3, 0x05e4,0x05e5,0x05e6,0x05e7,0x05e8,0x05e9,0x05ea,0x1e0c,0x1e0d,0x1e34,0x1e35,0x1e36,0x1e37,0x1e40,0x1e41,0x1e42, 0x1e43,0x1e44,0x1e45,0x1e46,0x1e47,0x1e6c,0x1e6d,0x1eb8,0x1eb9,0x1ebc,0x1ebd,0x1eca,0x1ecb,0x1ecc,0x1ecd,0x1ee4, 0x1ee5,0x1ef8,0x1ef9,0x2000,0x2001,0x2002,0x2003,0x2004,0x2005,0x2006,0x2007,0x2008,0x2009,0x200a,0x200b,0x200c, 0x200d,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x2015,0x2016,0x2017,0x2018,0x2019,0x201a,0x201b,0x201c, 0x201d,0x201e,0x201f,0x2020,0x2021,0x2022,0x2026,0x2030,0x2032,0x2033,0x2039,0x203a,0x203c,0x203e,0x2070,0x2071, 0x2074,0x2075,0x2076,0x2077,0x2078,0x2079,0x207a,0x207b,0x207c,0x207d,0x207e,0x207f,0x2080,0x2081,0x2082,0x2083, 0x2084,0x2085,0x2086,0x2087,0x2088,0x2089,0x208a,0x208b,0x208c,0x208d,0x208e,0x2090,0x2091,0x2092,0x2093,0x2094, 0x2095,0x2096,0x2097,0x2098,0x209a,0x20a7,0x20aa,0x20ac,0x20ae,0x2102,0x210e,0x210f,0x2115,0x2116,0x211a,0x211d, 0x2122,0x2124,0x2126,0x2135,0x2190,0x2191,0x2192,0x2193,0x2194,0x2195,0x21a4,0x21a6,0x21a8,0x21b5,0x21bb,0x21cb, 0x21cc,0x21d0,0x21d1,0x21d2,0x21d3,0x21d4,0x21d5,0x2200,0x2203,0x2204,0x2205,0x2206,0x2207,0x2208,0x2209,0x220a, 0x220b,0x220c,0x220d,0x2212,0x2213,0x2214,0x2215,0x2216,0x2219,0x221a,0x221e,0x221f,0x2225,0x2227,0x2228,0x2229, 0x222a,0x2248,0x2260,0x2261,0x2264,0x2265,0x226a,0x226b,0x2282,0x2283,0x2286,0x2287,0x22a5,0x22c2,0x22c3,0x2300, 0x2302,0x2308,0x2309,0x230a,0x230b,0x2310,0x2319,0x2320,0x2321,0x239b,0x239c,0x239d,0x239e,0x239f,0x23a0,0x23a1, 0x23a2,0x23a3,0x23a4,0x23a5,0x23a6,0x23a7,0x23a8,0x23a9,0x23ab,0x23ac,0x23ad,0x23ae,0x23af,0x23ba,0x23bb,0x23bc, 0x23bd,0x23d0,0x2409,0x240a,0x240b,0x240c,0x240d,0x2424,0x2500,0x2501,0x2502,0x2503,0x2508,0x2509,0x250a,0x250b, 0x250c,0x250d,0x250e,0x250f,0x2510,0x2511,0x2512,0x2513,0x2514,0x2515,0x2516,0x2517,0x2518,0x2519,0x251a,0x251b, 0x251c,0x251d,0x251e,0x251f,0x2520,0x2521,0x2522,0x2523,0x2524,0x2525,0x2526,0x2527,0x2528,0x2529,0x252a,0x252b, 0x252c,0x252d,0x252e,0x252f,0x2530,0x2531,0x2532,0x2533,0x2534,0x2535,0x2536,0x2537,0x2538,0x2539,0x253a,0x253b, 0x253c,0x253d,0x253e,0x253f,0x2540,0x2541,0x2542,0x2543,0x2544,0x2545,0x2546,0x2547,0x2548,0x2549,0x254a,0x254b, 0x2550,0x2551,0x2552,0x2553,0x2554,0x2555,0x2556,0x2557,0x2558,0x2559,0x255a,0x255b,0x255c,0x255d,0x255e,0x255f, 0x2560,0x2561,0x2562,0x2563,0x2564,0x2565,0x2566,0x2567,0x2568,0x2569,0x256a,0x256b,0x256c,0x256d,0x256e,0x256f, 0x2570,0x2571,0x2572,0x2573,0x2574,0x2575,0x2576,0x2577,0x2578,0x2579,0x257a,0x257b,0x257c,0x257d,0x257e,0x257f, 0x2580,0x2581,0x2582,0x2583,0x2584,0x2585,0x2586,0x2587,0x2588,0x2589,0x258a,0x258b,0x258c,0x258d,0x258e,0x258f, 0x2590,0x2591,0x2592,0x2593,0x2596,0x2597,0x2598,0x2599,0x259a,0x259b,0x259c,0x259d,0x259e,0x259f,0x25a0,0x25ac, 0x25ae,0x25b2,0x25b6,0x25ba,0x25bc,0x25c0,0x25c4,0x25c6,0x25ca,0x25cb,0x25cf,0x25d8,0x25d9,0x263a,0x263b,0x263c, 0x2640,0x2642,0x2660,0x2663,0x2665,0x2666,0x266a,0x266b,0x2713,0x2714,0x2717,0x2718,0x27e8,0x27e9,0x27ea,0x27eb, 0x2800,0x2801,0x2802,0x2803,0x2804,0x2805,0x2806,0x2807,0x2808,0x2809,0x280a,0x280b,0x280c,0x280d,0x280e,0x280f, 0x2810,0x2811,0x2812,0x2813,0x2814,0x2815,0x2816,0x2817,0x2818,0x2819,0x281a,0x281b,0x281c,0x281d,0x281e,0x281f, 0x2820,0x2821,0x2822,0x2823,0x2824,0x2825,0x2826,0x2827,0x2828,0x2829,0x282a,0x282b,0x282c,0x282d,0x282e,0x282f, 0x2830,0x2831,0x2832,0x2833,0x2834,0x2835,0x2836,0x2837,0x2838,0x2839,0x283a,0x283b,0x283c,0x283d,0x283e,0x283f, 0x2840,0x2841,0x2842,0x2843,0x2844,0x2845,0x2846,0x2847,0x2848,0x2849,0x284a,0x284b,0x284c,0x284d,0x284e,0x284f, 0x2850,0x2851,0x2852,0x2853,0x2854,0x2855,0x2856,0x2857,0x2858,0x2859,0x285a,0x285b,0x285c,0x285d,0x285e,0x285f, 0x2860,0x2861,0x2862,0x2863,0x2864,0x2865,0x2866,0x2867,0x2868,0x2869,0x286a,0x286b,0x286c,0x286d,0x286e,0x286f, 0x2870,0x2871,0x2872,0x2873,0x2874,0x2875,0x2876,0x2877,0x2878,0x2879,0x287a,0x287b,0x287c,0x287d,0x287e,0x287f, 0x2880,0x2881,0x2882,0x2883,0x2884,0x2885,0x2886,0x2887,0x2888,0x2889,0x288a,0x288b,0x288c,0x288d,0x288e,0x288f, 0x2890,0x2891,0x2892,0x2893,0x2894,0x2895,0x2896,0x2897,0x2898,0x2899,0x289a,0x289b,0x289c,0x289d,0x289e,0x289f, 0x28a0,0x28a1,0x28a2,0x28a3,0x28a4,0x28a5,0x28a6,0x28a7,0x28a8,0x28a9,0x28aa,0x28ab,0x28ac,0x28ad,0x28ae,0x28af, 0x28b0,0x28b1,0x28b2,0x28b3,0x28b4,0x28b5,0x28b6,0x28b7,0x28b8,0x28b9,0x28ba,0x28bb,0x28bc,0x28bd,0x28be,0x28bf, 0x28c0,0x28c1,0x28c2,0x28c3,0x28c4,0x28c5,0x28c6,0x28c7,0x28c8,0x28c9,0x28ca,0x28cb,0x28cc,0x28cd,0x28ce,0x28cf, 0x28d0,0x28d1,0x28d2,0x28d3,0x28d4,0x28d5,0x28d6,0x28d7,0x28d8,0x28d9,0x28da,0x28db,0x28dc,0x28dd,0x28de,0x28df, 0x28e0,0x28e1,0x28e2,0x28e3,0x28e4,0x28e5,0x28e6,0x28e7,0x28e8,0x28e9,0x28ea,0x28eb,0x28ec,0x28ed,0x28ee,0x28ef, 0x28f0,0x28f1,0x28f2,0x28f3,0x28f4,0x28f5,0x28f6,0x28f7,0x28f8,0x28f9,0x28fa,0x28fb,0x28fc,0x28fd,0x28fe,0x28ff, 0x2e2c,0xe0a0,0xe0a1,0xe0a2,0xe0b0,0xe0b1,0xe0b2,0xe0b3,0xf6be,0xfffd }; } // namespace // -- end of autogenerated text --- namespace fixed_font_32b { // -- start of autogenerated text --- // definition section for font: ter-u32b.bdf constexpr int CHARCOUNT = 1354; constexpr int WIDTH = 16; constexpr int HEIGHT = 32; constexpr int OFFSET_X = 0; constexpr int OFFSET_Y = 0; constexpr FixedFont_info_t fixedfont_info = { "Terminus", // font name "ter-u32b.bdf", // font name internal CHARCOUNT, // num of chars WIDTH, HEIGHT, OFFSET_X, OFFSET_Y, true // bold }; // font bitmap definitions constexpr std::array fixedfont_bitmap = { 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7c7c,0x7c7c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x701c,0x701c, 0x701c,0x701c,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x7c7c,0x7c7c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0020 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0021 0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0022 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x1c70,0x7ffc,0x7ffc,0x1c70,0x1c70,0x1c70, 0x1c70,0x1c70,0x1c70,0x7ffc,0x7ffc,0x1c70,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0023 0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x1ff0,0x3ff8,0x7bbc,0x739c,0x7380,0x7380,0x7380,0x7b80,0x3ff0, 0x1ff8,0x03bc,0x039c,0x039c,0x039c,0x739c,0x7bbc,0x3ff8,0x1ff0,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000, // u0024 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f1c,0x3f9c,0x3bb8,0x3bb8,0x3ff0,0x1f70,0x00e0,0x00e0,0x01c0,0x01c0, 0x0380,0x0380,0x0700,0x0700,0x0ef8,0x0ffc,0x1ddc,0x1ddc,0x39fc,0x38f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0025 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc0,0x1fe0,0x3870,0x3870,0x3870,0x3870,0x3870,0x1ce0,0x0fc0,0x0f80, 0x1fce,0x38ee,0x707c,0x7038,0x7038,0x7038,0x7038,0x787c,0x3fee,0x1fce,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0026 0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0027 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00e0,0x01c0,0x0380,0x0700,0x0700,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0700,0x0700,0x0380,0x01c0,0x00e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0028 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x0700,0x0380,0x01c0,0x01c0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0, 0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x01c0,0x01c0,0x0380,0x0700,0x0e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0029 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x1c70,0x0ee0,0x07c0,0x0380,0x7ffc, 0x7ffc,0x0380,0x07c0,0x0ee0,0x1c70,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0380,0x7ffc, 0x7ffc,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0700,0x0e00,0x0000,0x0000,0x0000,0x0000, // u002c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc, 0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x001c,0x001c,0x0038,0x0038,0x0070,0x0070,0x00e0,0x00e0,0x01c0,0x01c0, 0x0380,0x0380,0x0700,0x0700,0x0e00,0x0e00,0x1c00,0x1c00,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u002f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x703c,0x707c,0x70fc,0x71dc,0x739c, 0x771c,0x7e1c,0x7c1c,0x781c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0030 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0780,0x0f80,0x1f80,0x1f80,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x1ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0031 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x001c,0x0038,0x0070, 0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0032 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x001c,0x001c,0x001c,0x003c,0x0ff8, 0x0ff8,0x003c,0x001c,0x001c,0x001c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0033 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x001c,0x003c,0x007c,0x00fc,0x01dc,0x039c,0x071c,0x0e1c,0x1c1c,0x381c, 0x701c,0x701c,0x701c,0x7ffc,0x7ffc,0x001c,0x001c,0x001c,0x001c,0x001c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0034 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ff0,0x7ff8, 0x003c,0x001c,0x001c,0x001c,0x001c,0x001c,0x701c,0x781c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0035 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff8,0x3ff8,0x7800,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ff0,0x7ff8, 0x703c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0036 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x701c,0x701c,0x701c,0x7038,0x0038,0x0070,0x0070,0x00e0, 0x00e0,0x01c0,0x01c0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0037 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8, 0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0038 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c, 0x3ffc,0x1ffc,0x001c,0x001c,0x001c,0x001c,0x001c,0x003c,0x3ff8,0x3ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0039 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0700,0x0e00,0x0000,0x0000,0x0000,0x0000, // u003b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x001c,0x0038,0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800, 0x3800,0x1c00,0x0e00,0x0700,0x0380,0x01c0,0x00e0,0x0070,0x0038,0x001c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x0000,0x0000, 0x0000,0x0000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x1c00,0x0e00,0x0700,0x0380,0x01c0,0x00e0,0x0070,0x0038,0x001c, 0x001c,0x0038,0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x0038,0x0070,0x00e0, 0x01c0,0x0380,0x0380,0x0380,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u003f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff8,0x3ffc,0x780e,0x7006,0x71fe,0x73fe,0x778e,0x770e,0x770e,0x770e, 0x770e,0x770e,0x770e,0x779e,0x73fe,0x71f6,0x7000,0x7800,0x3ffe,0x1ffe,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0040 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x7ffc,0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0041 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff8,0x703c,0x701c,0x701c,0x701c,0x701c,0x7038,0x7ff0,0x7ff0, 0x7038,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x703c,0x7ff8,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0042 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x7000,0x7000,0x7000,0x7000,0x7000, 0x7000,0x7000,0x7000,0x7000,0x7000,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0043 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7ff0,0x7078,0x7038,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x7038,0x7078,0x7ff0,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0044 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7fe0, 0x7fe0,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0045 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7fe0, 0x7fe0,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0046 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x7000,0x7000,0x7000,0x7000,0x71fc, 0x71fc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0047 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x7ffc, 0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0048 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0x0fe0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0049 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00fe,0x00fe,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038, 0x0038,0x0038,0x0038,0x0038,0x7038,0x7038,0x7038,0x7878,0x3ff0,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u004a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x700c,0x701c,0x7038,0x7070,0x70e0,0x71c0,0x7380,0x7700,0x7e00,0x7c00, 0x7c00,0x7e00,0x7700,0x7380,0x71c0,0x70e0,0x7070,0x7038,0x701c,0x700c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u004b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000, 0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u004c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x700e,0x700e,0x781e,0x7c3e,0x7e7e,0x7e7e,0x77ee,0x73ce,0x73ce,0x718e, 0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u004d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x7c1c,0x7e1c,0x771c,0x739c, 0x71dc,0x70fc,0x707c,0x703c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u004e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u004f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff8,0x703c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x703c, 0x7ff8,0x7ff0,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0050 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x739c,0x79fc,0x3ff8,0x1ff0,0x0038,0x001c,0x0000,0x0000,0x0000,0x0000, // u0051 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff8,0x703c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x703c, 0x7ff8,0x7ff0,0x7e00,0x7700,0x7380,0x71c0,0x70e0,0x7070,0x7038,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0052 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x7000,0x7000,0x7000,0x7800,0x3ff0, 0x1ff8,0x003c,0x001c,0x001c,0x001c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0053 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0054 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0055 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x3838,0x3838,0x3838,0x3838,0x3838, 0x1c70,0x1c70,0x1c70,0x1c70,0x0ee0,0x0ee0,0x0ee0,0x07c0,0x07c0,0x07c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0056 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e, 0x718e,0x73ce,0x73ce,0x77ee,0x7e7e,0x7e7e,0x7c3e,0x781e,0x700e,0x700e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0057 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x3838,0x3838,0x1c70,0x1c70,0x0ee0,0x0ee0,0x07c0,0x07c0, 0x07c0,0x07c0,0x0ee0,0x0ee0,0x1c70,0x1c70,0x3838,0x3838,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0058 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x3838,0x3838,0x1c70,0x1c70,0x0ee0,0x0ee0,0x07c0, 0x07c0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0059 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x001c,0x001c,0x001c,0x0038,0x0070,0x00e0,0x01c0,0x0380, 0x0700,0x0e00,0x1c00,0x3800,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x0ff0,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0ff0,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x1c00,0x1c00,0x0e00,0x0e00,0x0700,0x0700,0x0380,0x0380, 0x01c0,0x01c0,0x00e0,0x00e0,0x0070,0x0070,0x0038,0x0038,0x001c,0x001c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x0ff0,0x0070,0x0070,0x0070,0x0070,0x0070,0x0070,0x0070,0x0070, 0x0070,0x0070,0x0070,0x0070,0x0070,0x0070,0x0070,0x0070,0x0ff0,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005d 0x0000,0x0000,0x0000,0x0000,0x0380,0x07c0,0x0ee0,0x1c70,0x3838,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u005e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000, // u005f 0x0000,0x1c00,0x0e00,0x0700,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0060 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x003c,0x001c, 0x001c,0x1ffc,0x3ffc,0x781c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0061 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ff0,0x7ff8,0x703c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x703c,0x7ff8,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0062 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0063 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x1ffc,0x3ffc,0x781c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0064 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x781c,0x3ffc,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0065 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00fe,0x01fe,0x03c0,0x0380,0x0380,0x0380,0x3ff8,0x3ff8,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0066 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ffc,0x3ffc,0x781c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x001c,0x001c,0x003c,0x3ff8,0x3ff0,0x0000, // u0067 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ff0,0x7ff8,0x703c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0068 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0f80,0x0f80,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0069 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x00f8,0x00f8,0x0038,0x0038, 0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x3838,0x3838,0x3c78,0x1ff0,0x0fe0,0x0000, // u006a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x381c,0x3838,0x3870,0x38e0, 0x39c0,0x3b80,0x3f00,0x3f00,0x3b80,0x39c0,0x38e0,0x3870,0x3838,0x381c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u006b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f80,0x0f80,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u006c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff8,0x73bc,0x739c, 0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u006d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff8,0x703c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u006e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u006f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff8,0x703c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x703c,0x7ff8,0x7ff0,0x7000,0x7000,0x7000,0x7000,0x7000,0x0000, // u0070 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ffc,0x3ffc,0x781c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x001c,0x001c,0x001c,0x001c,0x001c,0x0000, // u0071 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x73fc,0x77fc,0x7e00,0x7c00, 0x7800,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0072 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x7000, 0x7000,0x7800,0x3ff0,0x1ff8,0x003c,0x001c,0x001c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0073 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x7ff0,0x7ff0,0x0700,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0780,0x03fc,0x01fc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0074 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0075 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x3838, 0x3838,0x3838,0x1c70,0x1c70,0x1c70,0x0ee0,0x0ee0,0x07c0,0x07c0,0x07c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0076 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x7bbc,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0077 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x3838, 0x1c70,0x0ee0,0x07c0,0x07c0,0x0ee0,0x1c70,0x3838,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0078 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x001c,0x001c,0x003c,0x3ff8,0x3ff0,0x0000, // u0079 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x0038,0x0070, 0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01f0,0x03f0,0x0780,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x3e00, 0x3e00,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0780,0x03f0,0x01f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x3f00,0x0780,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x01f0, 0x01f0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0780,0x3f00,0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007d 0x0000,0x0000,0x0000,0x0000,0x1e1c,0x3f1c,0x779c,0x73dc,0x71f8,0x70f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u007e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x1ff0,0x3ff8,0x7bbc,0x739c, 0x7380,0x7380,0x7380,0x7380,0x7380,0x7380,0x739c,0x7bbc,0x3ff8,0x1ff0,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000, // u00a2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07e0,0x0ff0,0x1e78,0x1c38,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x7fe0, 0x7fe0,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1c1c,0x1c1c,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x3838,0x1ff0,0x1ff0,0x3838,0x3838,0x3838, 0x3838,0x3838,0x3838,0x1ff0,0x1ff0,0x3838,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x3838,0x3838,0x1c70,0x1c70,0x0ee0,0x0ee0,0x07c0,0x07c0, 0x0380,0x0380,0x3ff8,0x3ff8,0x0380,0x0380,0x3ff8,0x3ff8,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000, 0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a6 0x0000,0x0000,0x0000,0x0000,0x07e0,0x0ff0,0x1e78,0x1c38,0x1c00,0x1e00,0x0fc0,0x0fe0,0x1cf0,0x1c78,0x1c38,0x1c38, 0x1c38,0x1e38,0x0f38,0x07f0,0x03f0,0x0078,0x0038,0x1c38,0x1e78,0x0ff0,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a7 0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff8,0x3ffc,0x700e,0x67e6,0x6ff6,0x6e76,0x6e06,0x6e06, 0x6e06,0x6e06,0x6e76,0x6ff6,0x67e6,0x700e,0x3ffc,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00a9 0x0000,0x0000,0x1fe0,0x1ff0,0x0038,0x0038,0x0ff8,0x1ff8,0x3838,0x3838,0x3838,0x1ff8,0x0ff8,0x0000,0x0000,0x3ff8, 0x3ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01ce,0x039c,0x0738,0x0e70, 0x1ce0,0x39c0,0x7380,0x7380,0x39c0,0x1ce0,0x0e70,0x0738,0x039c,0x01ce,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ab 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x001c,0x001c, 0x001c,0x001c,0x001c,0x001c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ac 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff8, 0x3ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ad 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff8,0x3ffc,0x700e,0x6fe6,0x6ff6,0x6e76,0x6e76,0x6e76, 0x6fe6,0x6fc6,0x6fc6,0x6ee6,0x6e76,0x700e,0x3ffc,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ae 0x0000,0x0000,0x1ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00af 0x0000,0x0000,0x0000,0x0000,0x0fe0,0x1ff0,0x1c70,0x1c70,0x1c70,0x1c70,0x1ff0,0x0fe0,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0380,0x7ffc, 0x7ffc,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b1 0x0000,0x0000,0x0000,0x0fe0,0x1ff0,0x1c70,0x1c70,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1ff0,0x1ff0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b2 0x0000,0x0000,0x0000,0x0fe0,0x1ff0,0x1c70,0x0070,0x03e0,0x03e0,0x0070,0x0070,0x1c70,0x1ff0,0x0fe0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b3 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x703c,0x707c,0x70fc,0x7fdc,0x7f9c,0x7000,0x7000,0x7000,0x7000,0x7000,0x0000, // u00b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ffe,0x3ffe,0x79ce,0x71ce,0x71ce,0x71ce,0x71ce,0x71ce,0x79ce,0x3fce, 0x1fce,0x01ce,0x01ce,0x01ce,0x01ce,0x01ce,0x01ce,0x01ce,0x01ce,0x01ce,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380, 0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0700,0x0e00,0x0000, // u00b8 0x0000,0x0000,0x0000,0x0380,0x0780,0x0f80,0x0f80,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00b9 0x0000,0x0000,0x0fe0,0x1ff0,0x3838,0x3838,0x3838,0x3838,0x3838,0x3838,0x3838,0x1ff0,0x0fe0,0x0000,0x0000,0x3ff8, 0x3ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7380,0x39c0,0x1ce0,0x0e70, 0x0738,0x039c,0x01ce,0x01ce,0x039c,0x0738,0x0e70,0x1ce0,0x39c0,0x7380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x1e00,0x3e00,0x0e00,0x0e06,0x0e0e,0x0e1c,0x0e38,0x0e70,0x00e0, 0x01ce,0x039e,0x073e,0x0e7e,0x1cee,0x39ce,0x73fe,0x63fe,0x000e,0x000e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x3c00,0x7c06,0x1c0e,0x1c1c,0x1c38,0x1c70,0x1ce0,0x1dc0,0x0380, 0x0700,0x0efc,0x1dfe,0x39ce,0x71ce,0x601c,0x0038,0x0070,0x00fe,0x01fe,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00bd 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x7fc0,0x71c0,0x0f80,0x0f80,0x01c6,0x71ce,0x7fdc,0x3fb8,0x0070, 0x00ee,0x01de,0x03be,0x077e,0x0eee,0x1dce,0x3bfe,0x73fe,0x600e,0x000e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00be 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0380,0x0380,0x0380,0x0700, 0x0e00,0x1c00,0x3800,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00bf 0x0000,0x1c00,0x0e00,0x0700,0x0380,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x7ffc,0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c0 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x7ffc,0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c1 0x0000,0x0380,0x07c0,0x0ee0,0x1c70,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x7ffc,0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c2 0x0000,0x1f38,0x3bb8,0x3bb8,0x39f0,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x7ffc,0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c3 0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x7ffc,0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c4 0x0000,0x07c0,0x0ee0,0x0ee0,0x0ee0,0x07c0,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x7ffc,0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffe,0x7ffe,0xf1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xfffe, 0xfffe,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1fe,0xe1fe,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x7000,0x7000,0x7000,0x7000,0x7000, 0x7000,0x7000,0x7000,0x7000,0x7000,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0380,0x0380,0x0380,0x0700,0x0e00,0x0000, // u00c7 0x0000,0x1c00,0x0e00,0x0700,0x0380,0x0000,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7fe0, 0x7fe0,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c8 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7fe0, 0x7fe0,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00c9 0x0000,0x0380,0x07c0,0x0ee0,0x1c70,0x0000,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7fe0, 0x7fe0,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ca 0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7fe0, 0x7fe0,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cb 0x0000,0x1c00,0x0e00,0x0700,0x0380,0x0000,0x0fe0,0x0fe0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cc 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0fe0,0x0fe0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cd 0x0000,0x0380,0x07c0,0x0ee0,0x1c70,0x0000,0x0fe0,0x0fe0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ce 0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0fe0,0x0fe0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00cf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7ff0,0x7078,0x7038,0x701c,0x701c,0x701c,0x701c,0x701c,0xff9c, 0xff9c,0x701c,0x701c,0x701c,0x701c,0x701c,0x7038,0x7078,0x7ff0,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d0 0x0000,0x1f38,0x3bb8,0x3bb8,0x39f0,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x7c1c,0x7e1c,0x771c,0x739c, 0x71dc,0x70fc,0x707c,0x703c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d1 0x0000,0x1c00,0x0e00,0x0700,0x0380,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d2 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d3 0x0000,0x0380,0x07c0,0x0ee0,0x1c70,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d4 0x0000,0x1f38,0x3bb8,0x3bb8,0x39f0,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d5 0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x700e,0x381c,0x1c38,0x0e70,0x07e0,0x03c0, 0x03c0,0x07e0,0x0e70,0x1c38,0x381c,0x700e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783e,0x701e,0x701c,0x703c,0x707c,0x70fc,0x71dc,0x739c, 0x771c,0x7e1c,0x7c1c,0x781c,0x701c,0xf01c,0xf01c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d8 0x0000,0x1c00,0x0e00,0x0700,0x0380,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00d9 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00da 0x0000,0x0380,0x07c0,0x0ee0,0x1c70,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00db 0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00dc 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x701c,0x701c,0x701c,0x3838,0x3838,0x1c70,0x1c70,0x0ee0,0x0ee0,0x07c0, 0x07c0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00dd 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x7000,0x7000,0x7000,0x7ff0,0x7ff8,0x703c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x703c,0x7ff8,0x7ff0,0x7000,0x7000,0x7000,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00de 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fe0,0x7ff0,0x7078,0x7038,0x7038,0x7038,0x7038,0x7070,0x7ff0,0x7ff0, 0x7038,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x7c3c,0x77f8,0x73f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00df 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0e00,0x0700,0x0380,0x0000,0x0000,0x3ff0,0x3ff8,0x003c,0x001c, 0x001c,0x1ffc,0x3ffc,0x781c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x3ff0,0x3ff8,0x003c,0x001c, 0x001c,0x1ffc,0x3ffc,0x781c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x07c0,0x0ee0,0x1c70,0x0000,0x0000,0x3ff0,0x3ff8,0x003c,0x001c, 0x001c,0x1ffc,0x3ffc,0x781c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f38,0x3bb8,0x3bb8,0x39f0,0x0000,0x0000,0x3ff0,0x3ff8,0x003c,0x001c, 0x001c,0x1ffc,0x3ffc,0x781c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x3ff0,0x3ff8,0x003c,0x001c, 0x001c,0x1ffc,0x3ffc,0x781c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07c0,0x0ee0,0x0ee0,0x0ee0,0x07c0,0x0000,0x3ff0,0x3ff8,0x003c,0x001c, 0x001c,0x1ffc,0x3ffc,0x781c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ef8,0x7ffc,0x039e,0x038e, 0x038e,0x3f8e,0x7ffe,0xf3fe,0xe380,0xe380,0xe380,0xf3ce,0x7ffe,0x3efc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x701c,0x783c,0x3ff8,0x1ff0,0x0380,0x0380,0x0380,0x0700,0x0e00,0x0000, // u00e7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0e00,0x0700,0x0380,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x781c,0x3ffc,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x781c,0x3ffc,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00e9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x07c0,0x0ee0,0x1c70,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x781c,0x3ffc,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ea 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x781c,0x3ffc,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00eb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0e00,0x0700,0x0380,0x0000,0x0000,0x0f80,0x0f80,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ec 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x0f80,0x0f80,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ed 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x07c0,0x0ee0,0x1c70,0x0000,0x0000,0x0f80,0x0f80,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ee 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x0f80,0x0f80,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00ef 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1dc0,0x0f80,0x1f00,0x3b80,0x01c0,0x00e0,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f38,0x3bb8,0x3bb8,0x39f0,0x0000,0x0000,0x7ff0,0x7ff8,0x703c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0e00,0x0700,0x0380,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x07c0,0x0ee0,0x1c70,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f38,0x3bb8,0x3bb8,0x39f0,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x7ffc, 0x7ffc,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff6,0x3ffe,0x783c,0x707c, 0x70fc,0x71dc,0x739c,0x771c,0x7e1c,0x7c1c,0x781c,0x783c,0xfff8,0xdff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0e00,0x0700,0x0380,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00f9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00fa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x07c0,0x0ee0,0x1c70,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00fb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u00fc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x001c,0x001c,0x003c,0x3ff8,0x3ff0,0x0000, // u00fd 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ff0,0x7ff8,0x703c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x703c,0x7ff8,0x7ff0,0x7000,0x7000,0x7000,0x7000,0x7000,0x0000, // u00fe 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x001c,0x001c,0x003c,0x3ff8,0x3ff0,0x0000, // u00ff 0x0000,0x0000,0x1ff0,0x1ff0,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x7ffc,0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0100 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x1ff0,0x0000,0x0000,0x3ff0,0x3ff8,0x003c,0x001c, 0x001c,0x1ffc,0x3ffc,0x781c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0101 0x0000,0x1c70,0x1c70,0x0fe0,0x07c0,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x7ffc,0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0102 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x0fe0,0x07c0,0x0000,0x0000,0x3ff0,0x3ff8,0x003c,0x001c, 0x001c,0x1ffc,0x3ffc,0x781c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0103 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x7ffc,0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x007c,0x00f0,0x00e0,0x00fc,0x007c,0x0000, // u0104 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x003c,0x001c, 0x001c,0x1ffc,0x3ffc,0x781c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x007c,0x00f0,0x00e0,0x00fc,0x007c,0x0000, // u0105 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x7000,0x7000,0x7000,0x7000,0x7000, 0x7000,0x7000,0x7000,0x7000,0x7000,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0106 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0107 0x0000,0x0380,0x07c0,0x0ee0,0x1c70,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x7000,0x7000,0x7000,0x7000,0x7000, 0x7000,0x7000,0x7000,0x7000,0x7000,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0108 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x07c0,0x0ee0,0x1c70,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0109 0x0000,0x0380,0x0380,0x0380,0x0380,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x7000,0x7000,0x7000,0x7000,0x7000, 0x7000,0x7000,0x7000,0x7000,0x7000,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u010a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u010b 0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x7000,0x7000,0x7000,0x7000,0x7000, 0x7000,0x7000,0x7000,0x7000,0x7000,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u010c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u010d 0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x7fc0,0x7ff0,0x7078,0x7038,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x7038,0x7078,0x7ff0,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u010e 0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x1ffc,0x3ffc,0x781c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u010f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7ff0,0x7078,0x7038,0x701c,0x701c,0x701c,0x701c,0x701c,0xff9c, 0xff9c,0x701c,0x701c,0x701c,0x701c,0x701c,0x7038,0x7078,0x7ff0,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0110 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x001c,0x001c,0x03ff,0x03ff,0x001c,0x001c,0x1ffc,0x3ffc,0x781c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0111 0x0000,0x0000,0x1ff0,0x1ff0,0x0000,0x0000,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7fe0, 0x7fe0,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0112 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x1ff0,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x781c,0x3ffc,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0113 0x0000,0x1c70,0x1c70,0x0fe0,0x07c0,0x0000,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7fe0, 0x7fe0,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0114 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x0fe0,0x07c0,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x781c,0x3ffc,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0115 0x0000,0x0380,0x0380,0x0380,0x0380,0x0000,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7fe0, 0x7fe0,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0116 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x781c,0x3ffc,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0117 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7fe0, 0x7fe0,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x007c,0x00f0,0x00e0,0x00fc,0x007c,0x0000, // u0118 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x781c,0x3ffc,0x1ff8,0x03c0,0x0780,0x0700,0x07e0,0x03e0,0x0000, // u0119 0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7fe0, 0x7fe0,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u011a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x781c,0x3ffc,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u011b 0x0000,0x0380,0x07c0,0x0ee0,0x1c70,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x7000,0x7000,0x7000,0x7000,0x71fc, 0x71fc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u011c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x07c0,0x0ee0,0x1c70,0x0000,0x0000,0x1ffc,0x3ffc,0x781c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x001c,0x001c,0x003c,0x3ff8,0x3ff0,0x0000, // u011d 0x0000,0x1c70,0x1c70,0x0fe0,0x07c0,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x7000,0x7000,0x7000,0x7000,0x71fc, 0x71fc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u011e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x0fe0,0x07c0,0x0000,0x0000,0x1ffc,0x3ffc,0x781c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x001c,0x001c,0x003c,0x3ff8,0x3ff0,0x0000, // u011f 0x0000,0x0380,0x0380,0x0380,0x0380,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x7000,0x7000,0x7000,0x7000,0x71fc, 0x71fc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0120 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x01c0,0x01c0,0x01c0,0x0000,0x0000,0x1ffc,0x3ffc,0x781c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x001c,0x001c,0x003c,0x3ff8,0x3ff0,0x0000, // u0121 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x7000,0x7000,0x7000,0x7000,0x71fc, 0x71fc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0380,0x0380,0x0380,0x0700,0x0e00, // u0122 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x01c0,0x01c0,0x0000,0x1ffc,0x3ffc,0x781c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x001c,0x001c,0x003c,0x3ff8,0x3ff0,0x0000, // u0123 0x0000,0x0380,0x07c0,0x0ee0,0x1c70,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x7ffc, 0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0124 0x0000,0x0380,0x07c0,0x0ee0,0x1c70,0x0000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ff0,0x7ff8,0x703c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0125 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0xfffe,0xfffe,0x701c,0x701c,0x701c,0x701c,0x7ffc, 0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0126 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0xffc0,0xffc0,0x3800,0x3800,0x3ff8,0x3ffc,0x381e,0x380e, 0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0127 0x0000,0x1f38,0x3bb8,0x3bb8,0x39f0,0x0000,0x0fe0,0x0fe0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0128 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f38,0x3bb8,0x3bb8,0x39f0,0x0000,0x0000,0x0f80,0x0f80,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0129 0x0000,0x0000,0x1ff0,0x1ff0,0x0000,0x0000,0x0fe0,0x0fe0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u012a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x1ff0,0x0000,0x0000,0x0f80,0x0f80,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u012b 0x0000,0x1c70,0x1c70,0x0fe0,0x07c0,0x0000,0x0fe0,0x0fe0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u012c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x0fe0,0x07c0,0x0000,0x0000,0x0f80,0x0f80,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u012d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0x0fe0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0380,0x0780,0x0700,0x07e0,0x03e0,0x0000, // u012e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0f80,0x0f80,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0380,0x0780,0x0700,0x07e0,0x03e0,0x0000, // u012f 0x0000,0x0380,0x0380,0x0380,0x0380,0x0000,0x0fe0,0x0fe0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0130 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f80,0x0f80,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0131 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf81f,0xf81f,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e, 0x700e,0x700e,0x700e,0x700e,0x738e,0x738e,0x738e,0x73de,0xf9fc,0xf8f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0132 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x700e,0x700e,0x700e,0x700e,0x0000,0x0000,0xf03e,0xf03e,0x700e,0x700e, 0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0xf80e,0xf80e,0x038e,0x038e,0x03de,0x01fc,0x00f8,0x0000, // u0133 0x0000,0x0038,0x007c,0x00ee,0x01c7,0x0000,0x00fe,0x00fe,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038, 0x0038,0x0038,0x0038,0x0038,0x7038,0x7038,0x7038,0x7878,0x3ff0,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0134 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x007c,0x00ee,0x01c7,0x0000,0x0000,0x00f8,0x00f8,0x0038,0x0038, 0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x3838,0x3838,0x3c78,0x1ff0,0x0fe0,0x0000, // u0135 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x700c,0x701c,0x7038,0x7070,0x70e0,0x71c0,0x7380,0x7700,0x7e00,0x7c00, 0x7c00,0x7e00,0x7700,0x7380,0x71c0,0x70e0,0x7070,0x7038,0x701c,0x700c,0x0000,0x0380,0x0380,0x0380,0x0700,0x0e00, // u0136 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x381c,0x3838,0x3870,0x38e0, 0x39c0,0x3b80,0x3f00,0x3f00,0x3b80,0x39c0,0x38e0,0x3870,0x3838,0x381c,0x0000,0x0380,0x0380,0x0380,0x0700,0x0e00, // u0137 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x381c,0x3838,0x3870,0x38e0, 0x39c0,0x3b80,0x3f00,0x3f00,0x3b80,0x39c0,0x38e0,0x3870,0x3838,0x381c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0138 0x0000,0x0e00,0x1c00,0x3800,0x7000,0x0000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000, 0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0139 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0f80,0x0f80,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u013a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000, 0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0380,0x0380,0x0380,0x0700,0x0e00, // u013b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f80,0x0f80,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0380,0x0380,0x0380,0x0700,0x0e00, // u013c 0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000, 0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u013d 0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x0f80,0x0f80,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u013e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7070,0x7070, 0x7070,0x7070,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u013f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f80,0x0f80,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0387,0x0387, 0x0387,0x0387,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0140 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3b80,0x3f00,0x3e00, 0x3c00,0x7800,0xf800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3ffe,0x3ffe,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0141 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f80,0x0f80,0x0380,0x0380,0x0380,0x0380,0x0380,0x03f0,0x03e0,0x03c0, 0x0780,0x0f80,0x1f80,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0142 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x7c1c,0x7e1c,0x771c,0x739c, 0x71dc,0x70fc,0x707c,0x703c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0143 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x7ff0,0x7ff8,0x703c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0144 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x7c1c,0x7e1c,0x771c,0x739c, 0x71dc,0x70fc,0x707c,0x703c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0380,0x0380,0x0380,0x0700,0x0e00, // u0145 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff8,0x703c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0380,0x0380,0x0380,0x0700,0x0e00, // u0146 0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x7c1c,0x7e1c,0x771c,0x739c, 0x71dc,0x70fc,0x707c,0x703c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0147 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x0000,0x7ff0,0x7ff8,0x703c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0148 0x0000,0x0000,0x0000,0x0000,0x7000,0x7000,0x7000,0x7000,0xe000,0xe000,0x0000,0x0000,0x7ff0,0x7ff8,0x703c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0149 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x7c1c,0x7e1c,0x771c,0x739c, 0x71dc,0x70fc,0x707c,0x703c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x001c,0x001c,0x003c,0x01f8,0x01f0,0x0000, // u014a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff8,0x703c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x001c,0x001c,0x003c,0x01f8,0x01f0,0x0000, // u014b 0x0000,0x0000,0x1ff0,0x1ff0,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u014c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x1ff0,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u014d 0x0000,0x1c70,0x1c70,0x0fe0,0x07c0,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u014e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x0fe0,0x07c0,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u014f 0x0000,0x038e,0x071c,0x0e38,0x1c70,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0150 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x038e,0x071c,0x0e38,0x1c70,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0151 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffe,0x7ffe,0xf1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1fe, 0xe1fe,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xf1c0,0x7ffe,0x3ffe,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0152 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff8,0x7ffc,0xf39e,0xe38e, 0xe38e,0xe38e,0xe3fe,0xe3fe,0xe380,0xe380,0xe380,0xf38e,0x7ffe,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0153 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x7ff0,0x7ff8,0x703c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x703c, 0x7ff8,0x7ff0,0x7e00,0x7700,0x7380,0x71c0,0x70e0,0x7070,0x7038,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0154 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x73fc,0x77fc,0x7e00,0x7c00, 0x7800,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0155 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff8,0x703c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x703c, 0x7ff8,0x7ff0,0x7e00,0x7700,0x7380,0x71c0,0x70e0,0x7070,0x7038,0x701c,0x0000,0x0380,0x0380,0x0380,0x0700,0x0e00, // u0156 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39fe,0x3bfe,0x3f00,0x3e00, 0x3c00,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x0000,0x3800,0x3800,0x3800,0x7000,0xe000, // u0157 0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x7ff0,0x7ff8,0x703c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x703c, 0x7ff8,0x7ff0,0x7e00,0x7700,0x7380,0x71c0,0x70e0,0x7070,0x7038,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0158 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x0000,0x73fc,0x77fc,0x7e00,0x7c00, 0x7800,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0159 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x7000,0x7000,0x7000,0x7800,0x3ff0, 0x1ff8,0x003c,0x001c,0x001c,0x001c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u015a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x7000, 0x7000,0x7800,0x3ff0,0x1ff8,0x003c,0x001c,0x001c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u015b 0x0000,0x0380,0x07c0,0x0ee0,0x1c70,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x7000,0x7000,0x7000,0x7800,0x3ff0, 0x1ff8,0x003c,0x001c,0x001c,0x001c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u015c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x07c0,0x0ee0,0x1c70,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x7000, 0x7000,0x7800,0x3ff0,0x1ff8,0x003c,0x001c,0x001c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u015d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x7000,0x7000,0x7000,0x7800,0x3ff0, 0x1ff8,0x003c,0x001c,0x001c,0x001c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0380,0x0380,0x0380,0x0700,0x0e00,0x0000, // u015e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x7000, 0x7000,0x7800,0x3ff0,0x1ff8,0x003c,0x001c,0x001c,0x783c,0x3ff8,0x1ff0,0x0380,0x0380,0x0380,0x0700,0x0e00,0x0000, // u015f 0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x7000,0x7000,0x7000,0x7800,0x3ff0, 0x1ff8,0x003c,0x001c,0x001c,0x001c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0160 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x7000, 0x7000,0x7800,0x3ff0,0x1ff8,0x003c,0x001c,0x001c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0161 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x01c0,0x01c0,0x01c0,0x0380,0x0700,0x0000, // u0162 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x7ff0,0x7ff0,0x0700,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0780,0x03fc,0x01fc,0x0070,0x0070,0x0070,0x00e0,0x01c0,0x0000, // u0163 0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x7ffc,0x7ffc,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0164 0x0000,0x38e0,0x1dc0,0x0f80,0x0700,0x0000,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x7ff0,0x7ff0,0x0700,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0780,0x03fc,0x01fc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0165 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x1ff0, 0x1ff0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0166 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x7ff0,0x7ff0,0x0700,0x0700, 0x1fc0,0x1fc0,0x0700,0x0700,0x0700,0x0700,0x0700,0x0780,0x03fc,0x01fc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0167 0x0000,0x1f38,0x3bb8,0x3bb8,0x39f0,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0168 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f38,0x3bb8,0x3bb8,0x39f0,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0169 0x0000,0x0000,0x1ff0,0x1ff0,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u016a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x1ff0,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u016b 0x0000,0x1c70,0x1c70,0x0fe0,0x07c0,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u016c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x0fe0,0x07c0,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u016d 0x0000,0x07c0,0x0ee0,0x0ee0,0x0ee0,0x07c0,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u016e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07c0,0x0ee0,0x0ee0,0x0ee0,0x07c0,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u016f 0x0000,0x038e,0x071c,0x0e38,0x1c70,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0170 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x038e,0x071c,0x0e38,0x1c70,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0171 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x03c0,0x0780,0x0700,0x07e0,0x03e0,0x0000, // u0172 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x007c,0x00f0,0x00e0,0x00fc,0x007c,0x0000, // u0173 0x0000,0x0380,0x07c0,0x0ee0,0x1c70,0x0000,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e, 0x718e,0x73ce,0x73ce,0x77ee,0x7e7e,0x7e7e,0x7c3e,0x781e,0x700e,0x700e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0174 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x07c0,0x0ee0,0x1c70,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x7bbc,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0175 0x0000,0x0380,0x07c0,0x0ee0,0x1c70,0x0000,0x701c,0x701c,0x701c,0x3838,0x3838,0x1c70,0x1c70,0x0ee0,0x0ee0,0x07c0, 0x07c0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0176 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x07c0,0x0ee0,0x1c70,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x001c,0x001c,0x003c,0x3ff8,0x3ff0,0x0000, // u0177 0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x701c,0x701c,0x701c,0x3838,0x3838,0x1c70,0x1c70,0x0ee0,0x0ee0,0x07c0, 0x07c0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0178 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x7ffc,0x7ffc,0x001c,0x001c,0x001c,0x0038,0x0070,0x00e0,0x01c0,0x0380, 0x0700,0x0e00,0x1c00,0x3800,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0179 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x7ffc,0x7ffc,0x0038,0x0070, 0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u017a 0x0000,0x0380,0x0380,0x0380,0x0380,0x0000,0x7ffc,0x7ffc,0x001c,0x001c,0x001c,0x0038,0x0070,0x00e0,0x01c0,0x0380, 0x0700,0x0e00,0x1c00,0x3800,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u017b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x7ffc,0x7ffc,0x0038,0x0070, 0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u017c 0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x7ffc,0x7ffc,0x001c,0x001c,0x001c,0x0038,0x0070,0x00e0,0x01c0,0x0380, 0x0700,0x0e00,0x1c00,0x3800,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u017d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x0000,0x7ffc,0x7ffc,0x0038,0x0070, 0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u017e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00fe,0x01fe,0x03c0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u017f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x001c,0x001c,0x001c,0x001c,0x001c, 0x001c,0x001c,0x001c,0x001c,0x001c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0186 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x0ffc, 0x0ffc,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u018e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x001c,0x001c,0x001c,0x001c,0x7ffc, 0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u018f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x7000,0x7000,0x7000,0x7800,0x3fe0, 0x3fe0,0x7800,0x7000,0x7000,0x7000,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0190 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01f8,0x03fc,0x039c,0x039c,0x0380,0x0380,0x0380,0x0380,0x1ff0,0x1ff0, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x7380,0x7380,0x7f80,0x3f00,0x0000,0x0000, // u0192 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x380e,0x380e,0x380e,0x380e,0x380e,0x3c0e,0x3e0e,0x3f0e,0x3b8e,0x39ce, 0x38ee,0x387e,0x383e,0x381e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x3800,0x3800,0x3800,0x7800,0xf000,0x0000, // u019d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff8,0x703c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x001c,0x001c,0x001c,0x001c,0x001c,0x0000, // u019e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x001c,0x001c,0x001c,0x0038,0x0070,0x00e0,0x01c0,0x7ffc, 0x7ffc,0x0700,0x0e00,0x1c00,0x3800,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x0038,0x0070, 0x00e0,0x01c0,0x7ffc,0x7ffc,0x0700,0x0e00,0x1c00,0x3800,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x0038,0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0ff0,0x0ff8, 0x003c,0x001c,0x001c,0x001c,0x001c,0x001c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01b7 0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x7ffc,0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01cd 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x0000,0x3ff0,0x3ff8,0x003c,0x001c, 0x001c,0x1ffc,0x3ffc,0x781c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01ce 0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x0fe0,0x0fe0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01cf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x0000,0x0f80,0x0f80,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d0 0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d2 0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01d4 0x0000,0x0000,0x3ff8,0x3ff8,0x0000,0x0000,0x3ffe,0x7ffe,0xf1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xfffe, 0xfffe,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1fe,0xe1fe,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff8,0x3ff8,0x0000,0x0000,0x7ef8,0x7ffc,0x039e,0x038e, 0x038e,0x3f8e,0x7ffe,0xf3fe,0xe380,0xe380,0xe380,0xf3ce,0x7ffe,0x3efc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x7000,0x7000,0x7000,0x7000,0x71fc, 0x71fc,0x701c,0x701c,0x71ff,0x71ff,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ffc,0x3ffc,0x781c,0x701c, 0x701c,0x701c,0x71ff,0x71ff,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x001c,0x001c,0x003c,0x3ff8,0x3ff0,0x0000, // u01e5 0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x7000,0x7000,0x7000,0x7000,0x71fc, 0x71fc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x0000,0x1ffc,0x3ffc,0x781c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x001c,0x001c,0x003c,0x3ff8,0x3ff0,0x0000, // u01e7 0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x700c,0x701c,0x7038,0x7070,0x70e0,0x71c0,0x7380,0x7700,0x7e00,0x7c00, 0x7c00,0x7e00,0x7700,0x7380,0x71c0,0x70e0,0x7070,0x7038,0x701c,0x700c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e8 0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x381c,0x3838,0x3870,0x38e0, 0x39c0,0x3b80,0x3f00,0x3f00,0x3b80,0x39c0,0x38e0,0x3870,0x3838,0x381c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01e9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x03c0,0x0780,0x0700,0x07e0,0x03e0,0x0000, // u01ea 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x03c0,0x0780,0x0700,0x07e0,0x03e0,0x0000, // u01eb 0x0000,0x0000,0x1ff0,0x1ff0,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x03c0,0x0780,0x0700,0x07e0,0x03e0,0x0000, // u01ec 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x1ff0,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x03c0,0x0780,0x0700,0x07e0,0x03e0,0x0000, // u01ed 0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x7ffc,0x7ffc,0x0038,0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0ff0,0x0ff8, 0x003c,0x001c,0x001c,0x001c,0x001c,0x001c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01ee 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x0000,0x7ffc,0x7ffc,0x0038,0x0070, 0x00e0,0x01c0,0x0380,0x0700,0x0ff0,0x0ff8,0x003c,0x001c,0x001c,0x001c,0x001c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000, // u01ef 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01c7,0x00ee,0x007c,0x0038,0x0000,0x0000,0x00f8,0x00f8,0x0038,0x0038, 0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x3838,0x3838,0x3c78,0x1ff0,0x0fe0,0x0000, // u01f0 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x7000,0x7000,0x7000,0x7000,0x71fc, 0x71fc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01f4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x1ffc,0x3ffc,0x781c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x001c,0x001c,0x003c,0x3ff8,0x3ff0,0x0000, // u01f5 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x3ffe,0x7ffe,0xf1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xfffe, 0xfffe,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1fe,0xe1fe,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01fc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x7ef8,0x7ffc,0x039e,0x038e, 0x038e,0x3f8e,0x7ffe,0xf3fe,0xe380,0xe380,0xe380,0xf3ce,0x7ffe,0x3efc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01fd 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x1ff0,0x3ff8,0x783e,0x701e,0x701c,0x703c,0x707c,0x70fc,0x71dc,0x739c, 0x771c,0x7e1c,0x7c1c,0x781c,0x701c,0xf01c,0xf01c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01fe 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x1ff6,0x3ffe,0x783c,0x707c, 0x70fc,0x71dc,0x739c,0x771c,0x7e1c,0x7c1c,0x781c,0x783c,0xfff8,0xdff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u01ff 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x7000,0x7000,0x7000,0x7800,0x3ff0, 0x1ff8,0x003c,0x001c,0x001c,0x001c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0380,0x0380,0x0380,0x0700,0x0e00, // u0218 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x7000, 0x7000,0x7800,0x3ff0,0x1ff8,0x003c,0x001c,0x001c,0x783c,0x3ff8,0x1ff0,0x0000,0x0380,0x0380,0x0380,0x0700,0x0e00, // u0219 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0380,0x0380,0x0380,0x0700,0x0e00, // u021a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x7ff0,0x7ff0,0x0700,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0780,0x03fc,0x01fc,0x0000,0x0070,0x0070,0x0070,0x00e0,0x01c0, // u021b 0x0000,0x0000,0x1ff0,0x1ff0,0x0000,0x0000,0x701c,0x701c,0x701c,0x3838,0x3838,0x1c70,0x1c70,0x0ee0,0x0ee0,0x07c0, 0x07c0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0232 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x1ff0,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x001c,0x001c,0x003c,0x3ff8,0x3ff0,0x0000, // u0233 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00f8,0x00f8,0x0038,0x0038, 0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x3838,0x3838,0x3c78,0x1ff0,0x0fe0,0x0000, // u0237 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0254 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x7ffc,0x7ffc,0x001c,0x001c,0x001c,0x703c,0x7ff8,0x3ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0258 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x7ff8,0x703c,0x001c, 0x001c,0x001c,0x7ffc,0x7ffc,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0259 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x7000,0x7800,0x3fc0,0x3fc0,0x7800,0x7000,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u025b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff8,0x3ffc,0x381e,0x380e, 0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x3800,0x3800,0x3800,0x7800,0xf000,0x0000, // u0272 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x0038,0x0070, 0x00e0,0x01c0,0x0380,0x0700,0x0ff0,0x0ff8,0x003c,0x001c,0x001c,0x001c,0x001c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000, // u0292 0x0000,0x00e0,0x01c0,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bb 0x0000,0x0380,0x0380,0x0380,0x0700,0x0e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bc 0x0000,0x0380,0x0380,0x0380,0x01c0,0x00e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02bd 0x0000,0x0380,0x07c0,0x0ee0,0x1c70,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02c6 0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02c7 0x0000,0x1c70,0x1c70,0x0fe0,0x07c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02d8 0x0000,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02d9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03c0,0x0780,0x0700,0x07e0,0x03e0,0x0000, // u02db 0x0000,0x1f38,0x3bb8,0x3bb8,0x39f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02dc 0x0000,0x038e,0x071c,0x0e38,0x1c70,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u02dd 0x0000,0x1c00,0x0e00,0x0700,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0300 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0301 0x0000,0x0380,0x07c0,0x0ee0,0x1c70,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0302 0x0000,0x1f38,0x3bb8,0x3bb8,0x39f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0303 0x0000,0x0000,0x1ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0304 0x0000,0x0000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0305 0x0000,0x1c70,0x1c70,0x0fe0,0x07c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0306 0x0000,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0307 0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0308 0x0000,0x07c0,0x0ee0,0x0ee0,0x0ee0,0x07c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030a 0x0000,0x038e,0x071c,0x0e38,0x1c70,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030b 0x0000,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u030c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000, // u0329 0x0000,0x0000,0x1c00,0x3800,0x7000,0xe000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0384 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0385 0x0000,0x0000,0x1c00,0x3800,0x7000,0xe000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x7ffc,0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0386 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0387 0x0000,0x0000,0x1c00,0x3800,0x7000,0xe000,0x3ffe,0x3ffe,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3ff0, 0x3ff0,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3ffe,0x3ffe,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0388 0x0000,0x0000,0x1c00,0x3800,0x7000,0xe000,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x3ffe, 0x3ffe,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0389 0x0000,0x0000,0x1c00,0x3800,0x7000,0xe000,0x0fe0,0x0fe0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u038a 0x0000,0x0000,0x1c00,0x3800,0x7000,0xe000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u038c 0x0000,0x0000,0x1c00,0x3800,0x7000,0xe000,0x380e,0x380e,0x380e,0x1c1c,0x1c1c,0x0e38,0x0e38,0x0770,0x0770,0x03e0, 0x03e0,0x01c0,0x01c0,0x01c0,0x01c0,0x01c0,0x01c0,0x01c0,0x01c0,0x01c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u038e 0x0000,0x0000,0x1c00,0x3800,0x7000,0xe000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x3838,0x1c70,0x1c70,0x1c70,0x7c7c,0x7c7c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u038f 0x0000,0x00e0,0x01c0,0x0380,0x0700,0x0000,0x38e0,0x38e0,0x38e0,0x38e0,0x0000,0x0000,0x1f00,0x1f00,0x0700,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0780,0x03f0,0x01f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0390 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x7ffc,0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0391 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff8,0x703c,0x701c,0x701c,0x701c,0x701c,0x7038,0x7ff0,0x7ff0, 0x7038,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x703c,0x7ff8,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0392 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000, 0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0393 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x07c0,0x07c0,0x07c0,0x0ee0,0x0ee0,0x0ee0,0x1c70, 0x1c70,0x1c70,0x3838,0x3838,0x3838,0x701c,0x701c,0x701c,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0394 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7fe0, 0x7fe0,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0395 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x001c,0x001c,0x001c,0x0038,0x0070,0x00e0,0x01c0,0x0380, 0x0700,0x0e00,0x1c00,0x3800,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0396 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x7ffc, 0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0397 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x77dc, 0x77dc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0398 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0x0fe0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0399 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x700c,0x701c,0x7038,0x7070,0x70e0,0x71c0,0x7380,0x7700,0x7e00,0x7c00, 0x7c00,0x7e00,0x7700,0x7380,0x71c0,0x70e0,0x7070,0x7038,0x701c,0x700c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u039a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x07c0,0x07c0,0x07c0,0x0ee0,0x0ee0,0x0ee0,0x1c70, 0x1c70,0x1c70,0x3838,0x3838,0x3838,0x3838,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u039b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x700e,0x700e,0x781e,0x7c3e,0x7e7e,0x7e7e,0x77ee,0x73ce,0x73ce,0x718e, 0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u039c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x7c1c,0x7e1c,0x771c,0x739c, 0x71dc,0x70fc,0x707c,0x703c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u039d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0, 0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u039e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u039f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff8,0x703c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x703c, 0x7ff8,0x7ff0,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x7000,0x3800,0x1c00,0x0e00,0x0700,0x0380,0x01c0,0x00e0, 0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x3838,0x3838,0x1c70,0x1c70,0x0ee0,0x0ee0,0x07c0, 0x07c0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x1ff0,0x3ff8,0x7bbc,0x739c,0x739c,0x739c,0x739c,0x739c, 0x739c,0x739c,0x739c,0x739c,0x739c,0x7bbc,0x3ff8,0x1ff0,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x3838,0x3838,0x1c70,0x1c70,0x0ee0,0x0ee0,0x07c0,0x07c0, 0x07c0,0x07c0,0x0ee0,0x0ee0,0x1c70,0x1c70,0x3838,0x3838,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c, 0x739c,0x739c,0x739c,0x7bbc,0x3ff8,0x1ff0,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x3838,0x1c70,0x1c70,0x1c70,0x7c7c,0x7c7c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03a9 0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0fe0,0x0fe0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03aa 0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x701c,0x701c,0x701c,0x3838,0x3838,0x1c70,0x1c70,0x0ee0,0x0ee0,0x07c0, 0x07c0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ab 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x1fee,0x3ffe,0x783c,0x7038, 0x7038,0x7038,0x7038,0x7038,0x7038,0x7038,0x7038,0x783c,0x3ffe,0x1fee,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ac 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x7000,0x7800,0x3fc0,0x3fc0,0x7800,0x7000,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ad 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x7ff0,0x7ff8,0x703c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x001c,0x001c,0x001c,0x001c,0x001c,0x0000, // u03ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00e0,0x01c0,0x0380,0x0700,0x0000,0x0000,0x1f00,0x1f00,0x0700,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0780,0x03f0,0x01f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03af 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fee,0x3ffe,0x783c,0x7038, 0x7038,0x7038,0x7038,0x7038,0x7038,0x7038,0x7038,0x783c,0x3ffe,0x1fee,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fe0,0x7ff0,0x7078,0x7038,0x7038,0x7038,0x7038,0x7070,0x7ff0,0x7ff0, 0x7038,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x703c,0x7ff8,0x7ff0,0x7000,0x7000,0x7000,0x7000,0x7000,0x0000, // u03b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x3838, 0x3838,0x3838,0x1c70,0x1c70,0x0ee0,0x0ee0,0x07c0,0x07c0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000, // u03b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x1ff0,0x0e00,0x0700,0x0380,0x01c0,0x0fe0,0x1ff0,0x3838,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x7000,0x7800,0x3fc0,0x3fc0,0x7800,0x7000,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x0038,0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00, 0x3800,0x3800,0x7000,0x7000,0x7000,0x7000,0x7000,0x7800,0x3ff0,0x1ff8,0x003c,0x001c,0x001c,0x0078,0x0070,0x0000, // u03b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff8,0x703c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x001c,0x001c,0x001c,0x001c,0x001c,0x0000, // u03b7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0x1ff0,0x3c78,0x3838,0x3838,0x3838,0x3838,0x3838,0x3838,0x3ff8, 0x3ff8,0x3838,0x3838,0x3838,0x3838,0x3838,0x3838,0x3c78,0x1ff0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x1f00,0x0700,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0780,0x03f0,0x01f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03b9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x381c,0x3838,0x3870,0x38e0, 0x39c0,0x3b80,0x3f00,0x3f00,0x3b80,0x39c0,0x38e0,0x3870,0x3838,0x381c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x0e00,0x0700,0x0700,0x0380,0x0380,0x07c0,0x07c0,0x0ee0,0x0ee0, 0x0ee0,0x1c70,0x1c70,0x1c70,0x3838,0x3838,0x3838,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x703c,0x707c,0x70fc,0x7fdc,0x7f9c,0x7000,0x7000,0x7000,0x7000,0x7000,0x0000, // u03bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x3838, 0x3838,0x3838,0x1c70,0x1c70,0x1c70,0x0ee0,0x0ee0,0x07c0,0x07c0,0x07c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03bd 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ffc,0x3ffc,0x7800,0x7000,0x7000,0x7000,0x7000,0x3800,0x1ff0,0x1ff0, 0x3800,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7800,0x3ff0,0x1ff8,0x003c,0x001c,0x001c,0x0078,0x0070,0x0000, // u03be 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x703c,0x7ff8,0x7ff0,0x7000,0x7000,0x7000,0x7000,0x7000,0x0000, // u03c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7800,0x3ff0,0x1ff8,0x003c,0x001c,0x001c,0x0078,0x0070,0x0000, // u03c2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ffe,0x3ffe,0x78f0,0x7078, 0x703c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x03c0,0x01f8,0x00f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x19f0,0x3bf8,0x7bbc,0x739c, 0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x7bbc,0x3ff8,0x1ff0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000, // u03c6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x3838,0x3838, 0x1c70,0x1c70,0x0ee0,0x0ee0,0x07c0,0x07c0,0x07c0,0x0ee0,0x0ee0,0x1c70,0x1c70,0x3838,0x3838,0x701c,0x701c,0x0000, // u03c7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x739c,0x739c,0x739c,0x739c, 0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x7bbc,0x3ff8,0x1ff0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000, // u03c8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x701c,0x701c, 0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x77dc,0x3ff8,0x1ef0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03c9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x38e0,0x38e0,0x38e0,0x38e0,0x0000,0x0000,0x1f00,0x1f00,0x0700,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0780,0x03f0,0x01f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ca 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03cb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03cc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03cd 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x3838,0x3838,0x701c,0x701c, 0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x77dc,0x3ff8,0x1ef0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03ce 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0x1ff0,0x3c78,0x3838,0x3838,0x3838,0x3838,0x1ffe,0x0ffe,0x0038, 0x0038,0x0038,0xf838,0xf838,0x3838,0x3838,0x3838,0x3c78,0x1ff0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x1ff0,0x3ff8,0x7bbc,0x739c, 0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x7bbc,0x3ff8,0x1ff0,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000, // u03d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7c0c,0x7e1c,0x0738,0x0770, 0x03e0,0x03c0,0x0380,0x0380,0x0780,0x0f80,0x1dc0,0x39c0,0x70fc,0x607c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x703c,0x7ff8,0x7ff0,0x7000,0x7000,0x7800,0x3ff8,0x1ff8,0x0000, // u03f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x00f8,0x00f8,0x0038,0x0038, 0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x3838,0x3838,0x3c78,0x1ff0,0x0fe0,0x0000, // u03f3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x7ffc, 0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07fc,0x1ffc,0x3c00,0x3800, 0x7000,0x7000,0x7ff0,0x7ff0,0x7000,0x7000,0x3800,0x3c00,0x1ffc,0x07fc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7ff0,0x0078,0x0038, 0x001c,0x001c,0x1ffc,0x1ffc,0x001c,0x001c,0x0038,0x0078,0x7ff0,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u03f6 0x0000,0x1c00,0x0e00,0x0700,0x0380,0x0000,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7fe0, 0x7fe0,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0400 0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7fe0, 0x7fe0,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0401 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff80,0xff80,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1ff8,0x1ffc,0x1c1e, 0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c1e,0x1c7c,0x1c78,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0402 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000, 0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0403 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x7000,0x7000,0x7000,0x7000,0x7fe0, 0x7fe0,0x7000,0x7000,0x7000,0x7000,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0404 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x7000,0x7000,0x7000,0x7800,0x3ff0, 0x1ff8,0x003c,0x001c,0x001c,0x001c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0405 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0x0fe0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0406 0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0fe0,0x0fe0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0407 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00fe,0x00fe,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038, 0x0038,0x0038,0x0038,0x0038,0x7038,0x7038,0x7038,0x7878,0x3ff0,0x1fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0408 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x3f80,0x7b80,0x7380,0x7380,0x7380,0x7380,0x73f8,0x73fc,0x739e, 0x738e,0x738e,0x738e,0x738e,0x738e,0x738e,0x738e,0x739e,0xf3fc,0xe3f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0409 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xe380,0xe380,0xe380,0xe380,0xe380,0xe380,0xe380,0xe3f8,0xe3fc,0xff9e, 0xff8e,0xe38e,0xe38e,0xe38e,0xe38e,0xe38e,0xe38e,0xe39e,0xe3fc,0xe3f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u040a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff80,0xff80,0x1c00,0x1c00,0x1c00,0x1c00,0x1c00,0x1ff8,0x1ffc,0x1c1e, 0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u040b 0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x700c,0x701c,0x7038,0x7070,0x70e0,0x71c0,0x7380,0x7700,0x7e00,0x7c00, 0x7c00,0x7e00,0x7700,0x7380,0x71c0,0x70e0,0x7070,0x7038,0x701c,0x700c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u040c 0x0000,0x1c00,0x0e00,0x0700,0x0380,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x703c,0x707c,0x70fc,0x71dc, 0x739c,0x771c,0x7e1c,0x7c1c,0x781c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u040d 0x0000,0x1c70,0x1c70,0x0fe0,0x07c0,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c, 0x3ffc,0x1ffc,0x001c,0x001c,0x001c,0x001c,0x001c,0x003c,0x3ff8,0x3ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u040e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x7ffc,0x7ffc,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000, // u040f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x7ffc,0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0410 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff8,0x7ff8,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ff0,0x7ff8,0x703c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x703c,0x7ff8,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0411 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff8,0x703c,0x701c,0x701c,0x701c,0x701c,0x7038,0x7ff0,0x7ff0, 0x7038,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x703c,0x7ff8,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0412 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000, 0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0413 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff8,0x1ff8,0x3c38,0x3838,0x3838,0x3838,0x3838,0x3838,0x3838,0x3838, 0x3838,0x3838,0x3838,0x3838,0x3838,0x3838,0x3838,0x3838,0x7ffc,0xfffe,0xe00e,0xe00e,0xe00e,0xe00e,0x0000,0x0000, // u0414 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7fe0, 0x7fe0,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0415 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x3bb8,0x1ff0,0x0fe0, 0x0fe0,0x1ff0,0x3bb8,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0416 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x001c,0x001c,0x001c,0x003c,0x0ff8, 0x0ff8,0x003c,0x001c,0x001c,0x001c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0417 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x703c,0x707c,0x70fc,0x71dc, 0x739c,0x771c,0x7e1c,0x7c1c,0x781c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0418 0x0000,0x1c70,0x1c70,0x0fe0,0x07c0,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x703c,0x707c,0x70fc,0x71dc, 0x739c,0x771c,0x7e1c,0x7c1c,0x781c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0419 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x700c,0x701c,0x7038,0x7070,0x70e0,0x71c0,0x7380,0x7700,0x7e00,0x7c00, 0x7c00,0x7e00,0x7700,0x7380,0x71c0,0x70e0,0x7070,0x7038,0x701c,0x700c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u041a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07fc,0x0ffc,0x1e1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c, 0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x381c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u041b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x700e,0x700e,0x781e,0x7c3e,0x7e7e,0x7e7e,0x77ee,0x73ce,0x73ce,0x718e, 0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u041c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x7ffc, 0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u041d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u041e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u041f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff8,0x703c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x703c, 0x7ff8,0x7ff0,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0420 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x7000,0x7000,0x7000,0x7000,0x7000, 0x7000,0x7000,0x7000,0x7000,0x7000,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0421 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0422 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c, 0x3ffc,0x1ffc,0x001c,0x001c,0x001c,0x001c,0x001c,0x003c,0x3ff8,0x3ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0423 0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x1ff0,0x3ff8,0x7bbc,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c, 0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x7bbc,0x3ff8,0x1ff0,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000, // u0424 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x3838,0x3838,0x1c70,0x1c70,0x0ee0,0x0ee0,0x07c0,0x07c0, 0x07c0,0x07c0,0x0ee0,0x0ee0,0x1c70,0x1c70,0x3838,0x3838,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0425 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781e,0x3fff,0x1fff,0x0007,0x0007,0x0007,0x0007,0x0007,0x0000, // u0426 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c, 0x3ffc,0x1ffc,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0427 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c, 0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x7b9c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0428 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c, 0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x7b9c,0x3ffe,0x1fff,0x0007,0x0007,0x0007,0x0007,0x0007,0x0000, // u0429 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0x3800,0x3800,0x3800,0x3800,0x3ff0,0x3ff8,0x383c,0x381c, 0x381c,0x381c,0x381c,0x381c,0x381c,0x381c,0x381c,0x383c,0x3ff8,0x3ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u042a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x7f0e,0x7f8e,0x73ce,0x71ce, 0x71ce,0x71ce,0x71ce,0x71ce,0x71ce,0x71ce,0x71ce,0x73ce,0x7f8e,0x7f0e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u042b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3ff0,0x3ff8,0x383c,0x381c, 0x381c,0x381c,0x381c,0x381c,0x381c,0x381c,0x381c,0x383c,0x3ff8,0x3ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u042c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x001c,0x001c,0x001c,0x001c,0x0ffc, 0x0ffc,0x001c,0x001c,0x001c,0x001c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u042d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x70f8,0x71fc,0x738e,0x738e,0x738e,0x738e,0x738e,0x738e,0x738e,0x7f8e, 0x7f8e,0x738e,0x738e,0x738e,0x738e,0x738e,0x738e,0x738e,0x71fc,0x70f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u042e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ffc,0x3ffc,0x781c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c, 0x3ffc,0x1ffc,0x00fc,0x01dc,0x039c,0x071c,0x0e1c,0x1c1c,0x381c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u042f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x003c,0x001c, 0x001c,0x1ffc,0x3ffc,0x781c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0430 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff0,0x7800,0x7000,0x7000,0x7000,0x7000,0x7ff0,0x7ff8,0x703c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x703c,0x7ff8,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0431 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3fc0,0x7fe0,0x70f0,0x7070,0x7070,0x7070,0x7070,0x70e0,0x7fe0,0x7ff0, 0x7038,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x703c,0x7ff8,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0432 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x7000,0x7000, 0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0433 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ffc,0x3ffc,0x781c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x001c,0x001c,0x003c,0x3ff8,0x3ff0,0x0000, // u0434 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x781c,0x3ffc,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0435 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x739c,0x739c,0x739c,0x739c, 0x3bb8,0x1ff0,0x0fe0,0x1ff0,0x3bb8,0x739c,0x739c,0x739c,0x739c,0x739c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0436 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x001c,0x003c,0x07f8,0x07f8,0x003c,0x001c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0437 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0438 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x0fe0,0x07c0,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0439 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x381c,0x3838,0x3870,0x38e0, 0x39c0,0x3b80,0x3f00,0x3f00,0x3b80,0x39c0,0x38e0,0x3870,0x3838,0x381c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u043a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07fc,0x0ffc,0x1e1c,0x1c1c, 0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x381c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u043b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6006,0x700e,0x781e,0x7c3e, 0x7e7e,0x77ee,0x73ce,0x718e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u043c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x7ffc,0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u043d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u043e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u043f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff8,0x703c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x703c,0x7ff8,0x7ff0,0x7000,0x7000,0x7000,0x7000,0x7000,0x0000, // u0440 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0441 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0442 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x001c,0x001c,0x003c,0x3ff8,0x3ff0,0x0000, // u0443 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x1ff0,0x3ff8,0x7bbc,0x739c, 0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x7bbc,0x3ff8,0x1ff0,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000, // u0444 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x3838, 0x1c70,0x0ee0,0x07c0,0x07c0,0x0ee0,0x1c70,0x3838,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0445 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffe,0x1fff,0x0007,0x0007,0x0007,0x0007,0x0007,0x0000, // u0446 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x781c,0x3ffc,0x1ffc,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0447 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x739c,0x739c,0x739c,0x739c, 0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x7b9c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0448 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x739c,0x739c,0x739c,0x739c, 0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x7b9c,0x3ffe,0x1fff,0x0007,0x0007,0x0007,0x0007,0x0007,0x0000, // u0449 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7c00,0x7c00,0x1c00,0x1c00, 0x1ff0,0x1ff8,0x1c3c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c3c,0x1ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u044a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x700e,0x700e,0x700e,0x700e, 0x7f0e,0x7f8e,0x73ce,0x71ce,0x71ce,0x71ce,0x71ce,0x73ce,0x7f8e,0x7f0e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u044b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800, 0x3fe0,0x3ff0,0x3878,0x3838,0x3838,0x3838,0x3838,0x3878,0x3ff0,0x3fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u044c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x001c,0x001c,0x07fc,0x07fc,0x001c,0x001c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u044d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x70f8,0x71fc,0x738e,0x738e, 0x738e,0x738e,0x7f8e,0x7f8e,0x738e,0x738e,0x738e,0x738e,0x71fc,0x70f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u044e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ffc,0x3ffc,0x781c,0x701c, 0x701c,0x781c,0x3ffc,0x1ffc,0x01dc,0x039c,0x071c,0x0e1c,0x1c1c,0x381c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u044f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0e00,0x0700,0x0380,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x781c,0x3ffc,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0450 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x781c,0x3ffc,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0451 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0xffc0,0xffc0,0x3800,0x3800,0x3ff8,0x3ffc,0x381e,0x380e, 0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x000e,0x000e,0x001e,0x00fc,0x00f8,0x0000, // u0452 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x7ffc,0x7ffc,0x7000,0x7000, 0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0453 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x7000,0x7000,0x7fc0,0x7fc0,0x7000,0x7000,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0454 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x7000, 0x7000,0x7800,0x3ff0,0x1ff8,0x003c,0x001c,0x001c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0455 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0f80,0x0f80,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0456 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x0f80,0x0f80,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0457 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x00f8,0x00f8,0x0038,0x0038, 0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x3838,0x3838,0x3c78,0x1ff0,0x0fe0,0x0000, // u0458 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f80,0x3f80,0x7b80,0x7380, 0x73f8,0x73fc,0x739e,0x738e,0x738e,0x738e,0x738e,0x739e,0xf3fc,0xe3f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0459 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xe380,0xe380,0xe380,0xe380, 0xe3f8,0xe3fc,0xff9e,0xff8e,0xe38e,0xe38e,0xe38e,0xe39e,0xe3fc,0xe3f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u045a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0xffc0,0xffc0,0x3800,0x3800,0x3ff8,0x3ffc,0x381e,0x380e, 0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u045b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380,0x0000,0x0000,0x381c,0x3838,0x3870,0x38e0, 0x39c0,0x3b80,0x3f00,0x3f00,0x3b80,0x39c0,0x38e0,0x3870,0x3838,0x381c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u045c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0e00,0x0700,0x0380,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u045d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x0fe0,0x07c0,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x001c,0x001c,0x003c,0x3ff8,0x3ff0,0x0000, // u045e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x7ffc,0x7ffc,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000, // u045f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0xff80,0xff80,0x3800,0x3800,0x3ff0,0x3ff8,0x383c,0x381c, 0x381c,0x381c,0x381c,0x381c,0x381c,0x381c,0x381c,0x383c,0x3ff8,0x3ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0462 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x1c00,0x1c00,0x1c00,0x7fc0,0x7fc0,0x1c00,0x1c00,0x1c00,0x1c00, 0x1ff0,0x1ff8,0x1c3c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c3c,0x1ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0463 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x701c,0x3838,0x3838,0x1c70,0x1c70,0x0ee0,0x0fe0,0x07c0, 0x0fe0,0x1ff0,0x3bb8,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u046a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x701c,0x3838, 0x1c70,0x0ee0,0x0fe0,0x1ff0,0x3bb8,0x739c,0x739c,0x739c,0x739c,0x739c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u046b 0x0000,0x0000,0x001c,0x001c,0x001c,0x001c,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000, 0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0490 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x001c,0x001c,0x001c,0x001c,0x7ffc,0x7ffc,0x7000,0x7000, 0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0491 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0xff80, 0xff80,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0492 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x7000,0x7000, 0x7000,0x7000,0xff80,0xff80,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0493 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000, 0x7ff0,0x7ff8,0x703c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x001c,0x001c,0x0038,0x0070,0x0000,0x0000, // u0494 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x7000,0x7000, 0x7000,0x7000,0x7000,0x7fc0,0x7fe0,0x70f0,0x7070,0x7070,0x7070,0x7070,0x0070,0x0070,0x00e0,0x01c0,0x0000,0x0000, // u0495 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x3bb8,0x1ff0,0x0fe0, 0x0fe0,0x1ff0,0x3bb8,0x739c,0x739c,0x739c,0x739c,0x739c,0x739e,0x739f,0x0007,0x0007,0x0007,0x0007,0x0007,0x0000, // u0496 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x739c,0x739c,0x739c,0x739c, 0x3bb8,0x1ff0,0x0fe0,0x1ff0,0x3bb8,0x739c,0x739c,0x739c,0x739e,0x739f,0x0007,0x0007,0x0007,0x0007,0x0007,0x0000, // u0497 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x001c,0x001c,0x001c,0x003c,0x0ff8, 0x0ff8,0x003c,0x001c,0x001c,0x001c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000, // u0498 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x001c,0x003c,0x07f8,0x07f8,0x003c,0x001c,0x701c,0x783c,0x3ff8,0x1ff0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000, // u0499 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x700c,0x701c,0x7038,0x7070,0x70e0,0x71c0,0x7380,0x7700,0x7e00,0x7c00, 0x7c00,0x7e00,0x7700,0x7380,0x71c0,0x70e0,0x7070,0x7038,0x701c,0x700e,0x0007,0x0007,0x0007,0x0007,0x0007,0x0000, // u049a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x381c,0x3838,0x3870,0x38e0, 0x39c0,0x3b80,0x3f00,0x3f00,0x3b80,0x39c0,0x38e0,0x3870,0x3838,0x381c,0x000e,0x000e,0x000e,0x000e,0x000e,0x0000, // u049b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x700e,0x700e,0x700e,0x701c,0x7638,0x7670,0x76e0,0x77c0,0x7780,0x7f00, 0x7f00,0x7780,0x77c0,0x76e0,0x7670,0x7638,0x701c,0x700e,0x700e,0x700e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u049c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x700e,0x701c,0x7638,0x7670, 0x76e0,0x77c0,0x7f80,0x7f80,0x77c0,0x76e0,0x7670,0x7638,0x701c,0x700e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u049d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf806,0xf80e,0x381c,0x3838,0x3870,0x38e0,0x39c0,0x3b80,0x3f00,0x3e00, 0x3e00,0x3f00,0x3b80,0x39c0,0x38e0,0x3870,0x3838,0x381c,0x380e,0x3806,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf81c,0xf838,0x3870,0x38e0, 0x39c0,0x3b80,0x3f00,0x3f00,0x3b80,0x39c0,0x38e0,0x3870,0x3838,0x381c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x7ffc, 0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701e,0x701f,0x0007,0x0007,0x0007,0x0007,0x0007,0x0000, // u04a2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x7ffc,0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701e,0x701f,0x0007,0x0007,0x0007,0x0007,0x0007,0x0000, // u04a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xe0ff,0xe0ff,0xe0e0,0xe0e0,0xe0e0,0xe0e0,0xe0e0,0xe0e0,0xe0e0,0xffe0, 0xffe0,0xe0e0,0xe0e0,0xe0e0,0xe0e0,0xe0e0,0xe0e0,0xe0e0,0xe0e0,0xe0e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xe0ff,0xe0ff,0xe0e0,0xe0e0, 0xe0e0,0xe0e0,0xffe0,0xffe0,0xe0e0,0xe0e0,0xe0e0,0xe0e0,0xe0e0,0xe0e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04a5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x7000,0x7000,0x7000,0x7000,0x7000, 0x7000,0x7000,0x7000,0x7000,0x7000,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000, // u04aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x701c,0x783c,0x3ff8,0x1ff0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000, // u04ab 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x3838,0x3838,0x1c70,0x1c70,0x0ee0,0x0ee0,0x07c0, 0x07c0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x3838, 0x3838,0x3838,0x1c70,0x1c70,0x0ee0,0x0ee0,0x07c0,0x07c0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000, // u04af 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x3838,0x3838,0x1c70,0x1c70,0x0ee0,0x0ee0,0x07c0, 0x07c0,0x0380,0x3ff8,0x3ff8,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04b0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x3838, 0x3838,0x3838,0x1c70,0x1c70,0x0ee0,0x0ee0,0x07c0,0x07c0,0x0380,0x3ff8,0x3ff8,0x0380,0x0380,0x0380,0x0380,0x0000, // u04b1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x3838,0x3838,0x1c70,0x1c70,0x0ee0,0x0ee0,0x07c0,0x07c0, 0x07c0,0x07c0,0x0ee0,0x0ee0,0x1c70,0x1c70,0x3838,0x3838,0x701e,0x701f,0x0007,0x0007,0x0007,0x0007,0x0007,0x0000, // u04b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x3838, 0x1c70,0x0ee0,0x07c0,0x07c0,0x0ee0,0x1c70,0x3838,0x701c,0x701e,0x701f,0x0007,0x0007,0x0007,0x0007,0x0007,0x0000, // u04b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c, 0x3ffc,0x1ffc,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001e,0x001f,0x0007,0x0007,0x0007,0x0007,0x0007,0x0000, // u04b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x781c,0x3ffc,0x1ffc,0x001c,0x001c,0x001c,0x001c,0x001e,0x001f,0x0007,0x0007,0x0007,0x0007,0x0007,0x0000, // u04b7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x739c,0x739c,0x739c,0x7b9c, 0x3ffc,0x1ffc,0x039c,0x039c,0x039c,0x039c,0x001c,0x001c,0x001c,0x001c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04b8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x739c, 0x739c,0x7b9c,0x3ffc,0x1ffc,0x039c,0x039c,0x039c,0x001c,0x001c,0x001c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04b9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ff0,0x7ff8, 0x703c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x7000,0x7000,0x7000, 0x7000,0x7ff0,0x7ff8,0x703c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0x0fe0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04c0 0x0000,0x1c70,0x1c70,0x0fe0,0x07c0,0x0000,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x3bb8,0x1ff0,0x0fe0, 0x0fe0,0x1ff0,0x3bb8,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x0fe0,0x07c0,0x0000,0x0000,0x739c,0x739c,0x739c,0x739c, 0x3bb8,0x1ff0,0x0fe0,0x1ff0,0x3bb8,0x739c,0x739c,0x739c,0x739c,0x739c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04c2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f80,0x0f80,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04cf 0x0000,0x1c70,0x1c70,0x0fe0,0x07c0,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x7ffc,0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x0fe0,0x07c0,0x0000,0x0000,0x3ff0,0x3ff8,0x003c,0x001c, 0x001c,0x1ffc,0x3ffc,0x781c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d1 0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x7ffc,0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x3ff0,0x3ff8,0x003c,0x001c, 0x001c,0x1ffc,0x3ffc,0x781c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffe,0x7ffe,0xf1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xfffe, 0xfffe,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1fe,0xe1fe,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ef8,0x7ffc,0x039e,0x038e, 0x038e,0x3f8e,0x7ffe,0xf3fe,0xe380,0xe380,0xe380,0xf3ce,0x7ffe,0x3efc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d5 0x0000,0x1c70,0x1c70,0x0fe0,0x07c0,0x0000,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7fe0, 0x7fe0,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x0fe0,0x07c0,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x781c,0x3ffc,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x001c,0x001c,0x001c,0x001c,0x7ffc, 0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x7ff8,0x703c,0x001c, 0x001c,0x001c,0x7ffc,0x7ffc,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04d9 0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x001c,0x001c,0x001c,0x001c,0x7ffc, 0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04da 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x3ff0,0x7ff8,0x703c,0x001c, 0x001c,0x001c,0x7ffc,0x7ffc,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04db 0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x3bb8,0x1ff0,0x0fe0, 0x0fe0,0x1ff0,0x3bb8,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04dc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x739c,0x739c,0x739c,0x739c, 0x3bb8,0x1ff0,0x0fe0,0x1ff0,0x3bb8,0x739c,0x739c,0x739c,0x739c,0x739c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04dd 0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x001c,0x001c,0x001c,0x003c,0x0ff8, 0x0ff8,0x003c,0x001c,0x001c,0x001c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04de 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x001c,0x003c,0x07f8,0x07f8,0x003c,0x001c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04df 0x0000,0x0000,0x1ff0,0x1ff0,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x703c,0x707c,0x70fc,0x71dc, 0x739c,0x771c,0x7e1c,0x7c1c,0x781c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x1ff0,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e3 0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x703c,0x707c,0x70fc,0x71dc, 0x739c,0x771c,0x7e1c,0x7c1c,0x781c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e5 0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x7ffc, 0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x7ffc,0x7ffc,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04e9 0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x7ffc, 0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ea 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x7ffc,0x7ffc,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04eb 0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x001c,0x001c,0x001c,0x001c,0x0ffc, 0x0ffc,0x001c,0x001c,0x001c,0x001c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ec 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x001c,0x001c,0x07fc,0x07fc,0x001c,0x001c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ed 0x0000,0x0000,0x1ff0,0x1ff0,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c, 0x3ffc,0x1ffc,0x001c,0x001c,0x001c,0x001c,0x001c,0x003c,0x3ff8,0x3ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04ee 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x1ff0,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x001c,0x001c,0x003c,0x3ff8,0x3ff0,0x0000, // u04ef 0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c, 0x3ffc,0x1ffc,0x001c,0x001c,0x001c,0x001c,0x001c,0x003c,0x3ff8,0x3ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x001c,0x001c,0x003c,0x3ff8,0x3ff0,0x0000, // u04f1 0x0000,0x038e,0x071c,0x0e38,0x1c70,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c, 0x3ffc,0x1ffc,0x001c,0x001c,0x001c,0x001c,0x001c,0x003c,0x3ff8,0x3ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x038e,0x071c,0x0e38,0x1c70,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x001c,0x001c,0x003c,0x3ff8,0x3ff0,0x0000, // u04f3 0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c, 0x3ffc,0x1ffc,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x781c,0x3ffc,0x1ffc,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f5 0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x7f0e,0x7f8e,0x73ce,0x71ce, 0x71ce,0x71ce,0x71ce,0x71ce,0x71ce,0x71ce,0x71ce,0x73ce,0x7f8e,0x7f0e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x700e,0x700e,0x700e,0x700e, 0x7f0e,0x7f8e,0x73ce,0x71ce,0x71ce,0x71ce,0x71ce,0x73ce,0x7f8e,0x7f0e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u04f9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x381c,0x381c,0x1c1c,0x1c1c,0x0e1c,0x0e1c,0x0738,0x0ff0, 0x1fe0,0x39c0,0x70e0,0x70e0,0x7070,0x7070,0x7038,0x7038,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffe0,0xfff0,0x0078,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038, 0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0xfffe,0xfffe,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x3fc0,0x01e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0, 0x00e0,0x00e0,0x01f0,0x03f0,0x07b8,0x0f38,0x1e1c,0x3c1c,0x780e,0xf00e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfffe,0xfffe,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038, 0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff8,0x003c,0x001c,0x001c,0x001c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x3f00,0x0780,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff8,0x3ff8,0x00f0,0x01e0,0x03c0,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff8,0x703c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x71f0,0x71f8,0x703c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e00,0x3f00,0x0780,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05d9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff8,0x003c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c, 0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x0000, // u05da 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff8,0x003c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c, 0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x003c,0x7ff8,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05db 0x0000,0x0000,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x003c,0x0078, 0x00f0,0x01e0,0x03c0,0x0780,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05dc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff8,0x703c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05dd 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xe7e0,0xfff8,0x7c3c,0x381c,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e, 0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x387e,0x387e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05de 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x3fc0,0x01e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0, 0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x0000, // u05df 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc0,0x1fe0,0x00f0,0x0070,0x0070,0x0070,0x0070,0x0070,0x0070,0x0070, 0x0070,0x0070,0x0070,0x0070,0x0070,0x0070,0x0070,0x0070,0x1ff0,0x1ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff8,0xfffc,0x381e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e, 0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x3c1e,0x1ffc,0x0ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x381c,0x381c,0x381c,0x1c1c,0x1c1c,0x1c1c,0x0e38, 0x0e38,0x0e38,0x0770,0x0770,0x0770,0x03e0,0x03c0,0x0780,0x7f00,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff8,0x703c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3f1c, 0x1f1c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x0000, // u05e3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff8,0x703c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3f1c, 0x1f1c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x003c,0x7ff8,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x381c,0x381c,0x1c1c,0x1c3c,0x0e78,0x0ef0,0x07e0,0x07c0, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000, // u05e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x381c,0x381c,0x1c1c,0x1c3c,0x0e78,0x0ef0,0x07e0,0x07c0, 0x0380,0x0380,0x01c0,0x01c0,0x00e0,0x00e0,0x0070,0x0070,0x7ff8,0x7ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x001c,0x001c,0x001c,0x001c,0x701c,0x701c,0x701c,0x7038, 0x7070,0x70e0,0x71c0,0x7380,0x7380,0x7380,0x7380,0x7380,0x7380,0x7380,0x7000,0x7000,0x7000,0x7000,0x7000,0x0000, // u05e7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff8,0x003c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c, 0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x779c, 0x7f1c,0x7e1c,0x701c,0x701c,0x701c,0x701c,0x701c,0x703c,0x7ff8,0x7ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05e9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff8,0xfffc,0x381e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e, 0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0xf80e,0xf00e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u05ea 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7ff0,0x7078,0x7038,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x7038,0x7078,0x7ff0,0x7fc0,0x0000,0x0700,0x0700,0x0700,0x0700,0x0000, // u1e0c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x1ffc,0x3ffc,0x781c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x01c0,0x01c0,0x01c0,0x01c0,0x0000, // u1e0d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x700c,0x701c,0x7038,0x7070,0x70e0,0x71c0,0x7380,0x7700,0x7e00,0x7c00, 0x7c00,0x7e00,0x7700,0x7380,0x71c0,0x70e0,0x7070,0x7038,0x701c,0x700c,0x0000,0x0000,0x1ff0,0x1ff0,0x0000,0x0000, // u1e34 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x381c,0x3838,0x3870,0x38e0, 0x39c0,0x3b80,0x3f00,0x3f00,0x3b80,0x39c0,0x38e0,0x3870,0x3838,0x381c,0x0000,0x0000,0x0ff0,0x0ff0,0x0000,0x0000, // u1e35 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000, 0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000, // u1e36 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f80,0x0f80,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000, // u1e37 0x0000,0x0380,0x0380,0x0380,0x0380,0x0000,0x700e,0x700e,0x781e,0x7c3e,0x7e7e,0x7e7e,0x77ee,0x73ce,0x73ce,0x718e, 0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e40 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x7ff0,0x7ff8,0x73bc,0x739c, 0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e41 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x700e,0x700e,0x781e,0x7c3e,0x7e7e,0x7e7e,0x77ee,0x73ce,0x73ce,0x718e, 0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000, // u1e42 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff8,0x73bc,0x739c, 0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000, // u1e43 0x0000,0x0380,0x0380,0x0380,0x0380,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x7c1c,0x7e1c,0x771c,0x739c, 0x71dc,0x70fc,0x707c,0x703c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e44 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x7ff0,0x7ff8,0x703c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u1e45 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x7c1c,0x7e1c,0x771c,0x739c, 0x71dc,0x70fc,0x707c,0x703c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000, // u1e46 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ff0,0x7ff8,0x703c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000, // u1e47 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000, // u1e6c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x7ff0,0x7ff0,0x0700,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0780,0x03fc,0x01fc,0x0000,0x0070,0x0070,0x0070,0x0070,0x0000, // u1e6d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7fe0, 0x7fe0,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000, // u1eb8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x781c,0x3ffc,0x1ff8,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000, // u1eb9 0x0000,0x1f38,0x3bb8,0x3bb8,0x39f0,0x0000,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7fe0, 0x7fe0,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u1ebc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f38,0x3bb8,0x3bb8,0x39f0,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x7ffc,0x7ffc,0x7000,0x7000,0x7000,0x781c,0x3ffc,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u1ebd 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0x0fe0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000, // u1eca 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0f80,0x0f80,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000, // u1ecb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000, // u1ecc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000, // u1ecd 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8,0x1ff0,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000, // u1ee4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x0000,0x01c0,0x01c0,0x01c0,0x01c0,0x0000, // u1ee5 0x0000,0x1f38,0x3bb8,0x3bb8,0x39f0,0x0000,0x701c,0x701c,0x701c,0x3838,0x3838,0x1c70,0x1c70,0x0ee0,0x0ee0,0x07c0, 0x07c0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u1ef8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f38,0x3bb8,0x3bb8,0x39f0,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x781c,0x3ffc,0x1ffc,0x001c,0x001c,0x003c,0x3ff8,0x3ff0,0x0000, // u1ef9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2000 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2001 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2002 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2003 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2004 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2005 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2006 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2007 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2008 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2009 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u200f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff8, 0x3ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2010 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff8, 0x3ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2011 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc, 0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2012 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc, 0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2013 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffe, 0x7ffe,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2014 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffe, 0x7ffe,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2015 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70, 0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2016 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x0000,0x0000,0x7ffc,0x7ffc, // u2017 0x0000,0x0000,0x0000,0x0000,0x01c0,0x01c0,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2018 0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0700,0x0700,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2019 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0700,0x0700,0x0000,0x0000,0x0000,0x0000, // u201a 0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x01c0,0x01c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201b 0x0000,0x0000,0x0000,0x0000,0x0e38,0x0e38,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201c 0x0000,0x0000,0x0000,0x0000,0x0e38,0x0e38,0x0e38,0x0e38,0x1c70,0x1c70,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x38e0,0x38e0,0x0000,0x0000,0x0000,0x0000, // u201e 0x0000,0x0000,0x0000,0x0000,0x38e0,0x38e0,0x38e0,0x38e0,0x1c70,0x1c70,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u201f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x3ff8,0x3ff8,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2020 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x3ff8,0x3ff8,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x3ff8,0x3ff8,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2021 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03c0,0x07e0,0x0ff0,0x0ff0, 0x0ff0,0x0ff0,0x07e0,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2022 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x739c,0x739c,0x739c,0x739c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2026 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3870,0x7c70,0x6ce0,0x6ce0,0x7dc0,0x39c0,0x0380,0x0380,0x0700,0x0700, 0x0e00,0x0e00,0x1c00,0x1c00,0x39dc,0x3bfe,0x7376,0x7376,0xe3fe,0xe1dc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2030 0x0000,0x0000,0x0000,0x0000,0x03c0,0x03c0,0x03c0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2032 0x0000,0x0000,0x0000,0x0000,0x1e78,0x1e78,0x1e78,0x1c70,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2033 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x00e0,0x01c0,0x0380, 0x0700,0x0e00,0x1c00,0x1c00,0x0e00,0x0700,0x0380,0x01c0,0x00e0,0x0070,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2039 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0e00,0x0700,0x0380, 0x01c0,0x00e0,0x0070,0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u203a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x1c70,0x1c70,0x1c70,0x1c70,0x1c70,0x1c70, 0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x0000,0x1c70,0x1c70,0x1c70,0x1c70,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u203c 0x0000,0x0000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u203e 0x0000,0x0000,0x0000,0x07c0,0x0fe0,0x1c70,0x1c70,0x1c70,0x1c70,0x1c70,0x1c70,0x1c70,0x0fe0,0x07c0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2070 0x01c0,0x01c0,0x01c0,0x0000,0x07c0,0x07c0,0x01c0,0x01c0,0x01c0,0x01c0,0x01c0,0x01c0,0x07f0,0x07f0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2071 0x0000,0x0000,0x0000,0x0030,0x0070,0x00f0,0x01f0,0x03f0,0x0770,0x0e70,0x1ff0,0x1ff0,0x0070,0x0070,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2074 0x0000,0x0000,0x0000,0x1fe0,0x1fe0,0x1c00,0x1c00,0x1fe0,0x1ff0,0x0070,0x0070,0x1c70,0x1ff0,0x0fe0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2075 0x0000,0x0000,0x0000,0x07e0,0x0fe0,0x1c00,0x1c00,0x1fe0,0x1ff0,0x1c70,0x1c70,0x1c70,0x1ff0,0x0fe0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2076 0x0000,0x0000,0x0000,0x1ff0,0x1ff0,0x1c70,0x0070,0x00e0,0x00e0,0x01c0,0x01c0,0x0380,0x0380,0x0380,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2077 0x0000,0x0000,0x0000,0x0fe0,0x1ff0,0x1c70,0x1c70,0x1ff0,0x0fe0,0x1c70,0x1c70,0x1c70,0x1ff0,0x0fe0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2078 0x0000,0x0000,0x0000,0x0fe0,0x1ff0,0x1c70,0x1c70,0x1c70,0x1ff0,0x0ff0,0x0070,0x0070,0x0fe0,0x0fc0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2079 0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x1ff0,0x1ff0,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff8,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207b 0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff8,0x1ff8,0x0000,0x0000,0x0000,0x1ff8,0x1ff8,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207c 0x0000,0x0000,0x0000,0x01c0,0x0380,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0380,0x01c0,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207d 0x0000,0x0000,0x0000,0x0700,0x0380,0x01c0,0x01c0,0x01c0,0x01c0,0x01c0,0x01c0,0x01c0,0x0380,0x0700,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207e 0x0000,0x0000,0x0000,0x0000,0x1fe0,0x1ff0,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u207f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x07c0,0x0fe0,0x1c70,0x1c70,0x1c70,0x1c70,0x1c70,0x1c70,0x1c70,0x0fe0,0x07c0,0x0000,0x0000,0x0000, // u2080 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0380,0x0780,0x0f80,0x0f80,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000, // u2081 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0fe0,0x1ff0,0x1c70,0x1c70,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1ff0,0x1ff0,0x0000,0x0000,0x0000, // u2082 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0fe0,0x1ff0,0x1c70,0x0070,0x03e0,0x03e0,0x0070,0x0070,0x1c70,0x1ff0,0x0fe0,0x0000,0x0000,0x0000, // u2083 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0030,0x0070,0x00f0,0x01f0,0x03f0,0x0770,0x0e70,0x1ff0,0x1ff0,0x0070,0x0070,0x0000,0x0000,0x0000, // u2084 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1fe0,0x1fe0,0x1c00,0x1c00,0x1fe0,0x1ff0,0x0070,0x0070,0x1c70,0x1ff0,0x0fe0,0x0000,0x0000,0x0000, // u2085 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x07e0,0x0fe0,0x1c00,0x1c00,0x1fe0,0x1ff0,0x1c70,0x1c70,0x1c70,0x1ff0,0x0fe0,0x0000,0x0000,0x0000, // u2086 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x1ff0,0x1ff0,0x1c70,0x0070,0x00e0,0x00e0,0x01c0,0x01c0,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000, // u2087 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0fe0,0x1ff0,0x1c70,0x1c70,0x1ff0,0x0fe0,0x1c70,0x1c70,0x1c70,0x1ff0,0x0fe0,0x0000,0x0000,0x0000, // u2088 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0fe0,0x1ff0,0x1c70,0x1c70,0x1c70,0x1ff0,0x0ff0,0x0070,0x0070,0x0fe0,0x0fc0,0x0000,0x0000,0x0000, // u2089 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x1ff0,0x1ff0,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000, // u208a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff8,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u208b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x1ff8,0x1ff8,0x0000,0x0000,0x0000,0x1ff8,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000, // u208c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x01c0,0x0380,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0380,0x01c0,0x0000,0x0000,0x0000, // u208d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0700,0x0380,0x01c0,0x01c0,0x01c0,0x01c0,0x01c0,0x01c0,0x01c0,0x0380,0x0700,0x0000,0x0000,0x0000, // u208e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0fe0,0x0ff0,0x0038,0x0038,0x0ff8,0x1ff8,0x1c38,0x1c38,0x1ff8,0x0ff8,0x0000,0x0000,0x0000, // u2090 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x07e0,0x0ff0,0x1c38,0x1c38,0x1ff8,0x1ff8,0x1c00,0x1c00,0x0ff8,0x07f0,0x0000,0x0000,0x0000, // u2091 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x07e0,0x0ff0,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x0ff0,0x07e0,0x0000,0x0000,0x0000, // u2092 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x1c38,0x1c38,0x0e70,0x07e0,0x03c0,0x03c0,0x07e0,0x0e70,0x1c38,0x1c38,0x0000,0x0000,0x0000, // u2093 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0fe0,0x1ff0,0x0038,0x0038,0x1ff8,0x1ff8,0x1c38,0x1c38,0x0ff0,0x07e0,0x0000,0x0000,0x0000, // u2094 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00, 0x1c00,0x1c00,0x1c00,0x1fe0,0x1ff0,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x0000,0x0000,0x0000, // u2095 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00, 0x1c00,0x1c00,0x1c00,0x1c38,0x1c70,0x1ce0,0x1dc0,0x1f80,0x1f80,0x1dc0,0x1ce0,0x1c70,0x1c38,0x0000,0x0000,0x0000, // u2096 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f80, 0x0f80,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000, // u2097 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x7ff0,0x7ff8,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x739c,0x0000,0x0000,0x0000, // u2098 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x1fe0,0x1ff0,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1ff0,0x1fe0,0x1c00,0x1c00,0x1c00, // u209a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff00,0xff80,0xe3c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe1c0,0xe3c0,0xfff0, 0xff70,0xe070,0xe3fe,0xe3fe,0xe070,0xe070,0xe070,0xe070,0xe07e,0xe03e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u20a7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f86,0x7fc6,0x60e6,0x6066,0x6066,0x6066,0x6666,0x6666,0x6666,0x6666, 0x6666,0x6666,0x6666,0x6666,0x6606,0x6606,0x6606,0x660e,0x67fc,0x67f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u20aa 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03f0,0x07f8,0x0e1c,0x1c0e,0x3800,0x3800,0x3800,0xffe0,0xffe0,0x3800, 0x3800,0xffe0,0xffe0,0x3800,0x3800,0x3800,0x1c0e,0x0e1c,0x07f8,0x03f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u20ac 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x0380,0x0380,0x0380,0x0380,0x03f8,0x03f0,0x07c0,0x1f80, 0x3ff8,0x03f0,0x07c0,0x1f80,0x3f80,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u20ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x3e1c,0x360c,0x360c,0x3600,0x3600,0x3600,0x3600,0x3600, 0x3600,0x3600,0x3600,0x3600,0x3600,0x360c,0x360c,0x3e1c,0x1ff8,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2102 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7ff0,0x7ff8,0x703c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u210e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0xffc0,0xffc0,0x3800,0x3800,0x3ff8,0x3ffc,0x381e,0x380e, 0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x380e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u210f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x300c,0x300c,0x300c,0x300c,0x380c,0x3c0c,0x360c,0x3b0c,0x3d8c,0x36cc, 0x336c,0x31bc,0x30dc,0x306c,0x303c,0x301c,0x300c,0x300c,0x300c,0x300c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2115 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xe1c0,0xe1ce,0xe1df,0xe1db,0xf1db,0xf1df,0xf9ce,0xf9c0,0xfdc0,0xedc0, 0xefc0,0xe7c0,0xe7c0,0xe3df,0xe3df,0xe1c0,0xe1df,0xe1df,0xe1c0,0xe1c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2116 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x1ff8,0x3e1c,0x360c,0x360c,0x360c,0x360c,0x360c,0x360c,0x360c, 0x360c,0x360c,0x360c,0x360c,0x360c,0x360c,0x36cc,0x3efc,0x1ff8,0x0ff8,0x001c,0x000e,0x0000,0x0000,0x0000,0x0000, // u211a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff0,0x3ff8,0x361c,0x360c,0x360c,0x360c,0x360c,0x360c,0x360c,0x361c, 0x37f8,0x37f0,0x36c0,0x3760,0x37b0,0x36d8,0x366c,0x3636,0x361a,0x3e0e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u211d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff86,0xffce,0x39fe,0x39fe,0x39ce,0x39ce,0x39ce,0x39ce,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2122 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x000c,0x000c,0x001c,0x003c,0x006c,0x00d8,0x01b0,0x0360, 0x06c0,0x0d80,0x1b00,0x3600,0x3c00,0x3800,0x3000,0x3000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2124 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x3838,0x1c70,0x1c70,0x1c70,0x7c7c,0x7c7c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2126 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7070,0x7070,0x3838,0x3838,0x1c1c,0x1c1c,0x0e0e,0x0e0e,0x1f1c,0x3f38, 0x73f0,0xe3e0,0xe1c0,0xe1c0,0xe0e0,0xe0e0,0xe070,0xe070,0x7038,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2135 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0300,0x0700,0x0e00,0x1c00,0x3800,0x7ffe,0x7ffe, 0x7ffe,0x3800,0x1c00,0x0e00,0x0700,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2190 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x07c0,0x0fe0,0x1ff0,0x3bb8,0x739c,0x638c,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2191 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00e0,0x0070,0x0038,0x001c,0x7ffe,0x7ffe, 0x7ffe,0x001c,0x0038,0x0070,0x00e0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2192 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x638c,0x739c,0x3bb8,0x1ff0,0x0fe0,0x07c0,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2193 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0660,0x0e70,0x1c38,0x381c,0x700e,0xffff,0xffff, 0xffff,0x700e,0x381c,0x1c38,0x0e70,0x0660,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2194 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x07c0,0x0fe0,0x1ff0,0x3bb8,0x739c,0x638c,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x638c,0x739c,0x3bb8,0x1ff0,0x0fe0,0x07c0,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2195 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0306,0x0706,0x0e06,0x1c06,0x3806,0x7ffe,0x7ffe, 0x7ffe,0x3806,0x1c06,0x0e06,0x0706,0x0306,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x60c0,0x60e0,0x6070,0x6038,0x601c,0x7ffe,0x7ffe, 0x7ffe,0x601c,0x6038,0x6070,0x60e0,0x60c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x07c0,0x0fe0,0x1ff0,0x3bb8,0x739c,0x638c,0x0380,0x0380,0x0380, 0x0380,0x638c,0x739c,0x3bb8,0x1ff0,0x0fe0,0x07c0,0x0380,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21a8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x000e,0x000e,0x000e,0x000e,0x000e,0x000e,0x000e,0x030e,0x070e,0x0e0e, 0x1c0e,0x380e,0x7ffe,0x7ffe,0x7ffe,0x3800,0x1c00,0x0e00,0x0700,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x7f80,0x1f80,0x3f8c,0x3b8c,0x738e,0x700e, 0x700e,0x700e,0x700e,0x381c,0x3c3c,0x1ff8,0x07e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1800,0x3800,0x7000,0xfffe,0xfffe,0xfffe,0x0000, 0x0000,0xfffe,0xfffe,0xfffe,0x001c,0x0038,0x0030,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21cb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0030,0x0038,0x001c,0xfffe,0xfffe,0xfffe,0x0000, 0x0000,0xfffe,0xfffe,0xfffe,0x7000,0x3800,0x1800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21cc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0600,0x0e00,0x1ffe,0x3ffe,0x7ffe,0xf800, 0xf800,0x7ffe,0x3ffe,0x1ffe,0x0e00,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x03c0,0x07e0,0x0ff0,0x1ff8,0x3e7c,0x3e7c,0x0e70,0x0e70,0x0e70, 0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c0,0x00e0,0xfff0,0xfff8,0xfffc,0x003e, 0x003e,0xfffc,0xfff8,0xfff0,0x00e0,0x00c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70, 0x0e70,0x0e70,0x0e70,0x3e7c,0x3e7c,0x1ff8,0x0ff0,0x07e0,0x03c0,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0660,0x0e70,0x1ff8,0x3ffc,0x7ffe,0xf81f, 0xf81f,0x7ffe,0x3ffc,0x1ff8,0x0e70,0x0660,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x03c0,0x07e0,0x0ff0,0x1ff8,0x3e7c,0x3e7c,0x0e70,0x0e70,0x0e70, 0x0e70,0x0e70,0x0e70,0x3e7c,0x3e7c,0x1ff8,0x0ff0,0x07e0,0x03c0,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u21d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x700e,0x700e,0x700e,0x700e,0x381c,0x381c,0x3ffc,0x3ffc,0x1c38,0x1c38, 0x1c38,0x0c30,0x0e70,0x0e70,0x0660,0x0660,0x07e0,0x03c0,0x03c0,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2200 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x7ffc, 0x7ffc,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x001c,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2203 0x0000,0x0000,0x0000,0x001c,0x001c,0x003c,0x7ffc,0x7ffc,0x007c,0x00fc,0x00dc,0x01dc,0x01dc,0x039c,0x039c,0x7ffc, 0x7ffc,0x071c,0x071c,0x0e1c,0x0e1c,0x1c1c,0x1c1c,0x381c,0x7ffc,0x7ffc,0x7000,0xe000,0xe000,0x0000,0x0000,0x0000, // u2204 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x001c,0x001c,0x0038,0x0038,0x0ff0,0x1ff8,0x38fc,0x38fc,0x39dc,0x39dc, 0x3b9c,0x3b9c,0x3f1c,0x3f1c,0x1ff8,0x0ff0,0x1c00,0x1c00,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2205 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x07c0,0x07c0,0x07c0,0x0ee0,0x0ee0,0x0ee0,0x1c70, 0x1c70,0x1c70,0x3838,0x3838,0x3838,0x701c,0x701c,0x701c,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2206 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x701c,0x701c,0x701c,0x3838,0x3838,0x3838,0x1c70,0x1c70, 0x1c70,0x0ee0,0x0ee0,0x0ee0,0x07c0,0x07c0,0x07c0,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2207 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03fc,0x0ffc,0x1e00,0x3800,0x3800,0x7000,0x7000,0x7000,0x7000,0x7ffc, 0x7ffc,0x7000,0x7000,0x7000,0x7000,0x3800,0x3800,0x1e00,0x0ffc,0x03fc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2208 0x0000,0x0000,0x0000,0x000e,0x000e,0x001c,0x03fc,0x0ffc,0x1e38,0x3870,0x3870,0x70e0,0x70e0,0x71c0,0x71c0,0x7ffc, 0x7ffc,0x7380,0x7380,0x7700,0x7700,0x3e00,0x3e00,0x1e00,0x1ffc,0x3bfc,0x3800,0x7000,0x7000,0x0000,0x0000,0x0000, // u2209 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07fc,0x1ffc,0x3c00,0x3800,0x7000,0x7000,0x7ffc, 0x7ffc,0x7000,0x7000,0x3800,0x3c00,0x1ffc,0x07fc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u220a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x7fe0,0x00f0,0x0038,0x0038,0x001c,0x001c,0x001c,0x001c,0x7ffc, 0x7ffc,0x001c,0x001c,0x001c,0x001c,0x0038,0x0038,0x00f0,0x7fe0,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u220b 0x0000,0x0000,0x0000,0xe000,0xe000,0x7000,0x7f80,0x7fe0,0x38f0,0x1c38,0x1c38,0x0e1c,0x0e1c,0x071c,0x071c,0x7ffc, 0x7ffc,0x039c,0x039c,0x01dc,0x01dc,0x00f8,0x00f8,0x00f0,0x7ff0,0x7fb8,0x0038,0x001c,0x001c,0x0000,0x0000,0x0000, // u220c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7ff0,0x0078,0x0038,0x001c,0x001c,0x7ffc, 0x7ffc,0x001c,0x001c,0x0038,0x0078,0x7ff0,0x7fc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u220d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc, 0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2212 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x0000,0x0000,0x0380,0x0380, 0x0380,0x0380,0x0380,0x7ffc,0x7ffc,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2213 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0380,0x0380, 0x0380,0x0380,0x0380,0x7ffc,0x7ffc,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2214 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0006,0x000e,0x001c,0x0038,0x0070,0x00e0,0x01c0, 0x0380,0x0700,0x0e00,0x1c00,0x3800,0x7000,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2215 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0x7000,0x3800,0x1c00,0x0e00,0x0700,0x0380, 0x01c0,0x00e0,0x0070,0x0038,0x001c,0x000e,0x0006,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2216 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03c0,0x07e0,0x07e0, 0x07e0,0x07e0,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2219 0x0000,0x0000,0x0000,0x003e,0x003e,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x7038, 0x7038,0x7038,0x7838,0x3c38,0x1e38,0x0f38,0x07b8,0x03f8,0x01f8,0x00f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u221a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ef8,0x7ffc,0xe7ce,0xe38e,0xe38e, 0xe38e,0xe38e,0xe7ce,0x7ffc,0x3ef8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u221e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000, 0x7000,0x7000,0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u221f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70, 0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2225 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x07c0,0x07c0, 0x0ee0,0x0ee0,0x1c70,0x1c70,0x1c70,0x3838,0x3838,0x3838,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2227 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x3838,0x3838, 0x3838,0x1c70,0x1c70,0x1c70,0x0ee0,0x0ee0,0x07c0,0x07c0,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2228 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07c0,0x1ff0,0x3c78,0x3838,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2229 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x3838,0x3c78,0x1ff0,0x07c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u222a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e1c,0x7fbc,0x7bfc,0x70f8,0x0000, 0x0000,0x3e1c,0x7fbc,0x7bfc,0x70f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2248 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x000e,0x001c,0x7ffe,0x7ffe,0x00e0,0x01c0, 0x0380,0x0700,0x7ffe,0x7ffe,0x3800,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2260 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x7ffc, 0x7ffc,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2261 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x1c00,0x0e00, 0x0700,0x0380,0x01c0,0x00e0,0x0070,0x0038,0x0000,0x0000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2264 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c00,0x0e00,0x0700,0x0380,0x01c0,0x00e0,0x0070,0x0038,0x0038,0x0070, 0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x0000,0x0000,0x3ffc,0x3ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2265 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00c3,0x01c7,0x038e,0x071c,0x0e38,0x1c70,0x38e0,0x71c0,0xe380, 0xe380,0x71c0,0x38e0,0x1c70,0x0e38,0x071c,0x038e,0x01c7,0x00c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u226a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc300,0xe380,0x71c0,0x38e0,0x1c70,0x0e38,0x071c,0x038e,0x01c7, 0x01c7,0x038e,0x071c,0x0e38,0x1c70,0x38e0,0x71c0,0xe380,0xc300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u226b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07fe,0x1ffe,0x3c00,0x3800,0x7000,0x7000,0x7000, 0x7000,0x7000,0x7000,0x3800,0x3c00,0x1ffe,0x07fe,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2282 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x7ff8,0x003c,0x001c,0x000e,0x000e,0x000e, 0x000e,0x000e,0x000e,0x001c,0x003c,0x7ff8,0x7fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2283 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07fe,0x1ffe,0x3c00,0x3800,0x7000,0x7000,0x7000,0x7000,0x7000, 0x7000,0x3800,0x3c00,0x1ffe,0x07fe,0x0000,0x0000,0x7ffe,0x7ffe,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2286 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fe0,0x7ff8,0x003c,0x001c,0x000e,0x000e,0x000e,0x000e,0x000e, 0x000e,0x001c,0x003c,0x7ff8,0x7fe0,0x0000,0x0000,0x7ffe,0x7ffe,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2287 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u22a5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07c0,0x1ff0,0x3c78,0x3838,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u22c2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x3838,0x3c78,0x1ff0,0x07c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u22c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x001c,0x001c,0x0038,0x0038,0x0ff0,0x1ff8,0x38fc,0x38fc,0x39dc,0x39dc, 0x3b9c,0x3b9c,0x3f1c,0x3f1c,0x1ff8,0x0ff0,0x1c00,0x1c00,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2300 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x07c0,0x0fe0,0x1ef0,0x3c78,0x783c, 0xf01e,0xe00e,0xe00e,0xe00e,0xe00e,0xe00e,0xe00e,0xe00e,0xfffe,0xfffe,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2302 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x0ff0,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2308 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x0ff0,0x0070,0x0070,0x0070,0x0070,0x0070,0x0070,0x0070,0x0070, 0x0070,0x0070,0x0070,0x0070,0x0070,0x0070,0x0070,0x0070,0x0070,0x0070,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2309 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00, 0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0e00,0x0ff0,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u230a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0070,0x0070,0x0070,0x0070,0x0070,0x0070,0x0070,0x0070,0x0070,0x0070, 0x0070,0x0070,0x0070,0x0070,0x0070,0x0070,0x0070,0x0070,0x0ff0,0x0ff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u230b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x7000,0x7000, 0x7000,0x7000,0x7000,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2310 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x7000,0x7000,0x7000, 0x7000,0x7000,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2319 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01f8,0x03fc,0x039c,0x039c,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u2320 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x7380,0x7380,0x7f80,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2321 0x0038,0x0070,0x00e0,0x01c0,0x0380,0x0380,0x0700,0x0700,0x0e00,0x0e00,0x0e00,0x1c00,0x1c00,0x1c00,0x1c00,0x3800, 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u239b 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u239c 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, 0x3800,0x1c00,0x1c00,0x1c00,0x1c00,0x0e00,0x0e00,0x0e00,0x0700,0x0700,0x0380,0x0380,0x01c0,0x00e0,0x0070,0x0038, // u239d 0x3800,0x1c00,0x0e00,0x0700,0x0380,0x0380,0x01c0,0x01c0,0x00e0,0x00e0,0x00e0,0x0070,0x0070,0x0070,0x0070,0x0038, 0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038, // u239e 0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038, 0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038, // u239f 0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038, 0x0038,0x0070,0x0070,0x0070,0x0070,0x00e0,0x00e0,0x00e0,0x01c0,0x01c0,0x0380,0x0380,0x0700,0x0e00,0x1c00,0x3800, // u23a0 0x3ff8,0x3ff8,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u23a1 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, // u23a2 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800, 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3ff8,0x3ff8, // u23a3 0x3ff8,0x3ff8,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038, 0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038, // u23a4 0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038, 0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038, // u23a5 0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038, 0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x3ff8,0x3ff8, // u23a6 0x007f,0x01ff,0x03c0,0x0380,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u23a7 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0f00,0x1e00,0xfc00, 0xfc00,0x1e00,0x0f00,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, // u23a8 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700, 0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0700,0x0380,0x03c0,0x01ff,0x007f, // u23a9 0xfe00,0xff80,0x03c0,0x01c0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0, 0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0, // u23ab 0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x0070,0x003f, 0x003f,0x0070,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0, // u23ac 0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0, 0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x01c0,0x03c0,0xff80,0xfe00, // u23ad 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u23ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff, 0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23af 0xffff,0xffff,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23bb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u23bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff, // u23bd 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u23d0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x71c0,0x71c0,0x71c0,0x7fc0,0x7fc0,0x71c0,0x71c0,0x71c0,0x71c0,0x0000, 0x0000,0x03fe,0x03fe,0x0070,0x0070,0x0070,0x0070,0x0070,0x0070,0x0070,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2409 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7fc0,0x7fc0,0x0000, 0x0000,0x03fe,0x03fe,0x0380,0x0380,0x03f8,0x03f8,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u240a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x71c0,0x71c0,0x71c0,0x71c0,0x71c0,0x71c0,0x3b80,0x1f00,0x0e00,0x0000, 0x0000,0x03fe,0x03fe,0x0070,0x0070,0x0070,0x0070,0x0070,0x0070,0x0070,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u240b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0,0x7fc0,0x7000,0x7000,0x7f00,0x7f00,0x7000,0x7000,0x7000,0x0000, 0x0000,0x03fe,0x03fe,0x0380,0x0380,0x03f8,0x03f8,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u240c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x7fc0,0x71c0,0x7000,0x7000,0x7000,0x71c0,0x7fc0,0x3f80,0x0000, 0x0000,0x03fc,0x03fe,0x038e,0x038e,0x03fc,0x03f0,0x03b8,0x039c,0x038e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u240d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x71c0,0x71c0,0x79c0,0x7dc0,0x7fc0,0x77c0,0x73c0,0x71c0,0x71c0,0x0000, 0x0000,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x03fe,0x03fe,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2424 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff, 0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2500 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff, 0xffff,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2501 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u2502 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, // u2503 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf7de,0xf7de, 0xf7de,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2508 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf7de,0xf7de,0xf7de, 0xf7de,0xf7de,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2509 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000, // u250a 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x0000,0x0000,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x0000,0x0000, 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x0000,0x0000,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x0000,0x0000, // u250b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03ff,0x03ff, 0x03ff,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u250c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03ff,0x03ff,0x03ff, 0x03ff,0x03ff,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u250d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07ff,0x07ff, 0x07ff,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, // u250e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07ff,0x07ff,0x07ff, 0x07ff,0x07ff,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, // u250f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff80,0xff80, 0xff80,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u2510 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff80,0xff80,0xff80, 0xff80,0xff80,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u2511 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0, 0xffc0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, // u2512 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, // u2513 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x03ff,0x03ff, 0x03ff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2514 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x03ff,0x03ff,0x03ff, 0x03ff,0x03ff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2515 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07ff,0x07ff, 0x07ff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2516 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07ff,0x07ff,0x07ff, 0x07ff,0x07ff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2517 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0xff80,0xff80, 0xff80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2518 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0xff80,0xff80,0xff80, 0xff80,0xff80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2519 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0xffc0,0xffc0, 0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u251a 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u251b 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x03ff,0x03ff, 0x03ff,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u251c 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x03ff,0x03ff,0x03ff, 0x03ff,0x03ff,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u251d 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07ff,0x07ff, 0x07ff,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u251e 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x07ff,0x07ff, 0x07ff,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, // u251f 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07ff,0x07ff, 0x07ff,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, // u2520 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07ff,0x07ff,0x07ff, 0x07ff,0x07ff,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u2521 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x07ff,0x07ff,0x07ff, 0x07ff,0x07ff,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, // u2522 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07ff,0x07ff,0x07ff, 0x07ff,0x07ff,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, // u2523 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0xff80,0xff80, 0xff80,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u2524 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0xff80,0xff80,0xff80, 0xff80,0xff80,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u2525 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0xffc0,0xffc0, 0xffc0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u2526 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0xffc0,0xffc0, 0xffc0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, // u2527 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0xffc0,0xffc0, 0xffc0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, // u2528 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u2529 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, // u252a 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, // u252b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff, 0xffff,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u252c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff80,0xffff,0xffff, 0xffff,0xff80,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u252d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03ff,0xffff,0xffff, 0xffff,0x03ff,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u252e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff, 0xffff,0xffff,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u252f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff, 0xffff,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, // u2530 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffc0,0xffff,0xffff, 0xffff,0xffc0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, // u2531 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07ff,0xffff,0xffff, 0xffff,0x07ff,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, // u2532 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff, 0xffff,0xffff,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, // u2533 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0xffff,0xffff, 0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2534 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0xff80,0xffff,0xffff, 0xffff,0xff80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2535 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x03ff,0xffff,0xffff, 0xffff,0x03ff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2536 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0xffff,0xffff,0xffff, 0xffff,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2537 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0xffff,0xffff, 0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2538 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0xffc0,0xffff,0xffff, 0xffff,0xffc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2539 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07ff,0xffff,0xffff, 0xffff,0x07ff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u253a 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0xffff,0xffff,0xffff, 0xffff,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u253b 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0xffff,0xffff, 0xffff,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u253c 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0xff80,0xffff,0xffff, 0xffff,0xff80,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u253d 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x03ff,0xffff,0xffff, 0xffff,0x03ff,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u253e 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0xffff,0xffff,0xffff, 0xffff,0xffff,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u253f 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0xffff,0xffff, 0xffff,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u2540 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0xffff,0xffff, 0xffff,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, // u2541 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0xffff,0xffff, 0xffff,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, // u2542 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0xffc0,0xffff,0xffff, 0xffff,0xff80,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u2543 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07ff,0xffff,0xffff, 0xffff,0x03ff,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u2544 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0xff80,0xffff,0xffff, 0xffff,0xffc0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, // u2545 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x03ff,0xffff,0xffff, 0xffff,0x07ff,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, // u2546 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0xffff,0xffff,0xffff, 0xffff,0xffff,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u2547 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0xffff,0xffff,0xffff, 0xffff,0xffff,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, // u2548 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0xffc0,0xffff,0xffff, 0xffff,0xffc0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, // u2549 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07ff,0xffff,0xffff, 0xffff,0x07ff,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, // u254a 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0xffff,0xffff,0xffff, 0xffff,0xffff,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, // u254b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff,0x0000, 0x0000,0xffff,0xffff,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2550 0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70, 0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70, // u2551 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03ff,0x03ff,0x03ff,0x0380, 0x0380,0x03ff,0x03ff,0x03ff,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u2552 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fff,0x0fff, 0x0fff,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70, // u2553 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fff,0x0fff,0x0fff,0x0e00, 0x0e00,0x0e7f,0x0e7f,0x0e7f,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70, // u2554 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff80,0xff80,0xff80,0x0380, 0x0380,0xff80,0xff80,0xff80,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u2555 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff0, 0xfff0,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70, // u2556 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xfff0,0xfff0,0xfff0,0x0070, 0x0070,0xfe70,0xfe70,0xfe70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70, // u2557 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x03ff,0x03ff,0x03ff,0x0380, 0x0380,0x03ff,0x03ff,0x03ff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2558 0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0fff,0x0fff, 0x0fff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2559 0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e7f,0x0e7f,0x0e7f,0x0e00, 0x0e00,0x0fff,0x0fff,0x0fff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255a 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0xff80,0xff80,0xff80,0x0380, 0x0380,0xff80,0xff80,0xff80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255b 0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0xfff0,0xfff0, 0xfff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255c 0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0xfe70,0xfe70,0xfe70,0x0070, 0x0070,0xfff0,0xfff0,0xfff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u255d 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x03ff,0x03ff,0x03ff,0x0380, 0x0380,0x03ff,0x03ff,0x03ff,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u255e 0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e7f,0x0e7f, 0x0e7f,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70, // u255f 0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e7f,0x0e7f,0x0e7f,0x0e00, 0x0e00,0x0e7f,0x0e7f,0x0e7f,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70, // u2560 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0xff80,0xff80,0xff80,0x0380, 0x0380,0xff80,0xff80,0xff80,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u2561 0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0xfe70,0xfe70, 0xfe70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70, // u2562 0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0xfe70,0xfe70,0xfe70,0x0070, 0x0070,0xfe70,0xfe70,0xfe70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70, // u2563 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff,0x0000, 0x0000,0xffff,0xffff,0xffff,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u2564 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff, 0xffff,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70, // u2565 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff,0x0000, 0x0000,0xfe7f,0xfe7f,0xfe7f,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70, // u2566 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0xffff,0xffff,0xffff,0x0000, 0x0000,0xffff,0xffff,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2567 0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0xffff,0xffff, 0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2568 0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0xfe7f,0xfe7f,0xfe7f,0x0000, 0x0000,0xffff,0xffff,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2569 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0xffff,0xffff,0xffff,0x0380, 0x0380,0xffff,0xffff,0xffff,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u256a 0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0xffff,0xffff, 0xffff,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70, // u256b 0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0xfe7f,0xfe7f,0xfe7f,0x0000, 0x0000,0xfe7f,0xfe7f,0xfe7f,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70,0x0e70, // u256c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x001f,0x007f, 0x00ff,0x01f0,0x01c0,0x03c0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u256d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf000,0xfc00, 0xfe00,0x1f00,0x0700,0x0780,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u256e 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0780,0x0700,0x1f00,0xfe00,0xfc00, 0xf000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u256f 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x03c0,0x01c0,0x01f0,0x00ff,0x007f, 0x001f,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2570 0x0003,0x0003,0x0007,0x0007,0x000e,0x000e,0x001c,0x001c,0x0038,0x0038,0x0070,0x0070,0x00e0,0x00e0,0x01c0,0x01c0, 0x0380,0x0380,0x0700,0x0700,0x0e00,0x0e00,0x1c00,0x1c00,0x3800,0x3800,0x7000,0x7000,0xe000,0xe000,0xc000,0xc000, // u2571 0xc000,0xc000,0xe000,0xe000,0x7000,0x7000,0x3800,0x3800,0x1c00,0x1c00,0x0e00,0x0e00,0x0700,0x0700,0x0380,0x0380, 0x01c0,0x01c0,0x00e0,0x00e0,0x0070,0x0070,0x0038,0x0038,0x001c,0x001c,0x000e,0x000e,0x0007,0x0007,0x0003,0x0003, // u2572 0xc003,0xc003,0xe007,0xe007,0x700e,0x700e,0x381c,0x381c,0x1c38,0x1c38,0x0e70,0x0e70,0x07e0,0x07e0,0x03c0,0x03c0, 0x03c0,0x03c0,0x07e0,0x07e0,0x0e70,0x0e70,0x1c38,0x1c38,0x381c,0x381c,0x700e,0x700e,0xe007,0xe007,0xc003,0xc003, // u2573 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff80,0xff80, 0xff80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2574 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, 0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2575 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03ff,0x03ff, 0x03ff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2576 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380, 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u2577 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff80,0xff80,0xff80, 0xff80,0xff80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2578 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, 0x07c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2579 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03ff,0x03ff,0x03ff, 0x03ff,0x03ff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07c0,0x07c0, 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, // u257b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03ff,0xffff,0xffff, 0xffff,0x03ff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257c 0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x07c0,0x07c0, 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, // u257d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xff80,0xffff,0xffff, 0xffff,0xff80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u257e 0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0,0x07c0, 0x07c0,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380,0x0380, // u257f 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2580 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff,0xffff, // u2581 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, // u2582 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, // u2583 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, // u2584 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff,0xffff, 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, // u2585 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, // u2586 0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, // u2587 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, // u2588 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, 0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc,0xfffc, // u2589 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, 0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0,0xfff0, // u258a 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, 0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0, // u258b 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u258c 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, 0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00,0xfc00, // u258d 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, // u258e 0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000, 0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000,0xc000, // u258f 0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff, 0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff, // u2590 0xaaaa,0x0000,0xaaaa,0x0000,0xaaaa,0x0000,0xaaaa,0x0000,0xaaaa,0x0000,0xaaaa,0x0000,0xaaaa,0x0000,0xaaaa,0x0000, 0xaaaa,0x0000,0xaaaa,0x0000,0xaaaa,0x0000,0xaaaa,0x0000,0xaaaa,0x0000,0xaaaa,0x0000,0xaaaa,0x0000,0xaaaa,0x0000, // u2591 0xaaaa,0x5555,0xaaaa,0x5555,0xaaaa,0x5555,0xaaaa,0x5555,0xaaaa,0x5555,0xaaaa,0x5555,0xaaaa,0x5555,0xaaaa,0x5555, 0xaaaa,0x5555,0xaaaa,0x5555,0xaaaa,0x5555,0xaaaa,0x5555,0xaaaa,0x5555,0xaaaa,0x5555,0xaaaa,0x5555,0xaaaa,0x5555, // u2592 0xffff,0xaaaa,0xffff,0xaaaa,0xffff,0xaaaa,0xffff,0xaaaa,0xffff,0xaaaa,0xffff,0xaaaa,0xffff,0xaaaa,0xffff,0xaaaa, 0xffff,0xaaaa,0xffff,0xaaaa,0xffff,0xaaaa,0xffff,0xaaaa,0xffff,0xaaaa,0xffff,0xaaaa,0xffff,0xaaaa,0xffff,0xaaaa, // u2593 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u2596 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff, // u2597 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2598 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, // u2599 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, 0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff, // u259a 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u259b 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, 0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff, // u259c 0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u259d 0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff, 0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, // u259e 0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff, 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, // u259f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff8,0x1ff8,0x1ff8,0x1ff8,0x1ff8,0x1ff8, 0x1ff8,0x1ff8,0x1ff8,0x1ff8,0x1ff8,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25a0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x7ffe,0x7ffe,0x7ffe,0x7ffe,0x7ffe,0x7ffe,0x7ffe,0x7ffe,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ac 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x7ffc,0x7ffc,0x7ffc,0x7ffc,0x7ffc,0x7ffc,0x7ffc,0x7ffc, 0x7ffc,0x7ffc,0x7ffc,0x7ffc,0x7ffc,0x7ffc,0x7ffc,0x7ffc,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ae 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x03c0,0x03c0,0x07e0,0x07e0,0x0ff0,0x0ff0, 0x1ff8,0x1ff8,0x3ffc,0x3ffc,0x7ffe,0x7ffe,0xffff,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25b2 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xffc0,0xfff0,0xfffc,0xffff, 0xffff,0xfffc,0xfff0,0xffc0,0xff00,0xfc00,0xf000,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0xf000,0xfc00,0xff00,0xffc0,0xfff0,0xfffc,0xffff, 0xffff,0xfffc,0xfff0,0xffc0,0xff00,0xfc00,0xf000,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ba 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0x7ffe,0x7ffe,0x3ffc,0x3ffc,0x1ff8,0x1ff8, 0x0ff0,0x0ff0,0x07e0,0x07e0,0x03c0,0x03c0,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25bc 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0003,0x000f,0x003f,0x00ff,0x03ff,0x0fff,0x3fff,0xffff, 0xffff,0x3fff,0x0fff,0x03ff,0x00ff,0x003f,0x000f,0x0003,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25c0 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0003,0x000f,0x003f,0x00ff,0x03ff,0x0fff,0x3fff,0xffff, 0xffff,0x3fff,0x0fff,0x03ff,0x00ff,0x003f,0x000f,0x0003,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25c4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x07c0,0x0fe0,0x1ff0,0x3ff8,0x7ffc,0xfffe, 0xfffe,0x7ffc,0x3ff8,0x1ff0,0x0fe0,0x07c0,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25c6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x07c0,0x0ee0,0x1c70,0x3838,0x701c,0xe00e, 0xe00e,0x701c,0x3838,0x1c70,0x0ee0,0x07c0,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25ca 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03c0,0x07e0,0x0e70,0x0c30, 0x0c30,0x0e70,0x07e0,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25cb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03c0,0x07e0,0x0ff0,0x0ff0, 0x0ff0,0x0ff0,0x07e0,0x03c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u25cf 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xfc3f,0xf81f,0xf00f,0xf00f, 0xf00f,0xf00f,0xf81f,0xfc3f,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, // u25d8 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xfc3f,0xf81f,0xf18f,0xf3cf, 0xf3cf,0xf18f,0xf81f,0xfc3f,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff, // u25d9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff8,0x7ffc,0xf01e,0xe00e,0xe00e,0xe00e,0xeeee,0xeeee,0xe00e,0xe00e, 0xe00e,0xe00e,0xefee,0xe7ce,0xe00e,0xe00e,0xe00e,0xf01e,0x7ffc,0x3ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u263a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff8,0x7ffc,0xfffe,0xfffe,0xfffe,0xfffe,0xe38e,0xe38e,0xfffe,0xfffe, 0xfffe,0xfffe,0xe00e,0xf01e,0xf83e,0xfffe,0xfffe,0xfffe,0x7ffc,0x3ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u263b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x0380,0x739c,0x739c,0x3bb8,0x1ff0,0x0fe0,0x7c7c, 0x7c7c,0x0fe0,0x1ff0,0x3bb8,0x739c,0x739c,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u263c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ff0,0x3ff8,0x783c,0x701c,0x701c,0x701c,0x701c,0x701c,0x783c,0x3ff8, 0x1ff0,0x0380,0x0380,0x0380,0x7ffc,0x7ffc,0x0380,0x0380,0x0380,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2640 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03fe,0x03fe,0x001e,0x003e,0x0076,0x00e6,0x01c6,0x0386,0x3fe0,0x7ff0, 0xf078,0xe038,0xe038,0xe038,0xe038,0xe038,0xe038,0xf078,0x7ff0,0x3fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2642 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x0380,0x07c0,0x0fe0,0x1ff0,0x3ff8,0x7ffc,0x7ffc,0xfffe,0xfffe, 0xfffe,0xfffe,0xfffe,0x7bbc,0x3bb8,0x0380,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2660 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07c0,0x0fe0,0x0fe0,0x0fe0,0x0fe0,0x0fe0,0x07c0,0x0380,0x3bb8,0x7ffc, 0xfffe,0xfffe,0xfffe,0xfffe,0x7ffc,0x3bb8,0x0380,0x0380,0x0fe0,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2663 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x783c,0xfc7e,0xfefe,0xfffe,0xfffe,0xfffe,0xfffe,0xfffe, 0x7ffc,0x7ffc,0x3ff8,0x1ff0,0x0fe0,0x07c0,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2665 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0380,0x07c0,0x0fe0,0x1ff0,0x3ff8,0x7ffc,0xfffe, 0xfffe,0x7ffc,0x3ff8,0x1ff0,0x0fe0,0x07c0,0x0380,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2666 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ffc,0x3ffc,0x381c,0x381c,0x381c,0x381c,0x3ffc,0x3ffc,0x3800,0x3800, 0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0x3800,0xf800,0xf000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u266a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffe,0x7ffe,0x700e,0x700e,0x700e,0x700e,0x7ffe,0x7ffe,0x700e,0x700e, 0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x700e,0x703e,0xf03c,0xe000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u266b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0007,0x0007,0x000e,0x000e,0x001c,0x001c,0x0038,0x0038,0xc070,0xc070, 0xe0e0,0xe0e0,0x71c0,0x71c0,0x3b80,0x3b80,0x1f00,0x1f00,0x0e00,0x0e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2713 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x000f,0x000f,0x001e,0x001e,0x003c,0x003c,0x0078,0x0078,0xe0f0,0xe0f0, 0xf1e0,0xf1e0,0x7bc0,0x7bc0,0x3f80,0x3f80,0x1f00,0x1f00,0x0e00,0x0e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2714 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x7070,0x3870,0x1ce0,0x0ee0,0x07c0,0x03c0,0x03c0,0x03e0, 0x0770,0x0738,0x0e1c,0x0e0c,0x1c00,0x1c00,0x3800,0x3800,0x7000,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2717 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x003c,0x003c,0x7878,0x3c78,0x1ef0,0x0ff0,0x07e0,0x03e0,0x03e0,0x03f0, 0x07f8,0x07bc,0x0f1e,0x0f0e,0x1e00,0x1e00,0x3c00,0x3c00,0x7800,0x7800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2718 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00e0,0x00e0,0x01c0,0x01c0,0x0380,0x0380,0x0700,0x0700,0x0e00,0x0e00, 0x0e00,0x0e00,0x0700,0x0700,0x0380,0x0380,0x01c0,0x01c0,0x00e0,0x00e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u27e8 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x0e00,0x0700,0x0700,0x0380,0x0380,0x01c0,0x01c0,0x00e0,0x00e0, 0x00e0,0x00e0,0x01c0,0x01c0,0x0380,0x0380,0x0700,0x0700,0x0e00,0x0e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u27e9 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x071c,0x071c,0x0e38,0x0e38,0x1c70,0x1c70,0x38e0,0x38e0,0x71c0,0x71c0, 0x71c0,0x71c0,0x38e0,0x38e0,0x1c70,0x1c70,0x0e38,0x0e38,0x071c,0x071c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u27ea 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x71c0,0x71c0,0x38e0,0x38e0,0x1c70,0x1c70,0x0e38,0x0e38,0x071c,0x071c, 0x071c,0x071c,0x0e38,0x0e38,0x1c70,0x1c70,0x38e0,0x38e0,0x71c0,0x71c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u27eb 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2800 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2801 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2802 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2803 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2804 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2805 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2806 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2807 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2808 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2809 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280a 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280b 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280c 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280d 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280e 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u280f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2810 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2811 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2812 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2813 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2814 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2815 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2816 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2817 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2818 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2819 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281a 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281b 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281c 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281d 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281e 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u281f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2820 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2821 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2822 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2823 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2824 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2825 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2826 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2827 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2828 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2829 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282a 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282b 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282c 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282d 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282e 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u282f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2830 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2831 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2832 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2833 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2834 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2835 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2836 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2837 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2838 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2839 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283a 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283b 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283c 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283d 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283e 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u283f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2840 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2841 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2842 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2843 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2844 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2845 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2846 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2847 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2848 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2849 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u284a 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u284b 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u284c 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u284d 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u284e 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u284f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2850 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2851 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2852 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2853 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2854 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2855 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2856 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2857 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2858 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2859 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u285a 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u285b 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u285c 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u285d 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u285e 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u285f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2860 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2861 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2862 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2863 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2864 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2865 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2866 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2867 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2868 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2869 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u286a 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u286b 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u286c 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u286d 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u286e 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u286f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2870 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2871 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2872 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2873 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2874 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2875 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2876 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2877 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2878 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u2879 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u287a 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u287b 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u287c 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u287d 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u287e 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, // u287f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u2880 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u2881 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u2882 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u2883 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u2884 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u2885 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u2886 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u2887 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u2888 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u2889 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u288a 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u288b 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u288c 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u288d 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u288e 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u288f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u2890 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u2891 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u2892 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u2893 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u2894 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u2895 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u2896 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u2897 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u2898 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u2899 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u289a 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u289b 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u289c 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u289d 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u289e 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u289f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28a0 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28a1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28a2 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28a4 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28a5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28a6 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28a7 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28a8 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28a9 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28aa 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28ab 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28ac 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28ad 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28ae 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28af 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28b0 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28b1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28b2 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28b4 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28b5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28b6 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28b7 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28b8 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28b9 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28ba 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28bb 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28bc 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28bd 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28be 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, // u28bf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28c0 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28c1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28c2 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28c3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28c4 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28c5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28c6 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28c7 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28c8 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28c9 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28ca 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28cb 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28cc 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28cd 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28ce 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28cf 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28d0 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28d1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28d2 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28d3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28d4 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28d5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28d6 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28d7 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28d8 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28d9 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28da 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28db 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28dc 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28dd 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28de 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28df 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28e0 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28e1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28e2 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28e3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28e4 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28e6 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28e7 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28e8 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28e9 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28ea 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28eb 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28ec 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28ed 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28ee 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28ef 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28f0 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28f1 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28f2 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28f3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28f4 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28f5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28f6 0x0000,0x0000,0x3800,0x3800,0x3800,0x3800,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28f7 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28f8 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28f9 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28fa 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28fb 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28fc 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28fd 0x0000,0x0000,0x0038,0x0038,0x0038,0x0038,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28fe 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, 0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000,0x0000,0x0000,0x3838,0x3838,0x3838,0x3838,0x0000,0x0000, // u28ff 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x701c,0x701c,0x701c,0x701c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u2e2c 0xe000,0xe000,0xe000,0xe0e0,0xe1f0,0xe3f8,0xe7fc,0xeeee,0xe0e0,0xe0e0,0xe0e0,0xe0e0,0xe0e0,0xe0e0,0xe0e0,0xe1c0, 0xc380,0x8700,0x0e00,0x1c00,0x3800,0x7000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000,0xe000, // ue0a0 0x0000,0x0000,0x0000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7fe0,0x7fe0,0x0000,0x0000, 0x070e,0x070e,0x078e,0x07ce,0x07ee,0x077e,0x073e,0x071e,0x070e,0x070e,0x070e,0x0000,0x0000,0x0000,0x0000,0x0000, // ue0a1 0x0000,0x0000,0x0000,0x0000,0x0fe0,0x1ff0,0x3838,0x3838,0x3838,0x3838,0x3838,0x3838,0x3838,0x3838,0x7ffc,0xfffe, 0xfffe,0xfffe,0xfc7e,0xf83e,0xf83e,0xf83e,0xf83e,0xfc7e,0xfffe,0xfffe,0xfffe,0xfffe,0x0000,0x0000,0x0000,0x0000, // ue0a2 0x8000,0xc000,0xe000,0xf000,0xf800,0xfc00,0xfe00,0xff00,0xff80,0xffc0,0xffe0,0xfff0,0xfff8,0xfffc,0xfffe,0xffff, 0xffff,0xfffe,0xfffc,0xfff8,0xfff0,0xffe0,0xffc0,0xff80,0xff00,0xfe00,0xfc00,0xf800,0xf000,0xe000,0xc000,0x8000, // ue0b0 0x8000,0xc000,0xe000,0x7000,0x3800,0x1c00,0x0e00,0x0700,0x0380,0x01c0,0x00e0,0x0070,0x0038,0x001c,0x000e,0x0007, 0x0007,0x000e,0x001c,0x0038,0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800,0x7000,0xe000,0xc000,0x8000, // ue0b1 0x0001,0x0003,0x0007,0x000f,0x001f,0x003f,0x007f,0x00ff,0x01ff,0x03ff,0x07ff,0x0fff,0x1fff,0x3fff,0x7fff,0xffff, 0xffff,0x7fff,0x3fff,0x1fff,0x0fff,0x07ff,0x03ff,0x01ff,0x00ff,0x007f,0x003f,0x001f,0x000f,0x0007,0x0003,0x0001, // ue0b2 0x0001,0x0003,0x0007,0x000e,0x001c,0x0038,0x0070,0x00e0,0x01c0,0x0380,0x0700,0x0e00,0x1c00,0x3800,0x7000,0xe000, 0xe000,0x7000,0x3800,0x1c00,0x0e00,0x0700,0x0380,0x01c0,0x00e0,0x0070,0x0038,0x001c,0x000e,0x0007,0x0003,0x0001, // ue0b3 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00f8,0x00f8,0x0038,0x0038, 0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x0038,0x3838,0x3838,0x3c78,0x1ff0,0x0fe0,0x0000, // uf6be 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7ffc,0x7ffc,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c, 0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x701c,0x7ffc,0x7ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 // ufffd }; // codepoints array constexpr std::array fixedfont_codepoints = { 0x0000,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e, 0x002f,0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e, 0x003f,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e, 0x004f,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e, 0x005f,0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e, 0x006f,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e, 0x00a0,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af, 0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf, 0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf, 0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df, 0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef, 0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff, 0x0100,0x0101,0x0102,0x0103,0x0104,0x0105,0x0106,0x0107,0x0108,0x0109,0x010a,0x010b,0x010c,0x010d,0x010e,0x010f, 0x0110,0x0111,0x0112,0x0113,0x0114,0x0115,0x0116,0x0117,0x0118,0x0119,0x011a,0x011b,0x011c,0x011d,0x011e,0x011f, 0x0120,0x0121,0x0122,0x0123,0x0124,0x0125,0x0126,0x0127,0x0128,0x0129,0x012a,0x012b,0x012c,0x012d,0x012e,0x012f, 0x0130,0x0131,0x0132,0x0133,0x0134,0x0135,0x0136,0x0137,0x0138,0x0139,0x013a,0x013b,0x013c,0x013d,0x013e,0x013f, 0x0140,0x0141,0x0142,0x0143,0x0144,0x0145,0x0146,0x0147,0x0148,0x0149,0x014a,0x014b,0x014c,0x014d,0x014e,0x014f, 0x0150,0x0151,0x0152,0x0153,0x0154,0x0155,0x0156,0x0157,0x0158,0x0159,0x015a,0x015b,0x015c,0x015d,0x015e,0x015f, 0x0160,0x0161,0x0162,0x0163,0x0164,0x0165,0x0166,0x0167,0x0168,0x0169,0x016a,0x016b,0x016c,0x016d,0x016e,0x016f, 0x0170,0x0171,0x0172,0x0173,0x0174,0x0175,0x0176,0x0177,0x0178,0x0179,0x017a,0x017b,0x017c,0x017d,0x017e,0x017f, 0x0186,0x018e,0x018f,0x0190,0x0192,0x019d,0x019e,0x01b5,0x01b6,0x01b7,0x01cd,0x01ce,0x01cf,0x01d0,0x01d1,0x01d2, 0x01d3,0x01d4,0x01e2,0x01e3,0x01e4,0x01e5,0x01e6,0x01e7,0x01e8,0x01e9,0x01ea,0x01eb,0x01ec,0x01ed,0x01ee,0x01ef, 0x01f0,0x01f4,0x01f5,0x01fc,0x01fd,0x01fe,0x01ff,0x0218,0x0219,0x021a,0x021b,0x0232,0x0233,0x0237,0x0254,0x0258, 0x0259,0x025b,0x0272,0x0292,0x02bb,0x02bc,0x02bd,0x02c6,0x02c7,0x02d8,0x02d9,0x02db,0x02dc,0x02dd,0x0300,0x0301, 0x0302,0x0303,0x0304,0x0305,0x0306,0x0307,0x0308,0x030a,0x030b,0x030c,0x0329,0x0384,0x0385,0x0386,0x0387,0x0388, 0x0389,0x038a,0x038c,0x038e,0x038f,0x0390,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039a, 0x039b,0x039c,0x039d,0x039e,0x039f,0x03a0,0x03a1,0x03a3,0x03a4,0x03a5,0x03a6,0x03a7,0x03a8,0x03a9,0x03aa,0x03ab, 0x03ac,0x03ad,0x03ae,0x03af,0x03b0,0x03b1,0x03b2,0x03b3,0x03b4,0x03b5,0x03b6,0x03b7,0x03b8,0x03b9,0x03ba,0x03bb, 0x03bc,0x03bd,0x03be,0x03bf,0x03c0,0x03c1,0x03c2,0x03c3,0x03c4,0x03c5,0x03c6,0x03c7,0x03c8,0x03c9,0x03ca,0x03cb, 0x03cc,0x03cd,0x03ce,0x03d1,0x03d5,0x03f0,0x03f1,0x03f2,0x03f3,0x03f4,0x03f5,0x03f6,0x0400,0x0401,0x0402,0x0403, 0x0404,0x0405,0x0406,0x0407,0x0408,0x0409,0x040a,0x040b,0x040c,0x040d,0x040e,0x040f,0x0410,0x0411,0x0412,0x0413, 0x0414,0x0415,0x0416,0x0417,0x0418,0x0419,0x041a,0x041b,0x041c,0x041d,0x041e,0x041f,0x0420,0x0421,0x0422,0x0423, 0x0424,0x0425,0x0426,0x0427,0x0428,0x0429,0x042a,0x042b,0x042c,0x042d,0x042e,0x042f,0x0430,0x0431,0x0432,0x0433, 0x0434,0x0435,0x0436,0x0437,0x0438,0x0439,0x043a,0x043b,0x043c,0x043d,0x043e,0x043f,0x0440,0x0441,0x0442,0x0443, 0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,0x044a,0x044b,0x044c,0x044d,0x044e,0x044f,0x0450,0x0451,0x0452,0x0453, 0x0454,0x0455,0x0456,0x0457,0x0458,0x0459,0x045a,0x045b,0x045c,0x045d,0x045e,0x045f,0x0462,0x0463,0x046a,0x046b, 0x0490,0x0491,0x0492,0x0493,0x0494,0x0495,0x0496,0x0497,0x0498,0x0499,0x049a,0x049b,0x049c,0x049d,0x04a0,0x04a1, 0x04a2,0x04a3,0x04a4,0x04a5,0x04aa,0x04ab,0x04ae,0x04af,0x04b0,0x04b1,0x04b2,0x04b3,0x04b6,0x04b7,0x04b8,0x04b9, 0x04ba,0x04bb,0x04c0,0x04c1,0x04c2,0x04cf,0x04d0,0x04d1,0x04d2,0x04d3,0x04d4,0x04d5,0x04d6,0x04d7,0x04d8,0x04d9, 0x04da,0x04db,0x04dc,0x04dd,0x04de,0x04df,0x04e2,0x04e3,0x04e4,0x04e5,0x04e6,0x04e7,0x04e8,0x04e9,0x04ea,0x04eb, 0x04ec,0x04ed,0x04ee,0x04ef,0x04f0,0x04f1,0x04f2,0x04f3,0x04f4,0x04f5,0x04f8,0x04f9,0x05d0,0x05d1,0x05d2,0x05d3, 0x05d4,0x05d5,0x05d6,0x05d7,0x05d8,0x05d9,0x05da,0x05db,0x05dc,0x05dd,0x05de,0x05df,0x05e0,0x05e1,0x05e2,0x05e3, 0x05e4,0x05e5,0x05e6,0x05e7,0x05e8,0x05e9,0x05ea,0x1e0c,0x1e0d,0x1e34,0x1e35,0x1e36,0x1e37,0x1e40,0x1e41,0x1e42, 0x1e43,0x1e44,0x1e45,0x1e46,0x1e47,0x1e6c,0x1e6d,0x1eb8,0x1eb9,0x1ebc,0x1ebd,0x1eca,0x1ecb,0x1ecc,0x1ecd,0x1ee4, 0x1ee5,0x1ef8,0x1ef9,0x2000,0x2001,0x2002,0x2003,0x2004,0x2005,0x2006,0x2007,0x2008,0x2009,0x200a,0x200b,0x200c, 0x200d,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x2015,0x2016,0x2017,0x2018,0x2019,0x201a,0x201b,0x201c, 0x201d,0x201e,0x201f,0x2020,0x2021,0x2022,0x2026,0x2030,0x2032,0x2033,0x2039,0x203a,0x203c,0x203e,0x2070,0x2071, 0x2074,0x2075,0x2076,0x2077,0x2078,0x2079,0x207a,0x207b,0x207c,0x207d,0x207e,0x207f,0x2080,0x2081,0x2082,0x2083, 0x2084,0x2085,0x2086,0x2087,0x2088,0x2089,0x208a,0x208b,0x208c,0x208d,0x208e,0x2090,0x2091,0x2092,0x2093,0x2094, 0x2095,0x2096,0x2097,0x2098,0x209a,0x20a7,0x20aa,0x20ac,0x20ae,0x2102,0x210e,0x210f,0x2115,0x2116,0x211a,0x211d, 0x2122,0x2124,0x2126,0x2135,0x2190,0x2191,0x2192,0x2193,0x2194,0x2195,0x21a4,0x21a6,0x21a8,0x21b5,0x21bb,0x21cb, 0x21cc,0x21d0,0x21d1,0x21d2,0x21d3,0x21d4,0x21d5,0x2200,0x2203,0x2204,0x2205,0x2206,0x2207,0x2208,0x2209,0x220a, 0x220b,0x220c,0x220d,0x2212,0x2213,0x2214,0x2215,0x2216,0x2219,0x221a,0x221e,0x221f,0x2225,0x2227,0x2228,0x2229, 0x222a,0x2248,0x2260,0x2261,0x2264,0x2265,0x226a,0x226b,0x2282,0x2283,0x2286,0x2287,0x22a5,0x22c2,0x22c3,0x2300, 0x2302,0x2308,0x2309,0x230a,0x230b,0x2310,0x2319,0x2320,0x2321,0x239b,0x239c,0x239d,0x239e,0x239f,0x23a0,0x23a1, 0x23a2,0x23a3,0x23a4,0x23a5,0x23a6,0x23a7,0x23a8,0x23a9,0x23ab,0x23ac,0x23ad,0x23ae,0x23af,0x23ba,0x23bb,0x23bc, 0x23bd,0x23d0,0x2409,0x240a,0x240b,0x240c,0x240d,0x2424,0x2500,0x2501,0x2502,0x2503,0x2508,0x2509,0x250a,0x250b, 0x250c,0x250d,0x250e,0x250f,0x2510,0x2511,0x2512,0x2513,0x2514,0x2515,0x2516,0x2517,0x2518,0x2519,0x251a,0x251b, 0x251c,0x251d,0x251e,0x251f,0x2520,0x2521,0x2522,0x2523,0x2524,0x2525,0x2526,0x2527,0x2528,0x2529,0x252a,0x252b, 0x252c,0x252d,0x252e,0x252f,0x2530,0x2531,0x2532,0x2533,0x2534,0x2535,0x2536,0x2537,0x2538,0x2539,0x253a,0x253b, 0x253c,0x253d,0x253e,0x253f,0x2540,0x2541,0x2542,0x2543,0x2544,0x2545,0x2546,0x2547,0x2548,0x2549,0x254a,0x254b, 0x2550,0x2551,0x2552,0x2553,0x2554,0x2555,0x2556,0x2557,0x2558,0x2559,0x255a,0x255b,0x255c,0x255d,0x255e,0x255f, 0x2560,0x2561,0x2562,0x2563,0x2564,0x2565,0x2566,0x2567,0x2568,0x2569,0x256a,0x256b,0x256c,0x256d,0x256e,0x256f, 0x2570,0x2571,0x2572,0x2573,0x2574,0x2575,0x2576,0x2577,0x2578,0x2579,0x257a,0x257b,0x257c,0x257d,0x257e,0x257f, 0x2580,0x2581,0x2582,0x2583,0x2584,0x2585,0x2586,0x2587,0x2588,0x2589,0x258a,0x258b,0x258c,0x258d,0x258e,0x258f, 0x2590,0x2591,0x2592,0x2593,0x2596,0x2597,0x2598,0x2599,0x259a,0x259b,0x259c,0x259d,0x259e,0x259f,0x25a0,0x25ac, 0x25ae,0x25b2,0x25b6,0x25ba,0x25bc,0x25c0,0x25c4,0x25c6,0x25ca,0x25cb,0x25cf,0x25d8,0x25d9,0x263a,0x263b,0x263c, 0x2640,0x2642,0x2660,0x2663,0x2665,0x2666,0x266a,0x266b,0x2713,0x2714,0x2717,0x2718,0x27e8,0x27e9,0x27ea,0x27eb, 0x2800,0x2801,0x2802,0x2803,0x2804,0x2805,0x2806,0x2807,0x2808,0x2809,0x280a,0x280b,0x280c,0x280d,0x280e,0x280f, 0x2810,0x2811,0x2812,0x2813,0x2814,0x2815,0x2816,0x2817,0x2818,0x2819,0x281a,0x281b,0x281c,0x281d,0x281e,0x281f, 0x2820,0x2821,0x2822,0x2823,0x2824,0x2825,0x2826,0x2827,0x2828,0x2829,0x282a,0x282b,0x282c,0x282d,0x282e,0x282f, 0x2830,0x2831,0x2832,0x2833,0x2834,0x2835,0x2836,0x2837,0x2838,0x2839,0x283a,0x283b,0x283c,0x283d,0x283e,0x283f, 0x2840,0x2841,0x2842,0x2843,0x2844,0x2845,0x2846,0x2847,0x2848,0x2849,0x284a,0x284b,0x284c,0x284d,0x284e,0x284f, 0x2850,0x2851,0x2852,0x2853,0x2854,0x2855,0x2856,0x2857,0x2858,0x2859,0x285a,0x285b,0x285c,0x285d,0x285e,0x285f, 0x2860,0x2861,0x2862,0x2863,0x2864,0x2865,0x2866,0x2867,0x2868,0x2869,0x286a,0x286b,0x286c,0x286d,0x286e,0x286f, 0x2870,0x2871,0x2872,0x2873,0x2874,0x2875,0x2876,0x2877,0x2878,0x2879,0x287a,0x287b,0x287c,0x287d,0x287e,0x287f, 0x2880,0x2881,0x2882,0x2883,0x2884,0x2885,0x2886,0x2887,0x2888,0x2889,0x288a,0x288b,0x288c,0x288d,0x288e,0x288f, 0x2890,0x2891,0x2892,0x2893,0x2894,0x2895,0x2896,0x2897,0x2898,0x2899,0x289a,0x289b,0x289c,0x289d,0x289e,0x289f, 0x28a0,0x28a1,0x28a2,0x28a3,0x28a4,0x28a5,0x28a6,0x28a7,0x28a8,0x28a9,0x28aa,0x28ab,0x28ac,0x28ad,0x28ae,0x28af, 0x28b0,0x28b1,0x28b2,0x28b3,0x28b4,0x28b5,0x28b6,0x28b7,0x28b8,0x28b9,0x28ba,0x28bb,0x28bc,0x28bd,0x28be,0x28bf, 0x28c0,0x28c1,0x28c2,0x28c3,0x28c4,0x28c5,0x28c6,0x28c7,0x28c8,0x28c9,0x28ca,0x28cb,0x28cc,0x28cd,0x28ce,0x28cf, 0x28d0,0x28d1,0x28d2,0x28d3,0x28d4,0x28d5,0x28d6,0x28d7,0x28d8,0x28d9,0x28da,0x28db,0x28dc,0x28dd,0x28de,0x28df, 0x28e0,0x28e1,0x28e2,0x28e3,0x28e4,0x28e5,0x28e6,0x28e7,0x28e8,0x28e9,0x28ea,0x28eb,0x28ec,0x28ed,0x28ee,0x28ef, 0x28f0,0x28f1,0x28f2,0x28f3,0x28f4,0x28f5,0x28f6,0x28f7,0x28f8,0x28f9,0x28fa,0x28fb,0x28fc,0x28fd,0x28fe,0x28ff, 0x2e2c,0xe0a0,0xe0a1,0xe0a2,0xe0b0,0xe0b1,0xe0b2,0xe0b3,0xf6be,0xfffd }; } // namespace // -- end of autogenerated text --- namespace fixed_font_info_h { // -- start of autogenerated text --- // definition section for font: info_h constexpr int CHARCOUNT = 196; constexpr int WIDTH = 10; constexpr int HEIGHT = 20; constexpr int OFFSET_X = 0; constexpr int OFFSET_Y = 0; constexpr FixedFont_info_t fixedfont_info = { "info_h", // font name "info_h", // font name internal CHARCOUNT, // num of chars WIDTH, HEIGHT, OFFSET_X, OFFSET_Y, false // bold }; // font bitmap definitions constexpr std::array fixedfont_bitmap = { 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0020 0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0c00,0x0c00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0021 0x0000,0x0000,0x3300,0x3300,0x3300,0x1200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0022 0x0000,0x0000,0x0000,0x0d80,0x0d80,0x0d80,0x3fc0,0x1b00,0x1b00,0x1b00,0x7f80,0x3600,0x3600,0x3600,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0023 0x0000,0x0000,0x0c00,0x3f00,0x6d80,0x6c00,0x6c00,0x6c00,0x3f00,0x0d80,0x0d80,0x0d80,0x6d80,0x3f00,0x0c00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0024 0x0000,0x0000,0x0000,0x3980,0x6d80,0x6f00,0x3b00,0x0600,0x0600,0x0c00,0x0c00,0x1b80,0x1ec0,0x36c0,0x3380,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0025 0x0000,0x0000,0x1c00,0x3600,0x3600,0x3600,0x3c00,0x1800,0x3800,0x6c00,0x66c0,0x6380,0x6300,0x7780,0x3cc0,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0026 0x0000,0x0000,0x0f00,0x0e00,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0027 0x0000,0x0000,0x0300,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x1800,0x1800,0x1800,0x0c00,0x0c00,0x0600,0x0300,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0028 0x0000,0x0000,0x3000,0x1800,0x0c00,0x0c00,0x0600,0x0600,0x0600,0x0600,0x0600,0x0c00,0x0c00,0x1800,0x3000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0029 0x0000,0x0000,0x0000,0x0000,0x0000,0x3300,0x3300,0x1e00,0x7f80,0x1e00,0x3300,0x3300,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u002a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x7f80,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u002b 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x0e00,0x1800, 0x0000,0x0000,0x0000,0x0000, // u002c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u002d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x0e00,0x0e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u002e 0x0000,0x0000,0x0000,0x0180,0x0180,0x0300,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x3000,0x3000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u002f 0x0000,0x0000,0x0c00,0x1e00,0x3300,0x3300,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300,0x3300,0x1e00,0x0c00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0030 0x0000,0x0000,0x0c00,0x1c00,0x3c00,0x6c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x7f80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0031 0x0000,0x0000,0x1e00,0x3300,0x6180,0x6180,0x0180,0x0180,0x0300,0x0e00,0x1800,0x3000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0032 0x0000,0x0000,0x1e00,0x3300,0x6180,0x6180,0x0180,0x0300,0x0e00,0x0300,0x0180,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0033 0x0000,0x0000,0x0100,0x0300,0x0700,0x0f00,0x1b00,0x3300,0x6300,0x6300,0x7f80,0x0300,0x0300,0x0300,0x0300,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0034 0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6e00,0x7300,0x0180,0x0180,0x0180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0035 0x0000,0x0000,0x1e00,0x3300,0x6100,0x6000,0x6000,0x6e00,0x7300,0x6180,0x6180,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0036 0x0000,0x0000,0x7f80,0x0180,0x0180,0x0300,0x0300,0x0600,0x0600,0x0c00,0x0c00,0x1800,0x1800,0x3000,0x3000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0037 0x0000,0x0000,0x1e00,0x3300,0x6180,0x6180,0x6180,0x3300,0x1e00,0x3300,0x6180,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0038 0x0000,0x0000,0x1e00,0x3300,0x6180,0x6180,0x6180,0x6180,0x3380,0x1d80,0x0180,0x0180,0x2180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0039 0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x0e00,0x0000,0x0000,0x0000,0x0000,0x0e00,0x0e00,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u003a 0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x0e00,0x0000,0x0000,0x0000,0x0000,0x0e00,0x0e00,0x1c00,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u003b 0x0000,0x0000,0x0100,0x0300,0x0600,0x0c00,0x1800,0x3000,0x6000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0100,0x0000, 0x0000,0x0000,0x0000,0x0000, // u003c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u003d 0x0000,0x0000,0x2000,0x3000,0x1800,0x0c00,0x0600,0x0300,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x2000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u003e 0x0000,0x0000,0x1e00,0x3300,0x6180,0x6180,0x6180,0x0300,0x0600,0x0c00,0x0c00,0x0c00,0x0000,0x0c00,0x0c00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u003f 0x0000,0x0000,0x1e00,0x3300,0x6180,0x6780,0x6f80,0x6d80,0x6d80,0x6d80,0x6f00,0x6600,0x6000,0x3180,0x1f00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0040 0x0000,0x0000,0x0c00,0x1e00,0x3300,0x3300,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0041 0x0000,0x0000,0x7c00,0x6600,0x6300,0x6300,0x6300,0x6600,0x7e00,0x6300,0x6180,0x6180,0x6180,0x6300,0x7e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0042 0x0000,0x0000,0x1e00,0x3300,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0043 0x0000,0x0000,0x7e00,0x6300,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6300,0x7e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0044 0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0045 0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0046 0x0000,0x0000,0x1e00,0x3300,0x6180,0x6000,0x6000,0x6000,0x6780,0x6180,0x6180,0x6180,0x6180,0x3380,0x1e80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0047 0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0048 0x0000,0x0000,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x7f80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0049 0x0000,0x0000,0x0f80,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u004a 0x0000,0x0000,0x6180,0x6180,0x6300,0x6300,0x6600,0x6600,0x7c00,0x6600,0x6600,0x6300,0x6300,0x6180,0x6180,0x0000, 0x0000,0x0000,0x0000,0x0000, // u004b 0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u004c 0x0000,0x0000,0x6180,0x6180,0x7380,0x7380,0x7f80,0x6d80,0x6d80,0x6d80,0x6d80,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000,0x0000,0x0000, // u004d 0x0000,0x0000,0x6180,0x7180,0x7180,0x7980,0x7980,0x6d80,0x6d80,0x6780,0x6780,0x6380,0x6380,0x6180,0x6180,0x0000, 0x0000,0x0000,0x0000,0x0000, // u004e 0x0000,0x0000,0x1e00,0x3300,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u004f 0x0000,0x0000,0x7e00,0x6300,0x6180,0x6180,0x6180,0x6180,0x6300,0x7e00,0x6000,0x6000,0x6000,0x6000,0x6000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0050 0x0000,0x0000,0x1e00,0x3300,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6d80,0x6780,0x3300,0x1f00,0x0180, 0x0000,0x0000,0x0000,0x0000, // u0051 0x0000,0x0000,0x7e00,0x6300,0x6180,0x6180,0x6180,0x6180,0x6300,0x7e00,0x6600,0x6300,0x6300,0x6180,0x6180,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0052 0x0000,0x0000,0x1e00,0x3300,0x6180,0x6000,0x6000,0x3000,0x1e00,0x0300,0x0180,0x0180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0053 0x0000,0x0000,0x7f80,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0054 0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0055 0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x3300,0x3300,0x3300,0x1e00,0x1e00,0x1e00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0056 0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6d80,0x6d80,0x6d80,0x6d80,0x7380,0x7380,0x6180,0x6180,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0057 0x0000,0x0000,0x6180,0x6180,0x3300,0x3300,0x1e00,0x1e00,0x0c00,0x1e00,0x1e00,0x3300,0x3300,0x6180,0x6180,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0058 0x0000,0x0000,0x6180,0x6180,0x3300,0x3300,0x1e00,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0059 0x0000,0x0000,0x7f80,0x0180,0x0180,0x0300,0x0600,0x0600,0x0c00,0x1800,0x1800,0x3000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u005a 0x0000,0x0000,0x3f00,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x3f00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u005b 0x0000,0x0000,0x0000,0x3000,0x3000,0x1800,0x1800,0x0c00,0x0c00,0x0600,0x0600,0x0300,0x0300,0x0180,0x0180,0x0000, 0x0000,0x0000,0x0000,0x0000, // u005c 0x0000,0x0000,0x3f00,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x3f00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u005d 0x0000,0x0000,0x0c00,0x1e00,0x3300,0x6180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u005e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7fc0, 0x0000,0x0000,0x0000,0x0000, // u005f 0x0000,0x0000,0x3c00,0x1c00,0x0600,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0060 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x3e80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0061 0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6e00,0x7300,0x6180,0x6180,0x6180,0x6180,0x7300,0x6e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0062 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x6000,0x6000,0x6000,0x6000,0x3180,0x1f00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0063 0x0000,0x0000,0x0180,0x0180,0x0180,0x0180,0x0180,0x1d80,0x3380,0x6180,0x6180,0x6180,0x6180,0x3380,0x1d80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0064 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x6180,0x7f80,0x6000,0x6000,0x3180,0x1f00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0065 0x0000,0x0000,0x0f00,0x1980,0x1980,0x1800,0x1800,0x1800,0x1800,0x7e00,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0066 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3e80,0x6380,0x6300,0x6300,0x6300,0x3e00,0x6000,0x3f00,0x6180, 0x6180,0x6180,0x3f00,0x0000, // u0067 0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6e00,0x7300,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0068 0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x3c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x7f80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0069 0x0000,0x0000,0x0000,0x0000,0x0180,0x0180,0x0000,0x0780,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x3180, 0x3180,0x3180,0x1f00,0x0000, // u006a 0x0000,0x0000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6300,0x6600,0x6c00,0x7800,0x7c00,0x6600,0x6300,0x6180,0x0000, 0x0000,0x0000,0x0000,0x0000, // u006b 0x0000,0x0000,0x3c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x7f80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u006c 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x5b00,0x7f80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x6d80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u006d 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6e00,0x7300,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000,0x0000,0x0000, // u006e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x6180,0x6180,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u006f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6e00,0x7300,0x6180,0x6180,0x6180,0x6180,0x7300,0x6e00,0x6000, 0x6000,0x6000,0x6000,0x0000, // u0070 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1d80,0x3380,0x6180,0x6180,0x6180,0x6180,0x3380,0x1d80,0x0180, 0x0180,0x0180,0x0180,0x0000, // u0071 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6f00,0x3980,0x3000,0x3000,0x3000,0x3000,0x3000,0x3000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0072 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x6180,0x6000,0x3f00,0x0180,0x0180,0x6180,0x3f00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0073 0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x1800,0x7e00,0x1800,0x1800,0x1800,0x1800,0x1800,0x1980,0x0f00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0074 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3380,0x1d80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0075 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x3300,0x3300,0x1e00,0x1e00,0x0c00,0x0c00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0076 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6d80,0x6d80,0x6d80,0x7f80,0x3300,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0077 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x3300,0x1e00,0x0c00,0x0c00,0x1e00,0x3300,0x6180,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0078 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3380,0x1d80,0x0180, 0x6180,0x3300,0x1e00,0x0000, // u0079 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f80,0x0180,0x0300,0x0600,0x0c00,0x1800,0x3000,0x3f80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u007a 0x0000,0x0000,0x0780,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x7800,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0780,0x0000, 0x0000,0x0000,0x0000,0x0000, // u007b 0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u007c 0x0000,0x0000,0x7800,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0780,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x7800,0x0000, 0x0000,0x0000,0x0000,0x0000, // u007d 0x0000,0x0000,0x3980,0x6d80,0x6700,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u007e 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u007f 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00a0 0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00a1 0x0000,0x0000,0x0000,0x0c00,0x0c00,0x1e00,0x3300,0x6100,0x6000,0x6000,0x6100,0x3300,0x1e00,0x0c00,0x0c00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00a2 0x0000,0x0000,0x0000,0x0f00,0x1980,0x1980,0x1800,0x1800,0x7e00,0x1800,0x1800,0x1800,0x7c00,0x56c0,0x7380,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00a3 0x0000,0x0000,0x0000,0x0000,0x0000,0x4040,0x2e80,0x1f00,0x3180,0x3180,0x3180,0x1f00,0x2e80,0x4040,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00a4 0x0000,0x0000,0x0000,0x0000,0x4080,0x6180,0x3300,0x1e00,0x3f00,0x0c00,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00a5 0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00a6 0x0000,0x0000,0x3e00,0x6300,0x6000,0x7000,0x7800,0x4c00,0x6600,0x3300,0x1900,0x0f00,0x0300,0x6300,0x3e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00a7 0x0000,0x0000,0x3300,0x3300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00a8 0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x6180,0x5e80,0x5280,0x5080,0x5280,0x5e80,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00a9 0x0000,0x0000,0x1f00,0x2180,0x0180,0x3f80,0x6180,0x6180,0x3e80,0x0000,0x7f80,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00aa 0x0000,0x0000,0x0000,0x0000,0x0480,0x0d80,0x1b00,0x3600,0x6c00,0xd800,0x6c00,0x3600,0x1b00,0x0d80,0x0480,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00ab 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7f80,0x7f80,0x0180,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00ac 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,0x3f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00ad 0x0000,0x0000,0x0000,0x0000,0x1e00,0x3300,0x6180,0x5e80,0x5280,0x5e80,0x5480,0x5680,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00ae 0x0000,0x0000,0x0000,0x7f00,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00af 0x0000,0x0000,0x0c00,0x1e00,0x3300,0x3300,0x1e00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00b0 0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x7f80,0x7f80,0x0c00,0x0c00,0x0000,0x7f80,0x7f80,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00b1 0x0000,0x0000,0x1c00,0x3600,0x0600,0x0c00,0x1800,0x3000,0x3e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00b2 0x0000,0x0000,0x1c00,0x3600,0x0200,0x0e00,0x0200,0x3600,0x1c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00b3 0x0000,0x0000,0x0600,0x0c00,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00b4 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6300,0x6300,0x6300,0x6300,0x6300,0x7700,0x7d00,0x6000, 0x6000,0x6000,0x0000,0x0000, // u00b5 0x0000,0x0000,0x1f80,0x3f80,0x7d80,0x7d80,0x7d80,0x3d80,0x1d80,0x0580,0x0580,0x0580,0x0580,0x0580,0x0580,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00b6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e00,0x0e00,0x0e00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00b7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c00, 0x0400,0x1200,0x0c00,0x0000, // u00b8 0x0000,0x0000,0x1800,0x3800,0x1800,0x1800,0x1800,0x3c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00b9 0x0000,0x0000,0x1c00,0x3600,0x6300,0x6300,0x6300,0x3600,0x1c00,0x0000,0x7f00,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00ba 0x0000,0x0000,0x0000,0x0000,0x4800,0x6c00,0x3600,0x1b00,0x0d80,0x06c0,0x0d80,0x1b00,0x3600,0x6c00,0x4800,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00bb 0x0000,0x0000,0x2000,0x6000,0x2080,0x2100,0x7200,0x0400,0x0900,0x1300,0x2500,0x4f00,0x0100,0x0100,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00bc 0x0000,0x0000,0x2000,0x6000,0x2080,0x2100,0x7200,0x0400,0x0b00,0x1480,0x2080,0x4100,0x0200,0x0780,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00bd 0x0000,0x0000,0x7000,0x0800,0x3080,0x0900,0x7200,0x0400,0x0900,0x1300,0x2500,0x4f80,0x0100,0x0100,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00be 0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0c00,0x0c00,0x0c00,0x1800,0x3000,0x6180,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00bf 0x0000,0x0000,0x3000,0x1800,0x0c00,0x0000,0x0c00,0x1e00,0x3300,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00c0 0x0000,0x0000,0x0300,0x0600,0x0c00,0x0000,0x0c00,0x1e00,0x3300,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00c1 0x0000,0x0000,0x0c00,0x1e00,0x3300,0x0000,0x0c00,0x1e00,0x3300,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00c2 0x0000,0x0000,0x1900,0x3f00,0x2600,0x0000,0x0c00,0x1e00,0x3300,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00c3 0x0000,0x0000,0x3300,0x3300,0x0000,0x0000,0x0c00,0x1e00,0x3300,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00c4 0x0000,0x0000,0x0c00,0x1200,0x1200,0x0c00,0x0c00,0x1e00,0x3300,0x6180,0x6180,0x7f80,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00c5 0x0000,0x0000,0x0f80,0x1e00,0x3600,0x3600,0x6600,0x6600,0x7f80,0x6600,0x6600,0x6600,0x6600,0x6600,0x6780,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00c6 0x0000,0x0000,0x1e00,0x3300,0x6180,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6000,0x6180,0x3300,0x1e00,0x0c00, 0x0400,0x1200,0x0c00,0x0000, // u00c7 0x0000,0x0000,0x3000,0x1800,0x0c00,0x0000,0x7f80,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00c8 0x0000,0x0000,0x0600,0x0c00,0x1800,0x0000,0x7f80,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00c9 0x0000,0x0000,0x0c00,0x1e00,0x3300,0x0000,0x7f80,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00ca 0x0000,0x0000,0x3300,0x3300,0x0000,0x0000,0x7f80,0x6000,0x6000,0x6000,0x7e00,0x6000,0x6000,0x6000,0x7f80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00cb 0x0000,0x0000,0x3000,0x1800,0x0c00,0x0000,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x3f00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00cc 0x0000,0x0000,0x0600,0x0c00,0x1800,0x0000,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x3f00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00cd 0x0000,0x0000,0x0c00,0x1e00,0x3300,0x0000,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x3f00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00ce 0x0000,0x0000,0x3300,0x3300,0x0000,0x0000,0x3f00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x3f00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00cf 0x0000,0x0000,0x7e00,0x6300,0x6180,0x6180,0x6180,0x6180,0xf980,0x6180,0x6180,0x6180,0x6180,0x6300,0x7e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00d0 0x0000,0x0000,0x1900,0x3f00,0x2600,0x0000,0x4180,0x6180,0x7180,0x7980,0x7d80,0x6f80,0x6780,0x6380,0x6180,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00d1 0x0000,0x0000,0x3000,0x1800,0x0c00,0x0000,0x1e00,0x3300,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00d2 0x0000,0x0000,0x0300,0x0600,0x0c00,0x0000,0x1e00,0x3300,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00d3 0x0000,0x0000,0x0c00,0x1e00,0x3300,0x0000,0x1e00,0x3300,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00d4 0x0000,0x0000,0x1900,0x3f00,0x2600,0x0000,0x1e00,0x3300,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00d5 0x0000,0x0000,0x3300,0x3300,0x0000,0x0000,0x1e00,0x3300,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00d6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2080,0x3180,0x1b00,0x0e00,0x0e00,0x1b00,0x3180,0x2080,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00d7 0x0000,0x0080,0x1f00,0x3300,0x6380,0x6380,0x6580,0x6580,0x6580,0x6980,0x6980,0x6980,0x7180,0x3300,0x3e00,0x4000, 0x0000,0x0000,0x0000,0x0000, // u00d8 0x0000,0x0000,0x3000,0x1800,0x0c00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00d9 0x0000,0x0000,0x0300,0x0600,0x0c00,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00da 0x0000,0x0000,0x0c00,0x1e00,0x3300,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3380,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00db 0x0000,0x0000,0x3300,0x3300,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00dc 0x0000,0x0000,0x0300,0x0600,0x0c00,0x0000,0x4080,0x6180,0x3300,0x1e00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00dd 0x0000,0x0000,0x0000,0x0000,0x3c00,0x1800,0x1f00,0x1980,0x1980,0x1980,0x1f00,0x1800,0x1800,0x1800,0x3c00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00de 0x0000,0x0000,0x0000,0x1c00,0x3e00,0x7300,0x6300,0x6300,0x6600,0x6c00,0x6600,0x6300,0x6100,0x6300,0x6e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00df 0x0000,0x0000,0x3000,0x1800,0x0c00,0x0000,0x0000,0x3f00,0x6180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x3e80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00e0 0x0000,0x0000,0x0600,0x0c00,0x1800,0x0000,0x0000,0x3f00,0x6180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x3e80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00e1 0x0000,0x0000,0x0c00,0x1e00,0x3300,0x0000,0x0000,0x3f00,0x6180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x3e80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00e2 0x0000,0x0000,0x1900,0x3f00,0x2600,0x0000,0x0000,0x3f00,0x6180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x3e80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00e3 0x0000,0x0000,0x3300,0x3300,0x0000,0x0000,0x0000,0x3f00,0x6180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x3e80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00e4 0x0000,0x0000,0x0000,0x0c00,0x1200,0x1200,0x0c00,0x3f00,0x6180,0x0180,0x3f80,0x6180,0x6180,0x6180,0x3e80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00e5 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3b00,0x4d80,0x0d80,0x0f00,0x3c00,0x6c00,0x6c80,0x3700,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00e6 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f00,0x3180,0x6000,0x6000,0x6000,0x6000,0x3180,0x1f00,0x0c00, 0x0400,0x1200,0x0c00,0x0000, // u00e7 0x0000,0x0000,0x3000,0x1800,0x0c00,0x0000,0x0000,0x1e00,0x3300,0x6180,0x7f80,0x6000,0x6000,0x3180,0x1f00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00e8 0x0000,0x0000,0x0600,0x0c00,0x1800,0x0000,0x0000,0x1e00,0x3300,0x6180,0x7f80,0x6000,0x6000,0x3180,0x1f00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00e9 0x0000,0x0000,0x0c00,0x1e00,0x3300,0x0000,0x0000,0x1e00,0x3300,0x6180,0x7f80,0x6000,0x6000,0x3180,0x1f00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00ea 0x0000,0x0000,0x3300,0x3300,0x0000,0x0000,0x0000,0x1e00,0x3300,0x6180,0x7f80,0x6000,0x6000,0x3180,0x1f00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00eb 0x0000,0x0000,0x3000,0x1800,0x0c00,0x0000,0x0000,0x3c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x7f80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00ec 0x0000,0x0000,0x0600,0x0c00,0x1800,0x0000,0x0000,0x3c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x7f80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00ed 0x0000,0x0000,0x0c00,0x1e00,0x3300,0x0000,0x0000,0x3c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x7f80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00ee 0x0000,0x0000,0x3300,0x3300,0x0000,0x0000,0x0000,0x3c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0x7f80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00ef 0x0000,0x0000,0x4400,0x6c00,0x3800,0x3800,0x6c00,0x4600,0x1f00,0x3380,0x6180,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00f0 0x0000,0x0000,0x1900,0x3f00,0x2600,0x0000,0x0000,0x6e00,0x7300,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00f1 0x0000,0x0000,0x3000,0x1800,0x0c00,0x0000,0x0000,0x1e00,0x3300,0x6180,0x6180,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00f2 0x0000,0x0000,0x0600,0x0c00,0x1800,0x0000,0x0000,0x1e00,0x3300,0x6180,0x6180,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00f3 0x0000,0x0000,0x0c00,0x1e00,0x3300,0x0000,0x0000,0x1e00,0x3300,0x6180,0x6180,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00f4 0x0000,0x0000,0x1900,0x3f00,0x2600,0x0000,0x0000,0x1e00,0x3300,0x6180,0x6180,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00f5 0x0000,0x0000,0x3300,0x3300,0x0000,0x0000,0x0000,0x1e00,0x3300,0x6180,0x6180,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00f6 0x0000,0x0000,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0000,0x7f80,0x7f80,0x0000,0x0000,0x0c00,0x0c00,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00f7 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x1f00,0x3300,0x6580,0x6580,0x6980,0x6980,0x3300,0x3e00,0x4000, 0x0000,0x0000,0x0000,0x0000, // u00f8 0x0000,0x0000,0x3000,0x1800,0x0c00,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3380,0x1d80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00f9 0x0000,0x0000,0x0600,0x0c00,0x1800,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3380,0x1d80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00fa 0x0000,0x0000,0x0c00,0x1e00,0x3300,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3380,0x1d80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00fb 0x0000,0x0000,0x3300,0x3300,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3380,0x1d80,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00fc 0x0000,0x0000,0x0600,0x0c00,0x1800,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x3380,0x1d80,0x0180, 0x6180,0x3300,0x1e00,0x0000, // u00fd 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3800,0x1e00,0x1b00,0x1b00,0x1e00,0x1800,0x1800,0x3800,0x0000, 0x0000,0x0000,0x0000,0x0000, // u00fe 0x0000,0x0000,0x3300,0x3300,0x0000,0x0000,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x3380,0x1d80,0x0180, 0x6180,0x3300,0x1e00,0x0000, // u00ff 0x0000,0x0000,0x1980,0x3300,0x6600,0x0000,0x1e00,0x3300,0x6180,0x6180,0x6180,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0150 0x0000,0x0000,0x1980,0x3300,0x6600,0x0000,0x0000,0x1e00,0x3300,0x6180,0x6180,0x6180,0x6180,0x3300,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0151 0x0000,0x0000,0x1980,0x3300,0x6600,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3380,0x1e00,0x0000, 0x0000,0x0000,0x0000,0x0000, // u0170 0x0000,0x0000,0x1980,0x3300,0x6600,0x0000,0x0000,0x6180,0x6180,0x6180,0x6180,0x6180,0x6180,0x3380,0x1d80,0x0000, 0x0000,0x0000,0x0000,0x0000 // u0171 }; // codepoints array constexpr std::array fixedfont_codepoints = { 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e,0x002f, 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e,0x003f, 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e,0x004f, 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e,0x005f, 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e,0x006f, 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e,0x007f, 0x00a0,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af, 0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf, 0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf, 0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df, 0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef, 0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff, 0x0150,0x0151,0x0170,0x0171 }; } // namespace // -- end of autogenerated text --- // this font has no bold version, still make it available for bold=true namespace fixed_font_info_h_bold { // -- start of autogenerated text --- // definition section for font: info_h constexpr int CHARCOUNT = 196; constexpr int WIDTH = 10; constexpr int HEIGHT = 20; constexpr int OFFSET_X = 0; constexpr int OFFSET_Y = 0; constexpr FixedFont_info_t fixedfont_info = { "info_h", // font name "info_h", // font name internal CHARCOUNT, // num of chars WIDTH, HEIGHT, OFFSET_X, OFFSET_Y, true // bold }; // font bitmap definitions // same as non-bold // codepoints array // same as non-bold } // namespace // -- end of autogenerated text --- // Predefined fonts main table const uint16_t* font_bitmaps[PREDEFINED_FONT_COUNT] = { &fixed_font_12n::fixedfont_bitmap[0], &fixed_font_12n::fixedfont_bitmap[0], // 12b: same as non-bold &fixed_font_14n::fixedfont_bitmap[0], &fixed_font_14b::fixedfont_bitmap[0], &fixed_font_16n::fixedfont_bitmap[0], &fixed_font_16b::fixedfont_bitmap[0], &fixed_font_18n::fixedfont_bitmap[0], &fixed_font_18b::fixedfont_bitmap[0], &fixed_font_20n::fixedfont_bitmap[0], &fixed_font_20b::fixedfont_bitmap[0], &fixed_font_22n::fixedfont_bitmap[0], &fixed_font_22b::fixedfont_bitmap[0], &fixed_font_24n::fixedfont_bitmap[0], &fixed_font_24b::fixedfont_bitmap[0], &fixed_font_28n::fixedfont_bitmap[0], &fixed_font_28b::fixedfont_bitmap[0], &fixed_font_32n::fixedfont_bitmap[0], &fixed_font_32b::fixedfont_bitmap[0], &fixed_font_info_h::fixedfont_bitmap[0], &fixed_font_info_h::fixedfont_bitmap[0], // same as non-bold }; const uint16_t* font_codepoints[PREDEFINED_FONT_COUNT] = { &fixed_font_12n::fixedfont_codepoints[0], &fixed_font_12n::fixedfont_codepoints[0], // same as non-bold &fixed_font_14n::fixedfont_codepoints[0], &fixed_font_14b::fixedfont_codepoints[0], &fixed_font_16n::fixedfont_codepoints[0], &fixed_font_16b::fixedfont_codepoints[0], &fixed_font_18n::fixedfont_codepoints[0], &fixed_font_18b::fixedfont_codepoints[0], &fixed_font_20n::fixedfont_codepoints[0], &fixed_font_20b::fixedfont_codepoints[0], &fixed_font_22n::fixedfont_codepoints[0], &fixed_font_22b::fixedfont_codepoints[0], &fixed_font_24n::fixedfont_codepoints[0], &fixed_font_24b::fixedfont_codepoints[0], &fixed_font_28n::fixedfont_codepoints[0], &fixed_font_28b::fixedfont_codepoints[0], &fixed_font_32n::fixedfont_codepoints[0], &fixed_font_32b::fixedfont_codepoints[0], &fixed_font_info_h::fixedfont_codepoints[0], &fixed_font_info_h::fixedfont_codepoints[0], // same as non-bold }; const FixedFont_info_t* font_infos[PREDEFINED_FONT_COUNT] = { &fixed_font_12n::fixedfont_info, &fixed_font_12b::fixedfont_info, // report as bold &fixed_font_14n::fixedfont_info, &fixed_font_14b::fixedfont_info, &fixed_font_16n::fixedfont_info, &fixed_font_16b::fixedfont_info, &fixed_font_18n::fixedfont_info, &fixed_font_18b::fixedfont_info, &fixed_font_20n::fixedfont_info, &fixed_font_20b::fixedfont_info, &fixed_font_22n::fixedfont_info, &fixed_font_22b::fixedfont_info, &fixed_font_24n::fixedfont_info, &fixed_font_24b::fixedfont_info, &fixed_font_28n::fixedfont_info, &fixed_font_28b::fixedfont_info, &fixed_font_32n::fixedfont_info, &fixed_font_32b::fixedfont_info, &fixed_font_info_h::fixedfont_info, &fixed_font_info_h_bold::fixedfont_info, // report as bold }; ================================================ FILE: avs_core/core/fonts/fixedfonts.h ================================================ #ifndef __FIXEDFONTS_H__ #define __FIXEDFONTS_H__ #include typedef struct { const char* const fontname; const char* const fontname_internal; int charcount; uint8_t width; // like in global FONTBOUNDINGBOX uint8_t height; int8_t offset_x; int8_t offset_y; bool bold; } FixedFont_info_t; constexpr int PREDEFINED_FONT_COUNT = 18 + 2; // 2x9 Terminus + info_h #endif // __FIXEDFONTS_H__ ================================================ FILE: avs_core/core/function.h ================================================ #pragma once #include struct Function { typedef AVSValue(__cdecl *apply_func_t)(AVSValue args, void* user_data, IScriptEnvironment* env); apply_func_t apply; const char* name; const char* canon_name; const char* param_types; void* user_data; const char* dll_path; // can be filled during plugin load: bool isPluginAvs25; bool isPluginPreV11C; }; struct CaptureVars { int count; const char** var_names; const AVSValue* var_data; }; class IFunction { public: IFunction() : refcnt(0) {} virtual ~IFunction() { } virtual const char* ToString(IScriptEnvironment* env) = 0; virtual const char* GetLegacyName() = 0; virtual const Function* GetDefinition() = 0; virtual CaptureVars GetCaptures() = 0; private: friend class PFunction; friend class AVSValue; unsigned long refcnt; void AddRef(); void Release(); }; class AVSFunction : public Function { public: typedef Function::apply_func_t apply_func_t; AVSFunction(void*); AVSFunction(const char* _name, const char* _plugin_basename, const char* _param_types, apply_func_t _apply); AVSFunction(const char* _name, const char* _plugin_basename, const char* _param_types, apply_func_t _apply, void *_user_data); AVSFunction(const char* _name, const char* _plugin_basename, const char* _param_types, apply_func_t _apply, void *_user_data, const char* _dll_path, bool _isPluginAvs25, bool _isPluginPreV11C); ~AVSFunction(); AVSFunction() = delete; AVSFunction(const AVSFunction&) = delete; AVSFunction& operator=(const AVSFunction&) = delete; AVSFunction(AVSFunction&&) = delete; AVSFunction& operator=(AVSFunction&&) = delete; bool empty() const; static bool IsScriptFunction(const Function* func); static bool ArgNameMatch(const char* param_types, size_t args_names_count, const char* const* arg_names); static bool TypeMatch(const char* param_types, const AVSValue* args, size_t num_args, bool strict, IScriptEnvironment* env); static bool SingleTypeMatch(char type, const AVSValue& arg, bool strict); static bool SingleTypeMatchArray(char type, const AVSValue& arg, bool strict); }; ================================================ FILE: avs_core/core/info.cpp ================================================ // Avisynth+ // https://avs-plus.net // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. // pinterf: // high bit depth, planar RGB // utf8 option, internally unicode // info_h font definition reorganized, Latin-1 Supplement 00A0-00FF // Configurable color // Configurable halocolor (text outline) // Configurable background fading // Alignment // multiline // multiple size, multiple fonts, "Terminus", "info_h" // chroma location, overlay-like weighted chroma handling #include "info.h" #include #include #include #include #include #include #include #include #include #include #include "fonts/fixedfonts.h" #include "strings.h" #include "../convert/convert_helper.h" // helper function for remapping an utf8 string to font index entry list std::vector BitmapFont::remap(const std::string& s_utf8) { // new vector with characters remapped to font table indexes std::vector s_remapped; const size_t real_len = str_utf8_size(s_utf8); s_remapped.resize(real_len); size_t index = 0; const char* p = s_utf8.data(); const char* end = p + s_utf8.size(); while (p < end) { // Get the lead byte of the current UTF-8 character unsigned char lb = static_cast(*p); // Determine the number of bytes in the current UTF-8 character int n = 0; if ((lb & 0x80) == 0) n = 1; // 0xxxxxxx else if ((lb & 0xE0) == 0xC0) n = 2; // 110xxxxx else if ((lb & 0xF0) == 0xE0) n = 3; // 1110xxxx else if ((lb & 0xF8) == 0xF0) n = 4; // 11110xxx else { // Invalid lead byte, skip ++p; continue; } // Create a buffer to store the UTF-8 character code char utf8_char_buf[5] = { 0 }; // Copy the bytes from the string to the buffer std::memcpy(utf8_char_buf, p, n); // finds by utf8 character sequence in font index table auto it = charReMapUtf8.find(utf8_char_buf); if (it != charReMapUtf8.end()) s_remapped[index] = it->second; else s_remapped[index] = 0; // empty neutral character (space) index++; // Advance the pointer by the number of bytes p += n; } return s_remapped; } // Internal function! For creating source code from a previously LoadBDF'd font file // see fixedfonts.cpp void BitmapFont::SaveAsC(const uint16_t* _codepoints) { if (font_filename == "") return; // no GUS no sound :) std::string fontname; if (font_filename.substr(0, 4) == "ter-") font_name = "Terminus"; else font_name = font_filename; std::ostringstream ss; ss << "namespace fixed_font_# {" << std::endl; ss << "// -- start of autogenerated text ---" << std::endl; ss << "// definition section for font: " << font_filename << std::endl; ss << "constexpr int CHARCOUNT = " << std::to_string(number_of_chars) << ";" << std::endl; ss << "constexpr int WIDTH = " << std::to_string(global_bbx.width) << ";" << std::endl; ss << "constexpr int HEIGHT = " << std::to_string(global_bbx.height) << ";" << std::endl; ss << "constexpr int OFFSET_X = " << std::to_string(global_bbx.offset_x) << ";" << std::endl; ss << "constexpr int OFFSET_Y = " << std::to_string(global_bbx.offset_y) << ";" << std::endl; ss << "constexpr FixedFont_info_t fixedfont_info = {" << std::endl; ss << " \"" << font_filename << "\", // font name" << std::endl; ss << " \"" << font_filename << "\", // font name internal" << std::endl; ss << " CHARCOUNT, // num of chars" << std::endl; ss << " WIDTH, HEIGHT, OFFSET_X, OFFSET_Y," << std::endl; ss << " " << (bold ? "true" : "false") << " // bold" << std::endl; ss << "};" << std::endl; ss << "// font bitmap definitions" << std::endl; ss << "constexpr std::array fixedfont_bitmap = {" << std::endl; for (int charcount = 0; charcount < number_of_chars; charcount++) { constexpr int LINES_BY_N = 16; // maximum number of constants per line for (int y = 0; y < global_bbx.height; y++) { ss << "0x"; for (int x = 0; x < fontline_bytes; x++) { uint8_t charline = font_bitmaps[(charcount * global_bbx.height + y) * fontline_bytes + x]; ss << std::setfill('0') << std::setw(2) << std::hex << charline; } const bool last = charcount == number_of_chars - 1 && y == global_bbx.height - 1; if (!last) ss << ","; if (y == global_bbx.height - 1) ss << " // u" << std::setw(4) << std::hex << _codepoints[charcount]; if (y % LINES_BY_N == LINES_BY_N - 1) ss << std::endl; // last line of character- forced new line } if (global_bbx.height % LINES_BY_N != 0) ss << std::endl; }; // example output: // 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0020 // 0x0000,0x0000,0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300,0x0300, // 0x0000,0x0000,0x0300,0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // u0021 ss << "};" << std::endl; ss << "// codepoints array" << std::endl; ss << "constexpr std::array fixedfont_codepoints = {" << std::endl; for (int charcount = 0; charcount < number_of_chars; charcount++) { constexpr int LINES_BY_N = 16; int val = _codepoints[charcount]; ss << "0x" << std::setfill('0') << std::setw(4) << std::hex << val; const bool last = charcount == number_of_chars - 1; if (!last) ss << ","; if (charcount % LINES_BY_N == LINES_BY_N - 1) ss << std::endl; } ss << "};" << std::endl; ss << "} // namespace" << std::endl; ss << "// -- end of autogenerated text ---" << std::endl; // std::ofstream outFile(font_filename + ".cpp_sample"); outFile << ss.str(); outFile.close(); /* usage: // Predefined fonts main table constexpr int PREDEFINED_FONT_COUNT = 2; static const uint16_t* font_bitmaps[PREDEFINED_FONT_COUNT] = { &fixed_font_1::fixedfont_bitmap[0], &fixed_font_2::fixedfont_bitmap[0] // ... }; static const uint16_t* font_codepoints[PREDEFINED_FONT_COUNT] = { &fixed_font_1::fixedfont_codepoints[0], &fixed_font_2::fixedfont_codepoints[0] // ... }; static const FixedFont_info_t* font_infos[PREDEFINED_FONT_COUNT] = { &fixed_font_1::fixedfont_info, &fixed_font_2::fixedfont_info // ... }; */ } typedef struct CharInfo { // STARTCHAR charname std::string friendly_name; uint16_t encoding; int dwidth_x, dwidth_y; // DWIDTH not supported, same as main PIXELSIZE // font properties can be overridden. BBX bbx; int empty_lines_bottom; int empty_lines_top; int bits_to_shift; } CharDef; typedef struct FontProperties { std::string Copyright; std::string Notice; std::string Family_name; std::string Weight_name; int pixel_size; int font_ascent; // 12 int font_descent; // 4 uint16_t default_char; // 65533 } FontProperties; typedef struct FontInfo { std::string font; // n/a int size_points, size_dpi_x, size_dpi_y; // n/a // these may be overridden by individual characters. BBX bbx; // FONTBOUNDINGBOX e.g. 8 16 0 -4 int chars; // number of characters int fontline_bytes; // length of a single font line in the byte array } FontInfo; class BdfFont { public: std::string font_filename; FontInfo font_info; FontProperties font_properties; std::vector codepoints_array; std::vector charnames_array; // each character can have different bounding box dimensions from global one std::vector bbx_array; // one character line is not limited to 16/32 pixels anymore: std::vector font_bitmaps; }; std::string UnQuote(std::string s) { if (s.size() >= 2 && s.substr(0, 1) == "\"" && (s.substr(s.size() - 1, 1) == "\"")) return s.substr(1,s.size()-2); // zero based return s; } static void vector_shl(uint8_t* buf, const size_t size, const size_t bits) { const size_t whole_chunks = bits / 8; // more bits that size if (whole_chunks >= size) { memset(buf, 0, size); return; } if (whole_chunks) { memmove(buf, buf + whole_chunks, size - whole_chunks); memset(buf + size - whole_chunks, 0, whole_chunks); } const uint8_t final_shift = bits % 8; if (final_shift) { const auto right = 8 - final_shift; const size_t len = size - whole_chunks - 1; for (size_t i = 0; i < len; i++) { buf[i] = (buf[i] << final_shift) | (buf[i + 1] >> right); } buf[len] = buf[len] << final_shift; } } static void vector_shr(uint8_t* buf, const size_t size, const size_t bits) { const size_t whole_chunks = bits / 8; // more bits that size if (whole_chunks >= size) { memset(buf, 0, size); return; } if (whole_chunks) { memmove(buf + whole_chunks, buf, size - whole_chunks); memset(buf, 0, whole_chunks); } const uint8_t final_shift = bits % 8; if (final_shift) { const auto left = 8 - final_shift; const size_t len = size - whole_chunks - 1; auto index = size - 1; for (size_t i = 0; i < len; i++) { buf[index] = (buf[index] >> final_shift) | (buf[index - 1] << left); index--; } buf[index] = buf[index] >> final_shift; } } static BdfFont LoadBMF(std::string name, bool bold) { // https://en.wikipedia.org/wiki/Glyph_Bitmap_Distribution_Format // also for make cpp source code, see BdfFont methods enum loadstate { ls_Init, ls_StartFont, ls_StartProperties, ls_Char }; BdfFont fnt; CharInfo current_char; std::string temp; //std::ifstream ss("c:\\Download\\terminus-font-4.48\\terminus-font-4.48\\ter-u16n.bdf"); std::ifstream ss; // explicite font file name auto fname = fs::path(name); if (!fs::exists(name)) return fnt; fnt.font_filename = fname.filename().generic_string(); ss.open(name); loadstate state = ls_Init; size_t line_counter = 0; int char_counter = 0; // make list governed by LF separator while (std::getline(ss, temp, '\n')) { std::string token; std::istringstream ssline(temp); std::getline(ssline, token, ' '); if (token.size() == 0) continue; switch (state) { case ls_Init: if (token == "STARTFONT") state = ls_StartFont; else { // unexpected token } break; case ls_StartFont: if (token == "ENDFONT") { state = ls_Init; } else if (token == "FONT") { // FONT-xos4-Terminus-Bold-R-Normal--16-160-72-72-C-80-ISO10646-1 std::getline(ssline, token, ' '); fnt.font_info.font = UnQuote(token); } else if (token == "SIZE") { // SIZE 16 72 72 // size in points, X and Y-axis resolution std::getline(ssline, token, ' '); fnt.font_info.size_points = std::stoi(token); std::getline(ssline, token, ' '); fnt.font_info.size_dpi_x = std::stoi(token); std::getline(ssline, token, ' '); fnt.font_info.size_dpi_y = std::stoi(token); } else if (token == "FONTBOUNDINGBOX") { // FONTBOUNDINGBOX 8 16 0 -4 // bounding box of 8 pixels wide and 16 pixels high // lower left hand corner starting at x=0, y=-4. Note that although the bounding box is defined to be a 8x16 cell, // this can be overridden for individual glyphs. // e.g: Terminus: FONTBOUNDINGBOX 8 16 0 -4   Terminus // later for "A": BBX 8 16 0 -4 // Unifont: FONTBOUNDINGBOX 16 16 0 -2  Unifont // later for "A": BBX 8 16 0 -2 should override the global bounding box std::getline(ssline, token, ' '); fnt.font_info.bbx.width = std::stoi(token); std::getline(ssline, token, ' '); fnt.font_info.bbx.height = std::stoi(token); std::getline(ssline, token, ' '); fnt.font_info.bbx.offset_x = std::stoi(token); std::getline(ssline, token, ' '); fnt.font_info.bbx.offset_y = std::stoi(token); // a single font line can occupy variable amount of bytes depending on font width // Note: in this implementation these global font dimensions are _the_ // dimensions of the fixed size font // Note, that this is the maximum theoretical width; some BDF fonts (unifont) contain variable width characters // contrary to that it contains monospaced "C" type characters. In this case latin characters are 8 pixels wide, // and use DWIDTH and BBOX as 8, less than FONTBOUNDINGBOX value of 16. // but CJK characters are 16 pixels wide. fnt.font_info.fontline_bytes = (fnt.font_info.bbx.width + 7) / 8; } else if (token == "STARTPROPERTIES") { // STARTPROPERTIES 20 // do not check line count now state = ls_StartProperties; } else if (token == "CHARS") { std::getline(ssline, token); fnt.font_info.chars = std::stoi(token); // allocate area for "character_count" * "height" fnt.font_bitmaps.resize(fnt.font_info.chars * fnt.font_info.bbx.height * fnt.font_info.fontline_bytes); fnt.charnames_array.resize(fnt.font_info.chars); fnt.codepoints_array.resize(fnt.font_info.chars); fnt.bbx_array.resize(fnt.font_info.chars); } else if (token == "STARTCHAR") { std::getline(ssline, token); current_char.friendly_name = token; current_char.encoding = 0; current_char.dwidth_x = 0; current_char.dwidth_y = 0; current_char.bbx = fnt.font_info.bbx; // inherited from FONTBOUNDINGBOX current_char.bits_to_shift = 0; current_char.empty_lines_bottom = 0; current_char.empty_lines_top = 0; state = ls_Char; } else { // unexpected token } break; case ls_StartProperties: if (token == "ENDPROPERTIES") { state = ls_StartFont; } /* FAMILY_NAME "Terminus" FOUNDRY "xos4" SETWIDTH_NAME "Normal" ADD_STYLE_NAME "" COPYRIGHT "Copyright (C) 2019 Dimitar Toshkov Zhekov" NOTICE "Licensed under the SIL Open Font License, Version 1.1" WEIGHT_NAME "Bold" SLANT "R" PIXEL_SIZE 16 POINT_SIZE 160 RESOLUTION_X 72 RESOLUTION_Y 72 SPACING "C" AVERAGE_WIDTH 80 CHARSET_REGISTRY "ISO10646" CHARSET_ENCODING "1" MIN_SPACE 8 */ else if (token == "FAMILY_NAME") { //FAMILY_NAME "Terminus" std::getline(ssline, token, ' '); fnt.font_properties.Family_name = UnQuote(token); } else if (token == "COPYRIGHT") { std::getline(ssline, token, ' '); fnt.font_properties.Copyright = UnQuote(token); } else if (token == "NOTICE") { std::getline(ssline, token, ' '); fnt.font_properties.Notice = UnQuote(token); } else if (token == "WEIGHT_NAME") { // "Medium", "Bold" std::getline(ssline, token, ' '); fnt.font_properties.Weight_name = UnQuote(token); } else if (token == "PIXEL_SIZE") { std::getline(ssline, token, ' '); fnt.font_properties.pixel_size = std::stoi(token); } else if (token == "FONT_ASCENT") { // FONT_ASCENT 12 // 12 of the 16 pixels in height are above the baseline. std::getline(ssline, token, ' '); fnt.font_properties.font_ascent = std::stoi(token); } else if (token == "FONT_DESCENT") { // FONT_DESCENT 4 // 4 of the 16 pixels in height are below the baseline std::getline(ssline, token, ' '); fnt.font_properties.font_descent = std::stoi(token); } else if (token == "DEFAULT_CHAR") { // DEFAULT_CHAR 65533 std::getline(ssline, token, ' '); fnt.font_properties.default_char = std::stoi(token); } break; case ls_Char: if (token == "ENDCHAR") { // add to vector state = ls_StartFont; } else if (token == "DWIDTH") { // DWIDTH 9 0 // declares the Device Width of a glyph. After the glyph is rendered, the start of the next glyph is // offset 9 pixels on the X-axis and // offset 0 pixels on the Y-axis from the current glyph origin. // They are not necessarily equal to the width of the glyph. // It is simply the offset on the X-axis to move the current point to the start of the next glyph. // dwidth_y is not used in Avisynth, fonts are of fixed heights std::getline(ssline, token, ' '); current_char.dwidth_x = std::stoi(token); std::getline(ssline, token, ' '); current_char.dwidth_y = std::stoi(token); } else if (token == "ENCODING") { // ENCODING 32 std::getline(ssline, token, ' '); current_char.encoding = std::stoi(token); } else if (token == "BBX") { // BBX 8 16 0 -4 bounding box. 8 pixels wide and 16 pixels tall; // lower left corner is offset by 0 on the X and -4 pixels on the Y axis. // Originally we only assumed Monospaced, uniformly fixed size fonts. // But technically we can have variable width characters inside due to per character BBOX. // E.g. Latin characters usually have a DWIDTH of 8, while others like CJK Unifont // characters have a DWIDTH of 16. (like U + 007F and CJK glyphs). Because of these // wider characters, the FONTBOUNDINGBOX must be 16 pixels wide to signal the renderer // the maximum possible width for the font type (useful for buffer preallocation). But // ordinarly Latin characters are still 8 bits wide. // So can we support "fixed width" fonts which contains character bitmaps of different widths. std::getline(ssline, token, ' '); current_char.bbx.width = std::stoi(token); std::getline(ssline, token, ' '); current_char.bbx.height = std::stoi(token); std::getline(ssline, token, ' '); current_char.bbx.offset_x = std::stoi(token); std::getline(ssline, token, ' '); current_char.bbx.offset_y = std::stoi(token); current_char.empty_lines_bottom = current_char.bbx.offset_y - fnt.font_info.bbx.offset_y; current_char.empty_lines_top = fnt.font_info.bbx.height - (current_char.empty_lines_bottom + current_char.bbx.height); current_char.bits_to_shift = current_char.bbx.width - current_char.dwidth_x; // actual per-characer dwidth_x can differ from font_info.bbx.width } else if (token == "BITMAP") { /* space: STARTCHAR space ENCODING 32 SWIDTH 692 0 DWIDTH 9 0 BBX 0 0 0 0 BITMAP ENDCHAR or 6x12: BITMAP 00 00 70 88 08 30 08 08 88 70 00 00 ENDCHAR 10x18: BITMAP 0000 0000 0000 3F00 6180 6180 0180 0180 1F00 0180 0180 0180 6180 6180 3F00 0000 0000 0000 ENDCHAR */ fnt.codepoints_array[char_counter] = current_char.encoding; fnt.charnames_array[char_counter] = current_char.friendly_name; fnt.bbx_array[char_counter] = current_char.bbx; char_counter++; // by spec: charlines are left aligned within byte boundaries // fill empty top lines for (int count = 0; count < current_char.empty_lines_top; count++) { // fontline_bytes bytes per line for(int i = 0; i < fnt.font_info.fontline_bytes; i++) fnt.font_bitmaps[line_counter++] = 0; } // one character line is of (almost) arbitrary length, not limited to 16 or 32 bits std::vector charline_buffer(fnt.font_info.fontline_bytes); const size_t linebuf_len = fnt.font_info.fontline_bytes; for(int count = 0; count < current_char.bbx.height; count++) { std::getline(ss, temp); size_t len = temp.length(); const size_t bytes_defined = len / 2; if (len % 2) { // weird, one byte must be defined on two hexadecimal characters // FIXME: should give an error } if (bytes_defined > linebuf_len) { // weird, more bytes defined that needed for the font width defined in the header // FIXME: should give an error len = linebuf_len * 2; // until then a safe limit } size_t buf_ctr = 0; // two hex characters by two character then put into byte buffer for (size_t i = 0; i < len; i += 2) { auto ssss = temp.substr(i, 2); // next two hex chars charline_buffer[buf_ctr++] = (uint8_t)std::stoul(ssss, nullptr, 16); } for (auto i = buf_ctr; i < linebuf_len; i++) charline_buffer[i] = 0; // shift full buffer, they are msb...lsb for increasing addresses if (current_char.bits_to_shift < 0) { const int bits_to_shift_left = -current_char.bits_to_shift; vector_shl(charline_buffer.data(), fnt.font_info.fontline_bytes, bits_to_shift_left); } else if (current_char.bits_to_shift > 0) { const int bits_to_shift_right = current_char.bits_to_shift; vector_shr(charline_buffer.data(), fnt.font_info.fontline_bytes, bits_to_shift_right); } for(int i = 0; i < fnt.font_info.fontline_bytes; i++) { fnt.font_bitmaps[line_counter++] = charline_buffer[i]; } } // fill empty bottom lines for (int count = 0; count < current_char.empty_lines_bottom; count++) { // fontline_bytes bytes per line for (int i = 0; i < fnt.font_info.fontline_bytes; i++) fnt.font_bitmaps[line_counter++] = 0; } } break; } } return fnt; } /* STARTFONT 2.1 FONT -xos4-Terminus-Bold-R-Normal--16-160-72-72-C-80-ISO10646-1 SIZE 16 72 72 FONTBOUNDINGBOX 8 16 0 -4 STARTPROPERTIES 20 FAMILY_NAME "Terminus" FOUNDRY "xos4" SETWIDTH_NAME "Normal" ADD_STYLE_NAME "" COPYRIGHT "Copyright (C) 2019 Dimitar Toshkov Zhekov" NOTICE "Licensed under the SIL Open Font License, Version 1.1" WEIGHT_NAME "Bold" SLANT "R" PIXEL_SIZE 16 POINT_SIZE 160 RESOLUTION_X 72 RESOLUTION_Y 72 SPACING "C" AVERAGE_WIDTH 80 CHARSET_REGISTRY "ISO10646" CHARSET_ENCODING "1" MIN_SPACE 8 FONT_ASCENT 12 FONT_DESCENT 4 DEFAULT_CHAR 65533 ENDPROPERTIES CHARS 1354 STARTCHAR space ENCODING 32 SWIDTH 500 0 DWIDTH 8 0 BBX 8 16 0 -4 BITMAP ... 00 ENDCHAR ENDFONT */ static constexpr int ATA_LEFT = 1; static constexpr int ATA_RIGHT = 2; static constexpr int ATA_CENTER = 4; static constexpr int ATA_TOP = 8; static constexpr int ATA_BOTTOM = 16; static constexpr int ATA_BASELINE = 32; static int alignToBitmask(int align_1_to_9) { // alignment 1-9: digit positions on numeric keypad int al = 0; switch (align_1_to_9) // This spec where [X, Y] is relative to the text (inverted logic) { case 1: al = ATA_BOTTOM | ATA_LEFT; break; // .---- case 2: al = ATA_BOTTOM | ATA_CENTER; break; // --.-- case 3: al = ATA_BOTTOM | ATA_RIGHT; break; // ----. case 4: al = ATA_BASELINE | ATA_LEFT; break; // .____ case 5: al = ATA_BASELINE | ATA_CENTER; break; // __.__ case 6: al = ATA_BASELINE | ATA_RIGHT; break; // ____. case 7: al = ATA_TOP | ATA_LEFT; break; // `---- case 8: al = ATA_TOP | ATA_CENTER; break; // --`-- case 9: al = ATA_TOP | ATA_RIGHT; break; // ----` default: al = ATA_BASELINE | ATA_LEFT; break; // .____ } return al; } static int getColorForPlane(int plane, int color) { switch (plane) { case PLANAR_A: return (color >> 24) & 0xff; break; case PLANAR_R: case PLANAR_Y: return (color >> 16) & 0xff; break; case PLANAR_G: case PLANAR_U: return (color >> 8) & 0xff; break; case PLANAR_B: case PLANAR_V: return color & 0xff; break; } return color & 0xFF; } template void AVS_FORCEINLINE LightOnePixelPackedRGB(const bool lightIt, BYTE* _dp, int val_color_R, int val_color_G, int val_color_B) { pixel_t* dp = reinterpret_cast(_dp); if (lightIt) { dp[0] = val_color_B; dp[1] = val_color_G; dp[2] = val_color_R; } else { if constexpr (fadeBackground) { dp[0] = (pixel_t)((dp[0] * 7) >> 3); dp[1] = (pixel_t)((dp[1] * 7) >> 3); dp[2] = (pixel_t)((dp[2] * 7) >> 3); } } } template void AVS_FORCEINLINE LightOnePixel(const bool lightIt, pixel_t* dstp, int j, pixel_t& val_color, int bits_per_pixel) { // some optimization hint if constexpr (sizeof(pixel_t) == 1) bits_per_pixel = 8; else if constexpr (sizeof(pixel_t) == 4) bits_per_pixel = 32; if (lightIt) { // character definition bits aligned to msb dstp[j] = val_color; } else { // 16 = y_min // speed optimization: one subtraction less, 5-8% faster // (((Y - 16) * 7) >> 3) + 16 = ((Y * 7) >> 3) + 2 // in general: ((Y * 7) >> 3) + n, where n = range_min - ((range_min * 7) >> 3) if constexpr (fadeBackground) { // background darkening if constexpr (isRGB) { if constexpr (sizeof(pixel_t) != 4) dstp[j] = (pixel_t)((dstp[j] * 7) >> 3); else { constexpr float factor = 7.0f / 8; dstp[j] = (pixel_t)(dstp[j] * factor); } } else { if constexpr (sizeof(pixel_t) != 4) { const int range_min = 16 << (bits_per_pixel - 8); const int n = range_min - ((range_min * 7) >> 3); dstp[j] = (pixel_t)(((dstp[j] * 7) >> 3) + n); // (_dstp[j] - range_min) * 7) >> 3) + range_min); } else { constexpr float range_min_f = 16.0f / 255.0f; dstp[j] = (pixel_t)(((dstp[j] - range_min_f) * 7 / 8) + range_min_f); } } } } } template static void LightOneUVPixel(pixel_t* dstpU, int j, pixel_t* dstpV, pixel_t& font_color_u, pixel_t& font_color_v, pixel_t& halo_color_u, pixel_t& halo_color_v, int fontpixelcount, int halopixelcount, int bits_per_pixel ) { if constexpr (!fadeBackground) { if (halopixelcount == 0 && fontpixelcount == 0) return; // no change, keep background } // some optimization hint if constexpr (sizeof(pixel_t) == 1) bits_per_pixel = 8; else if constexpr (sizeof(pixel_t) == 4) bits_per_pixel = 32; // weighed count constexpr int totalpixelcount = (chromaMode == LEFT_420) ? 8 : // 1-2-1 | 1-2-1 (chromaMode == LEFT_422) ? 4 : // 1-2-1 (chromaMode == CENTER_420) ? 4 : // 1-1 | 1-1 (chromaMode == CENTER_422) ? 2 : // 1-1 (chromaMode == CENTER_411) ? 4 : // 1-1-1-1 1; // unreached if (fontpixelcount == totalpixelcount) { dstpU[j] = font_color_u; dstpV[j] = font_color_v; } else if (halopixelcount == totalpixelcount) { dstpU[j] = halo_color_u; dstpV[j] = halo_color_v; } else { // not reached, only when subsampled pixel_t actualU = dstpU[j]; pixel_t actualV = dstpV[j]; const int backgroundpixelcount = totalpixelcount - fontpixelcount - halopixelcount; if constexpr (fadeBackground) { // have to fade the existing background color // speed optimization: one subtraction less // (((U - 128) * 7) >> 3) + 128 = ((U * 7) >> 3) + 16 // in general: ((U * 7) >> 3) + n where n = range_half - ((range_half * 7) >> 3) if constexpr (sizeof(pixel_t) != 4) { int range_half = 1 << (bits_per_pixel - 1); int n = range_half - ((range_half * 7) >> 3); actualU = (pixel_t)(((actualU * 7) >> 3) + n); // ((((U - range_half) * 7) >> 3) + range_half); actualV = (pixel_t)(((actualV * 7) >> 3) + n); } else { constexpr float chroma_center = 0.0f; // ancient times this was 0.5 constexpr float factor = 7.0f / 8.0f; actualU = (pixel_t)(((actualU - chroma_center) * factor) + chroma_center); actualV = (pixel_t)(((actualV - chroma_center) * factor) + chroma_center); } } // compute resulting color weighted by pixel kinds if constexpr (sizeof(pixel_t) != 4) { constexpr int rounder = totalpixelcount >> 1; constexpr int divshift = (chromaMode == LEFT_420) ? 3 : (chromaMode == LEFT_422) ? 2 : (chromaMode == CENTER_420) ? 2 : (chromaMode == CENTER_422) ? 1 : (chromaMode == CENTER_411) ? 2 : 0; // unreached const int effective_color_u = (font_color_u * fontpixelcount + halo_color_u * halopixelcount + actualU * backgroundpixelcount + rounder); const int effective_color_v = (font_color_v * fontpixelcount + halo_color_v * halopixelcount + actualV * backgroundpixelcount + rounder); dstpU[j] = effective_color_u >> divshift; dstpV[j] = effective_color_v >> divshift; } else { constexpr float chroma_center = 0.0f; float effective_color_u = (font_color_u - chroma_center) * fontpixelcount + (halo_color_u - chroma_center) * halopixelcount + (actualU - chroma_center) * backgroundpixelcount; float effective_color_v = (font_color_v - chroma_center) * fontpixelcount + (halo_color_v - chroma_center) * halopixelcount + (actualV - chroma_center) * backgroundpixelcount; dstpU[j] = effective_color_u / totalpixelcount + chroma_center; dstpV[j] = effective_color_v / totalpixelcount + chroma_center; } } } // s (containing the indexes to the fontbitmap array) is modified in-place static void adjustWriteLimits(std::vector& s, const std::vector& bbx_array, const int vi_width, const int vi_height, const int FONT_WIDTH_not_used, const int FONT_HEIGHT, int align, const bool useHalocolor, int& x, int& y, int& len, int& startindex, int& xstart, int& ystart, int& yend) { const int al = alignToBitmask(align); // cannot calculate with len * FONT_WIDTH, because characters can have different widths int total_width = 0; for (int i = 0; i < len; i++) { // bbx_array is the array of bounding boxes for each character // s[i] is the index to the fontbitmap array total_width += bbx_array[s[i]].width; } // alignment X if (al & ATA_RIGHT) x -= (total_width - 1); else if (al & ATA_CENTER) x -= (total_width / 2); // alignment Y if (al & ATA_BASELINE) y -= FONT_HEIGHT / 2; else if (al & ATA_BOTTOM) y -= (FONT_HEIGHT - 1); const int final_height = useHalocolor ? FONT_HEIGHT + 2 : FONT_HEIGHT; if (useHalocolor) y = y - 1; // one more top line, adjust y (we do it after the alignment!) // Chop text if exceed right margin // keep last character of which at least one pixel can be drawn // Fixed FONT_WIDTH calculation logic is replaced with logic which allows variable width characters // Starting the truncation from the right side until the last character fits into the right margin, at least one pixel of it. // bbx.width is the width of the character, not the whole font, this amount must be subtracted from the right margin. while( total_width > vi_width - x + bbx_array[s[len - 1]].width && len > 0) { // remove last character len--; total_width -= bbx_array[s[len]].width; } /* // old method left here intentionally: if (len * FONT_WIDTH > width - x) len = (width - x + FONT_WIDTH - 1) / FONT_WIDTH; */ // FIXME: what if the character not, but its left side halo would be seen? startindex = 0; xstart = 0; // Chop 1st char if exceed left margin if (x < 0) { // startindex is the first position in the string to be drawn // Previously we had a global font-constant FONT_WIDTH, it was the same as x / FONT_WIDTH // and the internal start position could be calculated as (-x) % FONT_WIDTH. // Now that we allow that BDF originated characters can have different widths, we must // calculate the startindex one-by-one from the left side. while (startindex < len && x < 0) { // s[startindex] is the index to the fontbitmap array // bbx_array[s[startindex]].width is the width of the character x += bbx_array[s[startindex]].width; startindex++; } // x is the remaining negative offset, which is the start position of the first character xstart = x; // this is the start position of the first character // OLD method left here intentionally: /* startindex = (-x) / FONT_WIDTH; xstart = (-x) % FONT_WIDTH; */ x = 0; } ystart = 0; yend = final_height; // Chop font if exceed bottom margin if (y > vi_height - final_height) yend = vi_height - y; // Chop font if exceed top margin if (y < 0) { ystart = -y; y = 0; } // Roll in start index if (startindex > 0) { s.erase(s.begin(), s.begin() + startindex); len -= startindex; } } // Inserts leftmost 'bitcount' bits of fontlinebuf at the end of the byte buffer dst, // Target is the 'bitposition'th bit static void insert_from_msb_bit(uint8_t *dst, int bitposition, const uint8_t* fontlinebuf, int fontlinebuf_size, int bitcount) { int pos = bitposition / 8; int bitindex = bitposition % 8; if (bitindex > 0) { const int usable_msb_count = 8 - bitindex; // mask FF >> (bitindex) // bitindex 1 mask = 10000000 01111111 // bitindex 7 mask = 11111110 00000001 const uint8_t mask = (uint8_t)(0xFF >> bitindex); // leftmost (msb) N bits const uint8_t partial_val = (uint8_t)((fontlinebuf[0] >> bitindex) & mask); // shift leftmost bits lsb dst[pos++] |= partial_val; // or'd with existing bitcount -= usable_msb_count; // deal with shifted buffer from now on int bufpos = 0; while (bitcount > 0) { uint8_t val; if (bufpos > (8 - usable_msb_count)); else val = (fontlinebuf[bufpos] << usable_msb_count); // suppose that unused lsb bits were 0 in the end // put actual byte into buffer dst[pos++] = val; bufpos++; bitcount -= 8; } return; } int bufpos = 0; while (bitcount > 0) { // put actual byte into buffer dst[pos++] = fontlinebuf[bufpos++]; // suppose that unused lsb bits were 0 in the end bitcount -= 8; } } static uint8_t get_bit(uint8_t* src, const int bitposition) { int pos = bitposition / 8; int bitindex = bitposition % 8; const uint8_t mask = 1 << (7 - bitindex); return src[pos] & mask; } static int get_bits(uint8_t* src, int bitposition, int count) { int bitcounter = 0; while (count--) { if (0 != get_bit(src, bitposition++)) bitcounter++; } return bitcounter; } void PreRendered::make_outline() { auto h = stringbitmap.size(); auto w = stringbitmap[0].size(); // circular line buffer for holding precalculated shifted lines std::vector buf1(w); std::vector buf2(w); std::vector buf3(w); // it's unnecessary to mask the last byte against valid bitcounter, they won't drawn // const uint8_t mask = ~(0xFF >> (8 - (bitcounter % 8))); // shift a line left and rights and result is or'd auto make_dizzyLR = [](uint8_t* dst, auto src, size_t w) { if (w == 1) { *dst = (src[0] << 1) | (src[0] >> 1); return; } // leftmost uint8_t left = (src[0] << 1) | (src[1] >> (8 - 1)); uint8_t right = 0 | (src[0] >> 1); *dst = left | right; dst++; src++; // middle for (size_t i = 1; i < w - 1; ++i) { left = (src[0] << 1) | (src[1] >> (8 - 1)); right = (src[-1] << (8 - 1)) | (src[0] >> 1); *dst++ = left | right; src++; } // rightmost left = (src[0] << 1) | 0; right = (src[-1] << (8 - 1)) | (src[0] >> 1); *dst = left | right; }; #if defined(_MSC_VER) && _MSC_VER < 1944 // MSVC's optimizer fail (as of 17.8.4, release, optimize for speed, SSE2) would // Workaround. Bad code generated. Compiler bug. // Fixed (said) in 17.9 preview 3 (_MSC_VER 1939) // Tested again in 17.14 (_MSC_VER 1944), it's OK. // https://developercommunity.visualstudio.com/t/Bad-c-codegen-in-1784-x64-unless-se/10565370 volatile uint8_t* src_prev; volatile uint8_t* src; #else uint8_t* src_prev; uint8_t* src; #endif uint8_t* src_next; uint8_t* dst; uint8_t* tmp_line; uint8_t* prev_line_LR = buf1.data(); uint8_t* curr_line_LR = buf2.data(); uint8_t* next_line_LR = buf3.data(); // line 0, no previous line size_t y = 0; dst = stringbitmap_outline[y].data(); src = stringbitmap[y].data(); src_next = stringbitmap[y + 1].data(); make_dizzyLR(curr_line_LR, src, w); make_dizzyLR(next_line_LR, src_next, w); for (size_t x = 0; x < w; x++) { dst[x] = (curr_line_LR[x] | next_line_LR[x] | src_next[x]) & ~src[x]; } tmp_line = prev_line_LR; prev_line_LR = curr_line_LR; curr_line_LR = next_line_LR; next_line_LR = tmp_line; src_prev = src; src = src_next; y++; // middle lines, y runs on 1..(h-2) for (; y < h - 1; y++) { dst = stringbitmap_outline[y].data(); src_next = stringbitmap[y + 1].data(); make_dizzyLR(next_line_LR, src_next, w); for (size_t x = 0; x < w; x++) { dst[x] = (prev_line_LR[x] | curr_line_LR[x] | next_line_LR[x] | src_prev[x] | src_next[x]) & ~src[x]; } tmp_line = prev_line_LR; prev_line_LR = curr_line_LR; curr_line_LR = next_line_LR; next_line_LR = tmp_line; src_prev = src; src = src_next; } // last one, no next line dst = stringbitmap_outline[y].data(); for (size_t x = 0; x < w; x++) { dst[x] = (prev_line_LR[x] | curr_line_LR[x] | src_prev[x]) & ~src[x]; } } PreRendered::PreRendered( const uint8_t* fonts, const int fontline_bytes_storage, const int _vi_width, const int _vi_height, // from VideoInfo int _x, int _y, // they may change std::vector& s, // each character can have different width, variable bbx.width is used instead of font-level constant FONT_WIDTH const std::vector& bbx_array, int align, const bool _useHalocolor, // Each character can have a different width; variable bbx.width is used instead of the font-level constant FONT_WIDTH. // // A BDF font can contain mixed sizes. The next two parameters (FONT_WIDTH, FONT_HEIGHT) represent the global maximum // font size. A font file may contain per-character widths and heights in bbx_array. // // Regarding the wider spacing in Unifont: // This is due to how FONTBOUNDINGBOX is interpreted during rendering. In Unifont's BDF header, FONTBOUNDINGBOX is set // to 16 pixels wide. In earlier versions of Avisynth, having a BDF header with FONTBOUNDINGBOX set to 16 pixels wide // globally caused all glyphs, regardless of their actual per-character width, to be rendered with 16-pixel spacing in // Avisynth's Text() function. This resulted in visible gaps for narrower, 8-pixel wide Latin characters. // // While Unifont is conceptually monospaced, it technically includes variable-width glyphs. // For example, Latin characters have DWIDTH 8, but others (like U+007F or CJK characters) use DWIDTH 16. // // Thus, the global FONTBOUNDINGBOX only specifies a maximum size for buffer allocation and must be 16 pixels wide. // In a fully BDF-compliant renderer, the per-character DWIDTH and BBX values can override the global bounding box // for spacing and alignment. // // Since Avisynth 3.7.6, the BDF renderer implements this override behavior. const int FONT_WIDTH, const int FONT_HEIGHT, const int _safety_bits_x_left, const int _safety_bits_x_right ) : useHalocolor(_useHalocolor), vi_width(_vi_width), vi_height(_vi_height), safety_bits_x_left(_safety_bits_x_left), safety_bits_x_right(_safety_bits_x_right) { len = (int)s.size(); x = _x; y = _y; xstart = 0; ystart = 0; yend = 0; text_width = 0; int startindex = 0; // optional two additional lines for top and bottom for outline stringbitmap_height = useHalocolor ? FONT_HEIGHT + 2 : FONT_HEIGHT; adjustWriteLimits(s, // s is modified in-place bbx_array, // bounding boxes for each character vi_width, vi_height, FONT_WIDTH, // not used, bbx_array contains per-character widths, but must be passed FONT_HEIGHT, // extra top and bottom for halo align, useHalocolor, // adjusted parameters x, y, len, startindex, xstart, ystart, yend ); if (len <= 0) return; // prepare font mask and outline mask // instead of FONT_WIDTH * len we have to calculate the total width of the string dynamically, // because characters can have different widths, so we use bbx_array[s[i]].width int total_font_width = 0; for (int i = 0; i < len; i++) { // bbx_array is the array of bounding boxes for each character // s[i] is the index to the fontbitmap array // total_font_width += bbx_array[s[i]].width; total_font_width += bbx_array[s[i]].width; // this is the total width of the string } // left-right safety bits for horizontal subsampled cases const int stringbitmap_width = safety_bits_x_left + total_font_width + (useHalocolor ? 2 : 0) + safety_bits_x_right; const int stringbitmapline_bytes = (stringbitmap_width + 7) / 8; // allocate actual space stringbitmap.resize(stringbitmap_height); for (auto& subarray : stringbitmap) subarray.resize(stringbitmapline_bytes); if (useHalocolor) { stringbitmap_outline.resize(stringbitmap_height); for (auto& subarray : stringbitmap_outline) subarray.resize(stringbitmapline_bytes); } // fill matrix with fonts // optionally leave spare left-right-top-bottom pixel lines for out-of-matrix halo pixels // plus a final zero-cost bit column for safely drawing unaligned horizontal subsampling cases uint8_t zerobyte[1] = { 0 }; int bitcounter = 0; // safety columns for horizontal subsampling cases // fill another column with 0 for (int ty = 0; ty < stringbitmap_height; ty++) { insert_from_msb_bit(&stringbitmap[ty][0], bitcounter, &zerobyte[0], 1, safety_bits_x_left); } bitcounter += safety_bits_x_left; if (useHalocolor) { // fill leftmost 1 bitcolumn with 0 for (int ty = 0; ty < stringbitmap_height; ty++) { uint8_t zerobyte[1] = { 0 }; insert_from_msb_bit(&stringbitmap[ty][0], 0, &zerobyte[0], 1, 1); } bitcounter++; } // if outline needed, leave place for top outline, copy actual character to the second row const int ypos_of_char_in_bitmap = useHalocolor ? 1 : 0; for (int i = 0; i < len; i++) { int num = s[i]; int actual_font_width = bbx_array[num].width; // per character width, instead of font-level constant FONT_WIDTH; const uint8_t* fontlinebuf = &fonts[num * FONT_HEIGHT * fontline_bytes_storage]; for (int ty = 0; ty < FONT_HEIGHT; ty++) { // stuff FONT_WIDTH bits from fontline into bitcounter_th bit of target line insert_from_msb_bit(&stringbitmap[ty + ypos_of_char_in_bitmap][0], bitcounter, fontlinebuf, fontline_bytes_storage, actual_font_width); fontlinebuf += fontline_bytes_storage; } bitcounter += actual_font_width; } if (useHalocolor) { // fill rightmost 'safety_bits' bitcolumn with 0 for (int ty = 0; ty < stringbitmap_height; ty++) { insert_from_msb_bit(&stringbitmap[ty][0], bitcounter, &zerobyte[0], 1, 1); } bitcounter++; } // safety columns for horizontal subsampling cases // fill another column with 0 for (int ty = 0; ty < stringbitmap_height; ty++) { insert_from_msb_bit(&stringbitmap[ty][0], bitcounter, &zerobyte[0], 1, safety_bits_x_right); } bitcounter += safety_bits_x_right; assert(bitcounter == stringbitmap_width); if (useHalocolor) make_outline(); // recalculate the text width with assuming variable character widths // actual visible pixel count // Instead of (len - 1) * FONT_WIDTH, we must calculate the text width based on the actual character widths text_width = total_font_width - xstart; if (x + text_width > vi_width) text_width -= (x + text_width - vi_width); if (useHalocolor) { // x was calculated w/o the extra left-right padding xstart += 1; // worst case, skip leftmost extra halo column if (x + xstart - 1 >= 0 && x > 0) { x -= 1; xstart -= 1; text_width += 1; } // still good an increased text_width for last halo column? if (x + text_width + 1 < vi_width) text_width += 1; } } template static auto getHBDColor_UV(int color, int bits_per_pixel) { if (bits_per_pixel < 32) return (pixel_t)(color << (bits_per_pixel - 8)); constexpr float shift = 0.0f; return (pixel_t)((color - 128) / 255.0f + shift); // FIXME: consistently using limited->fullscale conversion for float } template static auto getHBDColor_Y(int color, int bits_per_pixel) { if (bits_per_pixel < 32) return (pixel_t)(color << (bits_per_pixel - 8)); return (pixel_t)(color / 255.0f); // 0..255 -> 0..1.0 // FIXME: consistently using limited->fullscale conversion for float } template static auto getHBDColor_RGB(int color, int bits_per_pixel) { if (bits_per_pixel <= 16) { const int max_pixel_value = (1 << (bits_per_pixel & 31)) - 1; return (pixel_t)((float)color * max_pixel_value / 255); // 0..255 --> 0..1023,4095,16383,65535 } return (pixel_t)(color / 255.0f); // 0..255 -> 0..1.0 } template void Render1by1Planes(int bits_per_pixel, int color, int halocolor, int* pitches, BYTE** dstps, PreRendered& pre, const int planeCount, const bool is444) { // 1:1 planes, Y or planar RGB or 4:4:4 U/V int planes_y[4] = { PLANAR_Y, PLANAR_U, PLANAR_V, PLANAR_A }; int planes_r[4] = { PLANAR_G, PLANAR_B, PLANAR_R, PLANAR_A }; int* planes = isRGB ? planes_r : planes_y; for (int p = 0; p < planeCount; p++) { const int plane = planes[p]; if (!(isRGB || plane == PLANAR_Y || ((plane == PLANAR_U || plane == PLANAR_V) && is444))) continue; // Y, R, G, B is O.K. U, V is OK if 444 pixel_t val_color; pixel_t val_color_outline; const int planecolor = getColorForPlane(plane, color); const int planecolor_outline = getColorForPlane(plane, halocolor); if (isRGB) { val_color = getHBDColor_RGB(planecolor, bits_per_pixel); val_color_outline = getHBDColor_RGB(planecolor_outline, bits_per_pixel); } else if (plane == PLANAR_U || plane == PLANAR_V) { val_color = getHBDColor_UV(planecolor, bits_per_pixel); val_color_outline = getHBDColor_UV(planecolor_outline, bits_per_pixel); } else {// Y val_color = getHBDColor_Y(planecolor, bits_per_pixel); val_color_outline = getHBDColor_Y(planecolor_outline, bits_per_pixel); } const int pitch = pitches[p]; BYTE* dstp = dstps[p] + pre.x * sizeof(pixel_t) + pre.y * pitch; // Start rendering for (int ty = pre.ystart; ty < pre.yend; ty++) { pixel_t* _dstp = reinterpret_cast(dstp); uint8_t* fontline_ptr = pre.stringbitmap[ty].data(); [[maybe_unused]] uint8_t* fontoutline_ptr; if constexpr(useHalocolor) fontoutline_ptr = pre.stringbitmap_outline[ty].data(); int j = 0; const int shifted_xstart = pre.safety_bits_x_left + pre.xstart; for (int tx = shifted_xstart; tx < shifted_xstart + pre.text_width; tx++) { const bool lightIt = 0 != get_bit(fontline_ptr, tx); LightOnePixel(lightIt, _dstp, j, val_color, bits_per_pixel); if constexpr(useHalocolor) { if (!lightIt) { const bool lightIt_outline = 0 != get_bit(fontoutline_ptr, tx); LightOnePixel(lightIt_outline, _dstp, j, val_color_outline, bits_per_pixel); } } j += 1; } dstp += pitch; } } } template void RenderUV(int bits_per_pixel, int color, int halocolor, int* pitches, BYTE** dstps, PreRendered& pre) { // some optimization hint if constexpr (sizeof(pixel_t) == 1) bits_per_pixel = 8; else if constexpr (sizeof(pixel_t) == 4) bits_per_pixel = 32; // draw U and V in one step pixel_t color_u = getHBDColor_UV(getColorForPlane(PLANAR_U, color), bits_per_pixel); pixel_t color_v = getHBDColor_UV(getColorForPlane(PLANAR_V, color), bits_per_pixel); pixel_t color_outline_u = getHBDColor_UV(getColorForPlane(PLANAR_U, halocolor), bits_per_pixel); pixel_t color_outline_v = getHBDColor_UV(getColorForPlane(PLANAR_V, halocolor), bits_per_pixel); const int pitchUV = pitches[1]; const int offset = (pre.x >> logXRatioUV) * sizeof(pixel_t) + (pre.y >> logYRatioUV) * pitchUV; BYTE* dstpU = dstps[1] + offset; BYTE* dstpV = dstps[2] + offset; // .SubS = 1, 2 or 4 constexpr int xSubS = 1 << logXRatioUV; constexpr int ySubS = 1 << logYRatioUV; /* U and V handling, multiple luma/outline/background source for a given chroma point resulting chroma is a weighted sum of the three pixel kinds (font/outline/background) 012345678901 ...#OOO#.... ..#O###O#... ..#O#.#O#... ..#O#.#O#... ..#O#.#O#... */ // unaligned x: for horizontal subsampling 420, 422 and 411: // 420, 422, 411 horizontal subsampling: one more loop because of the leftmost orphan pixel(s) // we can overaddress on the right, additional safety bit column(s) were added for the bitmap const bool unaligned_x_start = logXRatioUV > 0 && 0 != pre.x % xSubS; const int xplus = unaligned_x_start ? xSubS : 0; // extra orphan bits affecting rightmost chroma const int xshift = pre.x % xSubS; // when aligned --> 0 // unaligned y: vertical subsampling 420 const bool odd_y_start = logYRatioUV == 1 && 0 != pre.y % 2; const int yshift = odd_y_start ? 1 : 0; constexpr bool hasVerticalSubsample = logYRatioUV > 0; // safe zero array for vertical subsampled 4:2:0 case for orphan top/bottom std::vector zeros; if constexpr (hasVerticalSubsample) zeros.resize(pre.stringbitmap[0].size()); // second array element is only valid for vertically subsampled 4:2:0 uint8_t* fontlines_ptr[2] = { nullptr }; uint8_t* fontoutlines_ptr[2] = { nullptr }; for (int ty = pre.ystart; ty < pre.yend; ty += ySubS) { pixel_t* _dstpU = reinterpret_cast(dstpU); pixel_t* _dstpV = reinterpret_cast(dstpV); if (hasVerticalSubsample && odd_y_start && ty == pre.ystart) { // top font line on odd y position + vertically subsampled (420) fontlines_ptr[0] = zeros.data(); fontlines_ptr[1] = pre.stringbitmap[ty].data(); if constexpr(useHalocolor) { fontoutlines_ptr[0] = zeros.data(); fontoutlines_ptr[1] = pre.stringbitmap_outline[ty].data(); } } else if (hasVerticalSubsample && ty + 1 - yshift >= pre.stringbitmap_height) { // bottom font line on even y position fontlines_ptr[0] = pre.stringbitmap[ty - yshift].data(); fontlines_ptr[1] = zeros.data(); if constexpr(useHalocolor) { fontoutlines_ptr[0] = pre.stringbitmap_outline[ty - yshift].data(); fontoutlines_ptr[1] = zeros.data(); } } else { // all font lines contributing to chroma can safely be used for (int m = 0; m < ySubS; m++) fontlines_ptr[m] = pre.stringbitmap[ty + m - yshift].data(); if constexpr(useHalocolor) { for (int m = 0; m < ySubS; m++) fontoutlines_ptr[m] = pre.stringbitmap_outline[ty + m - yshift].data(); } } // render a horizontal line int j = 0; // (pre.xstart - xshift) is always on horizontal subsample boundary const int shifted_xstart = pre.safety_bits_x_left + pre.xstart - xshift; // left (mpeg2) location: int fontpixels_right = 0; // used for left (mpeg2) chroma location case int halopixels_right = 0; // For the very first chroma pixel there is no previous rightside. // Use index -1, safe because of safety columns if constexpr (chromaMode == LEFT_420 || chromaMode == LEFT_422) { for (int yy = 0; yy < ySubS; yy++) { fontpixels_right += get_bits(fontlines_ptr[yy], shifted_xstart - 1, 1); if constexpr (useHalocolor) halopixels_right += get_bits(fontoutlines_ptr[yy], shifted_xstart - 1, 1); } } for (int tx = shifted_xstart; tx < shifted_xstart + pre.text_width + xplus; tx += xSubS) { int fontpixels = 0; int halopixels = 0; // 411 // +------+------+------+------+ // | 0.25 | 0.25 | 0.25 | 0.25 | // +------+------+------+------+ // 420 center (mpeg1, jpeg) // +------+------+ // | 0.25 | 0.25 | // |------+------| // | 0.25 | 0.25 | // +------+------+ // 422 center // +------+------+ // | 0.5 | 0.5 | // +------+------+ // 420 left (mpeg2) // ------+------+-------+ // 0.125 | 0.25 | 0.125 | // ------|------+-------| // 0.125 | 0.25 | 0.125 | // ------+------+-------+ // 422 left (mpeg2) // ------+------+-------+ // 0.25 | 0.5 | 0.25 | // ------+------+-------+ if constexpr (chromaMode == LEFT_420 || chromaMode == LEFT_422) { int fontpixels_left = 0; int halopixels_left = 0; int fontpixels_mid = 0; int halopixels_mid = 0; // shift variables fontpixels_left = fontpixels_right; if constexpr (useHalocolor) halopixels_left = halopixels_right; // gather counts fontpixels_mid = get_bits(fontlines_ptr[0], tx, 1); fontpixels_right = get_bits(fontlines_ptr[0], tx + 1, 1); if constexpr (useHalocolor) { halopixels_mid = get_bits(fontoutlines_ptr[0], tx, 1); halopixels_right = get_bits(fontoutlines_ptr[0], tx + 1, 1); } if constexpr (chromaMode == LEFT_420) { fontpixels_mid += get_bits(fontlines_ptr[1], tx, 1); fontpixels_right += get_bits(fontlines_ptr[1], tx + 1, 1); if constexpr (useHalocolor) { halopixels_mid += get_bits(fontoutlines_ptr[1], tx, 1); halopixels_right += get_bits(fontoutlines_ptr[1], tx + 1, 1); } } // 1-2-1 weight fontpixels = fontpixels_left + 2 * fontpixels_mid + fontpixels_right; if constexpr (useHalocolor) halopixels = halopixels_left + 2 * halopixels_mid + halopixels_right; } else { // center, equal weights for (int yy = 0; yy < ySubS; yy++) { fontpixels += get_bits(fontlines_ptr[yy], tx, xSubS); if constexpr (useHalocolor) halopixels += get_bits(fontoutlines_ptr[yy], tx, xSubS); } } LightOneUVPixel(_dstpU, j, _dstpV, color_u, color_v, color_outline_u, color_outline_v, fontpixels, halopixels, bits_per_pixel ); j += 1; } dstpU += pitchUV; dstpV += pitchUV; } } template void do_DrawStringPlanar( const int width, const int height, BYTE** dstps, int* pitches, const int logXRatioUV, const int logYRatioUV, const int planeCount, int bits_per_pixel, const BitmapFont* bmfont, int x, int y, std::vector& s, int color, int halocolor, int align, bool useHalocolor, int chromalocation) { // some optimization hint if constexpr (sizeof(pixel_t) == 1) bits_per_pixel = 8; else if constexpr (sizeof(pixel_t) == 4) bits_per_pixel = 32; // Chroma 411 would require 3 extra bits on both left and right. // Chroma 420 and 422 need 1 bits on both left and right // Left (mpeg2) chroma placement (420, 422) requires an additional one on the left. const bool isLeftStyleChromaLoc = (logXRatioUV == 1) && ((chromalocation == ChromaLocation_e::AVS_CHROMA_LEFT) || (chromalocation == ChromaLocation_e::AVS_CHROMA_TOP_LEFT) || // not supported yet; for the sake of completeness (chromalocation == ChromaLocation_e::AVS_CHROMA_BOTTOM_LEFT)); // not supported yet; for the sake of completeness const int safety_bits_x_left = (1 << logXRatioUV) - 1 + (isLeftStyleChromaLoc ? 1 : 0); const int safety_bits_x_right = (1 << logXRatioUV) - 1; PreRendered pre(bmfont->font_bitmaps.data(), bmfont->fontline_bytes, width, height, x, y, s, bmfont->bbx_array, align, useHalocolor, bmfont->global_bbx.width, bmfont->global_bbx.height, safety_bits_x_left, safety_bits_x_right); if (pre.len <= 0) return; const bool is444 = !isRGB && (planeCount >= 3) && (logXRatioUV == 0) && (logYRatioUV == 0); if (useHalocolor) Render1by1Planes(bits_per_pixel, color, halocolor, pitches, dstps, pre, planeCount, is444); else Render1by1Planes(bits_per_pixel, color, halocolor, pitches, dstps, pre, planeCount, is444); if constexpr (isRGB) return; if (is444) return; if (planeCount < 3) return; // Y // Subsampled cases, templates help a lot // for 420 and 422 center and left supported only, what is not "center", we do the "left" method if (logXRatioUV == 2 && logYRatioUV == 0) {// 411 // ignore chromalocation if (useHalocolor) RenderUV(bits_per_pixel, color, halocolor, pitches, dstps, pre); else RenderUV(bits_per_pixel, color, halocolor, pitches, dstps, pre); } else if (logXRatioUV == 1 && logYRatioUV == 0) { if (chromalocation == ChromaLocation_e::AVS_CHROMA_CENTER) { if (useHalocolor) RenderUV(bits_per_pixel, color, halocolor, pitches, dstps, pre); else RenderUV(bits_per_pixel, color, halocolor, pitches, dstps, pre); } else { if (useHalocolor) RenderUV(bits_per_pixel, color, halocolor, pitches, dstps, pre); else RenderUV(bits_per_pixel, color, halocolor, pitches, dstps, pre); } } else if (logXRatioUV == 1 && logYRatioUV == 1) { if (chromalocation == ChromaLocation_e::AVS_CHROMA_CENTER) { if (useHalocolor) RenderUV(bits_per_pixel, color, halocolor, pitches, dstps, pre); else RenderUV(bits_per_pixel, color, halocolor, pitches, dstps, pre); } else { if (useHalocolor) RenderUV(bits_per_pixel, color, halocolor, pitches, dstps, pre); else RenderUV(bits_per_pixel, color, halocolor, pitches, dstps, pre); } } else assert(0); } template void RenderYUY2(int color, int halocolor, int pitch, BYTE* _dstp, PreRendered& pre) { BYTE* dstp = _dstp + pre.x * 2 + pre.y * pitch; BYTE* dstpUV = _dstp + (pre.x / 2) * 4 + 1 + pre.y * pitch; // always points to U of a YUYV block typedef uint8_t pixel_t; pixel_t val_color = getColorForPlane(PLANAR_Y, color); pixel_t val_color_outline = getColorForPlane(PLANAR_Y, halocolor); pixel_t color_u = getColorForPlane(PLANAR_U, color); pixel_t color_outline_u = getColorForPlane(PLANAR_U, halocolor); pixel_t color_v = getColorForPlane(PLANAR_V, color); pixel_t color_outline_v = getColorForPlane(PLANAR_V, halocolor); // YUY2 like 422 constexpr int logXRatioUV = 1; constexpr int logYRatioUV = 0; constexpr int xSubS = 2; // unaligned x: for horizontal subsampling 420, 422 (YUY2) and 411: // 420, 422, 411, YUY2 horizontal subsampling: one more loop because of the leftmost orphan pixel(s) // we can overaddress on the right, additional safety bit column(s) were added for the bitmap const bool unaligned_x_start = 0 != pre.x % xSubS; const int xplus = unaligned_x_start ? xSubS : 0; // extra orphan bits affecting rightmost chroma const int xshift = pre.x % xSubS; // when aligned --> 0 for (int ty = pre.ystart; ty < pre.yend; ty++) { BYTE* dp = dstp; BYTE* dpUV = dstpUV; uint8_t* fontline_ptr = pre.stringbitmap[ty].data(); [[maybe_unused]] uint8_t* fontoutline_ptr; if constexpr (useHalocolor) fontoutline_ptr = pre.stringbitmap_outline[ty].data(); // first Y, like in 4:4:4 int j = 0; int shifted_xstart = pre.safety_bits_x_left + pre.xstart; for (int tx = shifted_xstart; tx < shifted_xstart + pre.text_width; tx++) { const bool lightIt = 0 != get_bit(fontline_ptr, tx); LightOnePixel(lightIt, dp, j, val_color, 8); if constexpr (useHalocolor) { if (!lightIt) { const bool lightIt_outline = 0 != get_bit(fontoutline_ptr, tx); LightOnePixel(lightIt_outline, dp, j, val_color_outline, 8); } } j += 2; // next Y } // then chroma j = 0; // (pre.xstart - xshift) is always on horizontal subsample boundary shifted_xstart = pre.safety_bits_x_left + pre.xstart - xshift; // left (mpeg2) location: int fontpixels_right = 0; // used for left (mpeg2) chroma location case int halopixels_right = 0; // For the very first chroma pixel there is no previous rightside. // Use index -1, safe because of safety columns if constexpr (chromaMode == LEFT_422) { fontpixels_right = get_bits(fontline_ptr, shifted_xstart - 1, 1); if constexpr (useHalocolor) halopixels_right = get_bits(fontoutline_ptr, shifted_xstart - 1, 1); } for (int tx = shifted_xstart; tx < shifted_xstart + pre.text_width + xplus; tx += xSubS) { int fontpixels = 0; int halopixels = 0; // 422 center (mpeg1, jpeg) // +------+------+ // | 0.5 | 0.5 | // +------+------+ // 422 left (mpeg2) // ------+------+-------+ // 0.25 | 0.5 | 0.25 | // ------+------+-------+ if constexpr (chromaMode == LEFT_422) { int fontpixels_left = 0; int halopixels_left = 0; int fontpixels_mid = 0; int halopixels_mid = 0; // shift variables fontpixels_left = fontpixels_right; if constexpr (useHalocolor) halopixels_left = halopixels_right; // gather counts fontpixels_mid = get_bits(fontline_ptr, tx, 1); fontpixels_right = get_bits(fontline_ptr, tx + 1, 1); if constexpr (useHalocolor) { halopixels_mid = get_bits(fontoutline_ptr, tx, 1); halopixels_right = get_bits(fontoutline_ptr, tx + 1, 1); } // 1-2-1 weight fontpixels = fontpixels_left + 2 * fontpixels_mid + fontpixels_right; if constexpr (useHalocolor) halopixels = halopixels_left + 2 * halopixels_mid + halopixels_right; } else { // center, equal weights fontpixels += get_bits(fontline_ptr, tx, xSubS); if constexpr (useHalocolor) halopixels += get_bits(fontoutline_ptr, tx, xSubS); } LightOneUVPixel(dpUV /*U*/, j, dpUV + 2 /*V*/, color_u, color_v, color_outline_u, color_outline_v, fontpixels, halopixels, 8 ); j += 4; // YUYV } dstp += pitch; dstpUV += pitch; } } template static void do_DrawStringYUY2( const int width, const int height, BYTE* _dstp, int pitch, const BitmapFont* bmfont, int x, int y, std::vector& s, int color, int halocolor, int align, bool useHalocolor, int chromalocation) { const bool isLeftStyleChromaLoc = chromalocation == ChromaLocation_e::AVS_CHROMA_LEFT; // Like 422. Chroma subsampling would require 1 extra bit playground on both left and right const int safety_bits_x_left = 1 + (isLeftStyleChromaLoc ? 1 : 0); const int safety_bits_x_right = 1; PreRendered pre(bmfont->font_bitmaps.data(), bmfont->fontline_bytes, width, height, x, y, s, bmfont->bbx_array, align, useHalocolor, bmfont->global_bbx.width, bmfont->global_bbx.height, safety_bits_x_left, safety_bits_x_right); if (pre.len <= 0) return; if (useHalocolor) { if (chromalocation == ChromaLocation_e::AVS_CHROMA_CENTER) RenderYUY2(color, halocolor, pitch, _dstp, pre); else RenderYUY2(color, halocolor, pitch, _dstp, pre); } else { if (chromalocation == ChromaLocation_e::AVS_CHROMA_CENTER) RenderYUY2(color, halocolor, pitch, _dstp, pre); else RenderYUY2(color, halocolor, pitch, _dstp, pre); } } template static void RenderPackedRGB(int color, int halocolor, BYTE* _dstp, int pitch, int height, PreRendered& pre) { // packed: only 8 and 16 bits int bits_per_pixel = 0; if constexpr (sizeof(pixel_t) == 1) bits_per_pixel = 8; else if constexpr (sizeof(pixel_t) == 2) bits_per_pixel = 16; const int val_color_R = getHBDColor_RGB(getColorForPlane(PLANAR_R, color), bits_per_pixel); const int val_color_R_outline = getHBDColor_RGB(getColorForPlane(PLANAR_R, halocolor), bits_per_pixel); const int val_color_G = getHBDColor_RGB(getColorForPlane(PLANAR_G, color), bits_per_pixel); const int val_color_G_outline = getHBDColor_RGB(getColorForPlane(PLANAR_G, halocolor), bits_per_pixel); const int val_color_B = getHBDColor_RGB(getColorForPlane(PLANAR_B, color), bits_per_pixel); const int val_color_B_outline = getHBDColor_RGB(getColorForPlane(PLANAR_B, halocolor), bits_per_pixel); // upside down BYTE* dstp = _dstp + pre.x * rgbstep + (height - 1 - pre.y) * pitch; // Start rendering for (int ty = pre.ystart; ty < pre.yend; ty++) { uint8_t* dp = dstp; uint8_t* fontline_ptr = pre.stringbitmap[ty].data(); [[maybe_unused]] uint8_t* fontoutline_ptr; if constexpr(useHalocolor) fontoutline_ptr = pre.stringbitmap_outline[ty].data(); const int shifted_xstart = pre.safety_bits_x_left + pre.xstart; // though safety bit count must be 0 here for (int tx = shifted_xstart; tx < shifted_xstart + pre.text_width; tx++) { const bool lightIt = 0 != get_bit(fontline_ptr, tx); LightOnePixelPackedRGB(lightIt, dp, val_color_R, val_color_G, val_color_B); if constexpr(useHalocolor) { if (!lightIt) { const bool lightIt_outline = 0 != get_bit(fontoutline_ptr, tx); LightOnePixelPackedRGB(lightIt_outline, dp, val_color_R_outline, val_color_G_outline, val_color_B_outline); } } dp += rgbstep; } dstp -= pitch; } } template static void do_DrawStringPackedRGB( const int width, const int height, BYTE* _dstp, int pitch, const BitmapFont* bmfont, int x, int y, std::vector& s, int color, int halocolor, int align, bool useHalocolor) { const int safety_bits_x_left = 0; // no horizontal subsampling const int safety_bits_x_right = 0; // no horizontal subsampling PreRendered pre(bmfont->font_bitmaps.data(), bmfont->fontline_bytes, width, height, x, y, s, bmfont->bbx_array, align, useHalocolor, bmfont->global_bbx.width, bmfont->global_bbx.height, safety_bits_x_left, safety_bits_x_right); if (pre.len <= 0) return; if (useHalocolor) RenderPackedRGB(color, halocolor, _dstp, pitch, height, pre); else RenderPackedRGB(color, halocolor, _dstp, pitch, height, pre); } static bool strequals_i(const std::string& a, const std::string& b) { return std::equal(a.begin(), a.end(), b.begin(), b.end(), [](char a, char b) { return tolower(a) == tolower(b); }); } // in fixedfonts.cpp extern const uint16_t *font_bitmaps[]; extern const uint16_t *font_codepoints[]; extern const FixedFont_info_t *font_infos[]; std::unique_ptr GetBitmapFont(int size, const char *name, bool bold, bool debugSave) { BitmapFont* current_font = nullptr; // check internal embedded fonts bool found = false; // find font in internal list for (int i = 0; i < PREDEFINED_FONT_COUNT; i++) { const FixedFont_info_t* fi = font_infos[i]; if (fi->height == size && fi->bold == bold && strequals_i(fi->fontname, name)) { BBX global_bbx = BBX{ fi->width, fi->height, fi->offset_x, fi->offset_y }; // BBX from FONTBOUNDINGBOX // max WIDTH, max HEIGHT, offset_x, offset_y current_font = new BitmapFont( fi->charcount, font_bitmaps[i], // internal one nullptr, // not a byte array from external BDF sizeof(uint16_t), // sizeof(*font_bitmaps) 2: uint16_t font_codepoints[i], nullptr, // Individual BBX for each character. For our internal characters it comes from global bbx global_bbx, fi->fontname, "", fi->bold, false); found = true; break; } } // pass #2 when size does not match exactly, find nearest, but still smaller font. if (!found) { // find font i internal list int last_good_size = 0; int found_index = -1; for (int i = 0; i < PREDEFINED_FONT_COUNT; i++) { const FixedFont_info_t* fi = font_infos[i]; if (fi->bold == bold && strequals_i(fi->fontname, name)) { if (last_good_size == 0) { found_index = i; last_good_size = fi->height; } else if (std::abs(fi->height - size) < std::abs(last_good_size - size) && fi->height <= size) { // has better size match and is not larger found_index = i; last_good_size = fi->height; } } } if (found_index >= 0) { const FixedFont_info_t* fi = font_infos[found_index]; BBX global_bbx = BBX{ fi->width, fi->height, fi->offset_x, fi->offset_y }; // BBX from FONTBOUNDINGBOX current_font = new BitmapFont( fi->charcount, font_bitmaps[found_index], // internal one nullptr, // not a byte array from external BDF sizeof(uint16_t), // sizeof(*font_bitmaps) 2: uint16_t font_codepoints[found_index], nullptr, // Individual BBX for each character. For our internal characters it comes from global bbx global_bbx, fi->fontname, "", fi->bold, false); found = true; } } if (!found) { // fixme: make cache BdfFont bdf; bdf = LoadBMF(name, bold); if (bdf.codepoints_array.size() == 0) return nullptr; current_font = new BitmapFont( bdf.font_info.chars, nullptr, // not an internal one bdf.font_bitmaps.data(), // a byte array from external BDF bdf.font_info.fontline_bytes, bdf.codepoints_array.data(), &bdf.bbx_array, // Individual BBX for each character, nullptr if not available for our internal fonts bdf.font_info.bbx, // from FONTBOUNDINGBOX, max WIDTH, HEIGHT, offset_x, offset_y bdf.font_info.font, bdf.font_filename, strequals_i(bdf.font_properties.Weight_name, "bold"), debugSave); } return std::unique_ptr(current_font); } static void DrawString_internal(BitmapFont* current_font, const VideoInfo& vi, PVideoFrame& dst, int x, int y, std::string& s_utf8, int color, int halocolor, bool useHalocolor, int align, bool fadeBackground, int chromalocation) { //static BitmapFont_10_20 infoFont1020; // constructor runs once, single instance // map an utf8 string to a sequence of character map indexes auto s_remapped = current_font->remap(s_utf8); // array of font table indexes //SaveBitmapSource(); // debug to generate source from original table const bool isRGB = vi.IsRGB(); const int planes_y[4] = { PLANAR_Y, PLANAR_U, PLANAR_V, PLANAR_A }; const int planes_r[4] = { PLANAR_G, PLANAR_B, PLANAR_R, PLANAR_A }; const int* planes = isRGB ? planes_r : planes_y; int logXRatioUV = 0; int logYRatioUV = 0; if (!vi.IsY() && !vi.IsRGB()) { logXRatioUV = vi.IsYUY2() ? 1 : vi.GetPlaneWidthSubsampling(PLANAR_U); logYRatioUV = vi.IsYUY2() ? 0 : vi.GetPlaneHeightSubsampling(PLANAR_U); } const int planecount = vi.IsYUY2() ? 1 : std::min(vi.NumComponents(), 3); BYTE* dstps[3] = { nullptr }; int pitches[3] = { 0 }; for (int i = 0; i < planecount; i++) { int plane = planes[i]; dstps[i] = dst->GetWritePtr(plane); pitches[i] = dst->GetPitch(plane); } const int width = vi.width; const int height = vi.height; const int bits_per_pixel = vi.BitsPerComponent(); // narrow down valid chroma choices, ignoring and moving to default what is not supported at the moment if (vi.IsYV411()) { // ignored, always left chromalocation = ChromaLocation_e::AVS_CHROMA_LEFT; } else if (vi.Is420() || vi.Is422() || vi.IsYUY2()) { if (chromalocation != ChromaLocation_e::AVS_CHROMA_CENTER) chromalocation = ChromaLocation_e::AVS_CHROMA_LEFT; // When CENTER is specified, do "center", all other cases fall back // to "left" (mpeg2). Option is meaningful only 420 or 422 formats, otherwise ignored. } // YUY2 if (vi.IsYUY2()) { if (fadeBackground) do_DrawStringYUY2(width, height, dstps[0], pitches[0], current_font, x, y, s_remapped, color, halocolor, align, useHalocolor, chromalocation); else do_DrawStringYUY2(width, height, dstps[0], pitches[0], current_font, x, y, s_remapped, color, halocolor, align, useHalocolor, chromalocation); return; } // Packed RGB24/32/48/64 if (isRGB && !vi.IsPlanar()) { if (fadeBackground) { if (vi.IsRGB24()) do_DrawStringPackedRGB(width, height, dstps[0], pitches[0], current_font, x, y, s_remapped, color, halocolor, align, useHalocolor); else if (vi.IsRGB32()) do_DrawStringPackedRGB(width, height, dstps[0], pitches[0], current_font, x, y, s_remapped, color, halocolor, align, useHalocolor); else if (vi.IsRGB48()) do_DrawStringPackedRGB(width, height, dstps[0], pitches[0], current_font, x, y, s_remapped, color, halocolor, align, useHalocolor); else if (vi.IsRGB64()) do_DrawStringPackedRGB(width, height, dstps[0], pitches[0], current_font, x, y, s_remapped, color, halocolor, align, useHalocolor); } else { if (vi.IsRGB24()) do_DrawStringPackedRGB(width, height, dstps[0], pitches[0], current_font, x, y, s_remapped, color, halocolor, align, useHalocolor); else if (vi.IsRGB32()) do_DrawStringPackedRGB(width, height, dstps[0], pitches[0], current_font, x, y, s_remapped, color, halocolor, align, useHalocolor); else if (vi.IsRGB48()) do_DrawStringPackedRGB(width, height, dstps[0], pitches[0], current_font, x, y, s_remapped, color, halocolor, align, useHalocolor); else if (vi.IsRGB64()) do_DrawStringPackedRGB(width, height, dstps[0], pitches[0], current_font, x, y, s_remapped, color, halocolor, align, useHalocolor); } return; } // planar and Y if (fadeBackground) { if (isRGB) { switch (bits_per_pixel) { case 8: do_DrawStringPlanar(width, height, dstps, pitches, logXRatioUV, logYRatioUV, planecount, bits_per_pixel, current_font, x, y, s_remapped, color, halocolor, align, useHalocolor, chromalocation); break; case 10: case 12: case 14: case 16: do_DrawStringPlanar(width, height, dstps, pitches, logXRatioUV, logYRatioUV, planecount, bits_per_pixel, current_font, x, y, s_remapped, color, halocolor, align, useHalocolor, chromalocation); break; case 32: do_DrawStringPlanar(width, height, dstps, pitches, logXRatioUV, logYRatioUV, planecount, bits_per_pixel, current_font, x, y, s_remapped, color, halocolor, align, useHalocolor, chromalocation); break; } } else { switch (bits_per_pixel) { case 8: do_DrawStringPlanar(width, height, dstps, pitches, logXRatioUV, logYRatioUV, planecount, bits_per_pixel, current_font, x, y, s_remapped, color, halocolor, align, useHalocolor, chromalocation); break; case 10: case 12: case 14: case 16: do_DrawStringPlanar(width, height, dstps, pitches, logXRatioUV, logYRatioUV, planecount, bits_per_pixel, current_font, x, y, s_remapped, color, halocolor, align, useHalocolor, chromalocation); break; case 32: do_DrawStringPlanar(width, height, dstps, pitches, logXRatioUV, logYRatioUV, planecount, bits_per_pixel, current_font, x, y, s_remapped, color, halocolor, align, useHalocolor, chromalocation); break; } } } else { if (isRGB) { switch (bits_per_pixel) { case 8: do_DrawStringPlanar(width, height, dstps, pitches, logXRatioUV, logYRatioUV, planecount, bits_per_pixel, current_font, x, y, s_remapped, color, halocolor, align, useHalocolor, chromalocation); break; case 10: case 12: case 14: case 16: do_DrawStringPlanar(width, height, dstps, pitches, logXRatioUV, logYRatioUV, planecount, bits_per_pixel, current_font, x, y, s_remapped, color, halocolor, align, useHalocolor, chromalocation); break; case 32: do_DrawStringPlanar(width, height, dstps, pitches, logXRatioUV, logYRatioUV, planecount, bits_per_pixel, current_font, x, y, s_remapped, color, halocolor, align, useHalocolor, chromalocation); break; } } else { switch (bits_per_pixel) { case 8: do_DrawStringPlanar(width, height, dstps, pitches, logXRatioUV, logYRatioUV, planecount, bits_per_pixel, current_font, x, y, s_remapped, color, halocolor, align, useHalocolor, chromalocation); break; case 10: case 12: case 14: case 16: do_DrawStringPlanar(width, height, dstps, pitches, logXRatioUV, logYRatioUV, planecount, bits_per_pixel, current_font, x, y, s_remapped, color, halocolor, align, useHalocolor, chromalocation); break; case 32: do_DrawStringPlanar(width, height, dstps, pitches, logXRatioUV, logYRatioUV, planecount, bits_per_pixel, current_font, x, y, s_remapped, color, halocolor, align, useHalocolor, chromalocation); break; } } } } void SimpleTextOutW(BitmapFont *current_font, const VideoInfo& vi, PVideoFrame& frame, int real_x, int real_y, std::string& text_utf8, bool fadeBackground, int textcolor, int halocolor, bool useHaloColor, int align, int chromalocation) { DrawString_internal(current_font, vi, frame, real_x, real_y, text_utf8, textcolor, halocolor, useHaloColor, align, fadeBackground, chromalocation); // fully transparent background } // additional parameter: lsp line spacing void SimpleTextOutW_multi(BitmapFont *current_font, const VideoInfo& vi, PVideoFrame& frame, int real_x, int real_y, std::string& text_utf8, bool fadeBackground, int textcolor, int halocolor, bool useHaloColor, int align, int lsp, int chromalocation) { // make list governed by LF separator std::string temp; std::vector parts; std::stringstream ss(text_utf8); while (std::getline(ss, temp, '\n')) parts.push_back(temp); // still in utf8 // It doesn't result in a new line if the last character is \n and is followed by nothing. // "Line1\nLine2" is the same as "Line1\nLine2\n" // Like in SubTitle /* if(!text.empty()) { if( *text.rbegin() == '\n') parts.push_back(""); } */ const int fontSize = current_font->global_bbx.height; // when multiline, bottom and vertically centered cases affect starting y // lsp units are in 1/8 pixels by definition int al = alignToBitmask(align); if (al & ATA_BOTTOM) real_y -= (int)((fontSize + lsp / 8.0) * ((int)parts.size() - 1) + 0.5); else if (al & ATA_BASELINE) real_y -= (int)((fontSize + lsp / 8.0) * (int)(parts.size() - 1) / 2.0 + 0.5); const int orig_real_y = real_y; int linecount = 0; for (auto s_utf8 : parts) { real_y = orig_real_y + fontSize * linecount + (int)(lsp / 8.0 * linecount + 0.5); SimpleTextOutW(current_font, vi, frame, real_x, real_y, s_utf8, fadeBackground, textcolor, halocolor, useHaloColor, align, chromalocation); linecount++; } } // Old legacy info.h functions, but with utf8 mode // w/o outline, originally with ASCII input, background fading // Despite name Planar, it works for all formats void DrawStringPlanar(VideoInfo& vi, PVideoFrame& dst, int x, int y, const char* s) { int color; if (vi.IsRGB()) color = (250 << 16) + (250 << 8) + (250); else color = (230 << 16) + (128 << 8) + (128); // fadeBackground = true: background letter area is faded instead not being untouched. std::string s_utf8 = charToUtf8(s, false); int halocolor = 0; std::unique_ptr current_font = GetBitmapFont(20, "info_h", false, false); // 10x20 if (current_font == nullptr) return; DrawString_internal(current_font.get(), vi, dst, x, y, s_utf8, color, halocolor, false, // don't use halocolor 0 /* no align */, true, // fadeBackGround ChromaLocation_e::AVS_CHROMA_LEFT ); } void DrawStringYUY2(VideoInfo& vi, PVideoFrame& dst, int x, int y, const char* s) { DrawStringPlanar(vi, dst, x, y, s); } // legacy function w/o outline, originally with ASCII input, background fading void DrawStringRGB24(VideoInfo &vi, PVideoFrame& dst, int x, int y, const char* s) { DrawStringPlanar(vi, dst, x, y, s); } // legacy function w/o outline, originally with ASCII input, background fading void DrawStringRGB32(VideoInfo& vi, PVideoFrame& dst, int x, int y, const char* s) { DrawStringPlanar(vi, dst, x, y, s); } ================================================ FILE: avs_core/core/info.h ================================================ // Avisynth+ // https://avs-plus.net // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __INFO_H__ #define __INFO_H__ #ifdef AVS_LINUX #include #endif #include #include "internal.h" #include #include #include #include #include #include "strings.h" enum ChromaLocationMode { CENTER_411, CENTER_420, LEFT_420, CENTER_422, LEFT_422 }; typedef struct BBX { uint8_t width; // e.g. 8 uint8_t height; // 16 int8_t offset_x; // 0 int8_t offset_y; // -4 } BBX; class PreRendered { const bool useHalocolor; const int vi_width; const int vi_height; public: int x, y; int len; int xstart; int text_width; // draw this amount of pixels starting from horizontal index xstart int ystart; // vertical visibility: starting row in stringbitmap int yend; // vertical visibility: ending row in stringbitmap int stringbitmap_height; // font height plus optinally added top/bottom line const int safety_bits_x_left; // extra leftside playground for chroma rendering const int safety_bits_x_right; // extra rightside playground for chroma rendering std::vector> stringbitmap; std::vector> stringbitmap_outline; PreRendered( const uint8_t* fonts, const int fontline_bytes, const int _vi_width, const int _vi_height, int _x, int _y, // they may change std::vector& s, // it may get shortened const std::vector& bbx_array, const int align, const bool _useHalocolor, const int FONT_WIDTH_notused, const int FONT_HEIGHT, const int _safety_bits_x_left, const int _safety_bits_x_right ); void make_outline(); }; class BitmapFont { int number_of_chars; std::string font_name; std::string font_filename; public: const BBX global_bbx; const bool bold; std::vector font_bitmaps; std::vector bbx_array; // FontBoundingBox BBX array, can be individual for each character const int fontline_bytes; std::unordered_map charReMapUtf8; // utf8 vs. font image index void SaveAsC(const uint16_t* _codepoints); BitmapFont(int _number_of_chars, const uint16_t* _src_font_bitmaps_internaluint16, const uint8_t* _src_font_bitmaps, const int _fontline_bytes, const uint16_t* _codepoints, const std::vector* bbx_array_ptr, const BBX& _global_bbx, std::string _font_name, std::string _font_filename, bool _bold, bool debugSave) : number_of_chars(_number_of_chars), font_name(_font_name), font_filename(_font_filename), global_bbx(_global_bbx), bold(_bold), fontline_bytes(_fontline_bytes) //font_bitmaps(_font_bitmaps), { //fixme: do not copy data const int charline_count = global_bbx.height * number_of_chars; font_bitmaps.resize(charline_count * fontline_bytes); if (_src_font_bitmaps != nullptr) std::memcpy(font_bitmaps.data(), _src_font_bitmaps, font_bitmaps.size()); else { // this must be an internal, predefined array // copy uint16_t array to byte array MSB-LSB order // fontline_bytes is 2 const uint16_t* src = _src_font_bitmaps_internaluint16; uint8_t* dst = font_bitmaps.data(); for (auto i = 0; i < charline_count; i++) { uint16_t one_fontline = src[i]; dst[i * 2] = (uint8_t)(one_fontline >> 8); dst[i * 2 + 1] = (uint8_t)(one_fontline & 0xFF); } } // We always display utf8 strings, so the reverse lookup must be utf8 character based, // which returns the index to the font bitmap and bbx array. for (int i = 0; i < _number_of_chars; i++) { std::string s_utf8 = U16_to_utf8(_codepoints[i]); charReMapUtf8[s_utf8] = i; } // Many East Asian characters—especially CJK (Chinese, Japanese, Korean) ideographs // are typically double-width compared to Latin characters when used in monospaced bitmap // fonts like BDF. // For Avisynth-embedded internal fonts (e.g., Terminus, Info_H), only a fixed global BBX is used, // as these fonts do not include CJK characters, only Latin, Cyrillic, and Greek. // The variable BBX array is optional and is intended for use with external fonts, // such as unifont-16.0.04.bdf, where CJK characters have different BBX values // compared to Latin characters. if (bbx_array_ptr != nullptr) { // copy BBX array if provided bbx_array.insert(bbx_array.end(), bbx_array_ptr->begin(), bbx_array_ptr->end()); } else { // When no BBX array was provided (bbx_array_ptr is nullptr) // fill bbx_array with constant default global values bbx_array.assign(_number_of_chars, global_bbx); } if (debugSave) SaveAsC(_codepoints); } // helper function for remapping an utf8 string to font index entry list std::vector remap(const std::string& s_utf8); }; std::unique_ptr GetBitmapFont(int size, const char* name, bool bold, bool debugSave); void SimpleTextOutW(BitmapFont* current_font, const VideoInfo& vi, PVideoFrame& frame, int real_x, int real_y, std::string& text_utf8, bool fadeBackground, int textcolor, int halocolor, bool useHaloColor, int align, int chromaplacement); void SimpleTextOutW_multi(BitmapFont* current_font, const VideoInfo& vi, PVideoFrame& frame, int real_x, int real_y, std::string& text_utf8, bool fadeBackground, int textcolor, int halocolor, bool useHaloColor, int align, int lsp, int chromaplacement); // legacy function w/o outline, originally with ASCII input, background fading void DrawStringPlanar(VideoInfo& vi, PVideoFrame& dst, int x, int y, const char* s); void DrawStringYUY2(VideoInfo& vi, PVideoFrame& dst, int x, int y, const char* s); void DrawStringRGB32(VideoInfo& vi, PVideoFrame& dst, int x, int y, const char* s); void DrawStringRGB24(VideoInfo& vi, PVideoFrame& dst, int x, int y, const char* s); #endif // __INFO_H__ ================================================ FILE: avs_core/core/initguid.cpp ================================================ // Avisynth v2.5. Copyright 2007 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #define INITGUID #ifdef AVS_WINDOWS #define WIN32_LEAN_AND_MEAN #include #pragma warning( push ) #pragma warning (disable: 4201) // nonstandard extension used : nameless struct/union #include #pragma warning( pop ) // Just init the guid tables #endif ================================================ FILE: avs_core/core/interface.cpp ================================================ // Avisynth v2.5. Copyright 2002, 2005 Ben Rudiak-Gould et al. // Avisynth v2.6. Copyright 2006 Klaus Post. // Avisynth v2.6. Copyright 2009 Ian Brabham. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. /* Maintenance notes :- * * All the code here was formally baked into the avisynth.h interface. * * Whenever you modify any code here please keep and mark the original * code with a block comment beginning with the word "Baked" * * Be mindful with changes you do make that previous 2.5 plugins will * still have the original code active. This may require other defensive * or mitigating code elsewhere. */ #include #ifdef AVS_WINDOWS #include #else #include #endif #include "InternalEnvironment.h" #include "DeviceManager.h" #include "AVSMap.h" #include "function.h" #include "assert.h" /**********************************************************************/ // struct VideoInfo // useful functions of the above bool VideoInfo::HasVideo() const { return (width!=0); } bool VideoInfo::HasAudio() const { return (audio_samples_per_second!=0); } bool VideoInfo::IsRGB() const { return !!(pixel_type&CS_BGR); } bool VideoInfo::IsRGB24() const { return ((pixel_type & CS_BGR24) == CS_BGR24) && ((pixel_type & CS_Sample_Bits_Mask) == CS_Sample_Bits_8); } // Clear out additional properties bool VideoInfo::IsRGB32() const { return ((pixel_type & CS_BGR32) == CS_BGR32) && ((pixel_type & CS_Sample_Bits_Mask) == CS_Sample_Bits_8); } bool VideoInfo::IsYUV() const { return !!(pixel_type&CS_YUV ); } bool VideoInfo::IsYUY2() const { return (pixel_type & CS_YUY2) == CS_YUY2; } bool VideoInfo::IsYV24() const { return (pixel_type & CS_PLANAR_MASK) == (CS_YV24 & CS_PLANAR_FILTER); } bool VideoInfo::IsYV16() const { return (pixel_type & CS_PLANAR_MASK) == (CS_YV16 & CS_PLANAR_FILTER); } bool VideoInfo::IsYV12() const { return (pixel_type & CS_PLANAR_MASK) == (CS_YV12 & CS_PLANAR_FILTER); } bool VideoInfo::IsY8() const { return (pixel_type & CS_PLANAR_MASK) == (CS_Y8 & CS_PLANAR_FILTER); } bool VideoInfo::IsYV411() const { return (pixel_type & CS_PLANAR_MASK) == (CS_YV411 & CS_PLANAR_FILTER); } //bool VideoInfo::IsYUV9() const { return (pixel_type & CS_PLANAR_MASK) == (CS_YUV9 & CS_PLANAR_FILTER); } /* Baked ******************** bool VideoInfo::IsColorSpace(int c_space) const { return ((pixel_type & c_space) == c_space); } Baked ********************/ bool VideoInfo::IsColorSpace(int c_space) const { // This function will check if the colorspace (VideoInfo.pixel_type) is the same as given c_space (or more general it checks for a Colorspace property (see avisynth.h)). // So it's not only for exact colorspace comparison but checking properties also. return IsPlanar() ? ((pixel_type & CS_PLANAR_MASK) == (c_space & CS_PLANAR_FILTER)) : // support exact individual flag checking c_space == CS_YUVA ? ((c_space & CS_YUVA) == CS_YUVA) : c_space == CS_BGR ? ((c_space & CS_BGR) == CS_BGR) : c_space == CS_YUV ? ((c_space & CS_YUV) == CS_YUV) : c_space == CS_INTERLEAVED ? ((c_space & CS_INTERLEAVED) == CS_INTERLEAVED) : // RGB got sample bits: // In order to work: RGB64.IsColorSpace(RGB32) => false, or else we get true (RGB64 & RGB32 == RGB32) // Simple ((pixel_type & c_space) == c_space) would not work, does not take into account bit depth ( ((pixel_type & ~CS_Sample_Bits_Mask & c_space) == (c_space & ~CS_Sample_Bits_Mask)) && ((pixel_type & CS_Sample_Bits_Mask) == (c_space & CS_Sample_Bits_Mask)) ); } bool VideoInfo::Is(int property) const { return ((image_type & property)==property ); } bool VideoInfo::IsPlanar() const { return !!(pixel_type & CS_PLANAR); } bool VideoInfo::IsFieldBased() const { return !!(image_type & IT_FIELDBASED); } bool VideoInfo::IsParityKnown() const { return ((image_type & IT_FIELDBASED)&&(image_type & (IT_BFF|IT_TFF))); } bool VideoInfo::IsBFF() const { return !!(image_type & IT_BFF); } bool VideoInfo::IsTFF() const { return !!(image_type & IT_TFF); } /* Baked ******************** bool VideoInfo::IsVPlaneFirst() const {return ((pixel_type & CS_YV12) == CS_YV12); } // Don't use this int VideoInfo::BytesFromPixels(int pixels) const { return pixels * (BitsPerPixel()>>3); } // Will not work on planar images, but will return only luma planes int VideoInfo::RowSize() const { return BytesFromPixels(width); } // Also only returns first plane on planar images int VideoInfo::BMPSize() const { if (IsPlanar()) {int p = height * ((RowSize()+3) & ~3); p+=p>>1; return p; } return height * ((RowSize()+3) & ~3); } int64_t VideoInfo::AudioSamplesFromFrames(int64_t frames) const { return (fps_numerator && HasVideo()) ? ((int64_t)(frames) * audio_samples_per_second * fps_denominator / fps_numerator) : 0; } Baked ********************/ int64_t VideoInfo::AudioSamplesFromFrames(int frames) const { return (fps_numerator && HasVideo()) ? ((int64_t)(frames) * audio_samples_per_second * fps_denominator / fps_numerator) : 0; } int VideoInfo::FramesFromAudioSamples(int64_t samples) const { return (fps_denominator && HasAudio()) ? (int)((samples * fps_numerator)/((int64_t)fps_denominator * audio_samples_per_second)) : 0; } int64_t VideoInfo::AudioSamplesFromBytes(int64_t bytes) const { return HasAudio() ? bytes / BytesPerAudioSample() : 0; } int64_t VideoInfo::BytesFromAudioSamples(int64_t samples) const { return samples * BytesPerAudioSample(); } int VideoInfo::AudioChannels() const { return HasAudio() ? nchannels : 0; } int VideoInfo::SampleType() const{ return sample_type;} bool VideoInfo::IsSampleType(int testtype) const{ return !!(sample_type&testtype);} int VideoInfo::SamplesPerSecond() const { return audio_samples_per_second; } int VideoInfo::BytesPerAudioSample() const { return nchannels*BytesPerChannelSample();} void VideoInfo::SetFieldBased(bool isfieldbased) { if (isfieldbased) image_type|=IT_FIELDBASED; else image_type&=~IT_FIELDBASED; } void VideoInfo::Set(int property) { image_type|=property; } void VideoInfo::Clear(int property) { image_type&=~property; } /* Baked ******************** int VideoInfo::BitsPerPixel() const { switch (pixel_type) { case CS_BGR24: return 24; case CS_BGR32: return 32; case CS_YUY2: return 16; case CS_YV12: case CS_I420: return 12; default: return 0; } } Baked ********************/ int VideoInfo::BytesPerChannelSample() const { switch (sample_type) { case SAMPLE_INT8: return sizeof(unsigned char); case SAMPLE_INT16: return sizeof(signed short); case SAMPLE_INT24: return 3; case SAMPLE_INT32: return sizeof(signed int); case SAMPLE_FLOAT: return sizeof(SFLOAT); default: _ASSERTE("Audio sample type not recognized!"); return 0; } } bool VideoInfo::IsVPlaneFirst() const { return (NumComponents() > 1) && IsPlanar() && (pixel_type & (CS_VPlaneFirst | CS_UPlaneFirst)) == CS_VPlaneFirst; // Shouldn't use this } int VideoInfo::BytesFromPixels(int pixels) const { const int componentSizes[8] = {1,2,4,0,0,2,2,2}; return (NumComponents() > 1) && IsPlanar() ? pixels * componentSizes[(pixel_type>>CS_Shift_Sample_Bits) & 7] : pixels * (BitsPerPixel()>>3); // For planar images, will return luma plane } int VideoInfo::RowSize(int plane) const { const int rowsize = BytesFromPixels(width); switch (plane) { case PLANAR_U: case PLANAR_V: return ((NumComponents() > 1) && IsPlanar() && !IsPlanarRGB() && !IsPlanarRGBA()) ? rowsize>>GetPlaneWidthSubsampling(plane) : 0; case PLANAR_U_ALIGNED: case PLANAR_V_ALIGNED: return ((NumComponents() > 1) && IsPlanar() && !IsPlanarRGB() && !IsPlanarRGBA()) ? ((rowsize>>GetPlaneWidthSubsampling(plane))+FRAME_ALIGN-1)&(~(FRAME_ALIGN-1)) : 0; // Aligned rowsize case PLANAR_Y_ALIGNED: return (rowsize+FRAME_ALIGN-1)&(~(FRAME_ALIGN-1)); // Aligned rowsize case PLANAR_R: case PLANAR_G: case PLANAR_B: return ((NumComponents() > 1) && (IsPlanarRGB() || IsPlanarRGBA())) ? rowsize : 0; case PLANAR_R_ALIGNED: case PLANAR_G_ALIGNED: case PLANAR_B_ALIGNED: return IsPlanarRGB() || IsPlanarRGBA() ? (rowsize+FRAME_ALIGN-1)&(~(FRAME_ALIGN-1)) : 0; // Aligned rowsize case PLANAR_A: return ((NumComponents() == 4) && IsPlanar()) ? rowsize : 0; case PLANAR_A_ALIGNED: return ((NumComponents() == 4) && IsPlanar()) ? (rowsize+FRAME_ALIGN-1)&(~(FRAME_ALIGN-1)) : 0; // Aligned rowsize } return rowsize; } int VideoInfo::BMPSize() const { if ((NumComponents() > 1) && IsPlanar()) { if (IsPlanarRGB() || IsPlanarRGBA()) { return ((RowSize(PLANAR_G) + 3) & ~3) * height * NumComponents(); // does it make sense for planar rgb? } // Y plane const int Ybytes = ((RowSize(PLANAR_Y)+3) & ~3) * height; const int UVbytes = Ybytes >> (GetPlaneWidthSubsampling(PLANAR_U)+GetPlaneHeightSubsampling(PLANAR_U)); return Ybytes + UVbytes*2; } return height * ((RowSize()+3) & ~3); } int VideoInfo::GetPlaneWidthSubsampling(int plane) const { // Subsampling in bitshifts! if (plane == PLANAR_Y || plane == PLANAR_R || plane == PLANAR_G || plane == PLANAR_B || plane == PLANAR_A) // No subsampling return 0; if (NumComponents() == 1) throw AvisynthError("Filter error: GetPlaneWidthSubsampling not available on greyscale pixel type."); if (plane == PLANAR_U || plane == PLANAR_V) { if (IsYUY2()) return 1; else if (IsPlanar()) return ((pixel_type>>CS_Shift_Sub_Width)+1) & 3; else throw AvisynthError("Filter error: GetPlaneWidthSubsampling called with unsupported pixel type."); } throw AvisynthError("Filter error: GetPlaneWidthSubsampling called with unsupported plane."); } int VideoInfo::GetPlaneHeightSubsampling(int plane) const { // Subsampling in bitshifts! if (plane == PLANAR_Y || plane == PLANAR_R || plane == PLANAR_G || plane == PLANAR_B || plane == PLANAR_A) // No subsampling return 0; if (NumComponents() == 1) throw AvisynthError("Filter error: GetPlaneHeightSubsampling not available on greyscale pixel type."); if (plane == PLANAR_U || plane == PLANAR_V) { if (IsYUY2()) return 0; else if (IsPlanar()) return ((pixel_type>>CS_Shift_Sub_Height)+1) & 3; else throw AvisynthError("Filter error: GetPlaneHeightSubsampling called with unsupported pixel type."); } throw AvisynthError("Filter error: GetPlaneHeightSubsampling called with unsupported plane."); } int VideoInfo::BitsPerPixel() const { // Lookup Interleaved, calculate PLANAR's // Remark: // - total bitsize for interleaved/packed types, e.g. RGB48 = 48 = 3x16 // - byte size corrected with U-V subsampling factor for Planar YUV/YUVA // - external softwares may use it for calculating buffer size // - use BitsPerComponent instead for returning the pixel component format 8/10/12/14/16/32 bits switch (pixel_type) { case CS_BGR24: return 24; case CS_BGR32: return 32; case CS_YUY2: return 16; case CS_Y8: return 8; case CS_Y10: case CS_Y12: case CS_Y14: case CS_Y16: // AVS16 return 16; case CS_Y32: return 32; case CS_BGR48: return 48; case CS_BGR64: return 64; } if (IsPlanar()) { const int componentSizes[8] = {1,2,4,0,0,2,2,2}; const int S = (IsYUV() || IsYUVA()) ? GetPlaneWidthSubsampling(PLANAR_U) + GetPlaneHeightSubsampling(PLANAR_U) : 0; // planar RGBA: no subsampling const int fullSizePlaneCount = IsYUVA() || IsPlanarRGBA() ? 2 : 1; // alpha plane is always full size return (((fullSizePlaneCount << S) + 2) * (componentSizes[(pixel_type >> CS_Shift_Sample_Bits) & 7]) * 8) >> S; } return 0; } // useful mutator void VideoInfo::SetFPS(unsigned numerator, unsigned denominator) { if ((numerator == 0) || (denominator == 0)) { fps_numerator = 0; fps_denominator = 1; } else { unsigned x=numerator, y=denominator; while (y) { // find gcd unsigned t = x%y; x = y; y = t; } fps_numerator = numerator/x; fps_denominator = denominator/x; } } // Range protected multiply-divide of FPS void VideoInfo::MulDivFPS(unsigned multiplier, unsigned divisor) { uint64_t numerator = UInt32x32To64(fps_numerator, multiplier); uint64_t denominator = UInt32x32To64(fps_denominator, divisor); uint64_t x=numerator, y=denominator; while (y) { // find gcd uint64_t t = x%y; x = y; y = t; } numerator /= x; // normalize denominator /= x; uint64_t temp = numerator | denominator; // Just looking top bit unsigned u = 0; while (temp & 0xffffffff80000000) { // or perhaps > 16777216*2 temp = Int64ShrlMod32(temp, 1); u++; } if (u) { // Scale to fit const unsigned round = 1 << (u-1); SetFPS( (unsigned)Int64ShrlMod32(numerator + round, u), (unsigned)Int64ShrlMod32(denominator + round, u) ); } else { fps_numerator = (unsigned)numerator; fps_denominator = (unsigned)denominator; } } // Test for same colorspace bool VideoInfo::IsSameColorspace(const VideoInfo& vi) const { if (vi.pixel_type == pixel_type) return TRUE; if (IsYV12() && vi.IsYV12()) return TRUE; return FALSE; } int VideoInfo::NumComponents() const { switch (pixel_type) { case CS_UNKNOWN: return 0; case CS_RAW32: case CS_Y8: case CS_Y10: case CS_Y12: case CS_Y14: case CS_Y16: case CS_Y32: return 1; case CS_BGR32: case CS_BGR64: return 4; // these are not planar but return the count default: return (IsYUVA() || IsPlanarRGBA()) ? 4 : 3; // 3: YUV, planar RGB, 24/48 bit RGB // 4: YUVA and PlanarRGBA } } int VideoInfo::ComponentSize() const { // occupied bytes per one pixel component if(IsPlanar()) { const int componentSizes[8] = {1,2,4,0,0,2,2,2}; return componentSizes[(pixel_type >> CS_Shift_Sample_Bits) & 7]; } switch (pixel_type) { case CS_UNKNOWN: return 0; case CS_RAW32: return 4; case CS_BGR48: case CS_BGR64: return 2; default: // YUY2, packed 8 bit BGRs return 1; } } int VideoInfo::BitsPerComponent() const { // unlike BitsPerPixel, this returns the real // component size as 8/10/12/14/16/32 bit if (pixel_type == CS_YUY2) return 8; else if (pixel_type == CS_RAW32) return 32; // planar YUV/RGB and packed RGB const int componentBitSizes[8] = {8,16,32,0,0,10,12,14}; return componentBitSizes[(pixel_type >> CS_Shift_Sample_Bits) & 7]; } // bit-depth independent helper functions instead of 8 bit specific IsYV24/16/12/8 bool VideoInfo::Is444() const { return ((pixel_type & CS_PLANAR_MASK & ~CS_Sample_Bits_Mask) == (CS_GENERIC_YUV444 & CS_PLANAR_FILTER)) || ((pixel_type & CS_PLANAR_MASK & ~CS_Sample_Bits_Mask) == (CS_GENERIC_YUVA444 & CS_PLANAR_FILTER)) ; } bool VideoInfo::Is422() const { return ((pixel_type & CS_PLANAR_MASK & ~CS_Sample_Bits_Mask) == (CS_GENERIC_YUV422 & CS_PLANAR_FILTER)) || ((pixel_type & CS_PLANAR_MASK & ~CS_Sample_Bits_Mask) == (CS_GENERIC_YUVA422 & CS_PLANAR_FILTER)); } bool VideoInfo::Is420() const { return ((pixel_type & CS_PLANAR_MASK & ~CS_Sample_Bits_Mask) == (CS_GENERIC_YUV420 & CS_PLANAR_FILTER)) || ((pixel_type & CS_PLANAR_MASK & ~CS_Sample_Bits_Mask) == (CS_GENERIC_YUVA420 & CS_PLANAR_FILTER)); } bool VideoInfo::IsY() const { return (pixel_type & CS_PLANAR_MASK & ~CS_Sample_Bits_Mask) == (CS_GENERIC_Y & CS_PLANAR_FILTER); } bool VideoInfo::IsRGB48() const { return ((pixel_type & CS_BGR24) == CS_BGR24) && ((pixel_type & CS_Sample_Bits_Mask) == CS_Sample_Bits_16); } // Clear out additional properties bool VideoInfo::IsRGB64() const { return ((pixel_type & CS_BGR32) == CS_BGR32) && ((pixel_type & CS_Sample_Bits_Mask) == CS_Sample_Bits_16); } bool VideoInfo::IsYUVA() const { return !!(pixel_type&CS_YUVA ); } bool VideoInfo::IsPlanarRGB() const { return !!(pixel_type&CS_PLANAR) && !!(pixel_type&CS_BGR) && !!(pixel_type&CS_RGB_TYPE); } bool VideoInfo::IsPlanarRGBA() const { return !!(pixel_type&CS_PLANAR) && !!(pixel_type&CS_BGR) && !!(pixel_type&CS_RGBA_TYPE); } bool VideoInfo::IsChannelMaskKnown() const { return !!(image_type & IT_HAS_CHANNELMASK); } // Re-maps and stores channel mask into image_type, sets the 'has channel mask' flag as well void VideoInfo::SetChannelMask(bool isChannelMaskKnown, unsigned int dwChannelMask) { if (isChannelMaskKnown) image_type |= IT_HAS_CHANNELMASK; else image_type &= ~IT_HAS_CHANNELMASK; if (!isChannelMaskKnown) dwChannelMask = 0; if (dwChannelMask & AvsChannelMask::MASK_SPEAKER_ALL) // special mapping due to lack of bits in image_type dwChannelMask = AvsImageTypeFlags::IT_SPEAKER_ALL; else { dwChannelMask &= AvsChannelMask::MASK_SPEAKER_DEFINED; dwChannelMask <<= 4; } image_type &= ~AvsImageTypeFlags::IT_SPEAKER_BITS_MASK; image_type |= dwChannelMask; } unsigned int VideoInfo::GetChannelMask() const { // returns zero if not defined if (!IsChannelMaskKnown()) return 0; unsigned int dwChannelMask = image_type & AvsImageTypeFlags::IT_SPEAKER_BITS_MASK; // returns the original SPEAKER_ALL constant if (dwChannelMask == AvsImageTypeFlags::IT_SPEAKER_ALL) return AvsChannelMask::MASK_SPEAKER_ALL; // other SPEAKER bits were simply shifted by 4 bits return dwChannelMask >> 4; } // end struct VideoInfo /**********************************************************************/ // class VideoFrameBuffer const BYTE* VideoFrameBuffer::GetReadPtr() const { return data; } /* Baked ******************** BYTE* VideoFrameBuffer::GetWritePtr() { ++sequence_number; return data; } Baked ********************/ BYTE* VideoFrameBuffer::GetWritePtr() { InterlockedIncrement(&sequence_number); return data; } int VideoFrameBuffer::GetDataSize() const { return data_size; } int VideoFrameBuffer::GetSequenceNumber() const { return sequence_number; } int VideoFrameBuffer::GetRefcount() const { return refcount; } // end class VideoFrameBuffer /**********************************************************************/ // class VideoFrame /* Baked ******************** void VideoFrame::AddRef() { InterlockedIncrement((int *)&refcount); } void VideoFrame::Release() { if (refcount==1) InterlockedDecrement(&vfb->refcount); InterlockedDecrement((int *)&refcount); } int VideoFrame::GetPitch() const { return pitch; } int VideoFrame::GetPitch(int plane) const { switch (plane) {case PLANAR_U: case PLANAR_V: return pitchUV;} return pitch; } int VideoFrame::GetRowSize() const { return row_size; } int VideoFrame::GetRowSize(int plane) const { switch (plane) { case PLANAR_U: case PLANAR_V: if (pitchUV) return row_size>>1; else return 0; case PLANAR_U_ALIGNED: case PLANAR_V_ALIGNED: if (pitchUV) { int r = ((row_size+FRAME_ALIGN-1)&(~(FRAME_ALIGN-1)) )>>1; // Aligned rowsize if (r<=pitchUV) return r; return row_size>>1; } else return 0; case PLANAR_Y_ALIGNED: int r = (row_size+FRAME_ALIGN-1)&(~(FRAME_ALIGN-1)); // Aligned rowsize if (r<=pitch) return r; return row_size; } return row_size; } int VideoFrame::GetHeight() const { return height; } int VideoFrame::GetHeight(int plane) const { switch (plane) {case PLANAR_U: case PLANAR_V: if (pitchUV) return height>>1; return 0;} return height; } // generally you shouldn't use these three VideoFrameBuffer* VideoFrame::GetFrameBuffer() const { return vfb; } int VideoFrame::GetOffset() const { return offset; } int VideoFrame::GetOffset(int plane) const { switch (plane) {case PLANAR_U: return offsetU;case PLANAR_V: return offsetV;default: return offset;}; } const BYTE* VideoFrame::GetReadPtr() const { return vfb->GetReadPtr() + offset; } const BYTE* VideoFrame::GetReadPtr(int plane) const { return vfb->GetReadPtr() + GetOffset(plane); } bool VideoFrame::IsWritable() const { return (refcount == 1 && vfb->refcount == 1); } BYTE* VideoFrame::GetWritePtr() const { if (vfb->GetRefcount()>1) { _ASSERT(FALSE); //throw AvisynthError("Internal Error - refcount was more than one!"); } return IsWritable() ? (vfb->GetWritePtr() + offset) : 0; } Baked ********************/ void VideoFrame::AddRef() { InterlockedIncrement(&refcount); } void VideoFrame::Release() { VideoFrameBuffer* _vfb = vfb; if (!InterlockedDecrement(&refcount)) { // Do NOT touch 'properties' here. The FrameRegistry (under memory_mutex) is the // sole owner: it clears the AVSMap contents for reuse (winner frames) or deletes // it entirely (discarded frames). Freeing or clearing here without that lock would // race with concurrent FrameRegistry access. #ifdef ALTERNATIVE_VFB_TIMESTAMP if (!InterlockedDecrement(&_vfb->refcount)) { // all VideoFrameBuffer instances are actually VFBStorage, which has way mode admin fields VFBHelper::UpdateVFBFreeTimestamp(_vfb); } #else InterlockedDecrement(&_vfb->refcount); #endif } } int VideoFrame::GetPitch(int plane) const { switch (plane) { case PLANAR_U: case PLANAR_V: return pitchUV; case PLANAR_A: return pitchA; } return pitch; } int VideoFrame::GetRowSize(int plane) const { switch (plane) { case PLANAR_U: case PLANAR_V: if (pitchUV) return row_sizeUV; else return 0; case PLANAR_U_ALIGNED: case PLANAR_V_ALIGNED: if (pitchUV) { const int r = (row_sizeUV+FRAME_ALIGN-1)&(~(FRAME_ALIGN-1)); // Aligned rowsize if (r<=pitchUV) return r; return row_sizeUV; } else return 0; case PLANAR_ALIGNED: case PLANAR_Y_ALIGNED: case PLANAR_R_ALIGNED: case PLANAR_G_ALIGNED: case PLANAR_B_ALIGNED: { const int r = (row_size+FRAME_ALIGN-1)&(~(FRAME_ALIGN-1)); // Aligned rowsize if (r<=pitch) return r; return row_size; } case PLANAR_A: if (pitchA) return row_sizeA; else return 0; case PLANAR_A_ALIGNED: if(pitchA) { const int r = (row_sizeA+FRAME_ALIGN-1)&(~(FRAME_ALIGN-1)); // Aligned rowsize if (r<=pitchA) return r; return row_sizeA; } else return 0; } return row_size; // PLANAR_Y, PLANAR_G, PLANAR_B, PLANAR_R } int VideoFrame::GetHeight(int plane) const { switch (plane) { case PLANAR_U: case PLANAR_V: if (pitchUV) return heightUV; return 0; case PLANAR_A: if (pitchA) return height; return 0; } return height; } int VideoFrame::GetPixelType() const { return pixel_type; } void VideoFrame::AmendPixelType(int new_pixel_type) { pixel_type = new_pixel_type; } // Generally you should not be using these two VideoFrameBuffer* VideoFrame::GetFrameBuffer() const { return vfb; } int VideoFrame::GetOffset(int plane) const { switch (plane) { case PLANAR_U: case PLANAR_B: return offsetU; // G is first. Then B,R order like U,V case PLANAR_V: case PLANAR_R: return offsetV; case PLANAR_A: return offsetA; default: return offset; // PLANAR Y, PLANAR_G }; } const BYTE* VideoFrame::GetReadPtr(int plane) const { return vfb->GetReadPtr() + GetOffset(plane); } bool VideoFrame::IsWritable() const { if (refcount == 1 && vfb->refcount == 1) { vfb->GetWritePtr(); // Bump sequence number return true; } return false; } bool VideoFrame::IsPropertyWritable() const { return (refcount == 1); } BYTE* VideoFrame::GetWritePtr(int plane) const { if (!plane || plane == PLANAR_Y || plane == PLANAR_G) { // planar RGB order GBR if (vfb->GetRefcount()>1) { _ASSERT(FALSE); // throw AvisynthError("Internal Error - refcount was more than one!"); } return (refcount == 1 && vfb->refcount == 1) ? vfb->GetWritePtr() + GetOffset(plane) : 0; } return vfb->data + GetOffset(plane); } AVSMap& VideoFrame::getProperties() { return *properties; } const AVSMap& VideoFrame::getConstProperties() { return *properties; } void VideoFrame::setProperties(const AVSMap& properties) { *(this->properties) = properties; } PDevice VideoFrame::GetDevice() const { return vfb->device; } int VideoFrame::CheckMemory() const { #ifdef _DEBUG if (vfb->data && vfb->device->device_type == DEV_TYPE_CPU) { // check buffer overrun int *pInt = (int *)(vfb->data + vfb->data_size); if (pInt[0] != 0xDEADBEEF || pInt[1] != 0xDEADBEEF || pInt[2] != 0xDEADBEEF || pInt[3] != 0xDEADBEEF) { return 1; } return 0; } #endif return -1; } /* Baked ******************** VideoFrame::~VideoFrame() { InterlockedDecrement(&vfb->refcount); } Baked ********************/ VideoFrame::~VideoFrame() { DESTRUCTOR(); } void VideoFrame::DESTRUCTOR() { Release(); // finally destroyed when removed from FrameRegistry if (properties) { delete properties; properties = nullptr; } } // end class VideoFrame /**********************************************************************/ // class IClip /* Baked ******************** void IClip::AddRef() { InterlockedIncrement((int *)&refcnt); } void IClip::Release() { InterlockedDecrement((int *)&refcnt); if (!refcnt) delete this; } Baked ********************/ void IClip::AddRef() { InterlockedIncrement(&refcnt); } void IClip::Release() { if (!InterlockedDecrement(&refcnt)) delete this; } // end class IClip /**********************************************************************/ // class PClip IClip* PClip::GetPointerWithAddRef() const { if (p) p->AddRef(); return p; } void PClip::Init(IClip* x) { if (x) x->AddRef(); p=x; } void PClip::Set(IClip* x) { if (x) x->AddRef(); if (p) p->Release(); p=x; } PClip::PClip() { CONSTRUCTOR0(); } void PClip::CONSTRUCTOR0() { p = 0; } PClip::PClip(const PClip& x) { CONSTRUCTOR1(x); } void PClip::CONSTRUCTOR1(const PClip& x) { Init(x.p); } PClip::PClip(IClip* x) { CONSTRUCTOR2(x); } void PClip::CONSTRUCTOR2(IClip* x) { Init(x); } void PClip::operator=(IClip* x) { OPERATOR_ASSIGN0(x); } void PClip::OPERATOR_ASSIGN0(IClip* x) { Set(x); } void PClip::operator=(const PClip& x) { OPERATOR_ASSIGN1(x); } void PClip::OPERATOR_ASSIGN1(const PClip& x) { Set(x.p); } PClip::~PClip() { DESTRUCTOR(); } void PClip::DESTRUCTOR() { if (p) p->Release(); } // end class PClip /**********************************************************************/ // class PVideoFrame void PVideoFrame::Init(VideoFrame* x) { if (x) x->AddRef(); p=x; } void PVideoFrame::Set(VideoFrame* x) { if (x) x->AddRef(); if (p) p->Release(); p=x; } PVideoFrame::PVideoFrame() { CONSTRUCTOR0(); } void PVideoFrame::CONSTRUCTOR0() { p = 0; } PVideoFrame::PVideoFrame(const PVideoFrame& x) { CONSTRUCTOR1(x); } void PVideoFrame::CONSTRUCTOR1(const PVideoFrame& x) { Init(x.p); } PVideoFrame::PVideoFrame(VideoFrame* x) { CONSTRUCTOR2(x); } void PVideoFrame::CONSTRUCTOR2(VideoFrame* x) { Init(x); } void PVideoFrame::operator=(VideoFrame* x) { OPERATOR_ASSIGN0(x); } void PVideoFrame::OPERATOR_ASSIGN0(VideoFrame* x) { Set(x); } void PVideoFrame::operator=(const PVideoFrame& x) { OPERATOR_ASSIGN1(x); } void PVideoFrame::OPERATOR_ASSIGN1(const PVideoFrame& x) { Set(x.p); } PVideoFrame::~PVideoFrame() { DESTRUCTOR(); } void PVideoFrame::DESTRUCTOR() { if (p) p->Release(); } // end class PVideoFrame /**********************************************************************/ // class AVSValue AVSValue::AVSValue() { CONSTRUCTOR0(); } void AVSValue::CONSTRUCTOR0() { type = 'v'; array_size = 0; clip = NULL; } AVSValue::AVSValue(IClip* c) { CONSTRUCTOR1(c); } void AVSValue::CONSTRUCTOR1(IClip* c) { type = 'c'; array_size = 0; clip = c; if (c) c->AddRef(); } AVSValue::AVSValue(const PClip& c) { CONSTRUCTOR2(c); } void AVSValue::CONSTRUCTOR2(const PClip& c) { type = 'c'; array_size = 0; clip = c.GetPointerWithAddRef(); } AVSValue::AVSValue(bool b) { CONSTRUCTOR3(b); } void AVSValue::CONSTRUCTOR3(bool b) { type = 'b'; array_size = 0; clip = NULL; boolean = b; } AVSValue::AVSValue(int i) { CONSTRUCTOR4(i); } void AVSValue::CONSTRUCTOR4(int i) { type = 'i'; array_size = 0; clip = NULL; integer = i; } AVSValue::AVSValue(float f) { CONSTRUCTOR5(f); } void AVSValue::CONSTRUCTOR5(float f) { type = 'f'; array_size = 0; clip = NULL; floating_pt = f; } AVSValue::AVSValue(double f) { CONSTRUCTOR6(f); } void AVSValue::CONSTRUCTOR6(double f) { type = 'd'; array_size = 0; clip = NULL; #if UINTPTR_MAX >= 0xffffffffffffffff // pre-v11: floating_pt = float(f); double_pt = f; // v11: real 64 bit double! #else double_pt_ptr = new double; *double_pt_ptr = f; #endif } AVSValue::AVSValue(const char* s) { CONSTRUCTOR7(s); } void AVSValue::CONSTRUCTOR7(const char* s) { type = 's'; array_size = 0; string = s; } /* Baked ******************** AVSValue::AVSValue(const AVSValue* a, int size) { type = 'a'; array = a; array_size = size; } Baked ********************/ AVSValue::AVSValue(const AVSValue& a, int size) { CONSTRUCTOR8(&a, size); } AVSValue::AVSValue(const AVSValue* a, int size) { CONSTRUCTOR8(a, size); } void AVSValue::CONSTRUCTOR8(const AVSValue* a, int size) { type = 'a'; array_size = (short)size; if (a == nullptr) size = 0; array = new AVSValue[size]; // even for size = 0 a valid ptr is given for (int i = 0; i < size; i++) { const_cast(array)[i].Assign(&a[i], true); // init from source } } AVSValue::AVSValue(const AVSValue& v) { CONSTRUCTOR9(v); } void AVSValue::CONSTRUCTOR9(const AVSValue& v) { Assign(&v, true); } // from compatibility interface AVSValue::AVSValue(const AVSValue& v, bool no_deep_arrays) { CONSTRUCTOR10(v, no_deep_arrays); } void AVSValue::CONSTRUCTOR10(const AVSValue& v, bool no_deep_arrays) { Assign2(&v, true, no_deep_arrays); } AVSValue::AVSValue(const PFunction& n) { CONSTRUCTOR11(n); } void AVSValue::CONSTRUCTOR11(const PFunction& n) { type = 'n'; array_size = 0; function = n.GetPointerWithAddRef(); } AVSValue::AVSValue(int64_t l) { CONSTRUCTOR12(l); } void AVSValue::CONSTRUCTOR12(int64_t l) { type = 'l'; array_size = 0; clip = NULL; #if UINTPTR_MAX >= 0xffffffffffffffff longlong = l; #else longlong_ptr = new int64_t; *longlong_ptr = l; #endif } AVSValue::~AVSValue() { DESTRUCTOR(); } void AVSValue::DESTRUCTOR() { if (IsClip() && clip) clip->Release(); if (IsFunction() && function) function->Release(); #if !(UINTPTR_MAX >= 0xffffffffffffffff) // 32-bit systems support 64-bit data through dynamic allocation. if (type == 'l' && longlong_ptr) { delete longlong_ptr; longlong_ptr = nullptr; } else if (type == 'd' && double_pt_ptr) { delete double_pt_ptr; double_pt_ptr = nullptr; } #endif if (IsArray() && array) { delete[] array; // calls AVSValue destructors for all elements array = nullptr; } } void AVSValue::MarkArrayAsNonDeepCopy() { // Convert AVSValue content to a neutral 'v' type // to prevent destructor from freeing up the allocated array // and its elements. // Set just before releasing AVSValue. if (type == 'a') { type = 'v'; array_size = 0; array = nullptr; } } AVSValue& AVSValue::operator=(const AVSValue& v) { return OPERATOR_ASSIGN(v); } AVSValue& AVSValue::OPERATOR_ASSIGN(const AVSValue& v) { Assign(&v, false); return *this; } // pre-v11: Transparently allow 'int' to be treated as 'float'. // No int<->bool conversions. // v11 64 bit value changes: // - 'long' is int64_t. // - IsInt returns true for both 'long' and 'int' // - IsLong returns true only for exact 64-bit integer type // - Transparently allow 'long' and 'int' to be treated as 'float' or 'double' // - IsFloat returns true for both 'float' and 'double' (old IsFloat + 'double'). // - new IsFloatfStrict returns true only for 32-bit floating-point numbers. // - new IsLongStrict returns true only for exact 64-bit integer types. // Note: Exact type check is available GetType() with returns AvsValueType enum bool AVSValue::Defined() const { return type != 'v'; } bool AVSValue::IsClip() const { return type == 'c'; } bool AVSValue::IsBool() const { return type == 'b'; } bool AVSValue::IsInt() const { return type == 'i' || type == 'l'; } bool AVSValue::IsLongStrict() const { return type == 'l'; } bool AVSValue::IsFloat() const { return type == 'd' || type == 'f' || type == 'i' || type == 'l'; } bool AVSValue::IsFloatfStrict() const { return type == 'f'; } bool AVSValue::IsString() const { return type == 's'; } bool AVSValue::IsArray() const { return type == 'a'; } bool AVSValue::IsFunction() const { return type == 'n'; } PClip AVSValue::AsClip() const { _ASSERTE(IsClip()); return IsClip()?clip:0; } bool AVSValue::AsBool1() const { _ASSERTE(IsBool()); return boolean; } bool AVSValue::AsBool() const { return AsBool1(); } int AVSValue::AsInt1() const { _ASSERTE(IsInt()); // simple typecast, no saturation #if UINTPTR_MAX >= 0xffffffffffffffff return type == 'i' ? integer : (int)longlong; #else return type == 'i' ? integer : (int)*longlong_ptr; #endif } int AVSValue::AsInt() const { return AsInt1(); } int64_t AVSValue::AsLong1() const { _ASSERTE(IsInt()); #if UINTPTR_MAX >= 0xffffffffffffffff return type == 'i' ? integer : longlong; #else return type == 'i' ? integer : *longlong_ptr; #endif } int64_t AVSValue::AsLong() const { return AsLong1(); } const char* AVSValue::AsString1() const { _ASSERTE(IsString()); return IsString()?string:0; } const char* AVSValue::AsString() const { return AVSValue::AsString1(); } double AVSValue::AsFloat1() const { #if UINTPTR_MAX >= 0xffffffffffffffff _ASSERTE(IsFloat()); return type == 'i' ? (double)integer : type == 'l' ? (double)longlong : type == 'f' ? (double)floating_pt : double_pt; #else _ASSERTE(IsFloat()); return type == 'i' ? (double)integer : type == 'l' ? (double)*longlong_ptr : type == 'f' ? (double)floating_pt : *double_pt_ptr; #endif } double AVSValue::AsFloat() const { return AsFloat1(); } float AVSValue::AsFloatf() const { #if UINTPTR_MAX >= 0xffffffffffffffff _ASSERTE(IsFloat()); return type == 'i' ? (float)integer : type == 'l' ? (float)longlong : type == 'f' ? floating_pt : (float)double_pt; #else _ASSERTE(IsFloat()); return type == 'i' ? (float)integer : type == 'l' ? (float)*longlong_ptr : type == 'f' ? floating_pt : (float)*double_pt_ptr; #endif } bool AVSValue::AsBool2(bool def) const { _ASSERTE(IsBool()||!Defined()); return IsBool() ? boolean : def; } bool AVSValue::AsBool(bool def) const { return AsBool2(def); } int AVSValue::AsInt2(int def) const { _ASSERTE(IsInt()||!Defined()); #if UINTPTR_MAX >= 0xffffffffffffffff return type == 'i' ? integer : type == 'l' ? (int)longlong : def; #else return type == 'i' ? integer : type == 'l' ? (int)*longlong_ptr : def; #endif } int AVSValue::AsInt(int def) const { return AsInt2(def); } int64_t AVSValue::AsLong2(int64_t def) const { _ASSERTE(IsInt() || !Defined()); #if UINTPTR_MAX >= 0xffffffffffffffff return type == 'i' ? integer : type == 'l' ? longlong : def; #else return type == 'i' ? integer : type == 'l' ? *longlong_ptr : def; #endif } int64_t AVSValue::AsLong(int64_t def) const { return AsLong2(def); } double AVSValue::AsDblDef(double def) const { _ASSERTE(IsFloat()||!Defined()); #if UINTPTR_MAX >= 0xffffffffffffffff return type == 'i' ? (double)integer : type == 'l' ? (double)longlong : type == 'f' ? (double)floating_pt : type == 'd' ? double_pt : def; #else return type == 'i' ? (double)integer : type == 'l' ? (double)*longlong_ptr : type == 'f' ? (double)floating_pt : type == 'd' ? *double_pt_ptr : def; #endif } double AVSValue::AsFloat2(float def) const { _ASSERTE(IsFloat()||!Defined()); #if UINTPTR_MAX >= 0xffffffffffffffff return type == 'i' ? integer : type == 'l' ? (double)longlong : type == 'f' ? (double)floating_pt : type == 'd' ? double_pt : (double)def; #else return type == 'i' ? integer : type == 'l' ? (double)*longlong_ptr : type == 'f' ? (double)floating_pt : type == 'd' ? *double_pt_ptr : (double)def; #endif } double AVSValue::AsFloat(float def) const { return AsFloat2(def); } float AVSValue::AsFloatf(float def) const { return float( AsFloat2(def) ); } const char* AVSValue::AsString2(const char* def) const { _ASSERTE(IsString()||!Defined()); return IsString() ? string : def; } const char* AVSValue::AsString(const char* def) const { return AVSValue::AsString2(def); } PFunction AVSValue::AsFunction() const { _ASSERTE(IsFunction()); return IsFunction() ? function : 0; } int AVSValue::ArraySize() const { _ASSERTE(IsArray()) ; return IsArray() ? array_size : 1; } const AVSValue& AVSValue::operator[](int index) const { return OPERATOR_INDEX(index); } const AVSValue& AVSValue::OPERATOR_INDEX(int index) const { _ASSERTE(IsArray() && index>=0 && index=0 && indexIsClip() && src->clip) src->clip->AddRef(); if (src->IsFunction() && src->function) src->function->AddRef(); // The left side of the assignment ("this") will be overwritten by "src", // so it should be released or freed if necessary. // The relevant properties must be released/dereferenced at the end: // clip, array, function, double_pt_ptr and longlong_ptr // Since they share the same pointer, saving (void*)clip would do it; const bool shouldReleaseClip = !init && IsClip() && clip; const bool shouldReleaseFunction = !init && IsFunction() && function; const bool shouldReleaseArray = !init && IsArray() && array && !no_deep_arrays; #if !(UINTPTR_MAX >= 0xffffffffffffffff) const bool shouldReleaseDouble = !init && type == 'd' && double_pt_ptr; const bool shouldReleaseLong = !init && type == 'l' && longlong_ptr; #endif void* prev_pointer_to_release = (void*)clip; // common fields this->type = src->type; this->array_size = src->array_size; // no_deep_arrays: compatibility for AVS2.5: don't free or deep copy array elements! if (src->IsArray() && !no_deep_arrays) { // Delay releasing the previous array to avoid the args = args[0] case. // If an existing array were freed before this point, it would break the // value = value[x] case where the source value[x] is not an array. // Even for size == 0, this returns a valid pointer. AVSValue* tmp = new AVSValue[array_size]; for (int i = 0; i < array_size; i++) tmp[i].Assign(&src->array[i], true); // init from source array = tmp; } #if !(UINTPTR_MAX >= 0xffffffffffffffff) // 32 bit Avisynth: new 64 bit types are specially treated else if (this->type == 'l') { const uint64_t l = *src->longlong_ptr; this->longlong_ptr = new int64_t; *this->longlong_ptr = l; } else if (this->type == 'd') { const double d = *src->double_pt_ptr; this->double_pt_ptr = new double; *this->double_pt_ptr = d; } #endif else { this->clip = (IClip*)((void*)src->clip); // "clip" is the largest member of the union, making sure we copy everything } if (shouldReleaseClip) ((IClip*)prev_pointer_to_release)->Release(); if (shouldReleaseFunction) ((IFunction*)prev_pointer_to_release)->Release(); if (shouldReleaseArray) delete[](AVSValue*)(prev_pointer_to_release); // deallocates former array memory + calls destructor of AVSValue elements #if !(UINTPTR_MAX >= 0xffffffffffffffff) if (shouldReleaseDouble) delete (double*)prev_pointer_to_release; else if (shouldReleaseLong) delete (int64_t*)prev_pointer_to_release; #endif } AvsValueType AVSValue::GetType() const { return (AvsValueType)type; } // end class AVSValue /**********************************************************************/ PFunction::PFunction() { CONSTRUCTOR0(); } void PFunction::CONSTRUCTOR0() { Init(0); } PFunction::PFunction(IFunction* p) { CONSTRUCTOR1(p); } void PFunction::CONSTRUCTOR1(IFunction* p) { Init(p); } PFunction::PFunction(const PFunction& p) { CONSTRUCTOR2(p); } void PFunction::CONSTRUCTOR2(const PFunction& p) { Init(p.e); } PFunction& PFunction::operator=(IFunction* p) { return OPERATOR_ASSIGN0(p); } PFunction& PFunction::OPERATOR_ASSIGN0(IFunction* p) { Set(p); return *this; } PFunction& PFunction::operator=(const PFunction& p) { return OPERATOR_ASSIGN1(p); } PFunction& PFunction::OPERATOR_ASSIGN1(const PFunction& p) { Set(p.e); return *this; } PFunction::~PFunction() { DESTRUCTOR(); } void PFunction::DESTRUCTOR() { if (e) e->Release(); } IFunction * PFunction::GetPointerWithAddRef() const { if (e) e->AddRef(); return e; } void PFunction::Init(IFunction* p) { e = p; if (e) e->AddRef(); } void PFunction::Set(IFunction* p) { if (p) p->AddRef(); if (e) e->Release(); e = p; } PDevice::PDevice() { CONSTRUCTOR0(); } void PDevice::CONSTRUCTOR0() { e = 0; } PDevice::PDevice(Device* p) { CONSTRUCTOR1(p); } void PDevice::CONSTRUCTOR1(Device* p) { e = p; } PDevice::PDevice(const PDevice& p) { CONSTRUCTOR2(p); } void PDevice::CONSTRUCTOR2(const PDevice& p) { e = p.e; } PDevice& PDevice::operator=(Device* p) { return OPERATOR_ASSIGN0(p); } PDevice& PDevice::OPERATOR_ASSIGN0(Device* p) { e = p; return *this; } PDevice& PDevice::operator=(const PDevice& p) { return OPERATOR_ASSIGN1(p); } PDevice& PDevice::OPERATOR_ASSIGN1(const PDevice& p) { e = p.e; return *this; } PDevice::~PDevice() { } void PDevice::DESTRUCTOR() { } AvsDeviceType PDevice::GetType() const { return e ? e->device_type : DEV_TYPE_NONE; } int PDevice::GetId() const { return e ? e->device_id : -1; } int PDevice::GetIndex() const { return e ? e->device_index : -1; } const char* PDevice::GetName() const { return e ? e->GetName() : nullptr; } INeoEnv* __stdcall GetAvsEnv(IScriptEnvironment* env) { return static_cast(env); } PNeoEnv::PNeoEnv(IScriptEnvironment* env) : p(static_cast(env)) { } PNeoEnv::operator IScriptEnvironment2* () { return static_cast(p); } /**********************************************************************/ static const AVS_Linkage avs_linkage = { // struct AVS_Linkage { sizeof(AVS_Linkage), // int Size; /***************************************************************************************************************/ // struct VideoInfo &VideoInfo::HasVideo, // bool (VideoInfo::*HasVideo)() const; &VideoInfo::HasAudio, // bool (VideoInfo::*HasAudio)() const; &VideoInfo::IsRGB, // bool (VideoInfo::*IsRGB)() const; &VideoInfo::IsRGB24, // bool (VideoInfo::*IsRGB24)() const; &VideoInfo::IsRGB32, // bool (VideoInfo::*IsRGB32)() const; &VideoInfo::IsYUV, // bool (VideoInfo::*IsYUV)() const; &VideoInfo::IsYUY2, // bool (VideoInfo::*IsYUY2)() const; &VideoInfo::IsYV24, // bool (VideoInfo::*IsYV24)() const; &VideoInfo::IsYV16, // bool (VideoInfo::*IsYV16)() const; &VideoInfo::IsYV12, // bool (VideoInfo::*IsYV12)() const; &VideoInfo::IsYV411, // bool (VideoInfo::*IsYV411)() const; &VideoInfo::IsY8, // bool (VideoInfo::*IsY8)() const; &VideoInfo::IsColorSpace, // bool (VideoInfo::*IsColorSpace)(int c_space) const; &VideoInfo::Is, // bool (VideoInfo::*Is)(int property) const; &VideoInfo::IsPlanar, // bool (VideoInfo::*IsPlanar)() const; &VideoInfo::IsFieldBased, // bool (VideoInfo::*IsFieldBased)() const; &VideoInfo::IsParityKnown, // bool (VideoInfo::*IsParityKnown)() const; &VideoInfo::IsBFF, // bool (VideoInfo::*IsBFF)() const; &VideoInfo::IsTFF, // bool (VideoInfo::*IsTFF)() const; &VideoInfo::IsVPlaneFirst, // bool (VideoInfo::*IsVPlaneFirst)() const; &VideoInfo::BytesFromPixels, // int (VideoInfo::*BytesFromPixels)(int pixels) const; &VideoInfo::RowSize, // int (VideoInfo::*RowSize)(int plane) const; &VideoInfo::BMPSize, // int (VideoInfo::*BMPSize)() const; &VideoInfo::AudioSamplesFromFrames, // int64_t (VideoInfo::*AudioSamplesFromFrames)(int frames) const; &VideoInfo::FramesFromAudioSamples, // int (VideoInfo::*FramesFromAudioSamples)(int64_t samples) const; &VideoInfo::AudioSamplesFromBytes, // int64_t (VideoInfo::*AudioSamplesFromBytes)(int64_t bytes) const; &VideoInfo::BytesFromAudioSamples, // int64_t (VideoInfo::*BytesFromAudioSamples)(int64_t samples) const; &VideoInfo::AudioChannels, // int (VideoInfo::*AudioChannels)() const; &VideoInfo::SampleType, // int (VideoInfo::*SampleType)() const; &VideoInfo::IsSampleType, // bool (VideoInfo::*IsSampleType)(int testtype) const; &VideoInfo::SamplesPerSecond, // int (VideoInfo::*SamplesPerSecond)() const; &VideoInfo::BytesPerAudioSample, // int (VideoInfo::*BytesPerAudioSample)() const; &VideoInfo::SetFieldBased, // void (VideoInfo::*SetFieldBased)(bool isfieldbased); &VideoInfo::Set, // void (VideoInfo::*Set)(int property); &VideoInfo::Clear, // void (VideoInfo::*Clear)(int property); &VideoInfo::GetPlaneWidthSubsampling, // int (VideoInfo::*GetPlaneWidthSubsampling)(int plane) const; &VideoInfo::GetPlaneHeightSubsampling, // int (VideoInfo::*GetPlaneHeightSubsampling)(int plane) const; &VideoInfo::BitsPerPixel, // int (VideoInfo::*BitsPerPixel)() const; &VideoInfo::BytesPerChannelSample, // int (VideoInfo::*BytesPerChannelSample)() const; &VideoInfo::SetFPS, // void (VideoInfo::*SetFPS)(unsigned numerator, unsigned denominator) &VideoInfo::MulDivFPS, // void (VideoInfo::*MulDivFPS)(unsigned multiplier, unsigned divisor) &VideoInfo::IsSameColorspace, // bool (VideoInfo::*IsSameColorspace)(const VideoInfo& vi) const; // end struct VideoInfo /***************************************************************************************************************/ // class VideoFrameBuffer &VideoFrameBuffer::GetReadPtr, // const BYTE* (VideoFrameBuffer::*VFBGetReadPtr)() const; &VideoFrameBuffer::GetWritePtr, // BYTE* (VideoFrameBuffer::*VFBGetWritePtr)(); &VideoFrameBuffer::GetDataSize, // int (VideoFrameBuffer::*GetDataSize)() const; &VideoFrameBuffer::GetSequenceNumber, // int (VideoFrameBuffer::*GetSequenceNumber)() const; &VideoFrameBuffer::GetRefcount, // int (VideoFrameBuffer::*GetRefcount)() const; // end class VideoFrameBuffer /***************************************************************************************************************/ // class VideoFrame &VideoFrame::GetPitch, // int (VideoFrame::*GetPitch)(int plane) const; &VideoFrame::GetRowSize, // int (VideoFrame::*GetRowSize)(int plane) const; &VideoFrame::GetHeight, // int (VideoFrame::*GetHeight)(int plane) const; &VideoFrame::GetFrameBuffer, // VideoFrameBuffer* (VideoFrame::*GetFrameBuffer)() const; &VideoFrame::GetOffset, // int (VideoFrame::*GetOffset)(int plane) const; &VideoFrame::GetReadPtr, // const BYTE* (VideoFrame::*VFGetReadPtr)(int plane) const; &VideoFrame::IsWritable, // bool (VideoFrame::*IsWritable)() const; &VideoFrame::GetWritePtr, // BYTE* (VideoFrame::*VFGetWritePtr)(int plane) const; &VideoFrame::DESTRUCTOR, // void (VideoFrame::*VideoFrame_DESTRUCTOR)(); // end class VideoFrame /***************************************************************************************************************/ // class IClip // /* nothing */ // end class IClip /***************************************************************************************************************/ // class PClip &PClip::CONSTRUCTOR0, // void (PClip::*PClip_CONSTRUCTOR0)(); &PClip::CONSTRUCTOR1, // void (PClip::*PClip_CONSTRUCTOR1)(const PClip& x); &PClip::CONSTRUCTOR2, // void (PClip::*PClip_CONSTRUCTOR2)(IClip* x); &PClip::OPERATOR_ASSIGN0, // void (PClip::*PClip_OPERATOR_ASSIGN0)(IClip* x); &PClip::OPERATOR_ASSIGN1, // void (PClip::*PClip_OPERATOR_ASSIGN1)(const PClip& x); &PClip::DESTRUCTOR, // void (PClip::*PClip_DESTRUCTOR)(); // end class PClip /***************************************************************************************************************/ // class PVideoFrame &PVideoFrame::CONSTRUCTOR0, // void (PVideoFrame::*PVideoFrame_CONSTRUCTOR0)(); &PVideoFrame::CONSTRUCTOR1, // void (PVideoFrame::*PVideoFrame_CONSTRUCTOR1)(const PVideoFrame& x); &PVideoFrame::CONSTRUCTOR2, // void (PVideoFrame::*PVideoFrame_CONSTRUCTOR2)(VideoFrame* x); &PVideoFrame::OPERATOR_ASSIGN0, // void (PVideoFrame::*PVideoFrame_OPERATOR_ASSIGN0(VideoFrame* x); &PVideoFrame::OPERATOR_ASSIGN1, // void (PVideoFrame::*PVideoFrame_OPERATOR_ASSIGN1(const PVideoFrame& x); &PVideoFrame::DESTRUCTOR, // void (PVideoFrame::*PVideoFrame_DESTRUCTOR)(); // end class PVideoFrame /***************************************************************************************************************/ // class AVSValue &AVSValue::CONSTRUCTOR0, // void (AVSValue::*AVSValue_CONSTRUCTOR0)(); &AVSValue::CONSTRUCTOR1, // void (AVSValue::*AVSValue_CONSTRUCTOR1)(IClip* c); &AVSValue::CONSTRUCTOR2, // void (AVSValue::*AVSValue_CONSTRUCTOR2)(const PClip& c); &AVSValue::CONSTRUCTOR3, // void (AVSValue::*AVSValue_CONSTRUCTOR3)(bool b); &AVSValue::CONSTRUCTOR4, // void (AVSValue::*AVSValue_CONSTRUCTOR4)(int i); &AVSValue::CONSTRUCTOR5, // void (AVSValue::*AVSValue_CONSTRUCTOR5)(float f); &AVSValue::CONSTRUCTOR6, // void (AVSValue::*AVSValue_CONSTRUCTOR6)(double f); &AVSValue::CONSTRUCTOR7, // void (AVSValue::*AVSValue_CONSTRUCTOR7)(const char* s); &AVSValue::CONSTRUCTOR8, // void (AVSValue::*AVSValue_CONSTRUCTOR8)(const AVSValue* a, int &AVSValue::CONSTRUCTOR9, // void (AVSValue::*AVSValue_CONSTRUCTOR9)(const AVSValue& v); &AVSValue::DESTRUCTOR, // void (AVSValue::*AVSValue_DESTRUCTOR)(); &AVSValue::OPERATOR_ASSIGN, // AVSValue& (AVSValue::*AVSValue_OPERATOR_ASSIGN)(const AVSValue& v); &AVSValue::OPERATOR_INDEX, // const AVSValue& (AVSValue::*AVSValue_OPERATOR_INDEX)(int index) const; &AVSValue::Defined, // bool (AVSValue::*Defined)() const; &AVSValue::IsClip, // bool (AVSValue::*IsClip)() const; &AVSValue::IsBool, // bool (AVSValue::*IsBool)() const; &AVSValue::IsInt, // bool (AVSValue::*IsInt)() const; &AVSValue::IsFloat, // bool (AVSValue::*IsFloat)() const; &AVSValue::IsString, // bool (AVSValue::*IsString)() const; &AVSValue::IsArray, // bool (AVSValue::*IsArray)() const; &AVSValue::AsClip, // PClip (AVSValue::*AsClip)() const; &AVSValue::AsBool1, // bool (AVSValue::*AsBool1)() const; &AVSValue::AsInt1, // int (AVSValue::*AsInt1)() const; &AVSValue::AsString1, // const char* (AVSValue::*AsString1)() const; &AVSValue::AsFloat1, // double (AVSValue::*AsFloat1)() const; // AsDouble1 &AVSValue::AsBool2, // bool (AVSValue::*AsBool2)(bool def) const; &AVSValue::AsInt2, // int (AVSValue::*AsInt2)(int def) const; &AVSValue::AsDblDef, // double (AVSValue::*AsDblDef)(double def) const; // AsDouble2 &AVSValue::AsFloat2, // double (AVSValue::*AsFloat2)(float def) const; &AVSValue::AsString2, // const char* (AVSValue::*AsString2)(const char* def) const; &AVSValue::ArraySize, // int (AVSValue::*ArraySize)() const; &AVSValue::IsLongStrict, // bool (AVSValue::*IsLongStrict)() const; // v11 &AVSValue::IsFloatfStrict, // bool (AVSValue::*IsFloatfStrict() const; // v11 &AVSValue::AsLong1, // int64_t (AVSValue::*AsLong1)() const; // v11 &AVSValue::AsLong2, // int64_t (AVSValue::*AsLong2)(int64_t def) const; // v11 &AVSValue::CONSTRUCTOR12, // void (AVSValue::*AVSValue_CONSTRUCTOR12)(int64_ l); // v11 // end class AVSValue /**********************************************************************/ // a single { nullptr } initializes the whole placeholder array { nullptr }, // void (VideoInfo::* reserved[27])(); // reserved for AVS classic /**********************************************************************/ // AviSynth+ additions &VideoInfo::NumComponents, // int (VideoInfo::*NumChannels)() const; &VideoInfo::ComponentSize, // int (VideoInfo::*ComponentSize)() const; &VideoInfo::BitsPerComponent, // int (VideoInfo::*BitsPerComponent)() const; &VideoInfo::Is444, // bool (VideoInfo::*Is444)() const; &VideoInfo::Is422, // bool (VideoInfo::*Is422)() const; &VideoInfo::Is420, // bool (VideoInfo::*Is420)() const; &VideoInfo::IsY, // bool (VideoInfo::*IsY)() const; &VideoInfo::IsRGB48, // bool (VideoInfo::*IsRGB48)() const; &VideoInfo::IsRGB64, // bool (VideoInfo::*IsRGB64)() const; &VideoInfo::IsYUVA, // bool (VideoInfo::*IsYUVA)() const; &VideoInfo::IsPlanarRGB, // bool (VideoInfo::*IsPlanarRGB)() const; &VideoInfo::IsPlanarRGBA, // bool (VideoInfo::*IsPlanarRGBA)() const; /**********************************************************************/ // Frame properties &VideoFrame::getProperties, // AVSMap& (VideoFrame::* getProperties)(); &VideoFrame::getConstProperties, // const AVSMap& (VideoFrame::* getConstProperties)(); &VideoFrame::setProperties, // void (VideoFrame::* setProperties)(const AVSMap& properties); // PFunction (Neo) &AVSValue::CONSTRUCTOR11, &AVSValue::IsFunction, &PFunction::CONSTRUCTOR0, &PFunction::CONSTRUCTOR1, &PFunction::CONSTRUCTOR2, &PFunction::OPERATOR_ASSIGN0, &PFunction::OPERATOR_ASSIGN1, &PFunction::DESTRUCTOR, // end PFunction // VideoFrame extras (Neo) &VideoFrame::CheckMemory, &VideoFrame::GetDevice, // class PDevice (Neo) &PDevice::CONSTRUCTOR0, &PDevice::CONSTRUCTOR1, &PDevice::CONSTRUCTOR2, &PDevice::OPERATOR_ASSIGN0, &PDevice::OPERATOR_ASSIGN1, &PDevice::DESTRUCTOR, &PDevice::GetType, &PDevice::GetId, &PDevice::GetIndex, &PDevice::GetName, // end class PDevice // V9 &VideoFrame::IsPropertyWritable, // V10 &VideoFrame::GetPixelType, // int (VideoFrame::*VideoFrame_GetPixelType)() const; &VideoFrame::AmendPixelType, // void (VideoFrame::*VideoFrame_AmendPixelType)(); &VideoFrameBuffer::DESTRUCTOR, // void (VideoFrameBuffer::*VideoFrameBuffer_DESTRUCTOR)(); &AVSValue::GetType, // AvsValueType (AVSValue::*AVSValue_GetType)() const; // V10.1 &VideoInfo::IsChannelMaskKnown, // bool (VideoInfo::*IsChannelMaskKnown)() const; &VideoInfo::SetChannelMask, // void (VideoInfo::*SetChannelMask)(); &VideoInfo::GetChannelMask, // int (VideoInfo::*GetChannelMask)() const; // a single { nullptr } initializes the whole placeholder array { nullptr }, // void (VideoInfo::* reserved2[64 - 31])(); // Reserve pointer space for Avisynth+ /**********************************************************************/ // AviSynth Neo additions &GetAvsEnv // Most Neo linkage entries are moved to standard avs+ place. // frame property logic has been replaced entirely // this part should be identical with struct AVS_Linkage in avisynth.h /**********************************************************************/ }; // } extern __declspec(dllexport) const AVS_Linkage* const AVS_linkage = &avs_linkage; /**********************************************************************/ // in UserPlugin.cpp #if 0 #include "avisynth.h" /* New 2.6 requirment!!! */ // Declare and initialise server pointers static storage. const AVS_Linkage *AVS_linkage = 0; /* New 2.6 requirment!!! */ // DLL entry point called from LoadPlugin() to setup a user plugin. extern "C" __declspec(dllexport) const char* __stdcall AvisynthPluginInit3(IScriptEnvironment* env, const AVS_Linkage* const vectors) { /* New 2.6 requirment!!! */ // Save the server pointers. AVS_linkage = vectors; // Add the name of our function env->AddFunction("Plugin", "c", Create_Plugin, 0); // Return plugin text identifier. return "Plugin"; } #endif /**********************************************************************/ ================================================ FILE: avs_core/core/internal.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __Internal_H__ #define __Internal_H__ #include #include #include #include #include "version.h" #include #include #ifdef AVS_POSIX #include #endif #include "InternalEnvironment.h" #ifdef INTEL_INTRINSICS // Intrinsics base header + really required extension headers #if defined(_MSC_VER) #include // MSVC #else #include // GCC/MinGW/Clang/LLVM #endif #endif #if AVS_DEVNEXT_REV > 0 #define AVS_DEVELOPMENT_BUILD "\nNext Version Development Build: " AVS_PPSTR(AVS_DEV_REVDATE) #define AVS_DEVELOPMENT_BUILD_GIT "\nGit: " AVS_PPSTR(AVS_DEV_GITHASH) #else #define AVS_DEVELOPMENT_BUILD #define AVS_DEVELOPMENT_BUILD_GIT #endif // !! precision problems 2.60f < 2.60. Extra care for scripts where the version checking occurs like "IsAvs26 = VersionNumber()>=2.60" #define AVS_VERSION 3.75 // Note: Used by VersionNumber() script function #define AVS_COPYRIGHT "\n\xA9 2000-2015 Ben Rudiak-Gould, et al.\nhttp://avisynth.nl\n\xA9 2013-2026 AviSynth+ Project" #define AVS_COPYRIGHT_UTF8 u8"\n\u00A9 2000-2015 Ben Rudiak-Gould, et al.\nhttp://avisynth.nl\n\u00A9 2013-2026 AviSynth+ Project" #define BUILTIN_FUNC_PREFIX "AviSynth" enum MANAGE_CACHE_KEYS { MC_RegisterCache = (int)0xFFFF0004, MC_UnRegisterCache = (int)0xFFFF0006, MC_NodCache = (int)0xFFFF0007, MC_NodAndExpandCache = (int)0xFFFF0008, MC_RegisterMTGuard, MC_UnRegisterMTGuard, MC_RegisterGraphNode = (int)0xFFFF0100, MC_UnRegisterGraphNode, MC_QueryAvs25 = (int)0xFFFF0200, MC_QueryAvsPreV11C = (int)0xFFFF0201, }; #include #include #include "function.h" const char *GetPixelTypeName(const int pixel_type); // in script.c int GetPixelTypeFromName(const char *pixeltypename); // in script.c const char* GetAVSTypeName(AVSValue value); // in script.c int GetDeviceTypes(const PClip& child); // in DeviceManager.cpp size_t GetFrameHead(const PVideoFrame& vf); // in DeviceManager.cpp size_t GetFrameTail(const PVideoFrame& vf); // in DeviceManager.cpp PClip Create_MessageClip(const char* message, int width, int height, int pixel_type, bool shrink, int textcolor, int halocolor, int bgcolor, int fps_numerator, int fps_denominator, int num_frames, bool utf8, IScriptEnvironment* env); /* Used to clip/clamp a byte to the 0-255 range. Uses a look-up table internally for performance. */ class _PixelClip { enum { buffer=320 }; BYTE lut[256+buffer*2]; public: _PixelClip() { memset(lut, 0, buffer); for (int i=0; i<256; ++i) lut[i+buffer] = (BYTE)i; memset(lut+buffer+256, 255, buffer); } BYTE operator()(int i) const { return lut[i+buffer]; } }; extern const _PixelClip PixelClip; template static __inline void Relink(ListNode* newprev, ListNode* me, ListNode* newnext) { if (me == newprev || me == newnext) return; me->next->prev = me->prev; me->prev->next = me->next; me->prev = newprev; me->next = newnext; me->prev->next = me->next->prev = me; } class CWDChanger /** * Class to change the current working directory **/ { public: CWDChanger(const char* new_cwd); CWDChanger(const wchar_t* new_cwd); ~CWDChanger(void); #ifdef AVS_WINDOWS static std::wstring GetCurrentWorkingDirectory(); #else static std::string GetCurrentWorkingDirectory(); #endif private: void Init(const wchar_t* new_cwd); #ifdef AVS_WINDOWS std::unique_ptr old_working_directory; #else char old_working_directory[PATH_MAX]; #endif bool restore; }; class DllDirChanger { public: DllDirChanger(const char* new_cwd); ~DllDirChanger(void); private: std::unique_ptr old_directory; bool restore; }; class NonCachedGenericVideoFilter : public GenericVideoFilter /** * Class to select a range of frames from a longer clip **/ { public: NonCachedGenericVideoFilter(PClip _child); int __stdcall SetCacheHints(int cachehints, int frame_range); }; /*** Inline helper methods ***/ // 8 bit uv to float // 16-128-240 -> -112-0-112 -> 1..255: +/-127 -> +/-0.5 [[maybe_unused]] static AVS_FORCEINLINE float uv8tof(int color) { return (color - 128) / 255.f; // consistent with convert_uintN_to_float_c } // 8 bit fullscale to float [[maybe_unused]] static AVS_FORCEINLINE float c8tof(int color) { return color / 255.0f; } [[maybe_unused]] static AVS_FORCEINLINE uint8_t Scaled15bitPixelClip(int i) { return (uint8_t)clamp((i + 16384) >> 15, 0, 255); } [[maybe_unused]] static AVS_FORCEINLINE uint8_t ScaledPixelClip(int i) { // return PixelClip((i+32768) >> 16); // PF: clamp is faster than lut return (uint8_t)clamp((i + 32768) >> 16, 0, 255); } [[maybe_unused]] static AVS_FORCEINLINE uint16_t ScaledPixelClip(int64_t i) { return (uint16_t)clamp((i + 32768) >> 16, (int64_t)0, (int64_t)65535); } [[maybe_unused]] static AVS_FORCEINLINE uint16_t ScaledPixelClipEx(int64_t i, int max_value) { return (uint16_t)clamp((int)((i + 32768) >> 16), 0, max_value); } [[maybe_unused]] static AVS_FORCEINLINE bool IsClose(int a, int b, unsigned threshold) { return (unsigned(a-b+threshold) <= threshold*2); } [[maybe_unused]] static AVS_FORCEINLINE bool IsCloseFloat(float a, float b, float threshold) { return (a-b+threshold <= threshold*2); } #ifdef INTEL_INTRINSICS // useful SIMD helpers // sse2 replacement of _mm_mullo_epi32 in SSE4.1 // use it after speed test, may have too much overhead and C is faster [[maybe_unused]] static AVS_FORCEINLINE __m128i _MM_MULLO_EPI32(const __m128i &a, const __m128i &b) { // for SSE 4.1: return _mm_mullo_epi32(a, b); __m128i tmp1 = _mm_mul_epu32(a,b); // mul 2,0 __m128i tmp2 = _mm_mul_epu32( _mm_srli_si128(a,4), _mm_srli_si128(b,4)); // mul 3,1 // shuffle results to [63..0] and pack. a2->a1, a0->a0 return _mm_unpacklo_epi32(_mm_shuffle_epi32(tmp1, _MM_SHUFFLE (0,0,2,0)), _mm_shuffle_epi32(tmp2, _MM_SHUFFLE (0,0,2,0))); } // fake _mm_packus_epi32 (orig is SSE4.1 only) [[maybe_unused]] static AVS_FORCEINLINE __m128i _MM_PACKUS_EPI32( __m128i a, __m128i b ) { const __m128i val_32 = _mm_set1_epi32(0x8000); const __m128i val_16 = _mm_set1_epi16((short)0x8000); a = _mm_sub_epi32(a, val_32); b = _mm_sub_epi32(b, val_32); a = _mm_packs_epi32(a, b); a = _mm_add_epi16(a, val_16); return a; } // fake _mm_packus_epi32 (orig is SSE4.1 only) // only for packing 00000000..0000FFFF range integers, does not clamp properly above that, e.g. 00010001 [[maybe_unused]] static AVS_FORCEINLINE __m128i _MM_PACKUS_EPI32_SRC_TRUEWORD(__m128i a, __m128i b) { a = _mm_slli_epi32 (a, 16); a = _mm_srai_epi32 (a, 16); b = _mm_slli_epi32 (b, 16); b = _mm_srai_epi32 (b, 16); a = _mm_packs_epi32 (a, b); return a; } [[maybe_unused]] static AVS_FORCEINLINE __m128i _MM_CMPLE_EPU16(__m128i x, __m128i y) { // Returns 0xFFFF where x <= y: return _mm_cmpeq_epi16(_mm_subs_epu16(x, y), _mm_setzero_si128()); } [[maybe_unused]] static AVS_FORCEINLINE __m128i _MM_BLENDV_SI128(__m128i x, __m128i y, __m128i mask) { // Replace bit in x with bit in y when matching bit in mask is set: return _mm_or_si128(_mm_andnot_si128(mask, x), _mm_and_si128(mask, y)); } // SSE4.1 simulation for SSE2, same as above, intrisic name is _mm_blendv_epi8 [[maybe_unused]] static AVS_FORCEINLINE __m128i _MM_BLENDV_EPI8(__m128i const& a, __m128i const& b, __m128i const& selector) { return _mm_or_si128(_mm_andnot_si128(selector, a), _mm_and_si128(selector, b)); } // sse2 simulation of SSE4's _mm_min_epu16 [[maybe_unused]] static AVS_FORCEINLINE __m128i _MM_MIN_EPU16(__m128i x, __m128i y) { // Returns x where x <= y, else y: return _MM_BLENDV_SI128(y, x, _MM_CMPLE_EPU16(x, y)); } // sse2 simulation of SSE4's _mm_max_epu16 [[maybe_unused]] static AVS_FORCEINLINE __m128i _MM_MAX_EPU16(__m128i x, __m128i y) { // Returns x where x >= y, else y: return _MM_BLENDV_SI128(x, y, _MM_CMPLE_EPU16(x, y)); } #endif #ifndef MAKEFOURCC #define MAKEFOURCC(ch0, ch1, ch2, ch3) \ ((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | \ ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 )) #endif class GlobalVarFrame { InternalEnvironment* env; public: GlobalVarFrame(InternalEnvironment* env) : env(env) { env->PushContextGlobal(); } ~GlobalVarFrame() { env->PopContextGlobal(); } }; #endif // __Internal_H__ ================================================ FILE: avs_core/core/main.cpp ================================================ // Avisynth v2.5. Copyright 2007 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include #include "internal.h" // master ifdef #ifdef AVS_WINDOWS // inspect for Linux; COM/VfW stuff not needed? #ifdef AVS_WINDOWS #include #include #include #else #include #endif #include #include "bitblt.h" #include "exception.h" #include #include #include "AviHelper.h" #include "audio.h" #include #ifdef MSVC constexpr uint32_t FP_STATE = 0x9001f; #ifdef _M_X64 constexpr uint32_t FP_MASK = 0xffffffff & !(_MCW_PC | _MCW_IC); // x64 ignores _MCW_PC and _MCW_IC, Debug CRT library actually asserts when these are passed. // https ://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/control87-controlfp-control87-2?redirectedfrom=MSDN&view=msvc-170 #else constexpr uint32_t FP_MASK = 0xffffffff; #endif #endif #ifndef _DEBUG // Release mode logging // #define OPT_RELS_LOGGING # ifdef OPT_RELS_LOGGING #undef _RPT0 #undef _RPT1 #undef _RPT2 #undef _RPT3 #undef _RPT4 # ifdef _RPT5 #undef _RPT5 # endif #define _RPT0(rptno, msg) ReportMe(msg) #define _RPT1(rptno, msg, a1) ReportMe(msg, a1) #define _RPT2(rptno, msg, a1, a2) ReportMe(msg, a1, a2) #define _RPT3(rptno, msg, a1, a2, a3) ReportMe(msg, a1, a2, a3) #define _RPT4(rptno, msg, a1, a2, a3, a4) ReportMe(msg, a1, a2, a3, a4) #define _RPT5(rptno, msg, a1, a2, a3, a4, a5) ReportMe(msg, a1, a2, a3, a4, a5) void ReportMe(const char * msg, ...) { static char buf[256] = ""; va_list args; int l = strlen(buf); va_start(args, msg); l = _vsnprintf(buf+l, sizeof(buf)-1-l, msg, args); buf[sizeof(buf)-1] = 0; va_end(args); if (l == -1 || strchr(buf, '\n')) { OutputDebugString(buf); buf[0] = 0; } } # else # ifndef _RPT5 #define _RPT5(rptno, msg, a1, a2, a3, a4, a5) # endif # endif #else # ifndef _RPT5 # ifdef _RPT_BASE #define _RPT5(rptno, msg, a1, a2, a3, a4, a5) \ _RPT_BASE((rptno, NULL, 0, NULL, msg, a1, a2, a3, a4, a5)) # else # ifdef _CrtDbgBreak #define _RPT5(rptno, msg, a1, a2, a3, a4, a5) \ do { if ((1 == _CrtDbgReport(rptno, NULL, 0, NULL, msg, a1, a2, a3, a4, a5))) \ _CrtDbgBreak(); } while (0) # else #define _RPT5(rptno, msg, a1, a2, a3, a4, a5) # endif # endif # endif #endif static long gRefCnt=0; #ifdef XP_TLS DWORD dwTlsIndex = 0; #endif extern "C" const GUID CLSID_CAVIFileSynth // {E6D6B700-124D-11D4-86F3-DB80AFD98778} = {0xe6d6b700, 0x124d, 0x11d4, {0x86, 0xf3, 0xdb, 0x80, 0xaf, 0xd9, 0x87, 0x78}}; extern "C" const GUID IID_IAvisynthClipInfo // {E6D6B708-124D-11D4-86F3-DB80AFD98778} = {0xe6d6b708, 0x124d, 0x11d4, {0x86, 0xf3, 0xdb, 0x80, 0xaf, 0xd9, 0x87, 0x78}}; struct IAvisynthClipInfo : IUnknown { virtual int __stdcall GetError(const char** ppszMessage) = 0; virtual bool __stdcall GetParity(int n) = 0; virtual bool __stdcall IsFieldBased() = 0; }; // Silence warning for STDMETHODIMP: // "exception specification of overriding function is more lax than base version [-Wmicrosoft-exception-spec]" #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wmicrosoft-exception-spec" #elif defined(__GNUC__) //#pragma GCC diagnostic push // gcc has no problem // #pragma GCC diagnostic ignored "-Wnoexcept" #endif // final is used to silence warning: // delete called on non-final 'CAVIFileSynth' that has virtual functions but non-virtual destructor [-Wdelete-non-abstract-non-virtual-dtor] class CAVIFileSynth final: public IAVIFile, public IPersistFile, public IClassFactory, public IAvisynthClipInfo { friend class CAVIStreamSynth; private: long m_refs; char* szScriptName; char* szScriptNameUTF8; IScriptEnvironment2* env; PClip filter_graph; // actual result of script evaluation const VideoInfo* vi; const char* error_msg; CRITICAL_SECTION cs_filter_graph; bool VDubPlanarHack; bool AVIPadScanlines; bool Enable_V210; bool Enable_b64a; bool Enable_Y3_10_10; bool Enable_Y3_10_16; bool Enable_PlanarToPackedRGB; int ImageSize(const VideoInfo *vi); bool DelayInit(); bool DelayInit2(); void MakeErrorStream(const char* msg); void Lock(); void Unlock(); public: CAVIFileSynth(const CLSID& rclsid); ~CAVIFileSynth(); static HRESULT Create(const CLSID& rclsid, const IID& riid, void **ppv); //////////// IUnknown // 2023: Lots of clang-cl LLVM warning: // "exception specification of overriding function is more lax than base version[-Wmicrosoft-exception-spec]" // it's because STDMETHOD and STDMETHODIMP is differing by COM_DECLSPEC_NOTHROW that is __declspec(nothrow). // All we can do is to disable warnings. This is by MS design. STDMETHODIMP QueryInterface(const IID& iid, void** ppv); STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release(); //////////// IClassFactory STDMETHODIMP CreateInstance (LPUNKNOWN pUnkOuter, REFIID riid, void * * ppvObj) ; STDMETHODIMP LockServer (BOOL fLock) ; //////////// IPersistFile STDMETHODIMP GetClassID(LPCLSID lpClassID); // IPersist STDMETHODIMP IsDirty(); STDMETHODIMP Load(LPCOLESTR lpszFileName, DWORD grfMode); STDMETHODIMP Save(LPCOLESTR lpszFileName, BOOL fRemember); STDMETHODIMP SaveCompleted(LPCOLESTR lpszFileName); STDMETHODIMP GetCurFile(LPOLESTR *lplpszFileName); //////////// IAVIFile STDMETHODIMP CreateStream(PAVISTREAM *ppStream, AVISTREAMINFOW *psi); // 5 STDMETHODIMP EndRecord(); // 8 STDMETHODIMP GetStream(PAVISTREAM *ppStream, DWORD fccType, LONG lParam); // 4 STDMETHODIMP Info(AVIFILEINFOW *psi, LONG lSize); // 3 STDMETHODIMP Open(LPCSTR szFile, UINT mode, LPCOLESTR lpszFileName); // ??? STDMETHODIMP Save(LPCSTR szFile, AVICOMPRESSOPTIONS FAR *lpOptions, // ??? AVISAVECALLBACK lpfnCallback); STDMETHODIMP ReadData(DWORD fcc, LPVOID lp, LONG *lpcb); // 7 STDMETHODIMP WriteData(DWORD fcc, LPVOID lpBuffer, LONG cbBuffer); // 6 STDMETHODIMP DeleteStream(DWORD fccType, LONG lParam); // 9 //////////// IAvisynthClipInfo int __stdcall GetError(const char** ppszMessage); bool __stdcall GetParity(int n); bool __stdcall IsFieldBased(); }; /////////////////////////////////// class CAVIStreamSynth; // final is used to silence warning: // warning : delete called on non-final 'CAVIStreamSynth' that has virtual functions but non-virtual destructor class CAVIStreamSynth final: public IAVIStream, public IAVIStreaming { public: //////////// IUnknown STDMETHODIMP QueryInterface(const IID& iid, void **ppv); STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release(); CAVIStreamSynth(CAVIFileSynth *parentPtr, bool isAudio); ~CAVIStreamSynth(); //////////// IAVIStream STDMETHODIMP Create(LPARAM lParam1, LPARAM lParam2); STDMETHODIMP Delete(LONG lStart, LONG lSamples); STDMETHODIMP_(LONG) Info(AVISTREAMINFOW *psi, LONG lSize); STDMETHODIMP_(LONG) FindSample(LONG lPos, LONG lFlags); STDMETHODIMP Read(LONG lStart, LONG lSamples, LPVOID lpBuffer, LONG cbBuffer, LONG *plBytes, LONG *plSamples); STDMETHODIMP ReadData(DWORD fcc, LPVOID lp, LONG *lpcb); STDMETHODIMP ReadFormat(LONG lPos, LPVOID lpFormat, LONG *lpcbFormat); STDMETHODIMP SetFormat(LONG lPos, LPVOID lpFormat, LONG cbFormat); STDMETHODIMP Write(LONG lStart, LONG lSamples, LPVOID lpBuffer, LONG cbBuffer, DWORD dwFlags, LONG FAR *plSampWritten, LONG FAR *plBytesWritten); STDMETHODIMP WriteData(DWORD fcc, LPVOID lpBuffer, LONG cbBuffer); STDMETHODIMP SetInfo(AVISTREAMINFOW *psi, LONG lSize); //////////// IAVIStreaming STDMETHODIMP Begin(LONG lStart, LONG lEnd, LONG lRate); STDMETHODIMP End(); private: long m_refs; CAVIFileSynth *parent; BOOL fAudio; const char *sName; //////////// internal void ReadFrame(void* lpBuffer, int n); HRESULT Read2(LONG lStart, LONG lSamples, LPVOID lpBuffer, LONG cbBuffer, LONG *plBytes, LONG *plSamples); }; #ifdef __clang__ #pragma clang diagnostic pop #elif defined(__GNUC__) //#pragma GCC diagnostic pop #endif #ifndef AVS_STATIC_LIB BOOL APIENTRY DllMain(HANDLE hModule, ULONG ulReason, LPVOID lpReserved) { _RPT4(0,"DllMain: hModule=0x%08x, ulReason=%x, lpReserved=0x%08x, gRefCnt = %ld\n", hModule, ulReason, lpReserved, gRefCnt); #ifdef XP_TLS if (ulReason == DLL_PROCESS_ATTACH) { if ((dwTlsIndex = TlsAlloc()) == TLS_OUT_OF_INDEXES) throw("Avisynth DLL load: TlsAlloc failed"); _RPT1(0, "DllMain: TlsAlloc: dwTlsIndex=0x%x\n", dwTlsIndex); } else if (ulReason == DLL_PROCESS_DETACH) { _RPT1(0, "DllMain: TlsFree: dwTlsIndex=0x%x\n", dwTlsIndex); TlsFree(dwTlsIndex); dwTlsIndex = 0; } #endif return TRUE; } STDAPI DllGetClassObject(IN REFCLSID rclsid, IN REFIID riid, OUT LPVOID FAR* ppv){ if (rclsid != CLSID_CAVIFileSynth) { _RPT0(0,"DllGetClassObject() CLASS_E_CLASSNOTAVAILABLE\n"); return CLASS_E_CLASSNOTAVAILABLE; } _RPT0(0,"DllGetClassObject() CLSID: CAVIFileSynth\n"); HRESULT hresult = CAVIFileSynth::Create(rclsid, riid, ppv); _RPT2(0,"DllGetClassObject() result=0x%X, object=%p\n", hresult, *ppv); return hresult; } STDAPI DllCanUnloadNow() { _RPT1(0,"DllCanUnloadNow(): gRefCnt = %ld\n", gRefCnt); return gRefCnt ? S_FALSE : S_OK; } #endif /////////////////////////////////////////////////////////////////////////// // // CAVIFileSynth // /////////////////////////////////////////////////////////////////////////// //////////// IClassFactory STDMETHODIMP CAVIFileSynth::CreateInstance (LPUNKNOWN pUnkOuter, REFIID riid, void * * ppvObj) { if (pUnkOuter) { _RPT1(0,"%p->CAVIFileSynth::CreateInstance() CLASS_E_NOAGGREGATION\n", this); return CLASS_E_NOAGGREGATION; } _RPT1(0,"%p->CAVIFileSynth::CreateInstance()\n", this); HRESULT hresult = Create(CLSID_CAVIFileSynth, riid, ppvObj); _RPT3(0,"%p->CAVIFileSynth::CreateInstance() result=0x%X, object=%p\n", this, hresult, *ppvObj); return hresult; } STDMETHODIMP CAVIFileSynth::LockServer (BOOL fLock) { _RPT2(0,"%p->CAVIFileSynth::LockServer(%u)\n", this, fLock); return S_OK; } /////////////////////////////////////////////////// //////////// IPersistFile STDMETHODIMP CAVIFileSynth::GetClassID(LPCLSID lpClassID) { // IPersist _RPT1(0,"%p->CAVIFileSynth::GetClassID()\n", this); if (!lpClassID) return E_POINTER; *lpClassID = CLSID_CAVIFileSynth; return S_OK; } STDMETHODIMP CAVIFileSynth::IsDirty() { _RPT1(0,"%p->CAVIFileSynth::IsDirty()\n", this); return S_FALSE; } STDMETHODIMP CAVIFileSynth::Load(LPCOLESTR lpszFileName, DWORD grfMode) { char filename[MAX_PATH]; WideCharToMultiByte(AreFileApisANSI() ? CP_ACP : CP_OEMCP, 0, lpszFileName, -1, filename, sizeof filename, NULL, NULL); _RPT3(0,"%p->CAVIFileSynth::Load(\"%s\", 0x%X)\n", this, filename, grfMode); return Open(filename, grfMode, lpszFileName); } STDMETHODIMP CAVIFileSynth::Save(LPCOLESTR lpszFileName, BOOL fRemember) { _RPT1(0,"%p->CAVIFileSynth::Save()\n", this); return E_FAIL; } STDMETHODIMP CAVIFileSynth::SaveCompleted(LPCOLESTR lpszFileName) { _RPT1(0,"%p->CAVIFileSynth::SaveCompleted()\n", this); return S_OK; } STDMETHODIMP CAVIFileSynth::GetCurFile(LPOLESTR *lplpszFileName) { _RPT1(0,"%p->CAVIFileSynth::GetCurFile()\n", this); if (lplpszFileName) *lplpszFileName = NULL; return E_FAIL; } /////////////////////////////////////////////////// /////// static local HRESULT CAVIFileSynth::Create(const CLSID& rclsid, const IID& riid, void **ppv) { HRESULT hresult; // _RPT0(0,"CAVIFileSynth::Create()\n"); CAVIFileSynth* pAVIFileSynth = new(std::nothrow) CAVIFileSynth(rclsid); if (!pAVIFileSynth) return E_OUTOFMEMORY; hresult = pAVIFileSynth->QueryInterface(riid, ppv); pAVIFileSynth->Release(); // _RPT1(0,"CAVIFileSynth::Create() exit, result=0x%X\n", hresult); return hresult; } /////////////////////////////////////////////////// //////////// IUnknown STDMETHODIMP CAVIFileSynth::QueryInterface(const IID& iid, void **ppv) { if (!ppv) { _RPT1(0,"%p->CAVIFileSynth::QueryInterface() E_POINTER\n", this); return E_POINTER; } _RPT1(0,"%p->CAVIFileSynth::QueryInterface() ", this); _RPT3(0,"{%08lx-%04x-%04x-", iid.Data1, iid.Data2, iid.Data3); _RPT4(0,"%02x%02x-%02x%02x", iid.Data4[0], iid.Data4[1], iid.Data4[2], iid.Data4[3]); _RPT4(0,"%02x%02x%02x%02x} (", iid.Data4[4], iid.Data4[5], iid.Data4[6], iid.Data4[7]); if (iid == IID_IUnknown) { *ppv = (IUnknown *)(IAVIFile *)this; _RPT0(0,"IUnknown)\n"); } else if (iid == IID_IClassFactory) { *ppv = (IClassFactory *)this; _RPT0(0,"IClassFactory)\n"); } else if (iid == IID_IPersist) { *ppv = (IPersist *)this; _RPT0(0,"IPersist)\n"); } else if (iid == IID_IPersistFile) { *ppv = (IPersistFile *)this; _RPT0(0,"IPersistFile)\n"); } else if (iid == IID_IAVIFile) { *ppv = (IAVIFile *)this; _RPT0(0,"IAVIFile)\n"); } else if (iid == IID_IAvisynthClipInfo) { *ppv = (IAvisynthClipInfo *)this; _RPT0(0,"IAvisynthClipInfo)\n"); } else { _RPT0(0,"unsupported!)\n"); *ppv = NULL; return E_NOINTERFACE; } AddRef(); return S_OK; } STDMETHODIMP_(ULONG) CAVIFileSynth::AddRef() { const int refs = InterlockedIncrement(&m_refs); InterlockedIncrement(&gRefCnt); _RPT3(0,"%p->CAVIFileSynth::AddRef() gRefCnt=%d, m_refs=%d\n", this, gRefCnt, refs); return refs; } STDMETHODIMP_(ULONG) CAVIFileSynth::Release() { const int refs = InterlockedDecrement(&m_refs); InterlockedDecrement(&gRefCnt); _RPT3(0,"%p->CAVIFileSynth::Release() gRefCnt=%d, m_refs=%d\n", this, gRefCnt, refs); if (!refs) delete this; return refs; } //////////////////////////////////////////////////////////////////////// // // CAVIStreamSynth // //////////////////////////////////////////////////////////////////////// //////////// IUnknown STDMETHODIMP CAVIStreamSynth::QueryInterface(const IID& iid, void **ppv) { if (!ppv) { _RPT2(0,"%p->CAVIStreamSynth::QueryInterface() (%s) E_POINTER\n", this, sName); return E_POINTER; } _RPT2(0,"%p->CAVIStreamSynth::QueryInterface() (%s) ", this, sName); _RPT3(0,"{%08lx-%04x-%04x-", iid.Data1, iid.Data2, iid.Data3); _RPT4(0,"%02x%02x-%02x%02x", iid.Data4[0], iid.Data4[1], iid.Data4[2], iid.Data4[3]); _RPT4(0,"%02x%02x%02x%02x} (", iid.Data4[4], iid.Data4[5], iid.Data4[6], iid.Data4[7]); if (iid == IID_IUnknown) { *ppv = (IUnknown *)(IAVIStream *)this; _RPT0(0,"IUnknown)\n"); } else if (iid == IID_IAVIStream) { *ppv = (IAVIStream *)this; _RPT0(0,"IAVIStream)\n"); } else if (iid == IID_IAVIStreaming) { *ppv = (IAVIStreaming *)this; _RPT0(0,"IAVIStreaming)\n"); } else { _RPT0(0,"unsupported!)\n"); *ppv = NULL; return E_NOINTERFACE; } AddRef(); return S_OK; } STDMETHODIMP_(ULONG) CAVIStreamSynth::AddRef() { const int refs = InterlockedIncrement(&m_refs); InterlockedIncrement(&gRefCnt); _RPT4(0,"%p->CAVIStreamSynth::AddRef() (%s) gRefCnt=%d, m_refs=%d\n", this, sName, gRefCnt, refs); return refs; } STDMETHODIMP_(ULONG) CAVIStreamSynth::Release() { const int refs = InterlockedDecrement(&m_refs); InterlockedDecrement(&gRefCnt); _RPT4(0,"%p->CAVIStreamSynth::Release() (%s) gRefCnt=%d, m_refs=%d\n", this, sName, gRefCnt, refs); if (!refs) delete this; return refs; } //////////////////////////////////////////////////////////////////////// // // CAVIFileSynth // //////////////////////////////////////////////////////////////////////// //////////// IAVIFile STDMETHODIMP CAVIFileSynth::CreateStream(PAVISTREAM *ppStream, AVISTREAMINFOW *psi) { _RPT1(0,"%p->CAVIFileSynth::CreateStream()\n", this); *ppStream = NULL; return S_OK;//AVIERR_READONLY; } STDMETHODIMP CAVIFileSynth::EndRecord() { _RPT1(0,"%p->CAVIFileSynth::EndRecord()\n", this); return AVIERR_READONLY; } STDMETHODIMP CAVIFileSynth::Save(LPCSTR szFile, AVICOMPRESSOPTIONS FAR *lpOptions, AVISAVECALLBACK lpfnCallback) { _RPT1(0,"%p->CAVIFileSynth::Save()\n", this); return AVIERR_READONLY; } STDMETHODIMP CAVIFileSynth::ReadData(DWORD fcc, LPVOID lp, LONG *lpcb) { _RPT1(0,"%p->CAVIFileSynth::ReadData()\n", this); return AVIERR_NODATA; } STDMETHODIMP CAVIFileSynth::WriteData(DWORD fcc, LPVOID lpBuffer, LONG cbBuffer) { _RPT1(0,"%p->CAVIFileSynth::WriteData()\n", this); return AVIERR_READONLY; } STDMETHODIMP CAVIFileSynth::DeleteStream(DWORD fccType, LONG lParam) { _RPT1(0,"%p->CAVIFileSynth::DeleteStream()\n", this); return AVIERR_READONLY; } /////////////////////////////////////////////////// /////// local CAVIFileSynth::CAVIFileSynth(const CLSID& rclsid) { _RPT1(0,"%p->CAVIFileSynth::CAVIFileSynth()\n", this); m_refs = 0; AddRef(); szScriptName = NULL; env = NULL; error_msg = NULL; VDubPlanarHack = false; AVIPadScanlines = false; Enable_V210 = false; Enable_b64a = false; Enable_Y3_10_10 = false; Enable_Y3_10_16 = false; Enable_PlanarToPackedRGB = false; InitializeCriticalSection(&cs_filter_graph); } CAVIFileSynth::~CAVIFileSynth() { _RPT2(0,"%p->CAVIFileSynth::~CAVIFileSynth(), gRefCnt = %d\n", this, gRefCnt); Lock(); delete[] szScriptName; filter_graph = 0; if (env) env->DeleteScriptEnvironment(); env = NULL; DeleteCriticalSection(&cs_filter_graph); } STDMETHODIMP CAVIFileSynth::Open(LPCSTR szFile, UINT mode, LPCOLESTR lpszFileName) { // _RPT3(0,"%p->CAVIFileSynth::Open(\"%s\", 0x%08lx)\n", this, szFile, mode); if (mode & (OF_CREATE|OF_WRITE)) return E_FAIL; if (env) env->DeleteScriptEnvironment(); // just in case env = NULL; filter_graph = 0; vi = NULL; szScriptName = new(std::nothrow) char[lstrlen(szFile)+1]; if (!szScriptName) return AVIERR_MEMORY; lstrcpy(szScriptName, szFile); // when unicode file names are given and cannot be converted to 8 bit, szFile has ??? chars // szFile: 0x0018f198 "C:\\unicode\\SNH48 - ??????.avs" // lpSzFileName 0x02631cc8 L"C:\\unicode\\SNH48 - unicode_chars_here.avs" // use utf8 in DelayInit2 instead of szScriptName std::wstring ScriptNameW = lpszFileName; // wide -> utf8 int utf8len = WideCharToMultiByte(CP_UTF8, 0, ScriptNameW.c_str(), -1/*null terminated src*/, NULL, 0/*returns the required buffer size*/, 0, 0) + 1; // with \0 terminator szScriptNameUTF8 = new(std::nothrow) char[utf8len]; if (!szScriptNameUTF8) return AVIERR_MEMORY; WideCharToMultiByte(CP_UTF8, 0, ScriptNameW.c_str(), -1, szScriptNameUTF8, utf8len, 0, 0); // conversion to c_str once, here, not in DelayInit2 return S_OK; } bool CAVIFileSynth::DelayInit() { Lock(); bool result = DelayInit2(); Unlock(); return result; } bool CAVIFileSynth::DelayInit2() { // _RPT1(0,"Original: 0x%.4x\n", _control87( 0, 0 ) ); #if defined(MSVC) unsigned int fp_state = _controlfp(0, 0); _controlfp(FP_STATE, FP_MASK); #endif if (szScriptNameUTF8) // unicode! { #ifndef _DEBUG try { #endif try { // create a script environment and load the script into it env = CreateScriptEnvironment2(); if (!env) return false; } catch (const AvisynthError &error) { error_msg = error.msg; return false; } try { AVSValue new_args[2] = { szScriptNameUTF8, true }; AVSValue return_val = env->Invoke("Import", AVSValue(new_args, 2)); // store the script's return value (a video clip) if (return_val.IsClip()) { filter_graph = return_val.AsClip(); // Allow WAVE_FORMAT_IEEE_FLOAT audio output const bool AllowFloatAudio = env->GetVarBool(VARNAME_AllowFloatAudio, false); if (!AllowFloatAudio && filter_graph->GetVideoInfo().IsSampleType(SAMPLE_FLOAT)) // Ensure samples are int filter_graph = env->Invoke("ConvertAudioTo16bit", AVSValue(&return_val, 1)).AsClip(); filter_graph = env->Invoke("Cache", AVSValue(filter_graph)).AsClip(); // Tune top-level cache for encoding filter_graph->SetCacheHints(CACHE_SET_MIN_CAPACITY, 0); filter_graph->SetCacheHints(CACHE_SET_MAX_CAPACITY, 0); // Alternate sample values for editors: //filter_graph->SetCacheHints(CACHE_SET_MIN_CAPACITY, 10); //filter_graph->SetCacheHints(CACHE_SET_MAX_CAPACITY, 100); } else if (return_val.IsBool()) env->ThrowError("The script's return value was not a video clip, (Is a bool, %s).", return_val.AsBool() ? "True" : "False"); else if (return_val.IsInt()) env->ThrowError("The script's return value was not a video clip, (Is an int, %d).", return_val.AsInt()); else if (return_val.IsFloat()) env->ThrowError("The script's return value was not a video clip, (Is a float, %f).", return_val.AsFloat()); else if (return_val.IsString()) env->ThrowError("The script's return value was not a video clip, (Is a string, %s).", return_val.AsString()); else if (return_val.IsArray()) env->ThrowError("The script's return value was not a video clip, (Is an array[%d]).", return_val.ArraySize()); else if (!return_val.Defined()) env->ThrowError("The script's return value was not a video clip, (Is the undefined value)."); else env->ThrowError("The script's return value was not a video clip, (The type is unknown)."); if (!filter_graph) env->ThrowError("The returned video clip was nil (this is a bug)"); // get information about the clip vi = &filter_graph->GetVideoInfo(); // Hack YV16 and YV24 chroma plane order for old VDub's VDubPlanarHack = env->GetVarBool(VARNAME_VDubPlanarHack, false); // Option to have scanlines mod4 padded in all pixel formats AVIPadScanlines = env->GetVarBool(VARNAME_AVIPadScanlines, false); // AVS+ Enable_V210 instead of P210 Enable_V210 = env->GetVarBool(VARNAME_Enable_V210, false); // AVS+ y3[10][10] instead of P210 Enable_Y3_10_10 = env->GetVarBool(VARNAME_Enable_Y3_10_10, false); // AVS+ y3[10][16] instead of P216 Enable_Y3_10_16 = env->GetVarBool(VARNAME_Enable_Y3_10_16, false); // AVS+ Enable_V210 instead of BRA[64] Enable_b64a = env->GetVarBool(VARNAME_Enable_b64a, false); // AVS+ Enable on-the-fly Planar RGB to Packed RGB conversion Enable_PlanarToPackedRGB = env->GetVarBool(VARNAME_Enable_PlanarToPackedRGB, false); } catch (const AvisynthError &error) { error_msg = error.msg; try { AVSValue args[2] = { error.msg, 0xff3333 }; static const char* const arg_names[2] = { 0, "text_color" }; filter_graph = env->Invoke("MessageClip", AVSValue(args, 2), arg_names).AsClip(); vi = &filter_graph->GetVideoInfo(); } catch (const AvisynthError&) { filter_graph = 0; } } delete[] szScriptName; szScriptName = NULL; delete[] szScriptNameUTF8; szScriptNameUTF8 = NULL; #ifdef X86_32 _mm_empty(); #endif #if defined(MSVC) _clearfp(); _controlfp( fp_state, FP_MASK); #endif return true; #ifndef _DEBUG } catch (...) { _RPT0(1,"DelayInit() caught general exception!\n"); #if defined(MSVC) _clearfp(); #endif #ifdef X86_32 _mm_empty(); #if defined(MSVC) _controlfp( fp_state, FP_MASK ); #endif #endif return false; } #endif } else { #ifdef X86_32 _mm_empty(); #endif #if defined(MSVC) _clearfp(); _controlfp( fp_state, FP_MASK); #endif return (env && filter_graph && vi); } } void CAVIFileSynth::MakeErrorStream(const char* msg) { error_msg = msg; filter_graph = Create_MessageClip(msg, vi->width, vi->height, vi->pixel_type, false, 0xFF3333, 0, 0, -1, -1, -1, true, /* may be utf8 when using AvisynthError::msgr */ env); } void CAVIFileSynth::Lock() { EnterCriticalSection(&cs_filter_graph); } void CAVIFileSynth::Unlock() { LeaveCriticalSection(&cs_filter_graph); } /////////////////////////////////////////////////// //////////// IAVIFile STDMETHODIMP CAVIFileSynth::Info(AVIFILEINFOW *pfi, LONG lSize) { _RPT2(0,"%p->CAVIFileSynth::Info(pfi, %d)\n", this, lSize); if (!pfi) return E_POINTER; if (!DelayInit()) return E_FAIL; AVIFILEINFOW afi; memset(&afi, 0, sizeof(afi)); afi.dwMaxBytesPerSec = 0; afi.dwFlags = AVIFILEINFO_HASINDEX | AVIFILEINFO_ISINTERLEAVED; afi.dwCaps = AVIFILECAPS_CANREAD | AVIFILECAPS_ALLKEYFRAMES | AVIFILECAPS_NOCOMPRESSION; int nrStreams=0; if (vi->HasVideo()==true) nrStreams=1; if (vi->HasAudio()==true) nrStreams++; afi.dwStreams = nrStreams; afi.dwSuggestedBufferSize = 0; afi.dwWidth = vi->width; afi.dwHeight = vi->height; afi.dwEditCount = 0; afi.dwRate = vi->fps_numerator; afi.dwScale = vi->fps_denominator; afi.dwLength = vi->num_frames; wcscpy(afi.szFileType, L"Avisynth"); // Maybe should return AVIERR_BUFFERTOOSMALL for lSize < sizeof(afi) memset(pfi, 0, lSize); memcpy(pfi, &afi, min(size_t(lSize), sizeof(afi))); return S_OK; } static inline char BePrintable(int ch) { ch &= 0xff; return (char)(isprint(ch) ? ch : '.'); } STDMETHODIMP CAVIFileSynth::GetStream(PAVISTREAM *ppStream, DWORD fccType, LONG lParam) { CAVIStreamSynth *casr; char fcc[5]; fcc[0] = BePrintable(fccType ); fcc[1] = BePrintable(fccType >> 8); fcc[2] = BePrintable(fccType >> 16); fcc[3] = BePrintable(fccType >> 24); fcc[4] = 0; _RPT4(0,"%p->CAVIFileSynth::GetStream(*, %08x(%s), %ld)\n", this, fccType, fcc, lParam); if (!DelayInit()) return E_FAIL; *ppStream = NULL; if (!fccType) { // Maybe an Option to set the order of stream discovery if ((lParam==0) && (vi->HasVideo()) ) fccType = streamtypeVIDEO; else if ( ((lParam==1) && (vi->HasVideo())) || ((lParam==0) && vi->HasAudio()) ) { lParam=0; fccType = streamtypeAUDIO; } } if (lParam > 0) return AVIERR_NODATA; if (fccType == streamtypeVIDEO) { if (!vi->HasVideo()) return AVIERR_NODATA; if ((casr = new(std::nothrow) CAVIStreamSynth(this, false)) == 0) return AVIERR_MEMORY; *ppStream = (IAVIStream *)casr; } else if (fccType == streamtypeAUDIO) { if (!vi->HasAudio()) return AVIERR_NODATA; if ((casr = new(std::nothrow) CAVIStreamSynth(this, true)) == 0) return AVIERR_MEMORY; *ppStream = (IAVIStream *)casr; } else return AVIERR_NODATA; return S_OK; } //////////////////////////////////////////////////////////////////////// //////////// IAvisynthClipInfo int __stdcall CAVIFileSynth::GetError(const char** ppszMessage) { if (!DelayInit() && !error_msg) error_msg = "Avisynth: script open failed!"; if (ppszMessage) *ppszMessage = error_msg; return !!error_msg; } bool __stdcall CAVIFileSynth::GetParity(int n) { if (!DelayInit()) return false; return filter_graph->GetParity(n); } bool __stdcall CAVIFileSynth::IsFieldBased() { if (!DelayInit()) return false; return vi->IsFieldBased(); } //////////////////////////////////////////////////////////////////////// // // CAVIStreamSynth // //////////////////////////////////////////////////////////////////////// //////////// IAVIStreaming STDMETHODIMP CAVIStreamSynth::Begin(LONG lStart, LONG lEnd, LONG lRate) { _RPT5(0,"%p->CAVIStreamSynth::Begin(%ld, %ld, %ld) (%s)\n", this, lStart, lEnd, lRate, sName); return S_OK; } STDMETHODIMP CAVIStreamSynth::End() { _RPT2(0,"%p->CAVIStreamSynth::End() (%s)\n", this, sName); return S_OK; } //////////// IAVIStream STDMETHODIMP CAVIStreamSynth::Create(LPARAM lParam1, LPARAM lParam2) { _RPT1(0,"%p->CAVIStreamSynth::Create()\n", this); return AVIERR_READONLY; } STDMETHODIMP CAVIStreamSynth::Delete(LONG lStart, LONG lSamples) { _RPT1(0,"%p->CAVIStreamSynth::Delete()\n", this); return AVIERR_READONLY; } STDMETHODIMP CAVIStreamSynth::ReadData(DWORD fcc, LPVOID lp, LONG *lpcb) { _RPT1(0,"%p->CAVIStreamSynth::ReadData()\n", this); return AVIERR_NODATA; } STDMETHODIMP CAVIStreamSynth::SetFormat(LONG lPos, LPVOID lpFormat, LONG cbFormat) { _RPT1(0,"%p->CAVIStreamSynth::SetFormat()\n", this); return AVIERR_READONLY; } STDMETHODIMP CAVIStreamSynth::WriteData(DWORD fcc, LPVOID lpBuffer, LONG cbBuffer) { _RPT1(0,"%p->CAVIStreamSynth::WriteData()\n", this); return AVIERR_READONLY; } STDMETHODIMP CAVIStreamSynth::SetInfo(AVISTREAMINFOW *psi, LONG lSize) { _RPT1(0,"%p->CAVIStreamSynth::SetInfo()\n", this); return AVIERR_READONLY; } //////////////////////////////////////////////////////////////////////// //////////// local CAVIStreamSynth::CAVIStreamSynth(CAVIFileSynth *parentPtr, bool isAudio) { sName = isAudio ? "audio" : "video"; _RPT2(0,"%p->CAVIStreamSynth(%s)\n", this, sName); m_refs = 0; AddRef(); parent = parentPtr; fAudio = isAudio; parent->AddRef(); } CAVIStreamSynth::~CAVIStreamSynth() { _RPT3(0,"%p->~CAVIStreamSynth() (%s), gRefCnt = %d\n", this, sName, gRefCnt); if (parent) parent->Release(); } //////////////////////////////////////////////////////////////////////// //////////// IAVIStream STDMETHODIMP_(LONG) CAVIStreamSynth::Info(AVISTREAMINFOW *psi, LONG lSize) { _RPT4(0,"%p->CAVIStreamSynth::Info(%p, %ld) (%s)\n", this, psi, lSize, sName); if (!psi) return E_POINTER; AVISTREAMINFOW asi; const VideoInfo* const vi = parent->vi; memset(&asi, 0, sizeof(asi)); asi.fccType = fAudio ? streamtypeAUDIO : streamtypeVIDEO; asi.dwQuality = DWORD(-1); if (fAudio) { asi.fccHandler = 0; int bytes_per_sample = vi->BytesPerAudioSample(); asi.dwScale = bytes_per_sample; asi.dwRate = vi->audio_samples_per_second * bytes_per_sample; asi.dwLength = (unsigned int)vi->num_audio_samples; asi.dwSampleSize = bytes_per_sample; wcscpy(asi.szName, L"Avisynth audio #1"); } else { bool targetIsConvertedToPackedRGB = (parent->Enable_PlanarToPackedRGB && (vi->IsPlanarRGB() || vi->IsPlanarRGBA())); VideoInfo vi_final = *vi; // if basic type is changed, that affects buffer size, we change the format here if (targetIsConvertedToPackedRGB) { // Enable_PlanarToPackedRGB results in packed RGB64 for bits>8, RGB24/32 for 8 bits if (vi->BitsPerComponent() == 8) { if (vi->IsPlanarRGB()) vi_final.pixel_type = VideoInfo::CS_BGR24; else // planar RGBA vi_final.pixel_type = VideoInfo::CS_BGR32; } else // all 8+ bit planar RGB(A) is converted to RGB64 vi_final.pixel_type = VideoInfo::CS_BGR64; } // silent mapping of 12/14 bit YUV formats to 16 bit if (vi->pixel_type == VideoInfo::CS_YUV420P12 || vi->pixel_type == VideoInfo::CS_YUV420P14 || vi->pixel_type == VideoInfo::CS_YUV420PS) vi_final.pixel_type = VideoInfo::CS_YUV420P16; else if (vi->pixel_type == VideoInfo::CS_YUV422P12 || vi->pixel_type == VideoInfo::CS_YUV422P14 || vi->pixel_type == VideoInfo::CS_YUV422PS) vi_final.pixel_type = VideoInfo::CS_YUV422P16; else if (vi->pixel_type == VideoInfo::CS_YUV444P10 || vi->pixel_type == VideoInfo::CS_YUV444P12 || vi->pixel_type == VideoInfo::CS_YUV444P14 || vi->pixel_type == VideoInfo::CS_YUV444PS) vi_final.pixel_type = VideoInfo::CS_YUV444P16; else if (vi->pixel_type == VideoInfo::CS_YUVA444P10 || vi->pixel_type == VideoInfo::CS_YUVA444P12 || vi->pixel_type == VideoInfo::CS_YUVA444P14 || vi->pixel_type == VideoInfo::CS_YUVA444PS) vi_final.pixel_type = VideoInfo::CS_YUVA444P16; // -- pixel_type change end const int image_size = parent->ImageSize(&vi_final); asi.fccHandler = MAKEFOURCC('N','K','N','U'); // 'UNKN'; if (vi_final.IsRGB() && !vi_final.IsPlanar() && vi_final.BitsPerComponent() == 8) asi.fccHandler = MAKEFOURCC('D','I','B',' '); else if (vi_final.IsYUY2()) asi.fccHandler = MAKEFOURCC('Y','U','Y','2'); else if (vi_final.IsYV12()) asi.fccHandler = MAKEFOURCC('Y','V','1','2'); else if (vi_final.IsY8()) asi.fccHandler = MAKEFOURCC('Y','8','0','0'); else if (vi_final.IsYV24()) asi.fccHandler = MAKEFOURCC('Y','V','2','4'); else if (vi_final.IsYV16()) asi.fccHandler = MAKEFOURCC('Y','V','1','6'); else if (vi_final.IsYV411()) asi.fccHandler = MAKEFOURCC('Y','4','1','B'); // avs+ else if (vi_final.IsRGB64() && parent->Enable_b64a) asi.fccHandler = MAKEFOURCC('b','6','4','a'); // b64a = packed rgba 4*16-bit else if (vi_final.IsRGB64()) asi.fccHandler = MAKEFOURCC('B','R','A',64); // BRA@ ie. BRA[64] else if (vi_final.IsRGB48()) asi.fccHandler = MAKEFOURCC('B','G','R',48); // BGR0 ie. BGR[48] else if (vi_final.pixel_type == VideoInfo::CS_YUV420P10) asi.fccHandler = MAKEFOURCC('P','0','1','0'); else if (vi_final.pixel_type == VideoInfo::CS_YUV420P16) asi.fccHandler = MAKEFOURCC('P','0','1','6'); else if (vi_final.pixel_type == VideoInfo::CS_YUV422P10 && parent->Enable_V210) asi.fccHandler = MAKEFOURCC('v','2','1','0'); else if (vi_final.pixel_type == VideoInfo::CS_YUV422P10 && parent->Enable_Y3_10_10) asi.fccHandler = MAKEFOURCC('Y', '3', 10, 10); // Y3[10][10] (AV_PIX_FMT_YUV422P10) = planar YUV 422*10-bit else if (vi_final.pixel_type == VideoInfo::CS_YUV422P10) asi.fccHandler = MAKEFOURCC('P','2','1','0'); else if (vi_final.pixel_type == VideoInfo::CS_YUV422P16 && parent->Enable_Y3_10_16) asi.fccHandler = MAKEFOURCC('Y', '3', 10, 16); // Y3[10][16] (AV_PIX_FMT_YUV422P16) = planar YUV 422*16-bit else if (vi_final.pixel_type == VideoInfo::CS_YUV422P16) asi.fccHandler = MAKEFOURCC('P','2','1','6'); else if (vi_final.pixel_type == VideoInfo::CS_YUV444P16 || vi_final.pixel_type == VideoInfo::CS_YUVA444P16) asi.fccHandler = MAKEFOURCC('Y','4','1','6'); else if (vi_final.pixel_type == VideoInfo::CS_RGBP) asi.fccHandler = MAKEFOURCC('G','3',0, 8); // similar to 10-16 bits G3[0][8] // asi.fccHandler = MAKEFOURCC('8','B','P','S'); // this would be a special RLE encoded format // MagicYUV implements these (planar rgb/rgba 10,12,14,16) G3[0][10], G4[0][10], G3[0][12], G4[0][12], G3[0][14], G4[0][14], G3[0][16], G4[0][16] else if (vi_final.pixel_type == VideoInfo::CS_RGBP10) asi.fccHandler = MAKEFOURCC('G','3',0,10); else if (vi_final.pixel_type == VideoInfo::CS_RGBP12) asi.fccHandler = MAKEFOURCC('G','3',0,12); else if (vi_final.pixel_type == VideoInfo::CS_RGBP14) asi.fccHandler = MAKEFOURCC('G','3',0,14); else if (vi_final.pixel_type == VideoInfo::CS_RGBP16) asi.fccHandler = MAKEFOURCC('G','3',0,16); else if (vi_final.pixel_type == VideoInfo::CS_RGBAP) asi.fccHandler = MAKEFOURCC('G','4',0, 8); // similar to 10-16 bits G4[0][10] else if (vi_final.pixel_type == VideoInfo::CS_RGBAP10) asi.fccHandler = MAKEFOURCC('G','4',0,10); else if (vi_final.pixel_type == VideoInfo::CS_RGBAP12) asi.fccHandler = MAKEFOURCC('G','4',0,12); else if (vi_final.pixel_type == VideoInfo::CS_RGBAP14) asi.fccHandler = MAKEFOURCC('G','4',0,14); else if (vi_final.pixel_type == VideoInfo::CS_RGBAP16) asi.fccHandler = MAKEFOURCC('G','4',0,16); else { // fixme: YUVA420P8, grey 10+ bits such as Y16 are not covered _ASSERT(FALSE); } asi.dwScale = vi_final.fps_denominator; asi.dwRate = vi_final.fps_numerator; asi.dwLength = vi_final.num_frames; asi.rcFrame.right = vi_final.width; asi.rcFrame.bottom = vi_final.height; asi.dwSampleSize = image_size; asi.dwSuggestedBufferSize = image_size; wcscpy(asi.szName, L"Avisynth video #1"); } // Maybe should return AVIERR_BUFFERTOOSMALL for lSize < sizeof(asi) memset(psi, 0, lSize); memcpy(psi, &asi, min(size_t(lSize), sizeof(asi))); return S_OK; } STDMETHODIMP_(LONG) CAVIStreamSynth::FindSample(LONG lPos, LONG lFlags) { // _RPT3(0,"%p->CAVIStreamSynth::FindSample(%ld, %08lx)\n", this, lPos, lFlags); if (lFlags & FIND_FORMAT) return -1; if (lFlags & FIND_FROM_START) return 0; return lPos; } //////////////////////////////////////////////////////////////////////// //////////// local int CAVIFileSynth::ImageSize(const VideoInfo *vi) { return AviHelper_ImageSize(vi, AVIPadScanlines, Enable_V210, false, false, false, false, false, false); } void CAVIStreamSynth::ReadFrame(void* lpBuffer, int n) { // _RPT1(0, "CAVIStreamSynth::ReadFrame %d\r\n", n); VideoInfo vi = parent->filter_graph->GetVideoInfo(); PVideoFrame frame; if (((vi.Is420() || vi.Is422()) && (vi.BitsPerComponent() == 12 || vi.BitsPerComponent() == 14 || vi.BitsPerComponent() == 32)) || (vi.Is444() && (vi.BitsPerComponent() > 8 && vi.BitsPerComponent() != 16))) { // silent mapping of 12/14bit/float YUV420/422 formats to 16 bits AVSValue new_args[2] = { parent->filter_graph, 16 }; PClip newClip = parent->env->Invoke("ConvertBits", AVSValue(new_args, 2)).AsClip(); frame = newClip->GetFrame(n, parent->env); vi = newClip->GetVideoInfo(); } else if (parent->Enable_PlanarToPackedRGB && (vi.IsPlanarRGB() || vi.IsPlanarRGBA())) { PClip newClip; // convert Planar RGB to RGB24/32/RGB64 if (vi.BitsPerComponent() == 8) // 8 bit: ConvertToRGB24/32 { if (vi.IsPlanarRGB()) { AVSValue new_args[1] = { parent->filter_graph }; newClip = parent->env->Invoke("ConvertToRGB24", AVSValue(new_args, 1)).AsClip(); } else { // IsPlanarRGBA() AVSValue new_args[1] = { parent->filter_graph }; newClip = parent->env->Invoke("ConvertToRGB32", AVSValue(new_args, 1)).AsClip(); } } else { // 8+ bits, always RGB64 newClip = parent->filter_graph; if (vi.BitsPerComponent() != 16) { AVSValue new_args[2] = { newClip, 16 }; newClip = parent->env->Invoke("ConvertBits", AVSValue(new_args, 2)).AsClip(); } AVSValue new_args[1] = { newClip }; newClip = parent->env->Invoke("ConvertToRGB64", AVSValue(new_args, 1)).AsClip(); } frame = newClip->GetFrame(n, parent->env); vi = newClip->GetVideoInfo(); } else { // no on-the-fly conversion frame = parent->filter_graph->GetFrame(n, parent->env); } if (!frame) parent->env->ThrowError("Avisynth error: generated video frame was nil (this is a bug)"); // Y416 packed U,Y,V,A if (vi.pixel_type == VideoInfo::CS_YUV444P16 || vi.pixel_type == VideoInfo::CS_YUVA444P16) { int width = vi.width; int height = vi.height; int ppitch_y = frame->GetPitch(PLANAR_Y); int ppitch_uv = frame->GetPitch(PLANAR_U); int ppitch_a = frame->GetPitch(PLANAR_A); bool hasAlpha = (vi.NumComponents() == 4); const uint8_t *yptr = frame->GetReadPtr(PLANAR_Y); const uint8_t *uptr = frame->GetReadPtr(PLANAR_U); const uint8_t *vptr = frame->GetReadPtr(PLANAR_V); const uint8_t *aptr = frame->GetReadPtr(PLANAR_A); uint8_t *outbuf = (uint8_t *)lpBuffer; int out_pitch = width * 4 * sizeof(uint16_t); #ifdef INTEL_INTRINSICS if ((parent->env->GetCPUFlags() & CPUF_SSE2) != 0) { if (hasAlpha) ToY416_sse2(outbuf, out_pitch, yptr, ppitch_y, uptr, vptr, ppitch_uv, aptr, ppitch_a, width, height); else ToY416_sse2(outbuf, out_pitch, yptr, ppitch_y, uptr, vptr, ppitch_uv, aptr, ppitch_a, width, height); } else #endif { if (hasAlpha) ToY416_c(outbuf, out_pitch, yptr, ppitch_y, uptr, vptr, ppitch_uv, aptr, ppitch_a, width, height); else ToY416_c(outbuf, out_pitch, yptr, ppitch_y, uptr, vptr, ppitch_uv, aptr, ppitch_a, width, height); } return; } const int pitch = frame->GetPitch(); const int row_size = frame->GetRowSize(); const int height = frame->GetHeight(); int out_pitch; int out_pitchUV; // BMP scanlines are dword-aligned if ((vi.IsRGB() && !vi.IsPlanar()) || vi.IsYUY2() || vi.IsY() || parent->AVIPadScanlines) { out_pitch = (row_size+3) & ~3; out_pitchUV = (frame->GetRowSize(PLANAR_U)+3) & ~3; // 0 for packed RGB } // Planar scanlines are packed else { out_pitch = row_size; if(vi.IsRGB()) out_pitchUV = frame->GetRowSize(PLANAR_B); // G=B=R else out_pitchUV = frame->GetRowSize(PLANAR_U); } int plane1; int plane2; // Old VDub wants YUV for YV24 and YV16 and YVU for YV12. if (parent->VDubPlanarHack && !vi.IsYV12() && !vi.IsRGB() && vi.BitsPerComponent() == 8) { plane1 = PLANAR_U; plane2 = PLANAR_V; } else { if (vi.IsRGB() && vi.IsPlanar()) { // (PLANAR_G) plane1 = PLANAR_B; plane2 = PLANAR_R; } else { if (vi.BitsPerComponent() == 8) { // Set default VFW output plane order. plane1 = PLANAR_V; plane2 = PLANAR_U; } else { plane1 = PLANAR_U; plane2 = PLANAR_V; } } } bool semi_packed_p10 = (vi.pixel_type == VideoInfo::CS_YUV420P10) || (vi.pixel_type == VideoInfo::CS_YUV422P10) ; bool semi_packed_p16 = (vi.pixel_type == VideoInfo::CS_YUV420P16) || (vi.pixel_type == VideoInfo::CS_YUV422P16) ; #ifdef INTEL_INTRINSICS const bool ssse3 = (parent->env->GetCPUFlags() & CPUF_SSSE3) != 0; const bool sse2 = (parent->env->GetCPUFlags() & CPUF_SSE2) != 0; #endif if ((vi.pixel_type == VideoInfo::CS_YUV420P10) || (vi.pixel_type == VideoInfo::CS_YUV420P16) || ((vi.pixel_type == VideoInfo::CS_YUV422P10) && !parent->Enable_Y3_10_10 && !parent->Enable_V210) || ((vi.pixel_type == VideoInfo::CS_YUV422P16) && !parent->Enable_Y3_10_16)) { yuv42xp10_16_to_Px10_16((uint8_t *)lpBuffer, out_pitch, frame->GetReadPtr(), frame->GetPitch(), frame->GetReadPtr(PLANAR_U), frame->GetReadPtr(PLANAR_V), frame->GetPitch(PLANAR_U), vi.width, vi.height, frame->GetHeight(PLANAR_U), semi_packed_p16, parent->env); } else { if (vi.pixel_type == VideoInfo::CS_YUV422P10 && parent->Enable_V210) { int width = frame->GetRowSize(PLANAR_Y) / vi.ComponentSize(); yuv422p10_to_v210((BYTE *)lpBuffer, frame->GetReadPtr(PLANAR_Y), frame->GetPitch(PLANAR_Y), frame->GetReadPtr(PLANAR_U), frame->GetReadPtr(PLANAR_V), frame->GetPitch(PLANAR_U), width, height); } else if (semi_packed_p10 && !parent->Enable_Y3_10_10 && !parent->Enable_V210) { // already handled } else if (vi.IsRGB64() && parent->Enable_b64a) { // BGRA -> big endian ARGB with byte swap uint8_t* pdst = (uint8_t *)lpBuffer + out_pitch * (height - 1); // upside down int srcpitch = frame->GetPitch(); const BYTE *src = frame->GetReadPtr(); #ifdef INTEL_INTRINSICS if (ssse3) bgra_to_argbBE_ssse3(pdst, -out_pitch, src, srcpitch, vi.width, vi.height); else if (sse2) bgra_to_argbBE_sse2(pdst, -out_pitch, src, srcpitch, vi.width, vi.height); else #endif bgra_to_argbBE_c(pdst, -out_pitch, src, srcpitch, vi.width, vi.height); } else if (vi.IsRGB48() || vi.IsRGB64()) { // avisynth: upside down, output: back to normal parent->env->BitBlt((BYTE*)lpBuffer + out_pitch * (height - 1), -out_pitch, frame->GetReadPtr(), pitch, row_size, height); } else { parent->env->BitBlt((BYTE*)lpBuffer, out_pitch, frame->GetReadPtr(), pitch, row_size, height); } if (vi.pixel_type == VideoInfo::CS_YUV422P10 && parent->Enable_V210) { // intentionally empty } else if ((semi_packed_p10 && !parent->Enable_Y3_10_10 && !parent->Enable_V210) || (semi_packed_p16 && !parent->Enable_Y3_10_16)) { // already handled } else { // for RGB48 and 64 these are zero sized parent->env->BitBlt((BYTE*)lpBuffer + (out_pitch*height), out_pitchUV, frame->GetReadPtr(plane1), frame->GetPitch(plane1), frame->GetRowSize(plane1), frame->GetHeight(plane1)); parent->env->BitBlt((BYTE*)lpBuffer + (out_pitch*height + frame->GetHeight(plane1)*out_pitchUV), out_pitchUV, frame->GetReadPtr(plane2), frame->GetPitch(plane2), frame->GetRowSize(plane2), frame->GetHeight(plane2)); // fill alpha, not from YUVA, only from RGBAP, because only RGBAP8-16 is mapped to alpha aware fourCCs if (vi.IsPlanarRGBA()) { parent->env->BitBlt((BYTE*)lpBuffer + (out_pitch*height + 2 * frame->GetHeight(plane1)*out_pitchUV), out_pitchUV, frame->GetReadPtr(PLANAR_A), frame->GetPitch(PLANAR_A), frame->GetRowSize(PLANAR_A), frame->GetHeight(PLANAR_A)); } } } // no alpha? //_RPT1(0, "CAVIStreamSynth::ReadFrame %d END\r\n", n); } //////////////////////////////////////////////////////////////////////// //////////// IAVIStream STDMETHODIMP CAVIStreamSynth::Read(LONG lStart, LONG lSamples, LPVOID lpBuffer, LONG cbBuffer, LONG *plBytes, LONG *plSamples) { #if defined(X86_32) && defined(MSVC) // TODO: Does this need 64-bit porting? __asm { // Force compiler to protect these registers! mov ebx,ebx; mov esi,esi; mov edi,edi; } #endif parent->Lock(); HRESULT result = Read2(lStart, lSamples, lpBuffer, cbBuffer, plBytes, plSamples); parent->Unlock(); return result; } HRESULT CAVIStreamSynth::Read2(LONG lStart, LONG lSamples, LPVOID lpBuffer, LONG cbBuffer, LONG *plBytes, LONG *plSamples) { // _RPT3(0,"%p->CAVIStreamSynth::Read(%ld samples at %ld)\n", this, lSamples, lStart); // _RPT2(0,"\tbuffer: %ld bytes at %p\n", cbBuffer, lpBuffer); #ifdef MSVC unsigned int fp_state = _controlfp( 0, 0 ); _controlfp( FP_STATE, FP_MASK); #endif const VideoInfo* const vi = parent->vi; bool targetIsConvertedToPackedRGB = (parent->Enable_PlanarToPackedRGB && (vi->IsPlanarRGB() || vi->IsPlanarRGBA())); VideoInfo vi_final = *vi; // if basic type is changed, that affects buffer size, we change the format here if (targetIsConvertedToPackedRGB) { // Enable_PlanarToPackedRGB results in packed RGB64 for bits>8, RGB24/32 for 8 bits if (vi->BitsPerComponent() == 8) { if (vi->IsPlanarRGB()) vi_final.pixel_type = VideoInfo::CS_BGR24; else // planar RGBA vi_final.pixel_type = VideoInfo::CS_BGR32; } else // all 8+ bit planar RGB(A) is converted to RGB64 vi_final.pixel_type = VideoInfo::CS_BGR64; } // silent mapping of 12/14/float bit YUV formats to 16 bit if (vi->pixel_type == VideoInfo::CS_YUV420P12 || vi->pixel_type == VideoInfo::CS_YUV420P14 || vi->pixel_type == VideoInfo::CS_YUV420PS) vi_final.pixel_type = VideoInfo::CS_YUV420P16; else if (vi->pixel_type == VideoInfo::CS_YUV422P12 || vi->pixel_type == VideoInfo::CS_YUV422P14 || vi->pixel_type == VideoInfo::CS_YUV422PS) vi_final.pixel_type = VideoInfo::CS_YUV422P16; else if (vi->pixel_type == VideoInfo::CS_YUV444P10 || vi->pixel_type == VideoInfo::CS_YUV444P12 || vi->pixel_type == VideoInfo::CS_YUV444P14 || vi->pixel_type == VideoInfo::CS_YUV444PS) vi_final.pixel_type = VideoInfo::CS_YUV444P16; else if (vi->pixel_type == VideoInfo::CS_YUVA444P10 || vi->pixel_type == VideoInfo::CS_YUVA444P12 || vi->pixel_type == VideoInfo::CS_YUVA444P14 || vi->pixel_type == VideoInfo::CS_YUVA444PS) vi_final.pixel_type = VideoInfo::CS_YUVA444P16; // -- pixel_type change end if (fAudio) { // buffer overflow patch -- Avery Lee - Mar 2006 if (lSamples == AVISTREAMREAD_CONVENIENT) lSamples = (int)vi->AudioSamplesFromFrames(1); if (int64_t(lStart)+lSamples > vi->num_audio_samples) { lSamples = (int)(vi->num_audio_samples - lStart); if (lSamples < 0) lSamples = 0; } int bytes = (int)vi->BytesFromAudioSamples(lSamples); if (lpBuffer && bytes > cbBuffer) { lSamples = (int)vi->AudioSamplesFromBytes(cbBuffer); bytes = (int)vi->BytesFromAudioSamples(lSamples); } if (plBytes) *plBytes = bytes; if (plSamples) *plSamples = lSamples; if (!lpBuffer || !lSamples) return S_OK; } else { if (lStart >= vi->num_frames) { if (plSamples) *plSamples = 0; if (plBytes) *plBytes = 0; return S_OK; } const int image_size = parent->ImageSize(&vi_final); if (plSamples) *plSamples = 1; if (plBytes) *plBytes = image_size; if (!lpBuffer) { return S_OK; } else if (cbBuffer < image_size) { // _RPT1(0,"\tBuffer too small; should be %ld samples\n", image_size); return AVIERR_BUFFERTOOSMALL; } } #ifndef _DEBUG try { try { #endif SehGuard seh_guard; if (fAudio) parent->filter_graph->GetAudio(lpBuffer, lStart, lSamples, parent->env); else ReadFrame(lpBuffer, lStart); #ifndef _DEBUG } catch (AvisynthError &error) { parent->MakeErrorStream(error.msg); throw; } catch (SehException &seh) { char buf[256]; _snprintf(buf, 255, "CAVIStreamSynth: %s at 0x%p", seh.m_msg, seh.m_addr); parent->MakeErrorStream(parent->env->SaveString(buf)); throw; } catch (...) { parent->MakeErrorStream("CAVIStreamSynth: unhandled C++ exception"); throw; } } catch (...) { #ifdef X86_32 _mm_empty(); #endif #ifdef MSVC _clearfp(); _controlfp( fp_state, FP_MASK); #endif return E_FAIL; } #endif #ifdef X86_32 _mm_empty(); #endif #ifdef MSVC _clearfp(); _controlfp( fp_state, FP_MASK); #endif return S_OK; } STDMETHODIMP CAVIStreamSynth::ReadFormat(LONG lPos, LPVOID lpFormat, LONG *lpcbFormat) { _RPT2(0,"%p->CAVIStreamSynth::ReadFormat() (%s)\n", this, sName); if (!lpcbFormat) return E_POINTER; const VideoInfo* const vi = parent->vi; const bool UseWaveExtDefault = vi->IsChannelMaskKnown(); const bool UseWaveExtensible = parent->env->GetVarBool(VARNAME_UseWaveExtensible, UseWaveExtDefault); if (!lpFormat) { *lpcbFormat = fAudio ? ( UseWaveExtensible ? sizeof(WAVEFORMATEXTENSIBLE) : sizeof(WAVEFORMATEX) ) : sizeof(BITMAPINFOHEADER); return S_OK; } memset(lpFormat, 0, *lpcbFormat); if (fAudio) { if (UseWaveExtensible) { // Use WAVE_FORMAT_EXTENSIBLE audio output format #ifndef MSVC const GUID KSDATAFORMAT_SUBTYPE_PCM = {0x00000001, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}}; #endif #ifndef MSVC const GUID KSDATAFORMAT_SUBTYPE_IEEE_FLOAT= {0x00000003, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}}; #endif WAVEFORMATEXTENSIBLE wfxt; memset(&wfxt, 0, sizeof(wfxt)); wfxt.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; wfxt.Format.nChannels = (WORD)vi->AudioChannels(); wfxt.Format.nSamplesPerSec = vi->SamplesPerSecond(); wfxt.Format.wBitsPerSample = (WORD)(vi->BytesPerChannelSample() * 8); wfxt.Format.nBlockAlign = (WORD)vi->BytesPerAudioSample(); wfxt.Format.nAvgBytesPerSec = wfxt.Format.nSamplesPerSec * wfxt.Format.nBlockAlign; wfxt.Format.cbSize = sizeof(wfxt) - sizeof(wfxt.Format); wfxt.Samples.wValidBitsPerSample = wfxt.Format.wBitsPerSample; // If is set, then let's use it. if (vi->IsChannelMaskKnown()) wfxt.dwChannelMask = vi->GetChannelMask(); else { wfxt.dwChannelMask = (unsigned)vi->AudioChannels() <= 8 ? GetDefaultChannelLayout(vi->AudioChannels()) : (unsigned)vi->AudioChannels() <= 18 ? DWORD(-1) >> (32 - vi->AudioChannels()) : SPEAKER_ALL; unsigned int userChannelMask = (unsigned)(parent->env->GetVarInt(VARNAME_dwChannelMask, 0)); if (userChannelMask != 0) wfxt.dwChannelMask = userChannelMask; } wfxt.SubFormat = vi->IsSampleType(SAMPLE_FLOAT) ? KSDATAFORMAT_SUBTYPE_IEEE_FLOAT : KSDATAFORMAT_SUBTYPE_PCM; *lpcbFormat = min(*lpcbFormat, (LONG)sizeof(wfxt)); memcpy(lpFormat, &wfxt, size_t(*lpcbFormat)); } else { WAVEFORMATEX wfx; memset(&wfx, 0, sizeof(wfx)); wfx.wFormatTag = vi->IsSampleType(SAMPLE_FLOAT) ? WAVE_FORMAT_IEEE_FLOAT : WAVE_FORMAT_PCM; wfx.nChannels = (WORD)vi->AudioChannels(); wfx.nSamplesPerSec = vi->SamplesPerSecond(); wfx.wBitsPerSample = (WORD)(vi->BytesPerChannelSample() * 8); wfx.nBlockAlign = (WORD)vi->BytesPerAudioSample(); wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; *lpcbFormat = min(*lpcbFormat, (LONG)sizeof(wfx)); memcpy(lpFormat, &wfx, size_t(*lpcbFormat)); } } else { bool targetIsConvertedToPackedRGB = (parent->Enable_PlanarToPackedRGB && (vi->IsPlanarRGB() || vi->IsPlanarRGBA())); VideoInfo vi_final = *vi; // if basic type is changed, that affects buffer size, we change the format here if (targetIsConvertedToPackedRGB) { // Enable_PlanarToPackedRGB results in packed RGB64 for bits>8, RGB24/32 for 8 bits if (vi->BitsPerComponent() == 8) { if (vi->IsPlanarRGB()) vi_final.pixel_type = VideoInfo::CS_BGR24; else // planar RGBA vi_final.pixel_type = VideoInfo::CS_BGR32; } else // all 8+ bit planar RGB(A) is converted to RGB64 vi_final.pixel_type = VideoInfo::CS_BGR64; } // silent mapping of 12/14 bit YUV formats to 16 bit if (vi->pixel_type == VideoInfo::CS_YUV420P12 || vi->pixel_type == VideoInfo::CS_YUV420P14 || vi->pixel_type == VideoInfo::CS_YUV420PS) vi_final.pixel_type = VideoInfo::CS_YUV420P16; else if (vi->pixel_type == VideoInfo::CS_YUV422P12 || vi->pixel_type == VideoInfo::CS_YUV422P14 || vi->pixel_type == VideoInfo::CS_YUV422PS) vi_final.pixel_type = VideoInfo::CS_YUV422P16; else if (vi->pixel_type == VideoInfo::CS_YUV444P10 || vi->pixel_type == VideoInfo::CS_YUV444P12 || vi->pixel_type == VideoInfo::CS_YUV444P14 || vi->pixel_type == VideoInfo::CS_YUV444PS) vi_final.pixel_type = VideoInfo::CS_YUV444P16; else if (vi->pixel_type == VideoInfo::CS_YUVA444P10 || vi->pixel_type == VideoInfo::CS_YUVA444P12 || vi->pixel_type == VideoInfo::CS_YUVA444P14 || vi->pixel_type == VideoInfo::CS_YUVA444PS) vi_final.pixel_type = VideoInfo::CS_YUVA444P16; // -- pixel_type change end BITMAPINFOHEADER bi; memset(&bi, 0, sizeof(bi)); bi.biSize = sizeof(bi); bi.biWidth = vi_final.width; bi.biHeight = vi_final.height; bi.biPlanes = 1; bi.biBitCount = (WORD)vi_final.BitsPerPixel(); if (vi_final.pixel_type == VideoInfo::CS_YUV422P10 && parent->Enable_V210) bi.biBitCount = 20; // Enable_PlanarToPackedRGB results in packed RGB64 for bits>8, RGB24/32 for 8 bits if (vi_final.IsRGB() && !vi_final.IsPlanar() && vi_final.BitsPerComponent() == 8) bi.biCompression = BI_RGB; else if (vi_final.IsYUY2()) bi.biCompression = MAKEFOURCC('Y','U','Y','2'); else if (vi_final.IsYV12()) bi.biCompression = MAKEFOURCC('Y','V','1','2'); else if (vi_final.IsY8()) bi.biCompression = MAKEFOURCC('Y','8','0','0'); else if (vi_final.IsYV24()) bi.biCompression = MAKEFOURCC('Y','V','2','4'); else if (vi_final.IsYV16()) bi.biCompression = MAKEFOURCC('Y','V','1','6'); else if (vi_final.IsYV411()) bi.biCompression = MAKEFOURCC('Y','4','1','B'); // avs+ else if (vi_final.IsRGB64() && parent->Enable_b64a) bi.biCompression = MAKEFOURCC('b','6','4','a'); else if (vi_final.IsRGB64()) bi.biCompression = MAKEFOURCC('B','R','A',64); // BRA@ ie. BRA[64] else if (vi_final.IsRGB48()) bi.biCompression = MAKEFOURCC('B','G','R',48); // BGR0 ie. BGR[48] else if (vi_final.pixel_type == VideoInfo::CS_YUV420P10) bi.biCompression = MAKEFOURCC('P','0','1','0'); else if (vi_final.pixel_type == VideoInfo::CS_YUV420P16) bi.biCompression = MAKEFOURCC('P','0','1','6'); else if (vi_final.pixel_type == VideoInfo::CS_YUV422P10 && parent->Enable_Y3_10_10) bi.biCompression = MAKEFOURCC('Y', '3', 10, 10); // Y3[10][10] (AV_PIX_FMT_YUV422P10) = planar YUV 422*10-bit else if (vi_final.pixel_type == VideoInfo::CS_YUV422P10 && parent->Enable_V210) bi.biCompression = MAKEFOURCC('v','2','1','0'); else if (vi_final.pixel_type == VideoInfo::CS_YUV422P10) bi.biCompression = MAKEFOURCC('P','2','1','0'); else if (vi_final.pixel_type == VideoInfo::CS_YUV422P16 && parent->Enable_Y3_10_16) bi.biCompression = MAKEFOURCC('Y', '3', 10, 16); // Y3[10][16] (AV_PIX_FMT_YUV422P16) = planar YUV 422*16-bit else if (vi_final.pixel_type == VideoInfo::CS_YUV422P16) bi.biCompression = MAKEFOURCC('P','2','1','6'); else if (vi_final.pixel_type == VideoInfo::CS_YUV444P16 || vi_final.pixel_type == VideoInfo::CS_YUVA444P16) bi.biCompression = MAKEFOURCC('Y','4','1','6'); else if (vi_final.pixel_type == VideoInfo::CS_RGBP) bi.biCompression = MAKEFOURCC('G','3', 0, 8); // bi.biCompression = MAKEFOURCC('8','B','P','S'); special RLA encoded format, support G3[0][8] instead // MagicYUV implements these (planar rgb/rgba 10,12,14,16) G3[0][10], G4[0][10], G3[0][12], G4[0][12], G3[0][14], G4[0][14], G3[0][16], G4[0][16] else if (vi_final.pixel_type == VideoInfo::CS_RGBP10) bi.biCompression = MAKEFOURCC('G','3',0,10); else if (vi_final.pixel_type == VideoInfo::CS_RGBP12) bi.biCompression = MAKEFOURCC('G','3',0,12); else if (vi_final.pixel_type == VideoInfo::CS_RGBP14) bi.biCompression = MAKEFOURCC('G','3',0,14); else if (vi_final.pixel_type == VideoInfo::CS_RGBP16) bi.biCompression = MAKEFOURCC('G','3',0,16); else if (vi_final.pixel_type == VideoInfo::CS_RGBAP) bi.biCompression = MAKEFOURCC('G','4',0, 8); // similar to 10-16 bits else if (vi_final.pixel_type == VideoInfo::CS_RGBAP10) bi.biCompression = MAKEFOURCC('G','4',0,10); else if (vi_final.pixel_type == VideoInfo::CS_RGBAP12) bi.biCompression = MAKEFOURCC('G','4',0,12); else if (vi_final.pixel_type == VideoInfo::CS_RGBAP14) bi.biCompression = MAKEFOURCC('G','4',0,14); else if (vi_final.pixel_type == VideoInfo::CS_RGBAP16) bi.biCompression = MAKEFOURCC('G','4',0,16); else { _ASSERT(FALSE); } bi.biSizeImage = parent->ImageSize(&vi_final); *lpcbFormat = min(*lpcbFormat, (LONG)sizeof(bi)); memcpy(lpFormat, &bi, size_t(*lpcbFormat)); } return S_OK; } STDMETHODIMP CAVIStreamSynth::Write(LONG lStart, LONG lSamples, LPVOID lpBuffer, LONG cbBuffer, DWORD dwFlags, LONG FAR *plSampWritten, LONG FAR *plBytesWritten) { _RPT1(0,"%p->CAVIStreamSynth::Write()\n", this); return AVIERR_READONLY; } #endif ================================================ FILE: avs_core/core/memcpy_amd.cpp ================================================ /****************************************************************************** Copyright (c) 2001 Advanced Micro Devices, Inc. LIMITATION OF LIABILITY: THE MATERIALS ARE PROVIDED *AS IS* WITHOUT ANY EXPRESS OR IMPLIED WARRANTY OF ANY KIND INCLUDING WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT OF THIRD-PARTY INTELLECTUAL PROPERTY, OR FITNESS FOR ANY PARTICULAR PURPOSE. IN NO EVENT SHALL AMD OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS INTERRUPTION, LOSS OF INFORMATION) ARISING OUT OF THE USE OF OR INABILITY TO USE THE MATERIALS, EVEN IF AMD HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. BECAUSE SOME JURISDICTIONS PROHIBIT THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES, THE ABOVE LIMITATION MAY NOT APPLY TO YOU. AMD does not assume any responsibility for any errors which may appear in the Materials nor any responsibility to support or update the Materials. AMD retains the right to make changes to its test specifications at any time, without notice. NO SUPPORT OBLIGATION: AMD is not obligated to furnish, support, or make any further information, software, technical information, know-how, or show-how available to you. So that all may benefit from your experience, please report any problems or suggestions about this software to 3dsdk.support@amd.com AMD Developer Technologies, M/S 585 Advanced Micro Devices, Inc. 5900 E. Ben White Blvd. Austin, TX 78741 3dsdk.support@amd.com ******************************************************************************/ /***************************************************************************** MEMCPY_AMD.CPP ******************************************************************************/ // Very optimized memcpy() routine for all AMD Athlon and Duron family. // This code uses any of FOUR different basic copy methods, depending // on the transfer size. // NOTE: Since this code uses MOVNTQ (also known as "Non-Temporal MOV" or // "Streaming Store"), and also uses the software prefetchnta instructions, // be sure you're running on Athlon/Duron or other recent CPU before calling! #define TINY_BLOCK_COPY 64 // upper limit for movsd type copy // The smallest copy uses the X86 "movsd" instruction, in an optimized // form which is an "unrolled loop". #define IN_CACHE_COPY 64 * 1024 // upper limit for movq/movq copy w/SW prefetch // Next is a copy that uses the MMX registers to copy 8 bytes at a time, // also using the "unrolled loop" optimization. This code uses // the software prefetch instruction to get the data into the cache. #define UNCACHED_COPY 197 * 1024 // upper limit for movq/movntq w/SW prefetch // For larger blocks, which will spill beyond the cache, it's faster to // use the Streaming Store instruction MOVNTQ. This write instruction // bypasses the cache and writes straight to main memory. This code also // uses the software prefetch instruction to pre-read the data. // USE 64 * 1024 FOR THIS VALUE IF YOU'RE ALWAYS FILLING A "CLEAN CACHE" #define BLOCK_PREFETCH_COPY infinity // no limit for movq/movntq w/block prefetch #define CACHEBLOCK 80h // number of 64-byte blocks (cache lines) for block prefetch // For the largest size blocks, a special technique called Block Prefetch // can be used to accelerate the read operations. Block Prefetch reads // one address per cache line, for a series of cache lines, in a short loop. // This is faster than using software prefetch. The technique is great for // getting maximum read bandwidth, especially in DDR memory systems. // Inline assembly syntax for use with Visual C++ #include #if defined(X86_32) && defined(MSVC_PURE) void memcpy_amd(void *dest, const void *src, size_t n) { // Warning! : If you modify this routine, check the generated assembler to make sure // the stupid compiler is saving the ebx register in the entry prologue. // And don't just add an extra push/pop ebx pair around the code, try to // convince the compiler to do the right thing, it's not hard, usually a // slight shuffle or a well placed "__asm mov ebx,ebx" does the trick. __asm { mov ecx, [n] ; number of bytes to copy mov edi, [dest] ; destination mov esi, [src] ; source mov ebx, ecx ; keep a copy of count cld cmp ecx, TINY_BLOCK_COPY jb $memcpy_ic_3 ; tiny? skip mmx copy cmp ecx, 32*1024 ; // don't align between 32k-64k because jbe $memcpy_do_align ; it appears to be slower cmp ecx, 64*1024 jbe $memcpy_align_done $memcpy_do_align: mov ecx, 8 ; // a trick that's faster than rep movsb... sub ecx, edi ; align destination to qword and ecx, 111b ; get the low bits sub ebx, ecx ; update copy count neg ecx ; set up to jump into the array add ecx, offset $memcpy_align_done jmp ecx ; // jump to array of movsb's align 4 movsb movsb movsb movsb movsb movsb movsb movsb $memcpy_align_done: ; destination is dword aligned mov ecx, ebx ; number of bytes left to copy shr ecx, 6 ; get 64-byte block count jz $memcpy_ic_2 ; finish the last few bytes cmp ecx, IN_CACHE_COPY/64 ; too big 4 cache? use uncached copy jae $memcpy_uc_test // This is small block copy that uses the MMX registers to copy 8 bytes // at a time. It uses the "unrolled loop" optimization, and also uses // the software prefetch instruction to get the data into the cache. align 16 $memcpy_ic_1: ; 64-byte block copies, in-cache copy prefetchnta [esi + (200*64/34+192)] ; start reading ahead movq mm0, [esi+0] ; read 64 bits movq mm1, [esi+8] movq [edi+0], mm0 ; write 64 bits movq [edi+8], mm1 ; note: the normal movq writes the movq mm2, [esi+16] ; data to cache; a cache line will be movq mm3, [esi+24] ; allocated as needed, to store the data movq [edi+16], mm2 movq [edi+24], mm3 movq mm0, [esi+32] movq mm1, [esi+40] movq [edi+32], mm0 movq [edi+40], mm1 movq mm2, [esi+48] movq mm3, [esi+56] movq [edi+48], mm2 movq [edi+56], mm3 add esi, 64 ; update source pointer add edi, 64 ; update destination pointer dec ecx ; count down jnz $memcpy_ic_1 ; last 64-byte block? $memcpy_ic_2: mov ecx, ebx ; has valid low 6 bits of the byte count $memcpy_ic_3: shr ecx, 2 ; dword count and ecx, 1111b ; only look at the "remainder" bits neg ecx ; set up to jump into the array add ecx, offset $memcpy_last_few jmp ecx ; // jump to array of movsd's $memcpy_uc_test: cmp ecx, UNCACHED_COPY/64 ; big enough? use block prefetch copy jae $memcpy_bp_1 $memcpy_64_test: or ecx, ecx ; tail end of block prefetch will jump here jz $memcpy_ic_2 ; no more 64-byte blocks left // For larger blocks, which will spill beyond the cache, it's faster to // use the Streaming Store instruction MOVNTQ. This write instruction // bypasses the cache and writes straight to main memory. This code also // uses the software prefetch instruction to pre-read the data. align 16 $memcpy_uc_1: ; 64-byte blocks, uncached copy prefetchnta [esi + (200*64/34+192)] ; start reading ahead movq mm0,[esi+0] ; read 64 bits add edi,64 ; update destination pointer movq mm1,[esi+8] add esi,64 ; update source pointer movq mm2,[esi-48] movntq [edi-64], mm0 ; write 64 bits, bypassing the cache movq mm0,[esi-40] ; note: movntq also prevents the CPU movntq [edi-56], mm1 ; from READING the destination address movq mm1,[esi-32] ; into the cache, only to be over-written movntq [edi-48], mm2 ; so that also helps performance movq mm2,[esi-24] movntq [edi-40], mm0 movq mm0,[esi-16] movntq [edi-32], mm1 movq mm1,[esi-8] movntq [edi-24], mm2 movntq [edi-16], mm0 dec ecx movntq [edi-8], mm1 jnz $memcpy_uc_1 ; last 64-byte block? jmp $memcpy_ic_2 ; almost done // For the largest size blocks, a special technique called Block Prefetch // can be used to accelerate the read operations. Block Prefetch reads // one address per cache line, for a series of cache lines, in a short loop. // This is faster than using software prefetch, in this case. // The technique is great for getting maximum read bandwidth, // especially in DDR memory systems. $memcpy_bp_1: ; large blocks, block prefetch copy cmp ecx, CACHEBLOCK ; big enough to run another prefetch loop? jl $memcpy_64_test ; no, back to regular uncached copy mov eax, CACHEBLOCK / 2 ; block prefetch loop, unrolled 2X add esi, CACHEBLOCK * 64 ; move to the top of the block align 16 $memcpy_bp_2: mov edx, [esi-64] ; grab one address per cache line mov edx, [esi-128] ; grab one address per cache line sub esi, 128 ; go reverse order dec eax ; count down the cache lines jnz $memcpy_bp_2 ; keep grabbing more lines into cache mov eax, CACHEBLOCK ; // now that it's in cache, do the copy align 16 $memcpy_bp_3: movq mm0, [esi ] ; read 64 bits movq mm1, [esi+ 8] movq mm2, [esi+16] movq mm3, [esi+24] movq mm4, [esi+32] movq mm5, [esi+40] movq mm6, [esi+48] movq mm7, [esi+56] add esi, 64 ; update source pointer movntq [edi ], mm0 ; write 64 bits, bypassing cache movntq [edi+ 8], mm1 ; note: movntq also prevents the CPU movntq [edi+16], mm2 ; from READING the destination address movntq [edi+24], mm3 ; into the cache, only to be over-written, movntq [edi+32], mm4 ; so that also helps performance movntq [edi+40], mm5 movntq [edi+48], mm6 movntq [edi+56], mm7 add edi, 64 ; update dest pointer dec eax ; count down jnz $memcpy_bp_3 ; keep copying sub ecx, CACHEBLOCK ; update the 64-byte block count jmp $memcpy_bp_1 ; keep processing chunks // The smallest copy uses the X86 "movsd" instruction, in an optimized // form which is an "unrolled loop". Then it handles the last few bytes. align 4 movsd movsd ; perform last 1-15 dword copies movsd movsd movsd movsd movsd movsd movsd movsd ; perform last 1-7 dword copies movsd movsd movsd movsd movsd movsd $memcpy_last_few: ; // dword aligned from before movsd's mov ecx, ebx ; has valid low 2 bits of the byte count and ecx, 11b ; the last few cows must come home jz $memcpy_final ; // no more, let's leave rep movsb ; the last 1, 2, or 3 bytes $memcpy_final: emms ; clean up the MMX state sfence ; flush the write buffer mov eax, [dest] ; ret value = destination pointer } } #endif ================================================ FILE: avs_core/core/memcpy_amd.h ================================================ /****************************************************************************** Copyright (c) 2001 Advanced Micro Devices, Inc. LIMITATION OF LIABILITY: THE MATERIALS ARE PROVIDED *AS IS* WITHOUT ANY EXPRESS OR IMPLIED WARRANTY OF ANY KIND INCLUDING WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT OF THIRD-PARTY INTELLECTUAL PROPERTY, OR FITNESS FOR ANY PARTICULAR PURPOSE. IN NO EVENT SHALL AMD OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS INTERRUPTION, LOSS OF INFORMATION) ARISING OUT OF THE USE OF OR INABILITY TO USE THE MATERIALS, EVEN IF AMD HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. BECAUSE SOME JURISDICTIONS PROHIBIT THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES, THE ABOVE LIMITATION MAY NOT APPLY TO YOU. AMD does not assume any responsibility for any errors which may appear in the Materials nor any responsibility to support or update the Materials. AMD retains the right to make changes to its test specifications at any time, without notice. NO SUPPORT OBLIGATION: AMD is not obligated to furnish, support, or make any further information, software, technical information, know-how, or show-how available to you. So that all may benefit from your experience, please report any problems or suggestions about this software to 3dsdk.support@amd.com AMD Developer Technologies, M/S 585 Advanced Micro Devices, Inc. 5900 E. Ben White Blvd. Austin, TX 78741 3dsdk.support@amd.com ******************************************************************************/ /***************************************************************************** MEMCPY_AMD.CPP ******************************************************************************/ // Very optimized memcpy() routine for all AMD Athlon and Duron family. // This code uses any of FOUR different basic copy methods, depending // on the transfer size. // NOTE: Since this code uses MOVNTQ (also known as "Non-Temporal MOV" or // "Streaming Store"), and also uses the software prefetchnta instructions, // be sure you're running on Athlon/Duron or other recent CPU before calling! #ifndef AVSCORE_MEMCPY_AMD #define AVSCORE_MEMCPY_AMD #include void memcpy_amd(void *dest, const void *src, size_t n); #endif // AVSCORE_MEMCPY_AMD ================================================ FILE: avs_core/core/mpmc_bounded_queue.h ================================================ #include template class circular_buffer { public: typedef size_t size_type; typedef T value_type; private: std::vector array; const size_type max_size; size_type head; size_type tail; size_type size; public: circular_buffer(size_type capacity) : array(capacity), max_size(capacity), head(0), tail(0), size(0) { } bool empty() const { return size == 0; } bool full() const { assert(size <= max_size); return size == max_size; } bool push_front(T&& item) { if (full()) return false; array[head] = std::move(item); head = (head + 1) % max_size; ++size; return true; } bool pop_back(T* pItem) { if (empty()) return false; *pItem = std::move(array[tail]); tail = (tail + 1) % max_size; --size; return true; } size_type capacity() const { return max_size; } }; #include #include template class mpmc_bounded_queue { public: typedef circular_buffer container_type; typedef typename container_type::size_type size_type; typedef typename container_type::value_type value_type; private: mpmc_bounded_queue(const mpmc_bounded_queue&); // Disabled copy constructor mpmc_bounded_queue& operator = (const mpmc_bounded_queue&); // Disabled assign operator container_type m_container; std::mutex m_mutex; std::condition_variable m_not_empty; std::condition_variable m_not_full; bool finished; public: mpmc_bounded_queue(size_type capacity) : m_container(capacity), finished(false) { } size_type capacity() const { return m_container.capacity(); } void finish() { std::unique_lock lock(m_mutex); if (finished == false) { finished = true; m_not_full.notify_all(); m_not_empty.notify_all(); } } bool is_finished() { std::unique_lock lock(m_mutex); return finished; } bool push_front(T&& item) { std::unique_lock lock(m_mutex); if (finished) { return false; } while(m_container.full()) { m_not_full.wait(lock); if (finished) { return false; } } m_container.push_front(std::move(item)); lock.unlock(); m_not_empty.notify_one(); return true; } bool pop_back(value_type* pItem) { std::unique_lock lock(m_mutex); if (finished) { return false; } while(m_container.empty()) { m_not_empty.wait(lock); if (finished) { return false; } } m_container.pop_back(pItem); lock.unlock(); m_not_full.notify_one(); return true; } bool pop_remain(value_type* pItem) { assert(finished); if (m_container.empty()) return false; m_container.pop_back(pItem); return true; } }; ================================================ FILE: avs_core/core/parser/expression.cpp ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include "expression.h" #include "script.h" #include "../exception.h" #include "../internal.h" #include "../InternalEnvironment.h" #ifdef AVS_WINDOWS #include #else #include #endif #include #include class BreakStmtException { }; class ContinueStmtException { }; AVSValue ExpRootBlock::Evaluate(IScriptEnvironment* env) { AVSValue retval; try { retval = exp->Evaluate(env); } catch (const ReturnExprException &e) { retval = e.value; } return retval; } AVSValue ExpSequence::Evaluate(IScriptEnvironment* env) { AVSValue last = a->Evaluate(env); if (last.IsClip()) env->SetVar("last", last); return b->Evaluate(env); } AVSValue ExpExceptionTranslator::Evaluate(IScriptEnvironment* env) { try { SehGuard seh_guard; return exp->Evaluate(env); } catch (const IScriptEnvironment::NotFound&) { throw; } catch (const AvisynthError&) { throw; } catch (const BreakStmtException&) { throw; } catch (const ContinueStmtException&) { throw; } catch (const ReturnExprException&) { throw; } catch (const SehException &seh) { if (seh.m_msg) env->ThrowError(seh.m_msg); else env->ThrowError("Evaluate: System exception - 0x%x", seh.m_code); } catch (...) { env->ThrowError("Evaluate: Unhandled C++ exception!"); } return 0; } AVSValue ExpTryCatch::Evaluate(IScriptEnvironment* env) { AVSValue result; try { return ExpExceptionTranslator::Evaluate(env); } catch (const AvisynthError &ae) { env->SetVar(id, ae.msg); return catch_block->Evaluate(env); } } AVSValue ExpLine::Evaluate(IScriptEnvironment* env) { try { return ExpExceptionTranslator::Evaluate(env); } catch (const AvisynthError &ae) { env->ThrowError("%s\n(%s, line %d)", ae.msg, filename, line); } return 0; } AVSValue ExpBlockConditional::Evaluate(IScriptEnvironment* env) { AVSValue result; env->GetVarTry("last", &result); AVSValue cond = If->Evaluate(env); if (!cond.IsBool()) env->ThrowError("if: condition must be boolean (true/false)"); if (cond.AsBool()) { if (Then) // note: "Then" can also be NULL if its block is empty result = Then->Evaluate(env); } else if (Else) // note: "Else" can also be NULL if its block is empty result = Else->Evaluate(env); if (result.IsClip()) env->SetVar("last", result); return result; } AVSValue ExpWhileLoop::Evaluate(IScriptEnvironment* env) { AVSValue result; env->GetVarTry("last", &result); AVSValue cond; do { cond = condition->Evaluate(env); if (!cond.IsBool()) env->ThrowError("while: condition must be boolean (true/false)"); if (!cond.AsBool()) break; if (body) { try { result = body->Evaluate(env); if (result.IsClip()) env->SetVar("last", result); } catch(const BreakStmtException&) { AVSValue result2; env->GetVarTry("last", &result2); if (result2.IsClip()) result = result2; break; } catch (const ContinueStmtException&) { AVSValue result2; env->GetVarTry("last", &result2); if (result2.IsClip()) result = result2; } } } while (true); return result; } AVSValue ExpForLoop::Evaluate(IScriptEnvironment* env) { const AVSValue initVal = init->Evaluate(env), limitVal = limit->Evaluate(env), stepVal = step->Evaluate(env); if (!initVal.IsInt()) env->ThrowError("for: initial value must be int"); if (!limitVal.IsInt()) env->ThrowError("for: final value must be int"); if (!stepVal.IsInt()) env->ThrowError("for: step value must be int"); if (stepVal.AsLong() == 0) env->ThrowError("for: step value must be non-zero"); const int64_t iLimit = limitVal.AsLong(); const int64_t iStep = stepVal.AsLong(); int64_t i = initVal.AsLong(); AVSValue result; env->GetVarTry("last", &result); env->SetVar(id, initVal); while (iStep > 0 ? i <= iLimit : i >= iLimit) { if (body) { try { result = body->Evaluate(env); if (result.IsClip()) env->SetVar("last", result); } catch(const BreakStmtException&) { AVSValue result2; env->GetVarTry("last", &result2); if (result2.IsClip()) result = result2; break; } catch (const ContinueStmtException&) { AVSValue result2; env->GetVarTry("last", &result2); if (result2.IsClip()) result = result2; } } AVSValue idVal = env->GetVar(id); // may have been updated in body if (!idVal.IsInt()) env->ThrowError("for: loop variable '%s' has been assigned a non-int value", id); i = idVal.AsLong() + iStep; // store back to smaller type if (i >= INT_MIN && i <= INT_MAX) env->SetVar(id, (int)i); else env->SetVar(id, i); } return result; // overall result is that of final body evaluation (if any) } AVSValue ExpBreak::Evaluate(IScriptEnvironment* env) { throw BreakStmtException(); } AVSValue ExpContinue::Evaluate(IScriptEnvironment* env) { throw ContinueStmtException(); } AVSValue ExpConditional::Evaluate(IScriptEnvironment* env) { AVSValue cond = If->Evaluate(env); if (!cond.IsBool()) env->ThrowError("Evaluate: left of `?' must be boolean (true/false)"); return (cond.AsBool() ? Then : Else)->Evaluate(env); } AVSValue ExpReturn::Evaluate(IScriptEnvironment* env) { ReturnExprException ret; ret.value = value->Evaluate(env); throw ret; } /**** Operators ****/ AVSValue ExpOr::Evaluate(IScriptEnvironment* env) { AVSValue x = a->Evaluate(env); if (!x.IsBool()) env->ThrowError("Evaluate: left operand of || must be boolean (true/false)"); if (x.AsBool()) return x; AVSValue y = b->Evaluate(env); if (!y.IsBool()) env->ThrowError("Evaluate: right operand of || must be boolean (true/false)"); return y; } AVSValue ExpAnd::Evaluate(IScriptEnvironment* env) { AVSValue x = a->Evaluate(env); if (!x.IsBool()) env->ThrowError("Evaluate: left operand of && must be boolean (true/false)"); if (!x.AsBool()) return x; AVSValue y = b->Evaluate(env); if (!y.IsBool()) env->ThrowError("Evaluate: right operand of && must be boolean (true/false)"); return y; } AVSValue ExpEqual::Evaluate(IScriptEnvironment* env) { AVSValue x = a->Evaluate(env); AVSValue y = b->Evaluate(env); if (x.IsBool() && y.IsBool()) { return x.AsBool() == y.AsBool(); } else if (x.IsInt() && y.IsInt()) { // true for any 32/64 bit data return x.AsLong() == y.AsLong(); // work with 64 bits } else if (x.IsFloatfStrict() && y.IsFloatfStrict()) { return x.AsFloatf() == y.AsFloatf(); } else if (x.IsFloat() && y.IsFloat()) { return x.AsFloat() == y.AsFloat(); // AsFloat returns double } else if (x.IsClip() && y.IsClip()) { return x.AsClip() == y.AsClip(); } else if (x.IsString() && y.IsString()) { return !lstrcmpi(x.AsString(), y.AsString()); } else if (x.IsFunction() && y.IsFunction()) { return x.AsFunction() == y.AsFunction(); } else { env->ThrowError("Evaluate: operands of `==' and `!=' must be comparable"); return 0; } } AVSValue ExpLess::Evaluate(IScriptEnvironment* env) { AVSValue x = a->Evaluate(env); AVSValue y = b->Evaluate(env); if (x.IsInt() && y.IsInt()) { // true for any 32/64 bit data return x.AsLong() < y.AsLong(); // work with 64 bits } else if (x.IsFloatfStrict() && y.IsFloatfStrict()) { return x.AsFloatf() < y.AsFloatf(); } else if (x.IsFloat() && y.IsFloat()) { return x.AsFloat() < y.AsFloat(); } else if (x.IsString() && y.IsString()) { return _stricmp(x.AsString(),y.AsString()) < 0 ? true : false; } else { env->ThrowError("Evaluate: operands of `<' and friends must be string or numeric"); return 0; } } AVSValue ExpPlus::Evaluate(IScriptEnvironment* env) { AVSValue x = a->Evaluate(env); AVSValue y = b->Evaluate(env); if (x.IsClip() && y.IsClip()) { AVSValue arg[3] = { x, y, 0 }; return env->Invoke("UnalignedSplice", AVSValue(arg, 3)); } else if (x.IsInt() && y.IsInt()) { // they are true for any 32/64 bits inside int64_t result = x.AsLong() + y.AsLong(); // keep the smaller type if (result >= INT_MIN && result <= INT_MAX) return (int)result; return result; } else if (x.IsFloatfStrict() && y.IsFloatfStrict()) return x.AsFloatf() + y.AsFloatf(); else if (x.IsFloat() && y.IsFloat()) return x.AsFloat() + y.AsFloat(); // AsFloat returns double else if (x.IsString() && y.IsString()) return env->Sprintf("%s%s", x.AsString(), y.AsString()); else { env->ThrowError("Evaluate: operands of `+' must both be numbers, strings, or clips"); return 0; } } AVSValue ExpDoublePlus::Evaluate(IScriptEnvironment* env) { AVSValue x = a->Evaluate(env); AVSValue y = b->Evaluate(env); if (x.IsClip() && y.IsClip()) { AVSValue arg[3] = { x, y, 0 }; return env->Invoke("AlignedSplice", AVSValue(arg, 3)); } else { env->ThrowError("Evaluate: operands of `++' must be clips"); return 0; } } AVSValue ExpMinus::Evaluate(IScriptEnvironment* env) { AVSValue x = a->Evaluate(env); AVSValue y = b->Evaluate(env); if (x.IsInt() && y.IsInt()) { // they are true for any 32/64 bits inside int64_t result = x.AsLong() - y.AsLong(); // keep the smaller type if (result >= INT_MIN && result <= INT_MAX) return (int)result; return result; } else if (x.IsFloatfStrict() && y.IsFloatfStrict()) return x.AsFloatf() - y.AsFloatf(); else if (x.IsFloat() && y.IsFloat()) return x.AsFloat() - y.AsFloat(); // AsFloat returns double else { env->ThrowError("Evaluate: operands of `-' must be numeric"); return 0; } } AVSValue ExpMult::Evaluate(IScriptEnvironment* env) { AVSValue x = a->Evaluate(env); AVSValue y = b->Evaluate(env); if (x.IsInt() && y.IsInt()) { // they are true for any 32/64 bits inside int64_t result = x.AsLong() * y.AsLong(); // keep the smaller type if (result >= INT_MIN && result <= INT_MAX) return (int)result; return result; } else if (x.IsFloatfStrict() && y.IsFloatfStrict()) return x.AsFloatf() * y.AsFloatf(); else if (x.IsFloat() && y.IsFloat()) return x.AsFloat() * y.AsFloat(); // AsFloat returns double else { env->ThrowError("Evaluate: operands of `*' must be numeric"); return 0; } } AVSValue ExpDiv::Evaluate(IScriptEnvironment* env) { AVSValue x = a->Evaluate(env); AVSValue y = b->Evaluate(env); if (x.IsInt() && y.IsInt()) { // they are true for any 32/64 bits inside if (y.AsLong() == 0) env->ThrowError("Evaluate: division by zero"); int64_t result = x.AsLong() / y.AsLong(); // keep the smaller type if (result >= INT_MIN && result <= INT_MAX) return (int)result; return result; } else if (x.IsFloatfStrict() && y.IsFloatfStrict()) return x.AsFloatf() / y.AsFloatf(); else if (x.IsFloat() && y.IsFloat()) return x.AsFloat() / y.AsFloat(); // AsFloat returns double else { env->ThrowError("Evaluate: operands of `/' must be numeric"); return 0; } } AVSValue ExpMod::Evaluate(IScriptEnvironment* env) { AVSValue x = a->Evaluate(env); AVSValue y = b->Evaluate(env); if (x.IsInt() && y.IsInt()) { // they are true for any 32/64 bits inside if (y.AsLong() == 0) env->ThrowError("Evaluate: division by zero"); int64_t result = x.AsLong() % y.AsLong(); // keep the smaller type if (result >= INT_MIN && result <= INT_MAX) return (int)result; return result; } else { env->ThrowError("Evaluate: operands of `%%' must be integers"); return 0; } } AVSValue ExpNegate::Evaluate(IScriptEnvironment* env) { AVSValue x = e->Evaluate(env); if (x.IsInt()) { // true for any 32/64 bits inside // Note: In the old 32-bit integer case, the special value -(INT_MIN) resulted in a negative value // instead of a positive number. // This change in version 11 is not 100% compatible with the old behavior. int64_t result = -x.AsLong(); // keep the smaller type if (result >= INT_MIN && result <= INT_MAX) return (int)result; return result; } else if (x.IsFloatfStrict()) return -x.AsFloatf(); else if (x.IsFloat()) return -x.AsFloat(); // AsFloat returns double else { env->ThrowError("Evaluate: unary minus can only by used with numbers"); return 0; } } AVSValue ExpNot::Evaluate(IScriptEnvironment* env) { AVSValue x = e->Evaluate(env); if (x.IsBool()) return !x.AsBool(); else { env->ThrowError("Evaluate: operand of `!' must be boolean (true/false)"); return 0; } } AVSValue ExpVariableReference::Evaluate(IScriptEnvironment* env) { AVSValue result; // first look for a genuine variable // Don't add a cache to this one, it's a Var if (env->GetVarTry(name, &result)) { return result; } else { // Swap order to match ::Call below -- Gavino Jan 2010 // next look for an argless function if (!env->InvokeTry(&result, name, AVSValue(0,0))) { // finally look for a single-arg function taking implicit "last" AVSValue last; if (!env->GetVarTry("last", &last) || !env->InvokeTry(&result, name, last)) { // and we are giving a last chance, the variable may exist here after the avsi autoload mechanism if (env->GetVarTry(name, &result)) { return result; } env->ThrowError("I don't know what '%s' means.", name); return 0; } } } return result; } AVSValue ExpAssignment::Evaluate(IScriptEnvironment* env) { env->SetVar(lhs, rhs->Evaluate(env)); if (withret) { AVSValue last; AVSValue result; if (!env->GetVarTry("last", &last) || !env->InvokeTry(&result, lhs, last)) { // and we are giving a last chance, the variable may exist here after the avsi autoload mechanism if (env->GetVarTry(lhs, &result)) { return result; } env->ThrowError("I don't know what '%s' means.", lhs); return 0; } } return AVSValue(); } AVSValue ExpGlobalAssignment::Evaluate(IScriptEnvironment* env) { env->SetGlobalVar(lhs, rhs->Evaluate(env)); return AVSValue(); } ExpFunctionCall::ExpFunctionCall( const char* _name, const PExpression& _func, PExpression* _arg_exprs, const char** _arg_expr_names, int _arg_expr_count, bool _oop_notation ) : name(_name), func(_func), arg_expr_count(_arg_expr_count), oop_notation(_oop_notation) { arg_exprs = new PExpression[arg_expr_count]; arg_expr_names = new const char*[arg_expr_count]; for (int i=0; i(env); const char* real_name = name; const Function* real_func = nullptr; AVSValue eval_result; // function must be exist until the function call ends if (real_name == nullptr) { // if name is not given, evaluate expression to get the function eval_result = func->Evaluate(env); if (!eval_result.IsFunction()) { env->ThrowError( "Script error: '%s' cannot be called. Give me a function!", GetAVSTypeName(eval_result)); } //auto& func = eval_result.AsFunction(); // c++ strict conformance: cannot Convert PFunction to PFunction& const PFunction& func = eval_result.AsFunction(); real_name = func->GetLegacyName(); real_func = func->GetDefinition(); } assert(real_name || real_func); // Keep an entry at the beginning: 0th is implicite_last std::vector args(arg_expr_count+1, AVSValue()); for (int a = 0; a < arg_expr_count; ++a) args[a + 1] = arg_exprs[a]->Evaluate(env); AVSValue implicit_last = oop_notation ? AVSValue() : env2->GetVarDef("last"); args[0] = implicit_last; bool notfound = false; try { // Invoke can always throw by calling a constructor of a filter that throws // first give args with implicite_last as a separate parameter // and w/o implicit_last in the args array if (env2->Invoke_(&result, implicit_last, real_name, real_func, AVSValue(args.data() + 1, arg_expr_count), arg_expr_names)) return result; } catch (const IScriptEnvironment::NotFound&) { notfound = true; } if (notfound && implicit_last.IsClip()) { // Give a final chance with a forced implicite last trial for functions like "Animate" // which has with-clip and clipless function signatures. // For cases when clipless signature is found but during instantiating a function // inside its internal expression parameter fails to intantiate without a clip input // and it turnes out that the signature with implicit_last would work. try { std::vector arg_expr_names2(arg_expr_count + 1); for (int a = 0; a < arg_expr_count; ++a) arg_expr_names2[a + 1] = arg_expr_names[a]; arg_expr_names2[0] = nullptr; // with impicite_last inside the array if (env2->Invoke_(&result, AVSValue(), real_name, real_func, AVSValue(args.data(), arg_expr_count + 1), arg_expr_names2.data())) return result; } catch (const IScriptEnvironment::NotFound&) {} } if (real_name == nullptr) { // anonymous function env->ThrowError("Script error: Invalid arguments to %s.", eval_result.AsFunction()->ToString(env)); } else { AVSValue var; if (env->GetVarTry(real_name, &var) && var.IsFunction() && var.AsFunction()->GetLegacyName()) { real_name = var.AsFunction()->GetLegacyName(); } env->ThrowError(env->FunctionExists(real_name) ? "Script error: Invalid arguments to function '%s'." : "Script error: There is no function named '%s'.", real_name); } assert(0); // we should never get here return 0; } class WrappedFunction : public IFunction { public: WrappedFunction(const char* const name) : name(name) { } virtual const char* ToString(IScriptEnvironment* env) { return env->Sprintf("Wrapped Function: %s", name); } virtual const char* GetLegacyName() { return name; } virtual const Function* GetDefinition() { return nullptr; } virtual CaptureVars GetCaptures() { return CaptureVars(); } private: const char* const name; }; ExpFunctionWrapper::ExpFunctionWrapper(const char* name) : func(new WrappedFunction(name)), name(name) { } AVSValue ExpFunctionWrapper::Evaluate(IScriptEnvironment* env) { AVSValue result; if (env->GetVarTry(name, &result) && result.IsFunction()) { // if reference variable exists, returns it return result; } return func; } ExpFunctionDefinition::ExpFunctionDefinition( const PExpression& body, const char* name, const char* param_types, const bool* _param_floats, const char** _param_names, int param_count, const char** _var_names, int var_count, const char* filename, int line) : body(body) , name(name) , param_types(param_types) , param_floats(nullptr) , param_names(nullptr) , var_count(var_count) , var_names(nullptr) , filename(filename) , line(line) { param_floats = new bool[param_count]; memcpy(param_floats, _param_floats, param_count * sizeof(const bool)); param_names = new const char*[param_count]; memcpy(param_names, _param_names, param_count * sizeof(const char*)); if (var_count > 0) { var_names = new const char*[var_count]; memcpy(var_names, _var_names, var_count * sizeof(const char*)); } } AVSValue ExpFunctionDefinition::Evaluate(IScriptEnvironment* env) { AVSValue func = PFunction(new FunctionInstance(this, env)); if (name == nullptr) { return func; } env->SetGlobalVar(name, func); return AVSValue(); } FunctionInstance::FunctionInstance(ExpFunctionDefinition* pdef, IScriptEnvironment* env) : data(), pdef(pdef), pdef_ref(pdef), var_data(nullptr) { data.apply = Execute_; if (pdef->name) { std::string cn("_"); cn.append(pdef->name); data.name = pdef->name; data.canon_name = env->SaveString(cn.c_str()); } data.param_types = pdef->param_types; data.user_data = this; data.dll_path = nullptr; if (pdef->var_count > 0) { AVSValue result; var_data = new AVSValue[pdef->var_count]; for (int i = 0; i < pdef->var_count; ++i) { if (!env->GetVarTry(pdef->var_names[i], &result)) { env->ThrowError("No variable named '%s'", pdef->var_names[i]); } var_data[i] = result; } } } FunctionInstance::~FunctionInstance() { delete[] var_data; } const char* FunctionInstance::ToString(IScriptEnvironment* env) { if (pdef->name) { return env->Sprintf("Function: %s defined at %s, line %d", pdef->name, pdef->filename, pdef->line); } else { return env->Sprintf("Function: defined at %s, line %d", pdef->filename, pdef->line); } } static bool is_within_int_in_float32_range(int64_t value) { // 2^24 return value >= -16777216 && value <= 16777216; } AVSValue FunctionInstance::Execute(const AVSValue& args, IScriptEnvironment* env) { env->PushContext(); for (int i = 0; i < pdef->var_count; ++i) { env->SetVar(pdef->var_names[i], var_data[i]); } for (int i = 0; iSetVar(pdef->param_names[i], // Same as in ScriptFunction::Execute and AVSValue FunctionInstance::Execute // force float args that are actually long/int (int64) to be float/double (depending on the range) // opportunity to fit into the smaller float size (pdef->param_floats[i] && args[i].IsInt()) ? is_within_int_in_float32_range(args[i].AsLong()) ? (float)args[i].AsLong() : (double)args[i].AsLong() : args[i] ); AVSValue result; try { result = pdef->body->Evaluate(env); } catch (...) { env->PopContext(); throw; } env->PopContext(); return result; } AVSValue FunctionInstance::Execute_(AVSValue args, void* user_data, IScriptEnvironment* env) { FunctionInstance* self = (FunctionInstance*)user_data; return self->Execute(args, env); } ================================================ FILE: avs_core/core/parser/expression.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __Expression_H__ #define __Expression_H__ #include #include "../function.h" #include #include /******************************************************************** ********************************************************************/ struct ReturnExprException { AVSValue value; }; /**** Base Classes ****/ class Expression { public: Expression() : refcnt(0) {} virtual AVSValue Evaluate(IScriptEnvironment* env) = 0; virtual const char* GetLvalue() { return 0; } virtual ~Expression() {} private: friend class PExpression; std::atomic refcnt; void AddRef() { ++refcnt; } void Release() { if (--refcnt <= 0) delete this; } }; class PExpression { public: PExpression() { Init(0); } PExpression(Expression* p) { Init(p); } PExpression(const PExpression& p) { Init(p.e); } PExpression& operator=(Expression* p) { Set(p); return *this; } PExpression& operator=(const PExpression& p) { Set(p.e); return *this; } int operator!() const { return !e; } operator void*() const { return e; } Expression* operator->() const { return e; } ~PExpression() { Release(); } private: Expression* e; void Init(Expression* p) { e=p; if (e) e->AddRef(); } void Set(Expression* p) { if (p) p->AddRef(); if (e) e->Release(); e=p; } void Release() { if (e) e->Release(); } }; /**** Object classes ****/ class ExpRootBlock : public Expression { public: ExpRootBlock(const PExpression& e) : exp(e) {} virtual AVSValue Evaluate(IScriptEnvironment* env); private: const PExpression exp; }; class ExpConstant : public Expression { public: ExpConstant(std::vector* v) : val(v->data(), (int)(v->size())) {} // array of AVSValue* ExpConstant(AVSValue v) : val(v) {} ExpConstant(int i) : val(i) {} ExpConstant(int64_t i) : val(i) {} ExpConstant(float f) : val(f) {} ExpConstant(double f) : val(f) {} ExpConstant(const char* s) : val(s) {} virtual AVSValue Evaluate(IScriptEnvironment* env) { AVS_UNUSED(env); return val; } private: friend class ExpNegative; const AVSValue val; }; class ExpSequence : public Expression { public: ExpSequence(const PExpression& _a, const PExpression& _b) : a(_a), b(_b) {} virtual AVSValue Evaluate(IScriptEnvironment* env); private: const PExpression a, b; }; class ExpExceptionTranslator : public Expression { public: ExpExceptionTranslator(const PExpression& _exp) : exp(_exp) {} AVSValue Evaluate(IScriptEnvironment* env); private: const PExpression exp; void TrapEval(AVSValue&, unsigned &excode, IScriptEnvironment*); }; class ExpTryCatch : public ExpExceptionTranslator { public: ExpTryCatch(const PExpression& _try_block, const char* _id, const PExpression& _catch_block) : ExpExceptionTranslator(_try_block), id(_id), catch_block(_catch_block) {} AVSValue Evaluate(IScriptEnvironment* env); private: const char* const id; const PExpression catch_block; }; class ExpLine : public ExpExceptionTranslator { public: ExpLine(const PExpression& _exp, const char* _filename, int _line) : ExpExceptionTranslator(_exp), filename(_filename), line(_line) {} AVSValue Evaluate(IScriptEnvironment* env); private: const char* const filename; const int line; }; class ExpBlockConditional : public Expression { public: ExpBlockConditional(const PExpression& _If, const PExpression& _Then, const PExpression& _Else) : If(_If), Then(_Then), Else(_Else) {} virtual AVSValue Evaluate(IScriptEnvironment* env); private: const PExpression If, Then, Else; }; class ExpWhileLoop : public Expression { public: ExpWhileLoop(const PExpression& _condition, const PExpression& _body) : condition(_condition), body(_body) {} virtual AVSValue Evaluate(IScriptEnvironment* env); private: const PExpression condition, body; }; class ExpForLoop : public Expression { public: ExpForLoop(const char* const _id, const PExpression& _init, const PExpression& _limit, const PExpression& _step, const PExpression& _body) : id(_id), init(_init), limit(_limit), step(_step), body(_body) {} virtual AVSValue Evaluate(IScriptEnvironment* env); private: const char* const id; const PExpression init, limit, step, body; }; class ExpBreak : public Expression { public: ExpBreak() {} virtual AVSValue Evaluate(IScriptEnvironment* env); }; class ExpContinue : public Expression { public: ExpContinue() {} virtual AVSValue Evaluate(IScriptEnvironment* env); }; class ExpConditional : public Expression { public: ExpConditional(const PExpression& _If, const PExpression& _Then, const PExpression& _Else) : If(_If), Then(_Then), Else(_Else) {} virtual AVSValue Evaluate(IScriptEnvironment* env); private: const PExpression If, Then, Else; }; class ExpReturn : public Expression { public: ExpReturn(PExpression value) : value(value) {} virtual AVSValue Evaluate(IScriptEnvironment* env); private: const PExpression value; }; /**** Operator classes ****/ class ExpOr : public Expression { public: ExpOr(const PExpression& _a, const PExpression& _b) : a(_a), b(_b) {} virtual AVSValue Evaluate(IScriptEnvironment* env); private: const PExpression a, b; }; class ExpAnd : public Expression { public: ExpAnd(const PExpression& _a, const PExpression& _b) : a(_a), b(_b) {} virtual AVSValue Evaluate(IScriptEnvironment* env); private: const PExpression a, b; }; class ExpEqual : public Expression { public: ExpEqual(const PExpression& _a, const PExpression& _b) : a(_a), b(_b) {} virtual AVSValue Evaluate(IScriptEnvironment* env); private: const PExpression a, b; }; class ExpLess : public Expression { public: ExpLess(const PExpression& _a, const PExpression& _b) : a(_a), b(_b) {} virtual AVSValue Evaluate(IScriptEnvironment* env); private: const PExpression a, b; }; class ExpPlus : public Expression { public: ExpPlus(const PExpression& _a, const PExpression& _b) : a(_a), b(_b) {} virtual AVSValue Evaluate(IScriptEnvironment* env); private: const PExpression a, b; }; class ExpDoublePlus : public Expression { public: ExpDoublePlus(const PExpression& _a, const PExpression& _b) : a(_a), b(_b) {} virtual AVSValue Evaluate(IScriptEnvironment* env); private: const PExpression a, b; }; class ExpMinus : public Expression { public: ExpMinus(const PExpression& _a, const PExpression& _b) : a(_a), b(_b) {} virtual AVSValue Evaluate(IScriptEnvironment* env); private: const PExpression a, b; }; class ExpMult : public Expression { public: ExpMult(const PExpression& _a, const PExpression& _b) : a(_a), b(_b) {} virtual AVSValue Evaluate(IScriptEnvironment* env); private: const PExpression a, b; }; class ExpDiv : public Expression { public: ExpDiv(const PExpression& _a, const PExpression& _b) : a(_a), b(_b) {} virtual AVSValue Evaluate(IScriptEnvironment* env); private: const PExpression a, b; }; class ExpMod : public Expression { public: ExpMod(const PExpression& _a, const PExpression& _b) : a(_a), b(_b) {} virtual AVSValue Evaluate(IScriptEnvironment* env); private: const PExpression a, b; }; class ExpNegate : public Expression { public: ExpNegate(const PExpression& _e) : e(_e) {} virtual AVSValue Evaluate(IScriptEnvironment* env); private: const PExpression e; }; class ExpNot : public Expression { public: ExpNot(const PExpression& _e) : e(_e) {} virtual AVSValue Evaluate(IScriptEnvironment* env); private: const PExpression e; }; class ExpVariableReference : public Expression { public: ExpVariableReference(const char* _name) : name(_name) {} virtual AVSValue Evaluate(IScriptEnvironment* env); virtual const char* GetLvalue() { return name; } private: const char* const name; }; class ExpAssignment : public Expression { public: ExpAssignment(const char* _lhs, const PExpression& _rhs) : lhs(_lhs), rhs(_rhs), withret(false) {} ExpAssignment(const char* _lhs, const PExpression& _rhs, bool wr) : lhs(_lhs), rhs(_rhs), withret(wr) {} virtual AVSValue Evaluate(IScriptEnvironment* env); private: const char* const lhs; PExpression rhs; bool withret; }; class ExpGlobalAssignment : public Expression { public: ExpGlobalAssignment(const char* _lhs, const PExpression& _rhs) : lhs(_lhs), rhs(_rhs) {} virtual AVSValue Evaluate(IScriptEnvironment* env); private: const char* const lhs; PExpression rhs; }; class ExpFunctionCall : public Expression { public: ExpFunctionCall( const char* _name, const PExpression& _func, PExpression* _arg_exprs, const char** _arg_expr_names, int _arg_expr_count, bool _oop_notation ); ~ExpFunctionCall(void); virtual AVSValue Evaluate(IScriptEnvironment* env); private: const char* const name; PExpression func; PExpression* arg_exprs; const char** arg_expr_names; const int arg_expr_count; const bool oop_notation; }; class ExpLegacyFunctionDefinition : public Expression { public: virtual AVSValue Evaluate(IScriptEnvironment* env) { return AVSValue(); } }; class ExpFunctionWrapper : public Expression { public: ExpFunctionWrapper(const char* name); virtual AVSValue Evaluate(IScriptEnvironment* env); private: PFunction func; const char* const name; }; class ExpFunctionDefinition : public Expression { public: ExpFunctionDefinition(const PExpression& _body, const char* _name, const char* _param_types, const bool* _param_floats, const char** _param_names, int param_count, const char** _var_names, int _var_count, const char* filename, int line); ~ExpFunctionDefinition() { delete[]param_floats; delete[]param_names; delete[]var_names; } virtual AVSValue Evaluate(IScriptEnvironment* env); //private: const PExpression body; const char* name; const char* param_types; bool* param_floats; const char** param_names; int var_count; const char** var_names; const char* filename; int line; }; class FunctionInstance : public IFunction { public: FunctionInstance(ExpFunctionDefinition* pdef, IScriptEnvironment* env); virtual ~FunctionInstance(); virtual const char* ToString(IScriptEnvironment* env); virtual const char* GetLegacyName() { return nullptr; } virtual const Function* GetDefinition() { return &data; } virtual CaptureVars GetCaptures() { CaptureVars ret = { pdef->var_count, pdef->var_names, var_data }; return ret; } AVSValue Execute(const AVSValue& args, IScriptEnvironment* env); static AVSValue Execute_(AVSValue args, void* user_data, IScriptEnvironment* env); private: Function data; ExpFunctionDefinition* pdef; PExpression pdef_ref; AVSValue *var_data; }; #endif // __Expression_H_ ================================================ FILE: avs_core/core/parser/os/win32_string_compat.cpp ================================================ // Copy of AvxSynth's windowsPorts.cpp; it was missing the licensing // header there, too. #include "win32_string_compat.h" #include #include #include #include #include char *_strrev(char *str) { unsigned long nLength = strlen(str); for(unsigned long i = 0; i < nLength/2; i++) { char chTemp = str[i]; str[i] = str[nLength - i - 1]; str[nLength - i - 1] = chTemp; } return str; } char *_strupr(char *str) { if (str) { unsigned long nLength = strlen(str); for(unsigned long i = 0; i < nLength; i++) { str[i] = toupper(str[i]); } } return str; } char *_strlwr(char *str) { if (str) { unsigned long nLength = strlen(str); for(unsigned long i = 0; i < nLength; i++) { str[i] = tolower(str[i]); } } return str; } ================================================ FILE: avs_core/core/parser/os/win32_string_compat.h ================================================ // Copy of AvxSynth's windowsPorts.h; it was missing the licensing // header there, too. #ifndef __WIN32_STRING_COMPAT_H__ #define __WIN32_STRING_COMPAT_H__ #include #include #include #include char* _strrev(char *str); char* _strupr(char *str); char* _strlwr(char *str); struct _finddata_t { unsigned attrib; time_t time_create; /* -1 for FAT file systems */ time_t time_access; /* -1 for FAT file systems */ time_t time_write; uint64_t size; char name[PATH_MAX]; // originally name[260] }; intptr_t _findfirst(const char *filespec, struct _finddata_t *fileinfo); #endif // __WIN32_STRING_COMPAT_H__ ================================================ FILE: avs_core/core/parser/script.cpp ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include "script.h" #include #include #include #include #include #include #include #include #include #ifdef AVS_WINDOWS #include #include #else #include #include "os/win32_string_compat.h" #include #endif #include #include #include #include "../internal.h" #include "../Prefetcher.h" #include "../InternalEnvironment.h" #include "../strings.h" #include #include #include #define __STDC_FORMAT_MACROS #include #include #include #include #ifndef MINGW_HAS_SECURE_API #define sprintf_s sprintf #endif /******************************************************************** ***** Declare index of new filters for Avisynth's filter engine ***** ********************************************************************/ extern const AVSFunction Script_functions[] = { { "muldiv", BUILTIN_FUNC_PREFIX, "iii", Muldiv }, { "floor", BUILTIN_FUNC_PREFIX, "f", Floor }, { "ceil", BUILTIN_FUNC_PREFIX, "f", Ceil }, { "round", BUILTIN_FUNC_PREFIX, "f", Round }, { "acos", BUILTIN_FUNC_PREFIX, "f", Acos }, { "asin", BUILTIN_FUNC_PREFIX, "f", Asin }, { "atan", BUILTIN_FUNC_PREFIX, "f", Atan }, { "atan2", BUILTIN_FUNC_PREFIX, "ff", Atan2 }, { "cos", BUILTIN_FUNC_PREFIX, "f", Cos }, { "cosh", BUILTIN_FUNC_PREFIX, "f", Cosh }, { "exp", BUILTIN_FUNC_PREFIX, "f", Exp }, { "fmod", BUILTIN_FUNC_PREFIX, "ff", Fmod }, { "log", BUILTIN_FUNC_PREFIX, "f", Log }, { "log10", BUILTIN_FUNC_PREFIX, "f", Log10 }, { "pow", BUILTIN_FUNC_PREFIX, "ff", Pow }, { "sin", BUILTIN_FUNC_PREFIX, "f", Sin }, { "sinh", BUILTIN_FUNC_PREFIX, "f", Sinh }, { "tan", BUILTIN_FUNC_PREFIX, "f", Tan }, { "tanh", BUILTIN_FUNC_PREFIX, "f", Tanh }, { "sqrt", BUILTIN_FUNC_PREFIX, "f", Sqrt }, { "abs", BUILTIN_FUNC_PREFIX, "i", Abs }, { "abs", BUILTIN_FUNC_PREFIX, "f", FAbs }, { "pi", BUILTIN_FUNC_PREFIX, "", Pi }, #ifdef OPT_ScriptFunctionTau { "tau", BUILTIN_FUNC_PREFIX, "", Tau }, #endif { "sign", BUILTIN_FUNC_PREFIX, "f",Sign}, { "bitand", BUILTIN_FUNC_PREFIX, "ii",BitAnd}, { "bitnot", BUILTIN_FUNC_PREFIX, "i",BitNot}, { "bitor", BUILTIN_FUNC_PREFIX, "ii",BitOr}, { "bitxor", BUILTIN_FUNC_PREFIX, "ii",BitXor}, // v11 { "bitand64", BUILTIN_FUNC_PREFIX, "ii",BitAnd64}, { "bitnot64", BUILTIN_FUNC_PREFIX, "i",BitNot64}, { "bitor64", BUILTIN_FUNC_PREFIX, "ii",BitOr64}, { "bitxor64", BUILTIN_FUNC_PREFIX, "ii",BitXor64}, { "bitlshift", BUILTIN_FUNC_PREFIX, "ii",BitLShift}, { "bitlshiftl", BUILTIN_FUNC_PREFIX, "ii",BitLShift}, { "bitlshifta", BUILTIN_FUNC_PREFIX, "ii",BitLShift}, { "bitlshiftu", BUILTIN_FUNC_PREFIX, "ii",BitLShift}, { "bitlshifts", BUILTIN_FUNC_PREFIX, "ii",BitLShift}, { "bitshl", BUILTIN_FUNC_PREFIX, "ii",BitLShift}, { "bitsal", BUILTIN_FUNC_PREFIX, "ii",BitLShift}, // v11 omg under how many names do the same?! keep only two { "bitshl64", BUILTIN_FUNC_PREFIX, "ii",BitLShift64}, { "bitsal64", BUILTIN_FUNC_PREFIX, "ii",BitLShift64}, { "bitrshiftl", BUILTIN_FUNC_PREFIX, "ii",BitRShiftL}, { "bitrshifta", BUILTIN_FUNC_PREFIX, "ii",BitRShiftA}, { "bitrshiftu", BUILTIN_FUNC_PREFIX, "ii",BitRShiftL}, { "bitrshifts", BUILTIN_FUNC_PREFIX, "ii",BitRShiftA}, { "bitshr", BUILTIN_FUNC_PREFIX, "ii",BitRShiftL}, { "bitsar", BUILTIN_FUNC_PREFIX, "ii",BitRShiftA}, // v11 { "bitshr64", BUILTIN_FUNC_PREFIX, "ii",BitRShift64L}, { "bitsar64", BUILTIN_FUNC_PREFIX, "ii",BitRShift64A}, { "bitlrotate", BUILTIN_FUNC_PREFIX, "ii",BitRotateL}, { "bitrrotate", BUILTIN_FUNC_PREFIX, "ii",BitRotateR}, { "bitrol", BUILTIN_FUNC_PREFIX, "ii",BitRotateL}, { "bitror", BUILTIN_FUNC_PREFIX, "ii",BitRotateR}, // v11 { "bitrol64", BUILTIN_FUNC_PREFIX, "ii",BitRotate64L}, { "bitror64", BUILTIN_FUNC_PREFIX, "ii",BitRotate64R}, { "bitchg", BUILTIN_FUNC_PREFIX, "ii",BitChg}, { "bitchange", BUILTIN_FUNC_PREFIX, "ii",BitChg}, { "bitclr", BUILTIN_FUNC_PREFIX, "ii",BitClr}, { "bitclear", BUILTIN_FUNC_PREFIX, "ii",BitClr}, { "bitset", BUILTIN_FUNC_PREFIX, "ii",BitSet}, { "bittst", BUILTIN_FUNC_PREFIX, "ii",BitTst}, { "bittest", BUILTIN_FUNC_PREFIX, "ii",BitTst}, { "bitsetcount", BUILTIN_FUNC_PREFIX, "i+",BitSetCount }, // avs+ 180221 // v11 { "bitchg64", BUILTIN_FUNC_PREFIX, "ii",BitChg64}, { "bitclr64", BUILTIN_FUNC_PREFIX, "ii",BitClr64}, { "bitset64", BUILTIN_FUNC_PREFIX, "ii",BitSet64}, { "bittst64", BUILTIN_FUNC_PREFIX, "ii",BitTst64}, { "bitsetcount64", BUILTIN_FUNC_PREFIX, "i+",BitSetCount64 }, { "lcase", BUILTIN_FUNC_PREFIX, "s",LCase}, { "ucase", BUILTIN_FUNC_PREFIX, "s",UCase}, { "strlen", BUILTIN_FUNC_PREFIX, "s",StrLen}, { "revstr", BUILTIN_FUNC_PREFIX, "s",RevStr}, { "leftstr", BUILTIN_FUNC_PREFIX, "si",LeftStr}, { "midstr", BUILTIN_FUNC_PREFIX, "si[length]i",MidStr}, { "rightstr", BUILTIN_FUNC_PREFIX, "si",RightStr}, { "findstr", BUILTIN_FUNC_PREFIX, "ss",FindStr}, { "fillstr", BUILTIN_FUNC_PREFIX, "i[]s",FillStr}, { "replacestr", BUILTIN_FUNC_PREFIX, "sss[sig]b",ReplaceStr}, // avs+ 161230, case 180222 { "trimall", BUILTIN_FUNC_PREFIX, "s",TrimAll }, // avs+ 180225 diff name of clip-function Trim { "trimleft", BUILTIN_FUNC_PREFIX, "s",TrimLeft }, // avs+ 180225 { "trimright", BUILTIN_FUNC_PREFIX, "s",TrimRight }, // avs+ 180225 { "strcmp", BUILTIN_FUNC_PREFIX, "ss",StrCmp}, { "strcmpi", BUILTIN_FUNC_PREFIX, "ss",StrCmpi}, { "rand", BUILTIN_FUNC_PREFIX, "[max]i[scale]b[seed]b", Rand }, { "Select", BUILTIN_FUNC_PREFIX, "i.+", Select }, { "nop", BUILTIN_FUNC_PREFIX, "", NOP }, { "undefined",BUILTIN_FUNC_PREFIX, "", Undefined }, { "width", BUILTIN_FUNC_PREFIX, "c", Width }, { "height", BUILTIN_FUNC_PREFIX, "c", Height }, { "framecount", BUILTIN_FUNC_PREFIX, "c", FrameCount }, { "framerate", BUILTIN_FUNC_PREFIX, "c", FrameRate }, { "frameratenumerator", BUILTIN_FUNC_PREFIX, "c", FrameRateNumerator }, { "frameratedenominator", BUILTIN_FUNC_PREFIX, "c", FrameRateDenominator }, { "audiorate", BUILTIN_FUNC_PREFIX, "c", AudioRate }, { "audiolength", BUILTIN_FUNC_PREFIX, "c", AudioLength }, // v11: returns real int64 { "audiolengthlo", BUILTIN_FUNC_PREFIX, "c[]i", AudioLengthLo }, // audiolength%i { "audiolengthhi", BUILTIN_FUNC_PREFIX, "c[]i", AudioLengthHi }, // audiolength/i { "audiolengths", BUILTIN_FUNC_PREFIX, "c", AudioLengthS }, // as a string { "audiolengthf", BUILTIN_FUNC_PREFIX, "c", AudioLengthF }, // at least this will give an order of the size { "audioduration", BUILTIN_FUNC_PREFIX, "c", AudioDuration }, // In seconds { "audiochannels", BUILTIN_FUNC_PREFIX, "c", AudioChannels }, { "audiobits", BUILTIN_FUNC_PREFIX, "c", AudioBits }, { "IsAudioFloat", BUILTIN_FUNC_PREFIX, "c", IsAudioFloat }, { "IsAudioInt", BUILTIN_FUNC_PREFIX, "c", IsAudioInt }, { "IsChannelMaskKnown", BUILTIN_FUNC_PREFIX, "c", IsChannelMaskKnown }, { "GetChannelMask", BUILTIN_FUNC_PREFIX, "c", GetChannelMask }, // SetChannelMask: see in audio.cpp { "IsRGB", BUILTIN_FUNC_PREFIX, "c", IsRGB }, { "IsYUY2", BUILTIN_FUNC_PREFIX, "c", IsYUY2 }, { "IsYUV", BUILTIN_FUNC_PREFIX, "c", IsYUV }, { "IsY8", BUILTIN_FUNC_PREFIX, "c", IsY8 }, { "IsYV12", BUILTIN_FUNC_PREFIX, "c", IsYV12 }, { "IsYV16", BUILTIN_FUNC_PREFIX, "c", IsYV16 }, { "IsYV24", BUILTIN_FUNC_PREFIX, "c", IsYV24 }, { "IsYV411", BUILTIN_FUNC_PREFIX, "c", IsYV411 }, { "IsPlanar", BUILTIN_FUNC_PREFIX, "c", IsPlanar }, { "IsInterleaved", BUILTIN_FUNC_PREFIX, "c", IsInterleaved }, { "IsRGB24", BUILTIN_FUNC_PREFIX, "c", IsRGB24 }, { "IsRGB32", BUILTIN_FUNC_PREFIX, "c", IsRGB32 }, { "IsFieldBased", BUILTIN_FUNC_PREFIX, "c", IsFieldBased }, { "IsFrameBased", BUILTIN_FUNC_PREFIX, "c", IsFrameBased }, { "GetParity", BUILTIN_FUNC_PREFIX, "c[n]i", GetParity }, { "String", BUILTIN_FUNC_PREFIX, ".[]s", String }, { "Hex", BUILTIN_FUNC_PREFIX, "i[width]i", Hex }, // avs+ 20180222 new width parameter { "Func", BUILTIN_FUNC_PREFIX, "n", Func }, { "Format", BUILTIN_FUNC_PREFIX, "s.*", FormatString }, { "IsBool", BUILTIN_FUNC_PREFIX, ".", IsBool }, { "IsInt", BUILTIN_FUNC_PREFIX, ".", IsInt }, { "IsLongStrict", BUILTIN_FUNC_PREFIX, ".", IsLongStrict }, // v11 { "IsFloat", BUILTIN_FUNC_PREFIX, ".", IsFloat }, { "IsFloatFStrict", BUILTIN_FUNC_PREFIX, ".", IsFloatfStrict }, // v11 { "IsString", BUILTIN_FUNC_PREFIX, ".", IsString }, { "IsClip", BUILTIN_FUNC_PREFIX, ".", IsClip }, { "IsFunction", BUILTIN_FUNC_PREFIX, ".", IsFunction }, { "Defined", BUILTIN_FUNC_PREFIX, ".", Defined }, { "TypeName", BUILTIN_FUNC_PREFIX, ".", TypeName }, { "Default", BUILTIN_FUNC_PREFIX, "..", Default }, { "Eval", BUILTIN_FUNC_PREFIX, "s[name]s", Eval }, { "Eval", BUILTIN_FUNC_PREFIX, "cs[name]s", EvalOop }, { "Apply", BUILTIN_FUNC_PREFIX, "s.*", Apply }, { "Import", BUILTIN_FUNC_PREFIX, "s+[utf8]b", Import }, { "Assert", BUILTIN_FUNC_PREFIX, "b[message]s", Assert }, { "Assert", BUILTIN_FUNC_PREFIX, "s", AssertEval }, { "SetMemoryMax", BUILTIN_FUNC_PREFIX, "[]i[type]i[index]i", SetMemoryMax }, // Neo { "SetWorkingDir", BUILTIN_FUNC_PREFIX, "s", SetWorkingDir }, { "Exist", BUILTIN_FUNC_PREFIX, "s[utf8]b", Exist }, { "Chr", BUILTIN_FUNC_PREFIX, "i", AVSChr }, { "Ord", BUILTIN_FUNC_PREFIX, "s", AVSOrd }, { "Time", BUILTIN_FUNC_PREFIX, "s", AVSTime }, { "Spline", BUILTIN_FUNC_PREFIX, "[x]ff+[cubic]b", Spline }, // parameter is 'f' which cover any integer or float numbers { "int", BUILTIN_FUNC_PREFIX, "f", Int }, { "frac", BUILTIN_FUNC_PREFIX, "f", Frac }, { "float", BUILTIN_FUNC_PREFIX, "f", Float }, { "inti", BUILTIN_FUNC_PREFIX, "f", IntI }, // v11 { "long", BUILTIN_FUNC_PREFIX, "f", Long }, // v11 { "floatf", BUILTIN_FUNC_PREFIX, "f", Floatf }, // v11 { "double", BUILTIN_FUNC_PREFIX, "f", Double }, // v11 { "value", BUILTIN_FUNC_PREFIX, "s",Value}, { "hexvalue", BUILTIN_FUNC_PREFIX, "s[pos]i",HexValue}, // avs+ 20180222 new pos parameter { "hexvalue64", BUILTIN_FUNC_PREFIX, "s[pos]i",HexValue64 }, // v11 { "VersionNumber", BUILTIN_FUNC_PREFIX, "", VersionNumber }, { "VersionString", BUILTIN_FUNC_PREFIX, "", VersionString }, { "IsVersionOrGreater", BUILTIN_FUNC_PREFIX, "[majorversion]i[minorVersion]i[bugfixVersion]i", IsVersionOrGreater }, { "HasVideo", BUILTIN_FUNC_PREFIX, "c", HasVideo }, { "HasAudio", BUILTIN_FUNC_PREFIX, "c", HasAudio }, { "Min", BUILTIN_FUNC_PREFIX, "f+", AvsMin }, { "Max", BUILTIN_FUNC_PREFIX, "f+", AvsMax }, { "ScriptName", BUILTIN_FUNC_PREFIX, "", ScriptName }, { "ScriptFile", BUILTIN_FUNC_PREFIX, "", ScriptFile }, { "ScriptDir", BUILTIN_FUNC_PREFIX, "", ScriptDir }, { "ScriptNameUtf8", BUILTIN_FUNC_PREFIX, "", ScriptNameUtf8 }, { "ScriptFileUtf8", BUILTIN_FUNC_PREFIX, "", ScriptFileUtf8 }, { "ScriptDirUtf8", BUILTIN_FUNC_PREFIX, "", ScriptDirUtf8 }, { "PixelType", BUILTIN_FUNC_PREFIX, "c", PixelType }, { "AddAutoloadDir", BUILTIN_FUNC_PREFIX, "s[toFront]b[utf8]b", AddAutoloadDir }, { "ClearAutoloadDirs", BUILTIN_FUNC_PREFIX, "", ClearAutoloadDirs }, { "ListAutoloadDirs", BUILTIN_FUNC_PREFIX, "[utf8]b", ListAutoloadDirs }, { "AutoloadPlugins", BUILTIN_FUNC_PREFIX, "", AutoloadPlugins }, { "FunctionExists", BUILTIN_FUNC_PREFIX, "s", FunctionExists }, { "InternalFunctionExists", BUILTIN_FUNC_PREFIX, "s", InternalFunctionExists }, { "SetFilterMTMode", BUILTIN_FUNC_PREFIX, "si[force]b", SetFilterMTMode }, { "Prefetch", BUILTIN_FUNC_PREFIX, "c[threads]i[frames]i", Prefetcher::Create }, { "SetLogParams", BUILTIN_FUNC_PREFIX, "[target]s[level]i", SetLogParams }, { "LogMsg", BUILTIN_FUNC_PREFIX, "si", LogMsg }, { "SetCacheMode", BUILTIN_FUNC_PREFIX, "[mode]i", SetCacheMode }, // Neo { "SetDeviceOpt", BUILTIN_FUNC_PREFIX, "[opt]i[val]i", SetDeviceOpt }, // Neo { "SetMaxCPU", BUILTIN_FUNC_PREFIX, "s", SetMaxCPU }, // 20200331 { "SetFilterProp", BUILTIN_FUNC_PREFIX, "ss.[mode]i", SetFilterProp }, // any type (int/float/bool/string/fn/undef); clip rejected in body { "SetFilterProp", BUILTIN_FUNC_PREFIX, "ss.s.[mode]i", SetFilterProp }, // conditional: when param==match, inject key=value { "GetFilterProps", BUILTIN_FUNC_PREFIX, "", GetFilterProps }, { "SetFilterPropPassthrough", BUILTIN_FUNC_PREFIX, "s", SetFilterPropPassthrough }, { "IsY", BUILTIN_FUNC_PREFIX, "c", IsY }, { "Is420", BUILTIN_FUNC_PREFIX, "c", Is420 }, { "Is422", BUILTIN_FUNC_PREFIX, "c", Is422 }, { "Is444", BUILTIN_FUNC_PREFIX, "c", Is444 }, { "IsRGB48", BUILTIN_FUNC_PREFIX, "c", IsRGB48 }, { "IsRGB64", BUILTIN_FUNC_PREFIX, "c", IsRGB64 }, { "ComponentSize", BUILTIN_FUNC_PREFIX, "c", ComponentSize }, { "BitsPerComponent", BUILTIN_FUNC_PREFIX, "c", BitsPerComponent }, { "IsYUVA", BUILTIN_FUNC_PREFIX, "c", IsYUVA }, { "IsPlanarRGB", BUILTIN_FUNC_PREFIX, "c", IsPlanarRGB }, { "IsPlanarRGBA", BUILTIN_FUNC_PREFIX, "c", IsPlanarRGBA }, { "ColorSpaceNameToPixelType", BUILTIN_FUNC_PREFIX, "s", ColorSpaceNameToPixelType }, { "NumComponents", BUILTIN_FUNC_PREFIX, "c", NumComponents }, // r2348+ { "HasAlpha", BUILTIN_FUNC_PREFIX, "c", HasAlpha }, // r2348+ { "IsPackedRGB", BUILTIN_FUNC_PREFIX, "c", IsPackedRGB }, // r2348+ { "IsVideoFloat", BUILTIN_FUNC_PREFIX, "c", IsVideoFloat }, // r2435+ { "GetProcessInfo", BUILTIN_FUNC_PREFIX, "[type]i", GetProcessInfo }, // 170526- #ifdef AVS_WINDOWS { "StrToUtf8", BUILTIN_FUNC_PREFIX, "s", StrToUtf8 }, // 170601- { "StrFromUtf8", BUILTIN_FUNC_PREFIX, "s", StrFromUtf8 }, // 170601- #endif { "IsFloatUvZeroBased", BUILTIN_FUNC_PREFIX, "", IsFloatUvZeroBased }, // 180516- { "BuildPixelType", BUILTIN_FUNC_PREFIX, "[family]s[bits]i[chroma]i[compat]b[oldnames]b[sample_clip]c", BuildPixelType }, // 180517- { "VarExist", BUILTIN_FUNC_PREFIX, "s", VarExist }, // 180606- // Creates script array from zero or more anything. // Direct array constant syntax e.g. x = [arg1,arg2,...] is translated to x = Array(arg1,arg2,...) { "Array", BUILTIN_FUNC_PREFIX, ".*", ArrayCreate }, { "IsArray", BUILTIN_FUNC_PREFIX, ".", IsArray }, // dictionary type array indexing { "ArrayGet", BUILTIN_FUNC_PREFIX, ".s", ArrayGet }, // classic array indexing background helper: e.g. a[3,4] -> ArrayGet(a, [2,3]) { "ArrayGet", BUILTIN_FUNC_PREFIX, ".i+", ArrayGet }, // .+i+ syntax is not possible. // length can be zero { "ArraySize", BUILTIN_FUNC_PREFIX, ".", ArraySize }, { "ArrayIns", BUILTIN_FUNC_PREFIX, "..i+", ArrayIns, (void*)0 }, { "ArrayAdd", BUILTIN_FUNC_PREFIX, "..i*", ArrayIns, (void*)1 }, { "ArraySet", BUILTIN_FUNC_PREFIX, "..i+", ArrayIns, (void*)2 }, { "ArrayDel", BUILTIN_FUNC_PREFIX, ".i+", ArrayIns, (void*)3 }, { "ArraySort", BUILTIN_FUNC_PREFIX, ".", ArraySort, (void*)0 }, /* { "IsArrayOf", BUILTIN_FUNC_PREFIX, ".s", IsArrayOf }, */ { 0 } }; /********************************** ******* Script Function ****** *********************************/ ScriptFunction::ScriptFunction( const PExpression& _body, const bool* _param_floats, const char** _param_names, int param_count ) : body(_body) { param_floats = new bool[param_count]; memcpy(param_floats, _param_floats, param_count * sizeof(const bool)); param_names = new const char* [param_count]; memcpy(param_names, _param_names, param_count * sizeof(const char*)); } static bool is_within_int_in_float32_range(int64_t value) { return value >= -16777216 && value <= 16777216; } AVSValue ScriptFunction::Execute(AVSValue args, void* user_data, IScriptEnvironment* env) { ScriptFunction* self = (ScriptFunction*)user_data; env->PushContext(); for (int i=0; iSetVar(self->param_names[i], // Same as in ScriptFunction::Execute and AVSValue FunctionInstance::Execute // force float args that are actually long/int (int64) to be float/double (depending on the range) // opportunity to fit into the smaller float size (self->param_floats[i] && args[i].IsInt()) ? is_within_int_in_float32_range(args[i].AsLong()) ? (float)args[i].AsLong() : (double)args[i].AsLong() : args[i] ); AVSValue result; try { result = self->body->Evaluate(env); } catch (...) { env->PopContext(); throw; } env->PopContext(); return result; } void ScriptFunction::Delete(void* self, IScriptEnvironment*) { delete (ScriptFunction*)self; } /*********************************** ******* Helper Functions ****** **********************************/ #ifdef AVS_WINDOWS std::wstring CWDChanger::GetCurrentWorkingDirectory() { DWORD length = GetCurrentDirectoryW(0, nullptr); if (length == 0) return {}; std::wstring buffer(length, L'\0'); if (GetCurrentDirectoryW(length, &buffer[0]) == 0) return {}; // Remove trailing null character if present if (!buffer.empty() && buffer.back() == L'\0') { buffer.pop_back(); } return buffer; } #else std::string CWDChanger::GetCurrentWorkingDirectory() { char buffer[FILENAME_MAX]; if (getcwd(buffer, sizeof(buffer)) == nullptr) return {}; return std::string(buffer); } #endif #ifdef AVS_WINDOWS void CWDChanger::Init(const wchar_t* new_cwd) { // works in unicode internally uint32_t cwdLen = GetCurrentDirectoryW(0, NULL); old_working_directory = std::make_unique(cwdLen); // instead of new wchar_t[cwdLen]; uint32_t save_cwd_success = GetCurrentDirectoryW(cwdLen, old_working_directory.get()); bool set_cwd_success = SetCurrentDirectoryW(new_cwd); restore = (save_cwd_success && set_cwd_success); } CWDChanger::CWDChanger(const wchar_t* new_cwd) { Init(new_cwd); } // utf8 on Windows as well CWDChanger::CWDChanger(const char* new_cwd_utf8) { auto new_cwd_w = Utf8ToWideChar(new_cwd_utf8); Init(new_cwd_w.get()); } CWDChanger::~CWDChanger(void) { if (restore) SetCurrentDirectoryW(old_working_directory.get()); } DllDirChanger::DllDirChanger(const char* new_dir) { uint32_t len = GetDllDirectory (0, NULL); old_directory = std::make_unique(len + 1); // instead of new char[len+1] uint32_t save_success = GetDllDirectory (len, old_directory.get()); bool set_success = SetDllDirectory(new_dir); restore = (save_success && set_success); } DllDirChanger::~DllDirChanger(void) { if (restore) SetDllDirectory(old_directory.get()); } #else // copied from AvxSynth CWDChanger::CWDChanger(const char* new_cwd) { char* path = getcwd(old_working_directory, FILENAME_MAX); bool save_cwd_success = (NULL != path); bool set_cwd_success = (0 == chdir(new_cwd)); restore = (save_cwd_success && set_cwd_success); } CWDChanger::~CWDChanger(void) { if (restore) chdir(old_working_directory); } #endif AVSValue Assert(AVSValue args, void*, IScriptEnvironment* env) { if (!args[0].AsBool()) env->ThrowError("%s", args[1].Defined() ? args[1].AsString() : "Assert: assertion failed"); return AVSValue(); } AVSValue AssertEval(AVSValue args, void*, IScriptEnvironment* env) { const char* pred = args[0].AsString(); AVSValue eval_args[] = { args[0].AsString(), "asserted expression" }; AVSValue val = env->Invoke("Eval", AVSValue(eval_args, 2)); if (!val.IsBool()) env->ThrowError("Assert: expression did not evaluate to true or false: \"%s\"", pred); if (!val.AsBool()) env->ThrowError("Assert: assertion failed: \"%s\"", pred); return AVSValue(); } AVSValue Eval(AVSValue args, void*, IScriptEnvironment* env) { const char *filename = args[1].AsString(0); if (filename) filename = env->SaveString(filename); ScriptParser parser(env, args[0].AsString(), filename); PExpression exp = parser.Parse(); return exp->Evaluate(env); } AVSValue Apply(AVSValue args, void*, IScriptEnvironment* env) { return env->Invoke(args[0].AsString(), args[1]); } AVSValue EvalOop(AVSValue args, void*, IScriptEnvironment* env) { AVSValue prev_last = env->GetVarDef("last"); // Store previous last env->SetVar("last", args[0]); // Set implicit last AVSValue result; try { result = Eval(AVSValue(&args[1], 2), 0, env); } catch(...) { env->SetVar("last", prev_last); // Restore implicit last throw; } env->SetVar("last", prev_last); // Restore implicit last return result; } AVSValue Import(AVSValue args, void*, IScriptEnvironment* env) { // called as s+ or s+[Utf8]b const bool bHasUTF8param = args.IsArray() && args.ArraySize() == 2 && args[1].IsBool(); const bool bUtf8 = bHasUTF8param ? args[1].AsBool(false) : false; args = args[0]; AVSValue result; InternalEnvironment *envi = static_cast(env); const bool MainScript = (envi->IncrImportDepth() == 1); AVSValue lastScriptName = env->GetVarDef("$ScriptName$"); AVSValue lastScriptFile = env->GetVarDef("$ScriptFile$"); AVSValue lastScriptDir = env->GetVarDef("$ScriptDir$"); AVSValue lastScriptNameUtf8 = env->GetVarDef("$ScriptNameUtf8$"); AVSValue lastScriptFileUtf8 = env->GetVarDef("$ScriptFileUtf8$"); AVSValue lastScriptDirUtf8 = env->GetVarDef("$ScriptDirUtf8$"); for (int i = 0; i < args.ArraySize(); ++i) { const char* script_name = args[i].AsString(); #ifdef AVS_WINDOWS /* Linux, macOS, pretty much every OS aside from Windows uses UTF-8 pervasively and by default, making all the Ansi<->Unicode stuff we have to specially handle on Windows (which uses UTF-16 when it does 'Unicode', further complicating things if you don't force UTF-8) irrelevant. */ // Handling utf8 and ansi, working in wchar_t internally // filename and path can be full unicode // unicode input can come from CAVIFileSynth std::unique_ptr full_path_w; wchar_t *file_part_w; // make wchar_t full path strnig from either ansi or utf8 auto script_name_w = !bUtf8 ? AnsiToWideChar(script_name) : Utf8ToWideChar(script_name); // Long (>MAX_PATH) path support starting in Windows 10, version 1607. if (wcschr(script_name_w.get(), '\\') || wcschr(script_name_w.get(), '/')) { DWORD len = GetFullPathNameW(script_name_w.get(), 0, NULL, NULL); // buffer size for path + terminating zero full_path_w = std::make_unique(len); len = GetFullPathNameW(script_name_w.get(), len, full_path_w.get(), &file_part_w); if (len == 0) { auto script_name_utf8 = WideCharToUtf8(script_name_w.get()); env->ThrowError("Import: unable to open \"%s\" (path invalid?), error=0x%x", script_name_utf8.get(), GetLastError()); } } else { DWORD len = SearchPathW(NULL, script_name_w.get(), NULL, 0, NULL, NULL); // buffer size for path + terminating zero full_path_w = std::make_unique(len); len = SearchPathW(NULL, script_name_w.get(), NULL, len, full_path_w.get(), &file_part_w); if (len == 0) { auto script_name_utf8 = WideCharToUtf8(script_name_w.get()); env->ThrowError("Import: unable to locate \"%s\" (try specifying a path), error=0x%x", script_name_utf8.get(), GetLastError()); } } // back to 8 bit Ansi and Utf8 auto full_path = WideCharToAnsi(full_path_w.get()); auto full_path_utf8 = WideCharToUtf8(full_path_w.get()); auto file_part = WideCharToAnsi(file_part_w); auto file_part_utf8 = WideCharToUtf8(file_part_w); size_t dir_part_len = wcslen(full_path_w.get()) - wcslen(file_part_w); auto dir_part = WideCharToAnsi_maxn(full_path_w.get(), dir_part_len); auto dir_part_utf8 = WideCharToUtf8_maxn(full_path_w.get(), dir_part_len); // supply L"\\\\?\\" if necessary for long file path support std::wstring full_path_ex = std::wstring(full_path_w.get()); if (full_path_ex.length() > FILENAME_MAX && full_path_ex.substr(0, 4) != L"\\\\?\\") full_path_ex = L"\\\\?\\" + full_path_ex; HANDLE h = ::CreateFileW(full_path_ex.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if (h == INVALID_HANDLE_VALUE) env->ThrowError("Import: couldn't open \"%s\"", full_path.get()); env->SetGlobalVar("$ScriptName$", env->SaveString(full_path.get())); env->SetGlobalVar("$ScriptFile$", env->SaveString(file_part.get())); env->SetGlobalVar("$ScriptDir$", env->SaveString(dir_part.get())); env->SetGlobalVar("$ScriptNameUtf8$", env->SaveString(full_path_utf8.get())); env->SetGlobalVar("$ScriptFileUtf8$", env->SaveString(file_part_utf8.get())); env->SetGlobalVar("$ScriptDirUtf8$", env->SaveString(dir_part_utf8.get())); if (MainScript) { env->SetGlobalVar("$MainScriptName$", env->SaveString(full_path.get())); env->SetGlobalVar("$MainScriptFile$", env->SaveString(file_part.get())); env->SetGlobalVar("$MainScriptDir$", env->SaveString(dir_part.get())); env->SetGlobalVar("$MainScriptNameUtf8$", env->SaveString(full_path_utf8.get())); env->SetGlobalVar("$MainScriptFileUtf8$", env->SaveString(file_part_utf8.get())); env->SetGlobalVar("$MainScriptDirUtf8$", env->SaveString(dir_part_utf8.get())); } *file_part_w = 0; // trunc full_path_w to dir-only CWDChanger change_cwd(full_path_w.get()); // end of filename parsing / file open things DWORD size = GetFileSize(h, NULL); std::vector buf(size + 1, 0); bool status = ReadFile(h, buf.data(), size, &size, NULL); CloseHandle(h); if (!status) env->ThrowError("Import: unable to read \"%s\"", script_name); // Give poor Unicode users a hint they need to use ANSI encoding import" if (size >= 2) { unsigned char* q = reinterpret_cast(buf.data()); if ((q[0] == 0xFF && q[1] == 0xFE) || (q[0] == 0xFE && q[1] == 0xFF)) env->ThrowError("Import: Unicode source files are not supported, " "re-save script with ANSI or UTF8 w/o BOM encoding! : \"%s\"", script_name); if (q[0] == 0xEF && q[1] == 0xBB && q[2] == 0xBF) env->ThrowError("Import: UTF-8 source files with BOM are not supported, " "re-save script with ANSI or UTF8 w/o BOM encoding! : \"%s\"", script_name); } #else // adapted from AvxSynth std::string file_part = fs::path(script_name).filename().string(); std::string full_path = fs::path(script_name).remove_filename(); std::string dir_part = fs::path(script_name).parent_path(); FILE* h = fopen(script_name, "r"); if(NULL == h) env->ThrowError("Import: couldn't open \"%s\"", script_name ); env->SetGlobalVar("$ScriptName$", env->SaveString(script_name)); env->SetGlobalVar("$ScriptFile$", env->SaveString(file_part.c_str())); env->SetGlobalVar("$ScriptDir$", env->SaveString(full_path.c_str())); env->SetGlobalVar("$ScriptNameUtf8$", env->SaveString(script_name)); env->SetGlobalVar("$ScriptFileUtf8$", env->SaveString(file_part.c_str())); env->SetGlobalVar("$ScriptDirUtf8$", env->SaveString(full_path.c_str())); if (MainScript) { env->SetGlobalVar("$MainScriptName$", env->SaveString(script_name)); env->SetGlobalVar("$MainScriptFile$", env->SaveString(file_part.c_str())); env->SetGlobalVar("$MainScriptDir$", env->SaveString(full_path.c_str())); env->SetGlobalVar("$MainScriptNameUtf8$", env->SaveString(script_name)); env->SetGlobalVar("$MainScriptFileUtf8$", env->SaveString(file_part.c_str())); env->SetGlobalVar("$MainScriptDirUtf8$", env->SaveString(full_path.c_str())); } //*file_part = 0; // trunc full_path to dir-only CWDChanger change_cwd(full_path.c_str()); // end of filename parsing / file open things fseek(h, 0, SEEK_END); size_t size = ftell(h); fseek(h, 0, SEEK_SET); std::vector buf(size + 1, 0); if(size != fread(buf.data(), 1, size, h)) env->ThrowError("Import: unable to read \"%s\"", script_name); fclose(h); #endif buf[size] = 0; AVSValue eval_args[] = { buf.data(), script_name }; result = env->Invoke("Eval", AVSValue(eval_args, 2)); //env->ThrowError("Import: test %s size %d\n", buf.data(), (int)size); } env->SetGlobalVar("$ScriptName$", lastScriptName); env->SetGlobalVar("$ScriptFile$", lastScriptFile); env->SetGlobalVar("$ScriptDir$", lastScriptDir); env->SetGlobalVar("$ScriptNameUtf8$", lastScriptNameUtf8); env->SetGlobalVar("$ScriptFileUtf8$", lastScriptFileUtf8); env->SetGlobalVar("$ScriptDirUtf8$", lastScriptDirUtf8); envi->DecrImportDepth(); return result; } AVSValue ScriptName(AVSValue args, void*, IScriptEnvironment* env) { return env->GetVarDef("$ScriptName$"); } AVSValue ScriptFile(AVSValue args, void*, IScriptEnvironment* env) { return env->GetVarDef("$ScriptFile$"); } AVSValue ScriptDir (AVSValue args, void*, IScriptEnvironment* env) { return env->GetVarDef("$ScriptDir$" ); } AVSValue ScriptNameUtf8(AVSValue args, void*, IScriptEnvironment* env) { return env->GetVarDef("$ScriptNameUtf8$"); } AVSValue ScriptFileUtf8(AVSValue args, void*, IScriptEnvironment* env) { return env->GetVarDef("$ScriptFileUtf8$"); } AVSValue ScriptDirUtf8(AVSValue args, void*, IScriptEnvironment* env) { return env->GetVarDef("$ScriptDirUtf8$"); } AVSValue SetWorkingDir(AVSValue args, void*, IScriptEnvironment* env) { return env->SetWorkingDir(args[0].AsString()); } AVSValue Muldiv(AVSValue args, void*, IScriptEnvironment* ) { // designed for 32 bits, no change other than read int64 parameters, // though they are caster back immediately to int auto result = MulDiv((int)args[0].AsLong(), (int)args[1].AsLong(), (int)args[2].AsLong()); return (int)result; } // v11: up to int64 range AVSValue Floor(AVSValue args, void*, IScriptEnvironment* ) { int64_t result = static_cast(floor(args[0].AsFloat())); if (result >= INT_MIN && result <= INT_MAX) return (int)result; return result; } // v11: up to int64 range AVSValue Ceil(AVSValue args, void*, IScriptEnvironment* ) { int64_t result = static_cast(ceil(args[0].AsFloat())); if (result >= INT_MIN && result <= INT_MAX) return (int)result; return result; } // v11: up to int64 range AVSValue Round(AVSValue args, void*, IScriptEnvironment* ) { int64_t result = args[0].AsFloat() < 0 ? -static_cast(-args[0].AsFloat() + .5) : static_cast(args[0].AsFloat() + .5); if (result >= INT_MIN && result <= INT_MAX) return (int)result; return result; } AVSValue Acos(AVSValue args, void* , IScriptEnvironment* ) { return acos(args[0].AsFloat()); } AVSValue Asin(AVSValue args, void* , IScriptEnvironment* ) { return asin(args[0].AsFloat()); } AVSValue Atan(AVSValue args, void* , IScriptEnvironment* ) { return atan(args[0].AsFloat()); } AVSValue Atan2(AVSValue args, void* , IScriptEnvironment* ) { return atan2(args[0].AsFloat(), args[1].AsFloat()); } AVSValue Cos(AVSValue args, void* , IScriptEnvironment* ) { return cos(args[0].AsFloat()); } AVSValue Cosh(AVSValue args, void* , IScriptEnvironment* ) { return cosh(args[0].AsFloat()); } AVSValue Exp(AVSValue args, void* , IScriptEnvironment* ) { return exp(args[0].AsFloat()); } AVSValue Fmod(AVSValue args, void* , IScriptEnvironment* ) { return fmod(args[0].AsFloat(), args[1].AsFloat()); } AVSValue Log(AVSValue args, void* , IScriptEnvironment* ) { return log(args[0].AsFloat()); } AVSValue Log10(AVSValue args, void* , IScriptEnvironment* ) { return log10(args[0].AsFloat()); } AVSValue Pow(AVSValue args, void* , IScriptEnvironment* ) { return pow(args[0].AsFloat(),args[1].AsFloat()); } AVSValue Sin(AVSValue args, void* , IScriptEnvironment* ) { return sin(args[0].AsFloat()); } AVSValue Sinh(AVSValue args, void* , IScriptEnvironment* ) { return sinh(args[0].AsFloat()); } AVSValue Tan(AVSValue args, void* , IScriptEnvironment* ) { return tan(args[0].AsFloat()); } AVSValue Tanh(AVSValue args, void* , IScriptEnvironment* ) { return tanh(args[0].AsFloat()); } AVSValue Sqrt(AVSValue args, void* , IScriptEnvironment* ) { return sqrt(args[0].AsFloat()); } // v11: up to int64 range AVSValue Abs(AVSValue args, void* , IScriptEnvironment* ) { int64_t result = std::abs(args[0].AsLong()); if (result >= INT_MIN && result <= INT_MAX) return (int)result; return result; } AVSValue FAbs(AVSValue args, void* , IScriptEnvironment* ) { return fabs(args[0].AsFloat()); } AVSValue Pi(AVSValue args, void* , IScriptEnvironment* ) { return 3.14159265358979324; } #ifdef OPT_ScriptFunctionTau AVSValue Tau(AVSValue args, void* , IScriptEnvironment* ) { return 6.28318530717958648; } #endif AVSValue Sign(AVSValue args, void*, IScriptEnvironment* ) { return args[0].AsFloat()==0 ? 0 : args[0].AsFloat() > 0 ? 1 : -1; } // v11: These bitwise functions are strictly for 32 bit, if 64 bit versions are implemented they will have different names AVSValue BitAnd(AVSValue args, void*, IScriptEnvironment* ) { return args[0].AsInt() & args[1].AsInt(); } AVSValue BitNot(AVSValue args, void*, IScriptEnvironment* ) { return ~args[0].AsInt(); } AVSValue BitOr(AVSValue args, void*, IScriptEnvironment* ) { return args[0].AsInt() | args[1].AsInt(); } AVSValue BitXor(AVSValue args, void*, IScriptEnvironment* ) { return args[0].AsInt() ^ args[1].AsInt(); } AVSValue BitAnd64(AVSValue args, void*, IScriptEnvironment*) { return args[0].AsLong() & args[1].AsLong(); } AVSValue BitNot64(AVSValue args, void*, IScriptEnvironment*) { return ~args[0].AsLong(); } AVSValue BitOr64(AVSValue args, void*, IScriptEnvironment*) { return args[0].AsLong() | args[1].AsLong(); } AVSValue BitXor64(AVSValue args, void*, IScriptEnvironment*) { return args[0].AsLong() ^ args[1].AsLong(); } AVSValue BitLShift(AVSValue args, void*, IScriptEnvironment* ) { return args[0].AsInt() << args[1].AsInt(); } AVSValue BitRShiftL(AVSValue args, void*, IScriptEnvironment* ) { return int(unsigned(args[0].AsInt()) >> unsigned(args[1].AsInt())); } AVSValue BitRShiftA(AVSValue args, void*, IScriptEnvironment* ) { return args[0].AsInt() >> args[1].AsInt(); } AVSValue BitLShift64(AVSValue args, void*, IScriptEnvironment*) { return args[0].AsLong() << args[1].AsInt(); } AVSValue BitRShift64L(AVSValue args, void*, IScriptEnvironment*) { return int64_t(uint64_t(args[0].AsLong()) >> unsigned(args[1].AsInt())); } AVSValue BitRShift64A(AVSValue args, void*, IScriptEnvironment*) { return args[0].AsLong() >> args[1].AsInt(); } static unsigned int a_rol(unsigned int value, int shift) { if ((shift &= sizeof(value)*8 - 1) == 0) return value; return (value << shift) | (value >> (sizeof(value)*8 - shift)); } static uint64_t a_rol(uint64_t value, int shift) { if ((shift &= sizeof(value) * 8 - 1) == 0) return value; return (value << shift) | (value >> (sizeof(value) * 8 - shift)); } static unsigned int a_ror(unsigned int value, int shift) { if ((shift &= sizeof(value)*8 - 1) == 0) return value; return (value >> shift) | (value << (sizeof(value)*8 - shift)); } static uint64_t a_ror(uint64_t value, int shift) { if ((shift &= sizeof(value) * 8 - 1) == 0) return value; return (value >> shift) | (value << (sizeof(value) * 8 - shift)); } static int a_btc(int value, int bit) { value ^= 1 << bit; return value; } static int64_t a_btc(int64_t value, int bit) { value ^= static_cast(1) << bit; return value; } static int a_btr(int value, int bit) { value &= ~(1 << bit); return value; } static int64_t a_btr(int64_t value, int bit) { value &= ~(static_cast(1) << bit); return value; } static int a_bts(int value, int bit) { value |= (1 << bit); return value; } static int64_t a_bts(int64_t value, int bit) { value |= (static_cast(1) << bit); return value; } static bool a_bt(int value, int bit) { return (value & (1 << bit)) ? true : false; } static bool a_bt(int64_t value, int bit) { return (value & (static_cast(1)<< bit)) ? true : false; } AVSValue BitRotateL(AVSValue args, void*, IScriptEnvironment* ) { return (int)a_rol((unsigned int)args[0].AsInt(), args[1].AsInt()); } AVSValue BitRotateR(AVSValue args, void*, IScriptEnvironment* ) { return (int)a_ror((unsigned int)args[0].AsInt(), args[1].AsInt()); } AVSValue BitRotate64L(AVSValue args, void*, IScriptEnvironment*) { return (int64_t)a_rol((uint64_t)args[0].AsLong(), args[1].AsInt()); } AVSValue BitRotate64R(AVSValue args, void*, IScriptEnvironment*) { return (int64_t)a_ror((uint64_t)args[0].AsLong(), args[1].AsInt()); } AVSValue BitChg(AVSValue args, void*, IScriptEnvironment* ) { return a_btc(args[0].AsInt(), args[1].AsInt()); } AVSValue BitClr(AVSValue args, void*, IScriptEnvironment* ) { return a_btr(args[0].AsInt(), args[1].AsInt()); } AVSValue BitSet(AVSValue args, void*, IScriptEnvironment* ) { return a_bts(args[0].AsInt(), args[1].AsInt()); } AVSValue BitTst(AVSValue args, void*, IScriptEnvironment* ) { return a_bt (args[0].AsInt(), args[1].AsInt()); } AVSValue BitChg64(AVSValue args, void*, IScriptEnvironment*) { return a_btc(args[0].AsLong(), args[1].AsInt()); } AVSValue BitClr64(AVSValue args, void*, IScriptEnvironment*) { return a_btr(args[0].AsLong(), args[1].AsInt()); } AVSValue BitSet64(AVSValue args, void*, IScriptEnvironment*) { return a_bts(args[0].AsLong(), args[1].AsInt()); } AVSValue BitTst64(AVSValue args, void*, IScriptEnvironment*) { return a_bt(args[0].AsLong(), args[1].AsInt()); } static int numberOfSetBits(uint32_t i) { i = i - ((i >> 1) & 0x55555555); i = (i & 0x33333333) + ((i >> 2) & 0x33333333); return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24; } static int numberOfSetBits64(uint64_t i) { return static_cast(std::bitset<64>(i).count()); } AVSValue BitSetCount(AVSValue args, void*, IScriptEnvironment*) { if (args[0].IsInt()) return numberOfSetBits(static_cast(args[0].AsInt())); // multiple integer parameters int count = 0; for (int i = 0; i < args[0].ArraySize(); i++) count += numberOfSetBits(static_cast(args[0][i].AsInt())); return count; } AVSValue BitSetCount64(AVSValue args, void*, IScriptEnvironment*) { if (args[0].IsInt()) return numberOfSetBits64(static_cast(args[0].AsLong())); // multiple integer parameters int count = 0; for (int i = 0; i < args[0].ArraySize(); i++) count += numberOfSetBits64(static_cast(args[0][i].AsLong())); return count; } static const char* toUpperCase(const char* string) { // Make a temporary copy of the string char* tmp = _strdup(string); if (tmp == nullptr) { return nullptr; } // Convert the copy to uppercase _strupr(tmp); return tmp; } AVSValue UCase(AVSValue args, void*, IScriptEnvironment* env) { const char *res = toUpperCase(args[0].AsString()); if(res == nullptr) env->ThrowError("UCase: memory allocation error"); AVSValue result = env->SaveString(res); free((void*)res); return result; } static const char* toLowerCase(const char* string) { // Make a temporary copy of the string char* tmp = _strdup(string); if (tmp == nullptr) { return nullptr; } // Convert the copy to lowercase _strlwr(tmp); return tmp; } AVSValue LCase(AVSValue args, void*, IScriptEnvironment* env) { const char* res = toLowerCase(args[0].AsString()); if (res == nullptr) env->ThrowError("LCase: memory allocation error"); AVSValue result = env->SaveString(res); free((void*)res); return result; } AVSValue StrLen(AVSValue args, void*, IScriptEnvironment* ) { size_t len = strlen(args[0].AsString()); if (len > static_cast(std::numeric_limits::max())) return static_cast(len); else return static_cast(len); } static const char* toReversed(const char* string) { // Make a temporary copy of the string char* tmp = _strdup(string); if (tmp == nullptr) { return nullptr; } // reverse the copy _strrev(tmp); return tmp; } AVSValue RevStr(AVSValue args, void*, IScriptEnvironment* env) { const char* res = toReversed(args[0].AsString()); if (res == nullptr) env->ThrowError("RevStr: memory allocation error"); AVSValue result = env->SaveString(res); free((void*)res); return result; } AVSValue LeftStr(AVSValue args, void*, IScriptEnvironment* env) { const int64_t _count = args[1].AsLong(); if (_count < 0) { env->ThrowError("LeftStr: Negative character count not allowed"); } if (static_cast(_count) > std::numeric_limits::max() - 1) { env->ThrowError("LeftStr: Character count exceeds maximum allowed value"); } const size_t count = static_cast(_count); char* result = new(std::nothrow) char[count + 1]; if (!result) env->ThrowError("LeftStr: malloc failure (%zu bytes)!", count + 1); strncpy(result, args[0].AsString(), count); result[count] = '\0'; // Ensure null termination AVSValue ret = env->SaveString(result); delete[] result; return ret; } AVSValue MidStr(AVSValue args, void*, IScriptEnvironment* env) { const size_t maxlen = strlen(args[0].AsString()); if (args[1].AsLong() < 1) env->ThrowError("MidStr: Illegal character location. Positions start with 1."); if (static_cast(args[1].AsLong() - 1) > std::numeric_limits::max() - 1) env->ThrowError("MidStr: Offset exceeds maximum allowed value"); size_t offset = static_cast(args[1].AsLong() - 1); // pos=1 specifies start. int64_t _len = args[2].AsLong(maxlen); if (_len < 0) env->ThrowError("MidStr: Character count cannot be negative"); if (maxlen <= offset) { offset = 0; _len = 0;} if (static_cast(_len) > std::numeric_limits::max() - 1) env->ThrowError("MidStr: Character count exceeds maximum allowed value"); size_t len = static_cast(_len); if (offset + len > maxlen) len = maxlen - offset; // though strncpy handles premature string end char *result = new(std::nothrow) char[len + 1]; if (!result) env->ThrowError("MidStr: malloc failure (%zu bytes)!", len + 1); strncpy(result, args[0].AsString() + offset, len); result[len] = '\0'; AVSValue ret = env->SaveString(result); delete[] result; return ret; } AVSValue RightStr(AVSValue args, void*, IScriptEnvironment* env) { const int64_t _count = args[1].AsLong(); if (_count < 0) env->ThrowError("RightStr: Negative character count not allowed"); if (static_cast(_count) > std::numeric_limits::max() - 1) env->ThrowError("RightStr: Character count exceeds maximum allowed value"); size_t count = static_cast(_count); const size_t len = strlen(args[0].AsString()); if (count > len) count = len; // no error given, limit to string length // env->ThrowError("RightStr: Character count (%zu) exceeds string length (%zu)", count, len); const size_t offset = len - count; char* result = new(std::nothrow) char[count + 1]; if (!result) env->ThrowError("RightStr: memory allocation failure (%zu bytes)!", count + 1); strncpy(result, args[0].AsString() + offset, count); result[count] = '\0'; AVSValue ret = env->SaveString(result); delete[] result; return ret; } AVSValue ReplaceStr(AVSValue args, void*, IScriptEnvironment* env) { char const * const original = args[0].AsString(); char const * const pattern = args[1].AsString(); char const * const replacement = args[2].AsString(); const bool case_insensitive = args[3].AsBool(false); const size_t replace_len = strlen(replacement); const size_t pattern_len = strlen(pattern); const size_t orig_len = strlen(original); size_t pattern_count = 0; const char * orig_ptr; const char * pattern_location; if (0 == pattern_len) return original; if (case_insensitive) { char *original_lower = new(std::nothrow) char[sizeof(char) * (orig_len + 1)]; if (!original_lower) env->ThrowError("ReplaceStr: malloc failure!"); char *pattern_lower = new(std::nothrow) char[sizeof(char) * (pattern_len + 1)]; if (!pattern_lower) env->ThrowError("ReplaceStr: malloc failure!"); // make them lowercase for comparison strcpy(original_lower, original); strcpy(pattern_lower, pattern); #ifdef MSVC // works fine also for accented ANSI characters _locale_t locale = _create_locale(LC_ALL, ".ACP"); // Sets the locale to the ANSI code page obtained from the operating system. _strlwr_l(original_lower, locale); _strlwr_l(pattern_lower, locale); _free_locale(locale); #else _strlwr(original_lower); _strlwr(pattern_lower); #endif // find how many times the _lowercased_ pattern occurs in the _lowercased_ original string for (orig_ptr = original_lower; (pattern_location = strstr(orig_ptr, pattern_lower)); orig_ptr = pattern_location + pattern_len) { pattern_count++; } // allocate memory for the new string size_t const retlen = orig_len + pattern_count * (replace_len - pattern_len); char *result = new(std::nothrow) char[sizeof(char) * (retlen + 1)]; if (!result) env->ThrowError("ReplaceStr: malloc failure!"); *result = 0; // copy the original string, // replacing all the instances of the pattern const char * orig_upper_ptr; char * result_ptr = result; // handling dual pointer set: orig, uppercase for (orig_ptr = original, orig_upper_ptr = original_lower; (pattern_location = strstr(orig_upper_ptr, pattern_lower)); orig_upper_ptr = pattern_location + pattern_len, orig_ptr = original + (orig_upper_ptr - original_lower)) { const size_t skiplen = pattern_location - orig_upper_ptr; // copy the section until the occurence of the pattern strncpy(result_ptr, orig_ptr, skiplen); result_ptr += skiplen; // copy the replacement strncpy(result_ptr, replacement, replace_len); result_ptr += replace_len; } // copy rest strcpy(result_ptr, orig_ptr); AVSValue ret = env->SaveString(result); delete[] result; delete[] original_lower; delete[] pattern_lower; return ret; } // old case sensitive version // find how many times the pattern occurs in the original string for (orig_ptr = original; (pattern_location = strstr(orig_ptr, pattern)); orig_ptr = pattern_location + pattern_len) { pattern_count++; } // allocate memory for the new string size_t const retlen = orig_len + pattern_count * (replace_len - pattern_len); char *result = new(std::nothrow) char[sizeof(char) * (retlen + 1)]; if (!result) env->ThrowError("ReplaceStr: malloc failure!"); *result = 0; // copy the original string, // replacing all the instances of the pattern char * result_ptr = result; for (orig_ptr = original; (pattern_location = strstr(orig_ptr, pattern)); orig_ptr = pattern_location + pattern_len) { const size_t skiplen = pattern_location - orig_ptr; // copy the section until the occurence of the pattern strncpy(result_ptr, orig_ptr, skiplen); result_ptr += skiplen; // copy the replacement strncpy(result_ptr, replacement, replace_len); result_ptr += replace_len; } // copy rest strcpy(result_ptr, orig_ptr); AVSValue ret = env->SaveString(result); delete[] result; return ret; } AVSValue TrimLeft(AVSValue args, void*, IScriptEnvironment* env) { char const *original = args[0].AsString(); char const *s = original; char ch; // space, npsp, tab while ((ch = *s) == (char)32 || ch == (char)160 || ch == (char)9) s++; if (original == s) return args[0]; // avoid SaveString if no change return env->SaveString(s); } AVSValue TrimRight(AVSValue args, void*, IScriptEnvironment* env) { char const *original = args[0].AsString(); size_t len = strlen(original); if (len == 0) return args[0]; // avoid SaveString if no change size_t orig_len = len; char const *s = original + len; char ch; // space, npsp, tab while ((len > 0) && ((ch = *--s) == (char)32 || ch == (char)160 || ch == (char)9)) { len--; } if(orig_len == len) return args[0]; // avoid SaveString if no change if (len == 0) return env->SaveString(""); size_t retlen = s - original + 1; char *result = new(std::nothrow) char[sizeof(char) * (retlen + 1)]; if (!result) env->ThrowError("TrimRight: malloc failure!"); strncpy(result, original, retlen); result[retlen] = 0; AVSValue ret = env->SaveString(result); delete[] result; return ret; } AVSValue TrimAll(AVSValue args, void*, IScriptEnvironment* env) { // not simplify with calling Left/Right, avoid double SaveStrings // like TrimLeft char const *original = args[0].AsString(); if (!*original) return args[0]; // avoid SaveString if no change char ch; // space, npsp, tab while ((ch = *original) == (char)32 || ch == (char)160 || ch == (char)9) original++; // almost like TrimRight size_t len = strlen(original); if (len == 0) return env->SaveString(""); size_t orig_len = len; char const *s = original + len; // space, npsp, tab while ((len > 0) && ((ch = *--s) == (char)32 || ch == (char)160 || ch == (char)9)) len--; if (orig_len == len) return env->SaveString(original); // nothing to cut from right if (len == 0) return env->SaveString(""); // full cut size_t retlen = s - original + 1; char *result = new(std::nothrow) char[sizeof(char) * (retlen + 1)]; if (!result) env->ThrowError("TrimAll: malloc failure!"); strncpy(result, original, retlen); result[retlen] = 0; AVSValue ret = env->SaveString(result); delete[] result; return ret; } AVSValue StrCmp(AVSValue args, void*, IScriptEnvironment*) { return lstrcmp( args[0].AsString(), args[1].AsString() ); } AVSValue StrCmpi(AVSValue args, void*, IScriptEnvironment*) { return lstrcmpi( args[0].AsString(), args[1].AsString() ); } AVSValue FindStr(AVSValue args, void*, IScriptEnvironment*) { const char *pdest = strstr( args[0].AsString(),args[1].AsString() ); int result = (int)(pdest - args[0].AsString() + 1); if (pdest == NULL) result = 0; return result; } // FIXME: to v11 64 bit support AVSValue Rand(AVSValue args, void*, IScriptEnvironment*) { int limit = args[0].AsInt(RAND_MAX); bool scale_mode = args[1].AsBool((abs(limit) > RAND_MAX)); if (args[2].AsBool(false)) srand( (unsigned) time(NULL) ); //seed if (scale_mode) { double f = 1.0 / (RAND_MAX + 1.0); return int(f * rand() * limit); } else { //modulus mode int s = (limit < 0 ? -1 : 1); if (limit==0) return 0; else return s * rand() % limit; } } AVSValue Select(AVSValue args, void*, IScriptEnvironment* env) { // arraysize is still int int64_t i = args[0].AsLong(); if ((args[1].ArraySize() <= i) || (i < 0) || (i > INT_MAX)) env->ThrowError("Select: Index value out of range"); return args[1][static_cast(i)]; } AVSValue NOP(AVSValue args, void*, IScriptEnvironment*) { return 0;} AVSValue Undefined(AVSValue args, void*, IScriptEnvironment*) { return AVSValue();} AVSValue Exist(AVSValue args, void*, IScriptEnvironment*nv) { const char *filename = args[0].AsString(); #ifdef AVS_POSIX constexpr bool utf8default = true; #else constexpr bool utf8default = false; #endif const bool utf8 = args[1].AsBool(utf8default); if (strchr(filename, '*') || strchr(filename, '?')) // wildcard return false; #ifdef AVS_WINDOWS if (utf8) { // fixme/enhance me: check win codepage 65001 UTF8 and do like posix native utf8 // (remark applies to all utf8 in avs+) auto wsource = Utf8ToWideChar(filename); std::wstring filename_w = wsource.get(); return fs::exists(filename_w); } #endif return fs::exists(filename); } //WE -> // Spline functions to generate and evaluate a natural bicubic spline void spline(float x[], float y[], int n, float y2[]) { int i, k; float p, qn, sig, un, * u; u = new float[n]; y2[1] = u[1] = 0.0f; for (i = 2; i <= n - 1; i++) { sig = (x[i] - x[i - 1]) / (x[i + 1] - x[i - 1]); p = sig * y2[i - 1] + 2.0f; y2[i] = (sig - 1.0f) / p; u[i] = (y[i + 1] - y[i]) / (x[i + 1] - x[i]) - (y[i] - y[i - 1]) / (x[i] - x[i - 1]); u[i] = (6.0f * u[i] / (x[i + 1] - x[i - 1]) - sig * u[i - 1]) / p; } qn = un = 0.0f; y2[n] = (un - qn * u[n - 1]) / (qn * y2[n - 1] + 1.0f); for (k = n - 1; k >= 1; k--) { y2[k] = y2[k] * y2[k + 1] + u[k]; } delete[] u; } int splint(float xa[], float ya[], float y2a[], int n, float x, float& y, bool cubic) { int klo, khi, k; float h, b, a; klo = 1; khi = n; while (khi - klo > 1) { k = (khi + klo) >> 1; if (xa[k] > x) khi = k; else klo = k; } h = xa[khi] - xa[klo]; if (h == 0.0f) { y = 0.0f; return -1; // all x's have to be different } a = (xa[khi] - x) / h; b = (x - xa[klo]) / h; if (cubic) { y = a * ya[klo] + b * ya[khi] + ((a * a * a - a) * y2a[klo] + (b * b * b - b) * y2a[khi]) * (h * h) / 6.0f; } else { y = a * ya[klo] + b * ya[khi]; } return 0; } // the script functions AVSValue AVSChr(AVSValue args, void*, IScriptEnvironment* env) { char s[2]; s[0] = (char)(args[0].AsInt()); s[1] = 0; return env->SaveString(s); } AVSValue AVSOrd(AVSValue args, void*, IScriptEnvironment*) { return (int)args[0].AsString()[0] & 0xFF; } AVSValue FillStr(AVSValue args, void*, IScriptEnvironment* env ) { const int64_t _count = args[0].AsLong(); if (_count <= 0) env->ThrowError("FillStr: Repeat count must be greater than zero!"); const char *str = args[1].AsString(" "); const size_t len_to_repeat = strlen(str); if (len_to_repeat == 0) return str; constexpr size_t max_size_t = std::numeric_limits::max(); size_t max_repeats = (max_size_t - 1) / len_to_repeat; size_t count = static_cast(_count); if (count > max_repeats) env->ThrowError("FillStr: too many repeats, resulting string exceeds the maximum allowed length!"); const size_t total = count * len_to_repeat; char *buff = new(std::nothrow) char[total+1]; if (!buff) env->ThrowError("FillStr: memory allocation failure (%zu bytes)!", total + 1); if (len_to_repeat == 1) std::fill_n(buff, total, str[0]); else { for (size_t i = 0; i < count; i++) memcpy(buff + i * len_to_repeat, str, len_to_repeat); } buff[total] = '\0'; AVSValue ret = env->SaveString(buff); delete[] buff; return ret; } AVSValue AVSTime(AVSValue args, void*, IScriptEnvironment* env) { time_t lt_t; struct tm* lt; time(<_t); lt = localtime(<_t); char s[1024]; strftime(s, 1024, args[0].AsString(""), lt); s[1023] = 0; return env->SaveString(s); } // FIXME: to v11 64 bit support AVSValue Spline(AVSValue args, void*, IScriptEnvironment* env) { int n; float x, y; int i; bool cubic; AVSValue coordinates; x = args[0].AsFloatf(0); coordinates = args[1]; cubic = args[2].AsBool(true); n = coordinates.ArraySize(); if (n < 4 || n & 1) env->ThrowError("To few arguments for Spline"); n = n / 2; float* buf = new float[(n + 1) * 3]; float* xa = &(buf[(n + 1) * 0]); float* ya = &(buf[(n + 1) * 1]); float* y2a = &(buf[(n + 1) * 2]); for (i = 1; i <= n; i++) { xa[i] = coordinates[(i - 1) * 2 + 0].AsFloatf(0); ya[i] = coordinates[(i - 1) * 2 + 1].AsFloatf(0); } for (i = 1; i < n; i++) { if (xa[i] >= xa[i + 1]) env->ThrowError("Spline: all x values have to be different and in ascending order!"); } spline(xa, ya, n, y2a); splint(xa, ya, y2a, n, x, y, cubic); delete[] buf; return y; } // WE <- static inline const VideoInfo& VI(const AVSValue& arg) { return arg.AsClip()->GetVideoInfo(); } static const std::map pixel_format_table = { // names for lookup by pixel_type or name {VideoInfo::CS_BGR24, "RGB24"}, {VideoInfo::CS_BGR32, "RGB32"}, {VideoInfo::CS_YUY2 , "YUY2"}, {VideoInfo::CS_YV24 , "YV24"}, {VideoInfo::CS_YV16 , "YV16"}, {VideoInfo::CS_YV12 , "YV12"}, {VideoInfo::CS_I420 , "YV12"}, {VideoInfo::CS_YUV9 , "YUV9"}, {VideoInfo::CS_YV411, "YV411"}, {VideoInfo::CS_Y8 , "Y8"}, {VideoInfo::CS_YUV420P10, "YUV420P10"}, {VideoInfo::CS_YUV422P10, "YUV422P10"}, {VideoInfo::CS_YUV444P10, "YUV444P10"}, {VideoInfo::CS_Y10 , "Y10"}, {VideoInfo::CS_YUV420P12, "YUV420P12"}, {VideoInfo::CS_YUV422P12, "YUV422P12"}, {VideoInfo::CS_YUV444P12, "YUV444P12"}, {VideoInfo::CS_Y12 , "Y12"}, {VideoInfo::CS_YUV420P14, "YUV420P14"}, {VideoInfo::CS_YUV422P14, "YUV422P14"}, {VideoInfo::CS_YUV444P14, "YUV444P14"}, {VideoInfo::CS_Y14 , "Y14"}, {VideoInfo::CS_YUV420P16, "YUV420P16"}, {VideoInfo::CS_YUV422P16, "YUV422P16"}, {VideoInfo::CS_YUV444P16, "YUV444P16"}, {VideoInfo::CS_Y16 , "Y16"}, {VideoInfo::CS_YUV420PS , "YUV420PS"}, {VideoInfo::CS_YUV422PS , "YUV422PS"}, {VideoInfo::CS_YUV444PS , "YUV444PS"}, {VideoInfo::CS_Y32 , "Y32"}, {VideoInfo::CS_BGR48 , "RGB48"}, {VideoInfo::CS_BGR64 , "RGB64"}, {VideoInfo::CS_RGBP , "RGBP"}, {VideoInfo::CS_RGBP10 , "RGBP10"}, {VideoInfo::CS_RGBP12 , "RGBP12"}, {VideoInfo::CS_RGBP14 , "RGBP14"}, {VideoInfo::CS_RGBP16 , "RGBP16"}, {VideoInfo::CS_RGBPS , "RGBPS"}, {VideoInfo::CS_YUVA420, "YUVA420"}, {VideoInfo::CS_YUVA422, "YUVA422"}, {VideoInfo::CS_YUVA444, "YUVA444"}, {VideoInfo::CS_YUVA420P10, "YUVA420P10"}, {VideoInfo::CS_YUVA422P10, "YUVA422P10"}, {VideoInfo::CS_YUVA444P10, "YUVA444P10"}, {VideoInfo::CS_YUVA420P12, "YUVA420P12"}, {VideoInfo::CS_YUVA422P12, "YUVA422P12"}, {VideoInfo::CS_YUVA444P12, "YUVA444P12"}, {VideoInfo::CS_YUVA420P14, "YUVA420P14"}, {VideoInfo::CS_YUVA422P14, "YUVA422P14"}, {VideoInfo::CS_YUVA444P14, "YUVA444P14"}, {VideoInfo::CS_YUVA420P16, "YUVA420P16"}, {VideoInfo::CS_YUVA422P16, "YUVA422P16"}, {VideoInfo::CS_YUVA444P16, "YUVA444P16"}, {VideoInfo::CS_YUVA420PS , "YUVA420PS"}, {VideoInfo::CS_YUVA422PS , "YUVA422PS"}, {VideoInfo::CS_YUVA444PS , "YUVA444PS"}, {VideoInfo::CS_RGBAP , "RGBAP"}, {VideoInfo::CS_RGBAP10 , "RGBAP10"}, {VideoInfo::CS_RGBAP12 , "RGBAP12"}, {VideoInfo::CS_RGBAP14 , "RGBAP14"}, {VideoInfo::CS_RGBAP16 , "RGBAP16"}, {VideoInfo::CS_RGBAPS , "RGBAPS"}, }; static const std::multimap pixel_format_table_ex = { // alternative names for lookup by name (multimap!) {VideoInfo::CS_YV24 , "YUV444"}, {VideoInfo::CS_YV16 , "YUV422"}, {VideoInfo::CS_YV12 , "YUV420"}, {VideoInfo::CS_YV411, "YUV411"}, {VideoInfo::CS_RGBP , "RGBP8"}, {VideoInfo::CS_RGBAP, "RGBAP8"}, {VideoInfo::CS_YV24 , "YUV444P8"}, {VideoInfo::CS_YV16 , "YUV422P8"}, {VideoInfo::CS_YV12 , "YUV420P8"}, {VideoInfo::CS_YV411, "YUV411P8"}, {VideoInfo::CS_YUVA420, "YUVA420P8"}, {VideoInfo::CS_YUVA422, "YUVA422P8"}, {VideoInfo::CS_YUVA444, "YUVA444P8"}, }; const char *GetPixelTypeName(const int pixel_type) { const std::string name = ""; auto it = pixel_format_table.find(pixel_type); if (it == pixel_format_table.end()) return ""; return (it->second).c_str(); } int GetPixelTypeFromName(const char *pixeltypename) { std::string name_to_find = pixeltypename; for (auto & c: name_to_find) c = toupper(c); // uppercase input string for (auto it = pixel_format_table.begin(); it != pixel_format_table.end(); it++) { if ((it->second).compare(name_to_find) == 0) return it->first; } // find by alternative names e.g. YUV420 or YUV420P8 instead of YV12 for (auto it = pixel_format_table_ex.begin(); it != pixel_format_table_ex.end(); it++) { if ((it->second).compare(name_to_find) == 0) return it->first; } return VideoInfo::CS_UNKNOWN; } AVSValue PixelType (AVSValue args, void*, IScriptEnvironment*) { return GetPixelTypeName(VI(args[0]).pixel_type); } // AVS+ AVSValue ColorSpaceNameToPixelType (AVSValue args, void*, IScriptEnvironment*) { return GetPixelTypeFromName(args[0].AsString()); } AVSValue Width(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).width; } AVSValue Height(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).height; } AVSValue FrameCount(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).num_frames; } AVSValue FrameRate(AVSValue args, void*, IScriptEnvironment*) { const VideoInfo& vi = VI(args[0]); return (double)vi.fps_numerator / vi.fps_denominator; } // maximise available precision AVSValue FrameRateNumerator(AVSValue args, void*, IScriptEnvironment*) { return (int)VI(args[0]).fps_numerator; } // unsigned int truncated to int AVSValue FrameRateDenominator(AVSValue args, void*, IScriptEnvironment*) { return (int)VI(args[0]).fps_denominator; } // unsigned int truncated to int AVSValue AudioRate(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).audio_samples_per_second; } AVSValue AudioLength(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).num_audio_samples; } // since v11 not truncated to int AVSValue AudioLengthLo(AVSValue args, void*, IScriptEnvironment*) { return (int)(VI(args[0]).num_audio_samples % (unsigned)args[1].AsInt(1000000000)); } AVSValue AudioLengthHi(AVSValue args, void*, IScriptEnvironment*) { return (int)(VI(args[0]).num_audio_samples / (unsigned)args[1].AsInt(1000000000)); } AVSValue AudioLengthS(AVSValue args, void*, IScriptEnvironment* env) { char s[32]; #ifdef AVS_WINDOWS return env->SaveString(_i64toa(VI(args[0]).num_audio_samples, s, 10)); #else sprintf(s, "%" PRId64, VI(args[0]).num_audio_samples); return env->SaveString(s); #endif } AVSValue AudioLengthF(AVSValue args, void*, IScriptEnvironment*) { return static_cast(VI(args[0]).num_audio_samples); } // at least this will give an order of the size. // Since v11 it has of little use: AudioLength now can return int64, // anyway, cast to double instead of float AVSValue AudioDuration(AVSValue args, void*, IScriptEnvironment*) { const VideoInfo& vi = VI(args[0]); return (double)vi.num_audio_samples / vi.audio_samples_per_second; } AVSValue AudioChannels(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).HasAudio() ? VI(args[0]).nchannels : 0; } AVSValue AudioBits(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).BytesPerChannelSample()*8; } AVSValue IsAudioFloat(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).IsSampleType(SAMPLE_FLOAT); } AVSValue IsAudioInt(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).IsSampleType(SAMPLE_INT8 | SAMPLE_INT16 | SAMPLE_INT24 | SAMPLE_INT32 ); } AVSValue IsChannelMaskKnown(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).IsChannelMaskKnown(); } AVSValue GetChannelMask(AVSValue args, void*, IScriptEnvironment*) { return (int)VI(args[0]).GetChannelMask(); } AVSValue IsRGB(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).IsRGB(); } AVSValue IsRGB24(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).IsRGB24(); } AVSValue IsRGB32(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).IsRGB32(); } AVSValue IsYUV(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).IsYUV(); } AVSValue IsYUY2(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).IsYUY2(); } AVSValue IsY8(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).IsY8(); } AVSValue IsYV12(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).IsYV12(); } AVSValue IsYV16(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).IsYV16(); } AVSValue IsYV24(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).IsYV24(); } AVSValue IsYV411(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).IsYV411(); } AVSValue IsPlanar(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).IsPlanar(); } AVSValue IsInterleaved(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).IsColorSpace(VideoInfo::CS_INTERLEAVED); } AVSValue IsFieldBased(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).IsFieldBased(); } AVSValue IsFrameBased(AVSValue args, void*, IScriptEnvironment*) { return !VI(args[0]).IsFieldBased(); } AVSValue GetParity(AVSValue args, void*, IScriptEnvironment*) { return args[0].AsClip()->GetParity(args[1].AsInt(0)); } AVSValue HasVideo(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).HasVideo(); } AVSValue HasAudio(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).HasAudio(); } AVSValue String(AVSValue args, void*, IScriptEnvironment* env) { if (args[0].IsString()) return args[0]; if (args[0].IsBool()) return (args[0].AsBool() ? "true" : "false"); if (args[0].IsFunction()) return args[0].AsFunction()->ToString(env); if (args[1].Defined()) { // WE --> when a format parameter is present // order! if it is an Int: IsFloat gives True // If parameter exists, always convert to float if (args[0].GetType() == AvsValueType::VALUE_TYPE_FLOAT) // real 32 bit float { return env->Sprintf(args[1].AsString("%f"), args[0].AsFloatf()); // AsFloatf returns 32 bit float } else if (args[0].IsFloat()) // 32 or 64 bit integer or double { return env->Sprintf(args[1].AsString("%lf"), args[0].AsFloat()); // AsFloat returns double } return ""; } else { // standard behaviour if (args[0].IsLongStrict()) { char s[21]; sprintf(s, "%" PRId64, args[0].AsLong()); return env->SaveString(s); } if (args[0].IsInt()) { char s[12]; // with sign: worst case 11 sprintf(s, "%d", args[0].AsInt()); return env->SaveString(s); } if (args[0].IsFloat()) { // for double as well. char s[50]; // safe size for double #ifdef MSVC _locale_t locale = _create_locale(LC_NUMERIC, "C"); // decimal point: dot _sprintf_l(s, "%lf", locale, args[0].AsFloat()); _free_locale(locale); #else sprintf(s, "%lf", args[0].AsFloat()); #endif return env->SaveString(s); } } return ""; } AVSValue Hex(AVSValue args, void*, IScriptEnvironment* env) { int n = args[0].AsInt(); int wid = args[1].AsInt(0); // 0..8 is the minimum width of the returned string wid = (wid<0) ? 0 : (wid > 8) ? 8 : wid; char buf[8 + 1]; sprintf_s(buf, "%0*X", wid, n); // uppercase, unlike <=r2580 return env->SaveString(buf); } static std::string AVSValue_to_string(AVSValue v, IScriptEnvironment* env) { if (v.IsString()) return v.AsString(); if (v.IsBool()) return v.AsBool() ? "true" : "false"; if (v.IsFunction()) return v.AsFunction()->ToString(env); if (v.IsInt()) return std::to_string(v.AsLong()); // AsLong handles both 32 and 64-bit int if (v.IsFloat()) return double_to_string(v.AsFloat()); return ""; } // Formatting function with parameter list with ordered, indexed or named replacements AVSValue FormatString(AVSValue args, void*, IScriptEnvironment* env) { // Format("{} {}!", "Hello", "world") // max_pixel_value = 255 // Format("max pixel value = {max_pixel_value}!") // Format("Pi={1} x={0} y={0}!", 12, Pi()) std::string format = args[0].AsString(); int numargs = args[1].ArraySize(); // (name), value pairs, name can be empty std::vector> sv; for (int i = 0; i < numargs; i++) { std::string name; // can be empty std::string val_as_s; AVSValue v = args[1][i]; // ["name", value] support if (v.IsArray()) { if (v.ArraySize() != 2 || !v[0].IsString()) env->ThrowError("Format: for key-value lookup parameter must be in [\"name\", value] array format"); name = v[0].AsString(); v = v[1]; } val_as_s = AVSValue_to_string(v, env); sv.push_back(std::make_pair(name, val_as_s)); } size_t supplied_params_count = sv.size(); size_t len = format.size(); size_t i = 0; bool in_parenthesis = false; std::string ss; size_t last_pos = 0; std::string last_param_section; size_t param_counter = 0; while (i < len) { if (!in_parenthesis) { size_t x = format.find_first_of('{', last_pos); // }} can appear only when escaped size_t cx = format.find_first_of('}', last_pos); if (cx != std::string::npos && cx < x) { if (cx + 1 < len && format[cx + 1] == '}') // }} escaped { ss += format.substr(last_pos, cx - last_pos + 1); last_pos = cx + 2; i = last_pos; continue; } env->ThrowError("Format: unbalanced curly bracket at position %zu", cx); } if (x == std::string::npos) // { not found { ss += format.substr(last_pos); // copy rest break; } else if (x + 1 < len && format[x + 1] == '{') // {{ escaped { ss += format.substr(last_pos, x - last_pos + 1); last_pos = x + 2; i = last_pos; } else { // found {, not escaped ss += format.substr(last_pos, x - last_pos); last_pos = x + 1; // points to after the { i = last_pos; in_parenthesis = true; } continue; } // end of not-in-bracket-mode // in-curly-bracket: search for the closing bracket size_t x = format.find_first_of('}', last_pos); if (x == std::string::npos) // not found, will throw error outside break; last_param_section = format.substr(last_pos, x - last_pos); // name, order number or empty if (last_param_section.empty()) { // simple {}, insert next parameter, consume one from the list // in c++20 you cannot mix if (param_counter >= supplied_params_count) env->ThrowError("Format: more parameter sections than parameters supplied"); ss += sv[param_counter++].second; } else { // name or number bool validName = true; // check for a valid identifier name auto ch = last_param_section[0]; if (ch != '_' && !isalpha(ch)) validName = false; else { for (size_t i = 1; i < last_param_section.length(); i++) { const char ch = last_param_section[i]; if (!(ch == '_' || isalnum(ch))) { validName = false; break; } } } if (!validName) { // valid number like {2} to index parameters int index; try { // string -> integer index = std::stoi(last_param_section); } catch (...) { env->ThrowError("Format: invalid parameter specifier: \"%s\".", last_param_section.c_str()); } if (index < 0 || index >= (int)supplied_params_count) env->ThrowError("Format: parameter index is out of range: %d", index); ss += sv[index].second; } else { // find among the named parameters auto it = std::find_if(sv.begin(), sv.end(), [&last_param_section](const std::pair& element) { return element.first == last_param_section; }); if (it != sv.end()) ss += it->second; // name was found else { // last resort: variable with the given name AVSValue v; if (!env->GetVarTry(last_param_section.c_str(), &v)) env->ThrowError("Format: no parameter or variable found with name \"%s\".", last_param_section.c_str()); std::string val_as_s = AVSValue_to_string(v, env); ss += val_as_s; } } } last_pos = x + 1; i = last_pos; in_parenthesis = false; } if(in_parenthesis) env->ThrowError("Format: unclosed curly bracket"); return env->SaveString(ss.c_str()); } AVSValue Func(AVSValue args, void*, IScriptEnvironment*) { return args[0]; } AVSValue IsBool(AVSValue args, void*, IScriptEnvironment*) { return args[0].IsBool(); } AVSValue IsInt(AVSValue args, void*, IScriptEnvironment*) { return args[0].IsInt(); } AVSValue IsLongStrict(AVSValue args, void*, IScriptEnvironment*) { return args[0].IsLongStrict(); } AVSValue IsFloat(AVSValue args, void*, IScriptEnvironment*) { return args[0].IsFloat(); } AVSValue IsFloatfStrict(AVSValue args, void*, IScriptEnvironment*) { return args[0].IsFloatfStrict(); } AVSValue IsString(AVSValue args, void*, IScriptEnvironment*) { return args[0].IsString(); } AVSValue IsClip(AVSValue args, void*, IScriptEnvironment*) { return args[0].IsClip(); } AVSValue IsFunction(AVSValue args, void*, IScriptEnvironment*) { return args[0].IsFunction(); } AVSValue Defined(AVSValue args, void*, IScriptEnvironment*) { return args[0].Defined(); } const char* GetAVSTypeName(AVSValue value) { if (value.IsClip()) return "clip"; else if (value.IsBool()) return "bool"; else if (value.IsLongStrict()) // must be before IsInt return "long"; else if (value.IsInt()) return "int"; else if (value.IsFloatfStrict()) // before IsFloat return "float"; else if (value.IsFloat()) return "double"; else if (value.IsString()) return "string"; else if (value.IsArray()) return "array"; else if (value.IsFunction()) return "function"; else if (!value.Defined()) return "undefined value"; else return "unknown type"; } AVSValue TypeName(AVSValue args, void*, IScriptEnvironment*) { return GetAVSTypeName(args[0]); } AVSValue Default(AVSValue args, void*, IScriptEnvironment*) { return args[0].Defined() ? args[0] : args[1]; } static float find_next_valid_float(const double version) { float version_f = static_cast(version); const float initial_value = version_f; // float epsilon = std::nextafterf(version_f, INFINITY) - version_f; int steps = 0; while (version_f < version) { version_f = std::nextafterf(version_f, INFINITY); steps++; // Safety check to prevent infinite loops if (steps > 1000000) { // std::cout << "Too many steps required, possible overflow\n"; version_f = initial_value; break; } } return version_f; } AVSValue VersionNumber(AVSValue args, void*, IScriptEnvironment*) { const double VersionToReturn = AVS_VERSION; // consider upgrading float VersionToReturnf = find_next_valid_float(VersionToReturn); return VersionToReturnf; // A typical transition, when - even in Avisynth+ - we return 2.6f here. // From 3.7.4 script constants are of 64-bit double precision, and // the very popular IsAvs26 = VersionNumber() >= 2.6 will fail, since // 2.6f < 2.6, (double)(float)2.6 is 2.5999999046. Arrrgh. // 2.6 cannot be exactly specified as a floating point number and has // differently rounded values in float and in double. // Thus we start increasing the float value with the smallest available steps, // until the comparison will be fine. // Prior to interface version 11, Avisynth supported only 32-bit floating-point data (float), not 64-bit (double). // To maintain compatibility (old plugins get this value as 32 bit float), this return // value must remain a 32-bit float. } AVSValue VersionString(AVSValue args, void*, IScriptEnvironment*) { return AVS_FULLVERSION; } AVSValue IsVersionOrGreater(AVSValue args, void*, IScriptEnvironment* env) { if (!args[0].Defined() || !args[1].Defined()) { env->ThrowError("IsVersionOrGreater error: at least two parameters (majorVersion, minorVersion) required!"); } // true when current version is at least the same or greater than the given three-part version const int majorVersion = args[0].AsInt(0); const int minorVersion = args[1].AsInt(0); const int bugfixVersion = args[2].AsInt(0); if (majorVersion != AVS_MAJOR_VER) return majorVersion < AVS_MAJOR_VER; if (minorVersion != AVS_MINOR_VER) return minorVersion < AVS_MINOR_VER; return bugfixVersion <= AVS_BUGFIX_VER; } AVSValue Frac(AVSValue args, void*, IScriptEnvironment*) { if (args[0].IsInt()) return 0.f; double result = args[0].AsFloat() - int64_t(args[0].AsFloat()); if (args[0].IsFloat()) return (float)result; return result; } AVSValue Int(AVSValue args, void*, IScriptEnvironment*) { if (args[0].IsLongStrict()) return args[0].AsLong(); if (args[0].IsInt()) return args[0].AsInt(); int64_t result = int64_t(args[0].AsFloat()); if (result >= INT_MIN && result <= INT_MAX) return (int)result; return result; } AVSValue IntI(AVSValue args, void*, IScriptEnvironment*) { if (args[0].IsInt()) return static_cast(args[0].AsLong()); int result = static_cast(args[0].AsFloat()); return result; } AVSValue Long(AVSValue args, void*, IScriptEnvironment*) { if (args[0].IsInt()) return args[0].AsLong(); int64_t result = static_cast(args[0].AsFloat()); return result; } AVSValue Float(AVSValue args, void*, IScriptEnvironment*) { if (args[0].IsInt()) return (double)args[0].AsLong(); if(args[0].IsFloatfStrict()) return args[0].AsFloatf(); return args[0].AsFloat(); } // Always to 64 bit double AVSValue Double(AVSValue args, void*, IScriptEnvironment*) { return args[0].AsFloat(); } // Always to 32 bit float AVSValue Floatf(AVSValue args, void*, IScriptEnvironment*) { return args[0].AsFloatf(); } AVSValue Value(AVSValue args, void*, IScriptEnvironment*) { char *stopstring; return strtod(args[0].AsString(),&stopstring); } AVSValue HexValue(AVSValue args, void*, IScriptEnvironment*) { // Added optional pos arg default = 1, start position in string of the HexString, 1 denotes the string beginning. // Will return 0 if error in 'pos' ie if pos is less than 1 or greater than string length. const char* str = args[0].AsString(); int64_t pos = args[1].AsLong(1) - 1; // start is pos 1 size_t sz = strlen(str); if (pos < 0 || static_cast(pos) >= sz) return 0; str += pos; char* stopstring; unsigned long result = strtoul(str, &stopstring, 16); // keep int range, FFFFFFFF is negative - compatibility, see HexValue64 return (int)(result); } // new in v11 AVSValue HexValue64(AVSValue args, void*, IScriptEnvironment*) { // Added optional pos arg default = 1, start position in string of the HexString, 1 denotes the string beginning. // Will return 0 if error in 'pos' ie if pos is less than 1 or greater than string length. const char* str = args[0].AsString(); int64_t pos = args[1].AsLong(1) - 1; // start is pos 1 size_t sz = strlen(str); if (pos < 0 || static_cast(pos) >= sz) return 0; str += pos; char* stopstring; // v11: strtoul --> strtoull to 64 bit results long long unsigned long long result = strtoull(str, &stopstring, 16); // FFFFFFFF is positive return static_cast(result); } AVSValue AvsMin(AVSValue args, void*, IScriptEnvironment* env) { bool isInt = true; bool isFloat32 = true; const int n = args[0].ArraySize(); if (n < 2) env->ThrowError("Too few arguments for Min"); // If all numbers are Ints return an Int for (int i = 0; i < n; i++) if (!args[0][i].IsInt()) { isInt = false; break; } // v11: If all numbers are 32 bit floats return real float instead of double for (int i = 0; i < n; i++) if (!args[0][i].IsFloatfStrict()) { isFloat32 = false; break; } if (isInt) { int64_t V = args[0][0].AsLong(); for (int i = 1; i < n; i++) V = min(V, args[0][i].AsLong()); // keep the smaller type if (V >= INT_MIN && V <= INT_MAX) return (int)V; return V; } else { double V = args[0][0].AsFloat(); for (int i = 1; i < n; i++) V = min(V, args[0][i].AsFloat()); if (isFloat32) return (float)V; return V; } } AVSValue AvsMax(AVSValue args, void*, IScriptEnvironment* env) { bool isInt = true; bool isFloat32 = true; const int n = args[0].ArraySize(); if (n < 2) env->ThrowError("Too few arguments for Max"); // If all numbers are Ints return an Int for (int i = 0; i < n; i++) if (!args[0][i].IsInt()) { isInt = false; break; } // v11: If all numbers are 32 bit floats return real float instead of double for (int i = 0; i < n; i++) if (!args[0][i].IsFloatfStrict()) { isFloat32 = false; break; } if (isInt) { int64_t V = args[0][0].AsLong(); for (int i = 1; i < n; i++) V = max(V, args[0][i].AsLong()); // keep the smaller type if (V >= INT_MIN && V <= INT_MAX) return (int)V; return V; } else { double V = args[0][0].AsFloat(); for (int i = 1; i < n; i++) V = max(V, args[0][i].AsFloat()); if (isFloat32) return (float)V; return V; } } // The "AddAutoloadDir" script function allows supplying a UTF-8 directory path // even when the system code page is ANSI. // On Windows the Avisynth script typically treats string parameters as ANSI // by default, unless we force the interpretation with an optional bool utf8 = true. // The directory parameter is converted from ANSI to UTF-8 internally before calling // the interface API. This behavior depends on the IScriptEnvironment2 (development) // interface, which provides an AddAutoloadDir method that requires now UTF-8 paths. AVSValue AddAutoloadDir (AVSValue args, void*, IScriptEnvironment* env) { IScriptEnvironment2 *env2 = static_cast(env); const bool utf8 = args[2].AsBool(false); // default ANSI on Windows, n/a (see charToUtf8) on other OSes auto dir_utf8 = charToUtf8(args[0].AsString(), utf8); // takes care of ANSI to UTF8 conversion on Windows if needed env2->AddAutoloadDir(dir_utf8.c_str(), args[1].AsBool(true)); return AVSValue(); } AVSValue ClearAutoloadDirs (AVSValue args, void*, IScriptEnvironment* env) { IScriptEnvironment2 *env2 = static_cast(env); env2->ClearAutoloadDirs(); return AVSValue(); } AVSValue ListAutoloadDirs(AVSValue args, void*, IScriptEnvironment* env) { InternalEnvironment* envi = static_cast(env); const char* AutoLoadDirs = envi->ListAutoloadDirs(); // internally uses SaveString #if defined(AVS_WINDOWS) const bool utf8 = args[0].AsBool(false); // default ANSI on Windows, n/a on other OSes if (!utf8) { // On Windows the environment uses ANSI by default. When the caller requests ANSI // (utf8 == false), convert the internally stored UTF-8 string to ANSI before returning. // Characters that cannot be represented in ANSI will be replaced with '?'. return AVSValue(env->SaveString(Utf8ToAnsi(AutoLoadDirs).c_str())); // New SaveString needed. } #endif return AVSValue(AutoLoadDirs); } AVSValue AutoloadPlugins (AVSValue args, void*, IScriptEnvironment* env) { IScriptEnvironment2 *env2 = static_cast(env); env2->AutoloadPlugins(); return AVSValue(); } AVSValue FunctionExists (AVSValue args, void*, IScriptEnvironment* env) { return env->FunctionExists(args[0].AsString()); } AVSValue InternalFunctionExists (AVSValue args, void*, IScriptEnvironment* env) { IScriptEnvironment2 *env2 = static_cast(env); return env2->InternalFunctionExists(args[0].AsString()); } AVSValue SetFilterMTMode (AVSValue args, void*, IScriptEnvironment* env) { IScriptEnvironment2 *env2 = static_cast(env); env2->SetFilterMTMode(args[0].AsString(), (MtMode)args[1].AsInt(), args[2].AsBool(false)); return AVSValue(); } AVSValue SetLogParams(AVSValue args, void*, IScriptEnvironment* env) { const char* target = args[0].AsString("stderr"); const int level = args[1].AsInt(LOGLEVEL_INFO); InternalEnvironment *envi = static_cast(env); envi->SetLogParams(target, level); return AVSValue(); } AVSValue LogMsg(AVSValue args, void*, IScriptEnvironment* env) { if ((args.ArraySize() != 2) || !args[0].IsString() || !args[1].IsInt()) { env->ThrowError("Invalid parameters to Log() function."); } else { InternalEnvironment *envi = static_cast(env); envi->LogMsg(args[1].AsInt(), args[0].AsString()); } return AVSValue(); } AVSValue SetCacheMode(AVSValue args, void*, IScriptEnvironment* env) { InternalEnvironment *envI = static_cast(env); envI->SetCacheMode((CacheMode)args[0].AsInt()); return AVSValue(); } AVSValue SetDeviceOpt(AVSValue args, void*, IScriptEnvironment* env) { InternalEnvironment *envI = static_cast(env); envI->SetDeviceOpt((DeviceOpt)args[0].AsInt(), args[1].AsInt(0)); return AVSValue(); } AVSValue SetFilterProp(AVSValue args, void*, IScriptEnvironment* env) { InternalEnvironment* envi = static_cast(env); // 3+1-arg: "ss.[mode]i" // 5+1-arg: "ss.s.[mode]i": // arg3 exists and is string or integer/undefined if (args[3].IsString()) { // 5+1-arg conditional form matched by "ss.s.[mode]i": // SetFilterProp(filter, param_name, param_match, prop_key, prop_value [, mode]) // Inject prop_key=prop_value only when the named call arg 'param_name' equals param_match. const AVSValue& param_match = args[2]; // param_match may be a scalar (int/float/bool/string) or an array of scalars (aliases) if (param_match.IsArray()) { for (int j = 0; j < param_match.ArraySize(); ++j) { const AVSValue& elem = param_match[j]; if (!elem.IsInt() && !elem.IsFloat() && !elem.IsString() && !elem.IsBool()) env->ThrowError("SetFilterProp: alias array element %d must be int, float, bool, or string", j); } } else if (!param_match.IsInt() && !param_match.IsFloat() && !param_match.IsString() && !param_match.IsBool()) { env->ThrowError("SetFilterProp: condition value must be int, float, bool, string, " "or an array of those"); } const AVSValue& prop_value = args[4]; if (prop_value.Defined() && !prop_value.IsInt() && !prop_value.IsFloat() && !prop_value.IsString() && !prop_value.IsBool() && !prop_value.IsFunction()) env->ThrowError("SetFilterProp: property value (arg 5) must be int, float, bool, string, or function"); // Frame properties have no bool type: convert bool value to int 0/1 AVSValue stored_value = prop_value; if (stored_value.IsBool()) stored_value = AVSValue(stored_value.AsBool() ? 1 : 0); const int mode = args[5].AsInt(AVSPropAppendMode::PROPAPPENDMODE_REPLACE); envi->SetFilterPropConditional(args[0].AsString(), args[1].AsString(), param_match, args[3].AsString(), stored_value, mode); } else { // 3-arg simple form matched by "ss.[mode]i": // SetFilterProp(filter, prop_key, value [, mode]) const int mode = args[3].AsInt(AVSPropAppendMode::PROPAPPENDMODE_REPLACE); AVSValue val = args[2]; if (val.Defined() && !val.IsInt() && !val.IsFloat() && !val.IsString() && !val.IsBool() && !val.IsFunction()) env->ThrowError("SetFilterProp: property value must be int, float, bool, string, function, or undefined()"); // Frame properties have no bool type: convert bool to int 0/1 if (val.IsBool()) val = AVSValue(val.AsBool() ? 1 : 0); envi->SetFilterProp(args[0].AsString(), args[1].AsString(), val, mode); } return AVSValue(); } AVSValue GetFilterProps(AVSValue args, void*, IScriptEnvironment* env) { InternalEnvironment* envi = static_cast(env); return AVSValue(envi->GetFilterProps()); } AVSValue SetFilterPropPassthrough(AVSValue args, void*, IScriptEnvironment* env) { InternalEnvironment* envi = static_cast(env); envi->SetFilterPropPassthrough(args[0].AsString()); return AVSValue(); } // Neo style AVSValue SetMemoryMax(AVSValue args, void*, IScriptEnvironment* env) { int memMax = args[0].AsInt(0); int deviceType = args[1].AsInt(0); int deviceIndex = args[2].AsInt(0); if (deviceType == 0 || deviceType == DEV_TYPE_CPU) { return env->SetMemoryMax(memMax); } InternalEnvironment *envI = static_cast(env); return envI->SetMemoryMax((AvsDeviceType)deviceType, deviceIndex, memMax); } AVSValue SetMaxCPU(AVSValue args, void*, IScriptEnvironment* env) { InternalEnvironment* envI = static_cast(env); envI->SetMaxCPU(args[0].AsString()); return AVSValue(); } AVSValue IsY(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).IsY(); } AVSValue Is420(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).Is420(); } AVSValue Is422(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).Is422(); } AVSValue Is444(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).Is444(); } AVSValue IsRGB48(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).IsRGB48(); } AVSValue IsRGB64(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).IsRGB64(); } AVSValue ComponentSize(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).ComponentSize(); } AVSValue BitsPerComponent(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).BitsPerComponent(); } AVSValue IsYUVA(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).IsYUVA(); } AVSValue IsPlanarRGB(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).IsPlanarRGB(); } AVSValue IsPlanarRGBA(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).IsPlanarRGBA(); } AVSValue NumComponents(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).NumComponents(); } AVSValue HasAlpha(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).IsPlanarRGBA() || VI(args[0]).IsYUVA() || VI(args[0]).IsRGB32() || VI(args[0]).IsRGB64(); } AVSValue IsPackedRGB(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).IsRGB24() || VI(args[0]).IsRGB32() || VI(args[0]).IsRGB48() || VI(args[0]).IsRGB64(); } AVSValue IsVideoFloat(AVSValue args, void*, IScriptEnvironment*) { return VI(args[0]).BitsPerComponent() == 32; } // helper for GetProcessInfo static int ProcessType() { #define PROCESS_UNKNOWN -1 #define PROCESS_32_ON_32 0 #define PROCESS_32_ON_64 1 #define PROCESS_64_ON_64 2 if constexpr(sizeof(void*) == 8) return PROCESS_64_ON_64; #ifdef AVS_WINDOWS else { // IsWow64Process is not available on all supported versions of Windows. // Use GetModuleHandle to get a handle to the DLL that contains the function // and GetProcAddress to get a pointer to the function if available. BOOL bWoW64Process = FALSE; typedef bool(WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); LPFN_ISWOW64PROCESS fnIsWow64Process; HMODULE hKernel32 = GetModuleHandle("kernel32.dll"); if (hKernel32 == NULL) return PROCESS_UNKNOWN; fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(hKernel32, "IsWow64Process"); if (fnIsWow64Process != NULL) fnIsWow64Process(GetCurrentProcess(), &bWoW64Process); else return PROCESS_UNKNOWN; if (bWoW64Process) return PROCESS_32_ON_64; //WoW64 return PROCESS_32_ON_32; } #endif } AVSValue GetProcessInfo(AVSValue args, void*, IScriptEnvironment* env) { int infoType = args[0].AsInt(0); if (infoType < 0 || infoType > 1) env->ThrowError("GetProcessInfo: type must be 0 or 1"); if (infoType == 0) { return sizeof(void *) == 8 ? 64 : 32; } // infoType == 1 return ProcessType(); } #ifdef AVS_WINDOWS AVSValue StrToUtf8(AVSValue args, void*, IScriptEnvironment* env) { const char *source = args[0].AsString(); // in two steps: Ansi -> WideChar -> Utf8 auto wsource = AnsiToWideCharACP(source); // wide -> utf8 auto source_utf8 = WideCharToUtf8(wsource.get()); AVSValue ret = env->SaveString(source_utf8.get()); return ret; } AVSValue StrFromUtf8(AVSValue args, void*, IScriptEnvironment* env) { const char *source_utf8 = args[0].AsString(); // in two steps: Utf8 -> WideChar -> Ansi auto wsource = Utf8ToWideChar(source_utf8); // wide -> ansi auto source_ansi = WideCharToAnsiACP(wsource.get()); AVSValue ret = env->SaveString(source_ansi.get()); return ret; } #endif AVSValue IsFloatUvZeroBased(AVSValue args, void*, IScriptEnvironment*) { #ifdef FLOAT_CHROMA_IS_HALF_CENTERED return false; #else return true; #endif } AVSValue BuildPixelType(AVSValue args, void*, IScriptEnvironment* env) { // { "BuildPixelType", BUILTIN_FUNC_PREFIX, "[family]s[bits]i[chroma]i[compat]b[oldnames]b[sample_clip]c", BuildPixelType }, // 180517- // family: YUV, YUVA, RGB, RGBA, Y // bits: 8, 10, 12, 14, 16, 32 // chroma: for YUV(A) 420,422,444,411. Ignored for RGB(A) and Y // compat (default false): returns packed rgb formats for 8/16 bits (RGB default: planar RGB) // oldnames (default false): returns YV12/YV16/YV24 instead of YUV420P8/YUV422P8/YUV444P8 // sample_clip: when supported, its format is overridden by specified parameters (e.g. only change bits=10) const bool hasTemplate = args[5].Defined(); if (!args[0].Defined() && !hasTemplate) env->ThrowError("BuildPixelType error: no color space 'family' or template 'sample_clip' specified"); if (!args[1].Defined() && !hasTemplate) env->ThrowError("BuildPixelType error: no 'bits' or template 'sample_clip' specified"); std::string family; if (!args[0].Defined() && hasTemplate) { // no family parameter: use template VideoInfo const &vi = args[5].AsClip()->GetVideoInfo(); if (vi.IsY()) family = "Y"; else if (vi.IsPlanar()) { if (vi.IsYUV()) family = "YUV"; else if (vi.IsYUVA()) family = "YUVA"; else if (vi.IsPlanarRGB()) family = "RGB"; else if (vi.IsPlanarRGBA()) family = "RGBA"; else env->ThrowError("BuildPixelType error: invalid sample_clip format"); } else if (vi.IsRGB24() || vi.IsRGB48()) family = "RGB"; else if (vi.IsRGB32() || vi.IsRGB64()) family = "RGBA"; else env->ThrowError("BuildPixelType error: invalid sample_clip format"); } else { family = args[0].AsString(); for (auto & c : family) c = toupper(c); // uppercase input string } const bool isYUV = family == "YUV"; const bool isYUVA = family == "YUVA"; const bool isRGB = family == "RGB"; const bool isRGBA = family == "RGBA"; const bool isY = family == "Y"; if(!isYUV && !isYUVA && !isRGB && !isRGBA && !isY) env->ThrowError("BuildPixelType error: wrong 'family'.", family.c_str()); int bits; if (!args[1].Defined() && hasTemplate) { // no bits parameter: get it from template sample_clip bits = args[5].AsClip()->GetVideoInfo().BitsPerComponent(); } else { bits = args[1].AsInt(); } if (bits != 8 && bits != 10 && bits != 12 && bits != 14 && bits != 16 && bits != 32) env->ThrowError("BuildPixelType error: 'bits'=%d is not valid.", bits); int chroma; if (isYUV || isYUVA) { if (!args[2].Defined() && hasTemplate) { // no chroma parameter: subsampling from template clip VideoInfo const &vi = args[5].AsClip()->GetVideoInfo(); const int hs = vi.GetPlaneWidthSubsampling(PLANAR_U); const int vs = vi.GetPlaneHeightSubsampling(PLANAR_U); if (hs == 0 && vs == 0) chroma = 444; else if (hs == 1 && vs == 0) chroma = 422; else if (hs == 1 && vs == 1) chroma = 420; else if (hs == 2 && vs == 0) chroma = 411; else env->ThrowError("BuildPixelType error: sample_clip has invalid chroma subsampling."); } else { chroma = args[2].AsInt(444); } } else { chroma = 444; // n/a } if(chroma != 444 && chroma != 422 && chroma != 420 && chroma != 411) env->ThrowError("BuildPixelType error: 'chroma' must be 444, 422, 420 or 411."); // packed RGB compatibility formats only for RGB(A) const bool compat = isRGB || isRGBA ? args[3].AsBool(false) : false; // e.g. return YV12 instead of YUV420P8 const bool oldNames = args[4].AsBool(false); if(compat && bits != 8 && bits != 16) env->ThrowError("BuildPixelType error: 'compat'=true requires bits=8 or 16 for RGB(A)."); if(chroma == 411 && bits != 8) env->ThrowError("BuildPixelType error: 411 is supported only for 8 bits."); if (compat) { if (isRGB && bits == 8) return "RGB24"; if (isRGB && bits == 16) return "RGB48"; if (isRGBA && bits == 8) return "RGB32"; return "RGB64"; // RGBA, bits==16 } std::string format; if (isYUV || isYUVA || isY) format = family; else if (isRGB) format = "RGBP"; else if (isRGBA) format = "RGBAP"; if (isYUV || isYUVA) { if (chroma == 444) format += "444"; else if(chroma == 422) format += "422"; else if (chroma == 420) format += "420"; else if (chroma == 411) format += "411"; format = format + "P"; } if (bits == 32) format += (isY ? "32" : "S"); // no "YS", only "Y32" else format = format + std::to_string(bits); if (oldNames) { if (format == "YUV420" || format == "YUV420P8") format = "YV12"; else if (format == "YUV422" || format == "YUV422P8") format = "YV16"; else if (format == "YUV444" || format == "YUV444P8") format = "YV24"; } // 411 has no alternative naming if (format == "YUV411") format = "YV411"; return env->SaveString(format.c_str()); } AVSValue VarExist(AVSValue args, void*, IScriptEnvironment* env) { const char *name = args[0].AsString(); int len = (int)strlen(name); bool validName = true; // check for a valid identifier name if (*name != '_' && !isalpha(*name)) validName = false; else { for (int i = 1; i < len; i++) { const char ch = name[i]; if (!(ch == '_' || isalnum(ch))) { validName = false; break; } } } if (!validName) env->ThrowError("VarExist: invalid variable name"); AVSValue result; return (env->GetVarTry(name, &result)); // true if exists } AVSValue ArrayCreate(AVSValue args, void*, IScriptEnvironment* env) { return args[0]; } AVSValue IsArray(AVSValue args, void*, IScriptEnvironment* env) { return args[0].IsArray(); } AVSValue ArrayGet(AVSValue args, void*, IScriptEnvironment* env) { // signature .i+ // parameters: [0] array to index; [1] one or more integer indexes or a string if (!args[0].IsArray()) env->ThrowError("ArrayGet: array type required."); const int size = args[0].ArraySize(); if (args[1].IsString()) { // associative search // { {"a", element1}, { "b", element2 }, etc..} const char* tag = args[1].AsString(); for (int i = 0; i < size; i++) { AVSValue currentTagValue = args[0][i]; // two elements e.g. { "b", element2 } if (!currentTagValue.IsArray()) env->ThrowError("ArrayGet: Array must contain array[string, any] elements for dictionary lookup"); if (currentTagValue.ArraySize() < 2) env->ThrowError("ArrayGet: Internal array must have at least two elements (tag, value)"); AVSValue currentTag = currentTagValue[0]; if (currentTag.IsString() && !lstrcmpi(currentTag.AsString(), tag)) { return currentTagValue[1]; } } return AVSValue(); // undefined } else if (args[1].IsArray()) { AVSValue indexes = args[1]; AVSValue currentValue = args[0]; int index_count = indexes.ArraySize(); // array of parameters. a[1,2] -> [1,2] if (index_count == 0) env->ThrowError("ArrayGet: no index specified"); for (int i = 0; i < index_count; i++) { if (!currentValue.IsArray()) env->ThrowError("ArrayGet: not an array. Index=%d", i); int currentIndex = indexes[i].AsInt(); if (currentIndex < 0 || currentIndex >= currentValue.ArraySize()) env->ThrowError("ArrayGet: Array index out of range. Problematic index count: %d", i + 1); currentValue = currentValue[currentIndex]; } return currentValue; } env->ThrowError("ArrayGet: Invalid array index, must be integer or string, or comma separated integers"); return AVSValue(); // undefined } AVSValue ArraySize(AVSValue args, void*, IScriptEnvironment* env) { // func signature: "." if (!args[0].IsArray()) env->ThrowError("ArraySize: parameter must be an array"); return args[0].ArraySize(); } AVSValue ArrayIns(AVSValue args, void* user_data, IScriptEnvironment* env) { int mode = (int)(intptr_t)user_data; enum ArrayMode { INSERT = 0, APPEND = 1, REPLACE = 2, DEL = 3 }; // signature .. and ..i // parameters: // [0] array to modify; // [1] element to insert (ArrayAdd, ArrayIns and ArraySet) [2] inserting index(es) (ArrayIns, ArraySet) // or [1] delete index(es) ArrayDel const char* funcname = mode == DEL ? "ArrayDel" : mode == REPLACE ? "ArraySet" : mode == APPEND ? "ArrayAdd" : "ArrayIns"; if (!args[0].IsArray()) env->ThrowError("%s error: array type required.", funcname); const auto orig_size = args[0].ArraySize(); const int index_param_pos = mode == DEL ? 1 : 2; AVSValue indexes = args[index_param_pos]; int index_count = indexes.ArraySize(); // array of parameters. a[1,2] -> [1,2] if (mode == INSERT || mode == REPLACE || mode == DEL) { if (index_count == 0) env->ThrowError("%s: no index specified", funcname); } const int new_size = mode == DEL && index_count == 1 ? orig_size - 1 : mode == APPEND && index_count == 0 ? orig_size + 1 : mode == INSERT && index_count == 1 ? orig_size + 1 : orig_size; // replace and recurside other cases std::vector new_val(new_size); int action_pos; if (mode == APPEND) action_pos = orig_size; // at the end else action_pos = indexes[0].AsInt(); // copy before insertion/replace point for (int i = 0; i < action_pos; i++) new_val[i] = args[0][i]; // avs+: automatic deep copy if ( ((mode == REPLACE || mode == INSERT || mode == DEL) && index_count > 1) || ((mode == APPEND) && index_count >= 1)) { int current_index = indexes[0].AsInt(); // for multi-level array recursion is needed because there is no exact reference to an inner element if (mode == DEL) { AVSValue params[2] = { args[0][current_index], index_count <= 1 ? AVSValue(nullptr, 0) : AVSValue(&indexes[1], index_count - 1) }; new_val[current_index] = env->Invoke(funcname, AVSValue(params, 2)); // recursively } else { AVSValue params[3] = { args[0][current_index], args[1], index_count <= 1 ? AVSValue(nullptr, 0) : AVSValue(&indexes[1], index_count - 1) }; new_val[current_index] = env->Invoke(funcname, AVSValue(params, 3)); // recursively } mode = REPLACE; } else if (mode != DEL) { new_val[action_pos] = args[1]; } // copy from after insertion/replace/delete point if (mode == DEL) { for (int i = action_pos + 1; i < orig_size; i++) new_val[i - 1] = args[0][i]; // avs+: automatic deep copy } else if (mode == REPLACE) { for (int i = action_pos+1; i < orig_size; i++) new_val[i] = args[0][i]; // avs+: automatic deep copy } else { for (int i = action_pos; i < orig_size; i++) new_val[i + 1] = args[0][i]; // avs+: automatic deep copy } if(new_size == 0) return AVSValue(nullptr, 0); // zero array return AVSValue(new_val.data(), new_size); } // Custom comparator functions for sorting bool customCompareBool(const std::pair& a, const std::pair& b) { return (a.first)->AsBool() < (b.first)->AsBool(); } // v11: 64 bit content as well bool customCompareInt(const std::pair& a, const std::pair& b) { return (a.first)->AsLong() < (b.first)->AsLong(); // v11: AsLong instead of AsInt } // v11: 64 bit content as well bool customCompareFloat(const std::pair& a, const std::pair& b) { return (a.first)->AsFloat() < (b.first)->AsFloat(); // v11: AsFloat instead of AsFloatf } bool customCompareString(const std::pair& a, const std::pair& b) { return std::strcmp((a.first)->AsString(), (b.first)->AsString()) < 0; } AVSValue ArraySort(AVSValue args, void* user_data, IScriptEnvironment* env) { // [0] array to sort; if (!args[0].IsArray()) env->ThrowError("ArraySort error: array type required."); const auto size = args[0].ArraySize(); if (size == 0) return AVSValue(nullptr, 0); // zero array std::vector> indexedArr(size); // Create a pair of (element reference, index) with type checks // Note: integers and float can be mixed, sort by the broadest type AvsValueType finalType = (args[0][0]).GetType(); for (int i = 0; i < size; ++i) { indexedArr[i] = { &args[0][i], i }; AvsValueType currentType = indexedArr[i].first->GetType(); if (finalType == AvsValueType::VALUE_TYPE_INT && currentType == AvsValueType::VALUE_TYPE_LONG) { // promote int to long; note: since v11: long (int64) exists finalType = currentType; } else if (finalType == AvsValueType::VALUE_TYPE_FLOAT && currentType == AvsValueType::VALUE_TYPE_DOUBLE) { // promote float to double; note: since v11: double exists finalType = currentType; } else if ((finalType == AvsValueType::VALUE_TYPE_INT || finalType == AvsValueType::VALUE_TYPE_LONG) && (currentType == AvsValueType::VALUE_TYPE_FLOAT || currentType == AvsValueType::VALUE_TYPE_DOUBLE)) { // promote int-like to float-like; note: since v11: int64/double exists finalType = currentType; } // cannot mix bools, ints and strings if (finalType == AvsValueType::VALUE_TYPE_STRING) { if (currentType != AvsValueType::VALUE_TYPE_STRING) env->ThrowError("ArraySort: array contains different basic types, string expected."); } else if (finalType == AvsValueType::VALUE_TYPE_BOOL) { if (currentType != AvsValueType::VALUE_TYPE_BOOL) env->ThrowError("ArraySort: array contains different basic types, bool expected."); } else { // int-like or float-like if (currentType != AvsValueType::VALUE_TYPE_INT && currentType != AvsValueType::VALUE_TYPE_LONG && currentType != AvsValueType::VALUE_TYPE_FLOAT && currentType != AvsValueType::VALUE_TYPE_DOUBLE) env->ThrowError("ArraySort: array contains different basic types, number expected."); } } switch(finalType){ case AvsValueType::VALUE_TYPE_BOOL: std::sort(indexedArr.begin(), indexedArr.end(), customCompareBool); break; case AvsValueType::VALUE_TYPE_INT: case AvsValueType::VALUE_TYPE_LONG: std::sort(indexedArr.begin(), indexedArr.end(), customCompareInt); break; case AvsValueType::VALUE_TYPE_FLOAT: case AvsValueType::VALUE_TYPE_DOUBLE: std::sort(indexedArr.begin(), indexedArr.end(), customCompareFloat); break; case AvsValueType::VALUE_TYPE_STRING: std::sort(indexedArr.begin(), indexedArr.end(), customCompareString); break; default: env->ThrowError("ArraySort: unsupported data type"); } // copy the results once std::vector new_val(size); for (int i = 0; i < size; ++i) { new_val[i] = *indexedArr[i].first; } return AVSValue(new_val.data(), size); } ================================================ FILE: avs_core/core/parser/script.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __Script_H__ #define __Script_H__ #include #ifdef AVS_WINDOWS #include #include #else #include #endif #include "../internal.h" #include "expression.h" #include "scriptparser.h" /******************************************************************** ********************************************************************/ class ScriptFunction /** * Executes a script **/ { public: ScriptFunction(const PExpression& _body, const bool* _param_floats, const char** _param_names, int param_count); virtual ~ScriptFunction() { delete[] param_floats; delete[] param_names; } static AVSValue Execute(AVSValue args, void* user_data, IScriptEnvironment* env); static void Delete(void* self, IScriptEnvironment*); private: const PExpression body; bool* param_floats; const char** param_names; }; /**** Helper functions ****/ AVSValue Assert(AVSValue args, void*, IScriptEnvironment* env); AVSValue AssertEval(AVSValue args, void*, IScriptEnvironment* env); AVSValue Eval(AVSValue args, void*, IScriptEnvironment* env); AVSValue EvalOop(AVSValue args, void*, IScriptEnvironment* env); AVSValue Apply(AVSValue args, void*, IScriptEnvironment* env) ; AVSValue Import(AVSValue args, void*, IScriptEnvironment* env); AVSValue SetWorkingDir(AVSValue args, void*, IScriptEnvironment* env); /***** Entry/Factory Methods ******/ AVSValue Muldiv(AVSValue args, void*, IScriptEnvironment* env); AVSValue Floor(AVSValue args, void*, IScriptEnvironment* env); AVSValue Ceil(AVSValue args, void*, IScriptEnvironment* env); AVSValue Round(AVSValue args, void*, IScriptEnvironment* env); AVSValue Acos(AVSValue args, void* user_data, IScriptEnvironment* env); AVSValue Asin(AVSValue args, void* user_data, IScriptEnvironment* env); AVSValue Atan(AVSValue args, void* user_data, IScriptEnvironment* env); AVSValue Atan2(AVSValue args, void* user_data, IScriptEnvironment* env); AVSValue Cos(AVSValue args, void* user_data, IScriptEnvironment* env); AVSValue Cosh(AVSValue args, void* user_data, IScriptEnvironment* env); AVSValue Exp(AVSValue args, void* user_data, IScriptEnvironment* env); AVSValue Fmod(AVSValue args, void* user_data, IScriptEnvironment* env); AVSValue Log(AVSValue args, void* user_data, IScriptEnvironment* env); AVSValue Log10(AVSValue args, void* user_data, IScriptEnvironment* env); AVSValue Pow(AVSValue args, void* user_data, IScriptEnvironment* env); AVSValue Sin(AVSValue args, void* user_data, IScriptEnvironment* env); AVSValue Sinh(AVSValue args, void* user_data, IScriptEnvironment* env); AVSValue Tan(AVSValue args, void* user_data, IScriptEnvironment* env); AVSValue Tanh(AVSValue args, void* user_data, IScriptEnvironment* env); AVSValue Sqrt(AVSValue args, void* user_data, IScriptEnvironment* env); AVSValue Abs(AVSValue args, void* user_data, IScriptEnvironment* env); AVSValue FAbs(AVSValue args, void* user_data, IScriptEnvironment* env); AVSValue Pi(AVSValue args, void* user_data, IScriptEnvironment* env); #ifdef OPT_ScriptFunctionTau AVSValue Tau(AVSValue args, void* user_data, IScriptEnvironment* env); #endif AVSValue Sign(AVSValue args, void*, IScriptEnvironment* env); AVSValue PixelType (AVSValue args, void*, IScriptEnvironment* env); AVSValue Width(AVSValue args, void*, IScriptEnvironment* env); AVSValue Height(AVSValue args, void*, IScriptEnvironment* env); AVSValue FrameCount(AVSValue args, void*, IScriptEnvironment* env); AVSValue FrameRate(AVSValue args, void*, IScriptEnvironment* env); AVSValue FrameRateNumerator(AVSValue args, void*, IScriptEnvironment* env); AVSValue FrameRateDenominator(AVSValue args, void*, IScriptEnvironment* env); AVSValue AudioRate(AVSValue args, void*, IScriptEnvironment* env); AVSValue AudioLength(AVSValue args, void*, IScriptEnvironment* env); AVSValue AudioLengthLo(AVSValue args, void*, IScriptEnvironment* env); AVSValue AudioLengthHi(AVSValue args, void*, IScriptEnvironment* env); AVSValue AudioLengthS(AVSValue args, void*, IScriptEnvironment* env); AVSValue AudioLengthF(AVSValue args, void*, IScriptEnvironment* env); AVSValue AudioDuration(AVSValue args, void*, IScriptEnvironment* env); AVSValue AudioChannels(AVSValue args, void*, IScriptEnvironment* env); AVSValue AudioBits(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsAudioFloat(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsAudioInt(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsChannelMaskKnown(AVSValue args, void*, IScriptEnvironment* env); AVSValue GetChannelMask(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsRGB(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsY8(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsYV12(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsYV16(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsYV24(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsYV411(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsYUY2(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsYUV(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsRGB24(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsRGB32(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsPlanar(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsInterleaved(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsFieldBased(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsFrameBased(AVSValue args, void*, IScriptEnvironment* env); AVSValue GetParity(AVSValue args, void*, IScriptEnvironment* env); AVSValue String(AVSValue args, void*, IScriptEnvironment* env); AVSValue Hex(AVSValue args, void*, IScriptEnvironment* env); AVSValue Func(AVSValue args, void*, IScriptEnvironment* env); AVSValue FormatString(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsBool(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsInt(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsLongStrict(AVSValue args, void*, IScriptEnvironment* env); // v11 AVSValue IsFloat(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsFloatfStrict(AVSValue args, void*, IScriptEnvironment* env); // v11 AVSValue IsString(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsClip(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsFunction(AVSValue args, void*, IScriptEnvironment* env); AVSValue Defined(AVSValue args, void*, IScriptEnvironment* env); AVSValue TypeName(AVSValue args, void*, IScriptEnvironment* env); AVSValue Default(AVSValue args, void*, IScriptEnvironment* env); AVSValue VersionNumber(AVSValue args, void*, IScriptEnvironment* env); AVSValue VersionString(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsVersionOrGreater(AVSValue args, void*, IScriptEnvironment* env); AVSValue Int(AVSValue args, void*, IScriptEnvironment* env); AVSValue Frac(AVSValue args, void*, IScriptEnvironment* env); AVSValue Float(AVSValue args, void*,IScriptEnvironment* env); AVSValue IntI(AVSValue args, void*, IScriptEnvironment* env); // v11 AVSValue Long(AVSValue args, void*, IScriptEnvironment* env); // v11 AVSValue Double(AVSValue args, void*, IScriptEnvironment* env); // v11 AVSValue Floatf(AVSValue args, void*, IScriptEnvironment* env); // v11 AVSValue Value(AVSValue args, void*, IScriptEnvironment* env); AVSValue HexValue(AVSValue args, void*, IScriptEnvironment* env); AVSValue HexValue64(AVSValue args, void*, IScriptEnvironment* env); // v11 AVSValue BitAnd(AVSValue args, void*, IScriptEnvironment* env); AVSValue BitNot(AVSValue args, void*, IScriptEnvironment* env); AVSValue BitOr(AVSValue args, void*, IScriptEnvironment* env); AVSValue BitXor(AVSValue args, void*, IScriptEnvironment* env); AVSValue BitAnd64(AVSValue args, void*, IScriptEnvironment* env); // v11 AVSValue BitNot64(AVSValue args, void*, IScriptEnvironment* env); // v11 AVSValue BitOr64(AVSValue args, void*, IScriptEnvironment* env); // v11 AVSValue BitXor64(AVSValue args, void*, IScriptEnvironment* env); // v11 AVSValue BitLShift(AVSValue args, void*, IScriptEnvironment* env); AVSValue BitRShiftL(AVSValue args, void*, IScriptEnvironment* env); AVSValue BitRShiftA(AVSValue args, void*, IScriptEnvironment* env); AVSValue BitLShift64(AVSValue args, void*, IScriptEnvironment* env); // v11 AVSValue BitRShift64L(AVSValue args, void*, IScriptEnvironment* env); // v11 AVSValue BitRShift64A(AVSValue args, void*, IScriptEnvironment* env); // v11 AVSValue BitRotateL(AVSValue args, void*, IScriptEnvironment* env); AVSValue BitRotateR(AVSValue args, void*, IScriptEnvironment* env); AVSValue BitRotate64L(AVSValue args, void*, IScriptEnvironment* env); // v11 AVSValue BitRotate64R(AVSValue args, void*, IScriptEnvironment* env); // v11 AVSValue BitChg(AVSValue args, void*, IScriptEnvironment* env); AVSValue BitClr(AVSValue args, void*, IScriptEnvironment* env); AVSValue BitSet(AVSValue args, void*, IScriptEnvironment* env); AVSValue BitTst(AVSValue args, void*, IScriptEnvironment* env); AVSValue BitChg64(AVSValue args, void*, IScriptEnvironment* env); // v11 AVSValue BitClr64(AVSValue args, void*, IScriptEnvironment* env); // v11 AVSValue BitSet64(AVSValue args, void*, IScriptEnvironment* env); // v11 AVSValue BitTst64(AVSValue args, void*, IScriptEnvironment* env); // v11 AVSValue BitSetCount(AVSValue args, void*, IScriptEnvironment* env); AVSValue BitSetCount64(AVSValue args, void*, IScriptEnvironment* env); // v11 AVSValue UCase(AVSValue args, void*, IScriptEnvironment* env); AVSValue LCase(AVSValue args, void*, IScriptEnvironment* env); AVSValue StrLen(AVSValue args, void*, IScriptEnvironment* env); AVSValue RevStr(AVSValue args, void*, IScriptEnvironment* env); AVSValue LeftStr(AVSValue args, void*, IScriptEnvironment* env); AVSValue MidStr(AVSValue args, void*, IScriptEnvironment* env); AVSValue RightStr(AVSValue args, void*, IScriptEnvironment* env); AVSValue FindStr(AVSValue args, void*, IScriptEnvironment* env); AVSValue FillStr(AVSValue args, void*, IScriptEnvironment* env); AVSValue StrCmp(AVSValue args, void*, IScriptEnvironment* env); AVSValue StrCmpi(AVSValue args, void*, IScriptEnvironment* env); AVSValue TrimAll(AVSValue args, void*, IScriptEnvironment* env); AVSValue TrimLeft(AVSValue args, void*, IScriptEnvironment* env); AVSValue TrimRight(AVSValue args, void*, IScriptEnvironment* env); AVSValue Rand(AVSValue args, void* user_data, IScriptEnvironment* env); AVSValue Select(AVSValue args, void*, IScriptEnvironment* env); AVSValue NOP(AVSValue args, void*, IScriptEnvironment* env); AVSValue Undefined(AVSValue args, void*, IScriptEnvironment* env); AVSValue Exist(AVSValue args, void*, IScriptEnvironment* env); // WE -> AVSValue AVSChr(AVSValue args, void*, IScriptEnvironment* env); AVSValue AVSOrd(AVSValue args, void*, IScriptEnvironment* env); AVSValue AVSTime(AVSValue args, void*, IScriptEnvironment* env); AVSValue Spline(AVSValue args, void*, IScriptEnvironment* env); // WE <- AVSValue HasVideo(AVSValue args, void*, IScriptEnvironment* env); AVSValue HasAudio(AVSValue args, void*, IScriptEnvironment* env); AVSValue AvsMin(AVSValue args, void*, IScriptEnvironment* env); AVSValue AvsMax(AVSValue args, void*, IScriptEnvironment* env); AVSValue ScriptName(AVSValue args, void*, IScriptEnvironment* env); AVSValue ScriptFile(AVSValue args, void*, IScriptEnvironment* env); AVSValue ScriptDir (AVSValue args, void*, IScriptEnvironment* env); AVSValue ScriptNameUtf8(AVSValue args, void*, IScriptEnvironment* env); AVSValue ScriptFileUtf8(AVSValue args, void*, IScriptEnvironment* env); AVSValue ScriptDirUtf8(AVSValue args, void*, IScriptEnvironment* env); AVSValue AddAutoloadDir (AVSValue args, void*, IScriptEnvironment* env); AVSValue ClearAutoloadDirs (AVSValue args, void*, IScriptEnvironment* env); AVSValue ListAutoloadDirs(AVSValue args, void*, IScriptEnvironment* env); AVSValue AutoloadPlugins (AVSValue args, void*, IScriptEnvironment* env); AVSValue FunctionExists (AVSValue args, void*, IScriptEnvironment* env); AVSValue InternalFunctionExists (AVSValue args, void*, IScriptEnvironment* env); AVSValue SetFilterMTMode (AVSValue args, void*, IScriptEnvironment* env); AVSValue SetLogParams(AVSValue args, void*, IScriptEnvironment* env); AVSValue LogMsg(AVSValue args, void*, IScriptEnvironment* env); AVSValue SetCacheMode(AVSValue args, void*, IScriptEnvironment* env); AVSValue SetDeviceOpt(AVSValue args, void*, IScriptEnvironment* env); AVSValue SetMemoryMax(AVSValue args, void*, IScriptEnvironment* env); AVSValue SetMaxCPU(AVSValue args, void*, IScriptEnvironment* env); // 20200331 AVSValue SetFilterProp(AVSValue args, void*, IScriptEnvironment* env); AVSValue GetFilterProps(AVSValue args, void*, IScriptEnvironment* env); AVSValue SetFilterPropPassthrough(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsY(AVSValue args, void*, IScriptEnvironment* env); AVSValue Is420(AVSValue args, void*, IScriptEnvironment* env); AVSValue Is422(AVSValue args, void*, IScriptEnvironment* env); AVSValue Is444(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsRGB48(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsRGB64(AVSValue args, void*, IScriptEnvironment* env); AVSValue ComponentSize(AVSValue args, void*, IScriptEnvironment* env); AVSValue BitsPerComponent(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsYUVA(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsPlanarRGB(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsPlanarRGBA(AVSValue args, void*, IScriptEnvironment* env); AVSValue ColorSpaceNameToPixelType(AVSValue args, void*, IScriptEnvironment* env); AVSValue NumComponents(AVSValue args, void*, IScriptEnvironment* env); AVSValue HasAlpha(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsPackedRGB(AVSValue args, void*, IScriptEnvironment* env); AVSValue ReplaceStr(AVSValue args, void*, IScriptEnvironment* env); // avs+ 161230 AVSValue IsVideoFloat(AVSValue args, void*, IScriptEnvironment* env); // avs+ 170309 AVSValue GetProcessInfo(AVSValue args, void*, IScriptEnvironment* env); // avs+ 170526 AVSValue StrToUtf8(AVSValue args, void*, IScriptEnvironment* env); // avs+ 170601 AVSValue StrFromUtf8(AVSValue args, void*, IScriptEnvironment* env); // avs+ 170601 AVSValue IsFloatUvZeroBased(AVSValue args, void*, IScriptEnvironment* env); // avs+ 180516 AVSValue BuildPixelType(AVSValue args, void*, IScriptEnvironment* env); // avs+ 180517 AVSValue VarExist(AVSValue args, void*, IScriptEnvironment* env); // avs+ 180606 AVSValue ArrayCreate(AVSValue args, void*, IScriptEnvironment* env); AVSValue IsArray(AVSValue args, void*, IScriptEnvironment* env); AVSValue ArrayGet(AVSValue args, void*, IScriptEnvironment* env); AVSValue ArraySize(AVSValue args, void*, IScriptEnvironment* env); AVSValue ArrayIns(AVSValue args, void*, IScriptEnvironment* env); AVSValue ArrayDel(AVSValue args, void*, IScriptEnvironment* env); AVSValue ArraySort(AVSValue args, void*, IScriptEnvironment* env); #endif // __Script_H__ ================================================ FILE: avs_core/core/parser/scriptparser.cpp ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include "scriptparser.h" #include "../InternalEnvironment.h" /******************************** ******* Script Parser ****** *******************************/ ScriptParser::ScriptParser(IScriptEnvironment* _env, const char* _code, const char* _filename) : env(static_cast(_env)), tokenizer(_code, _env), code(_code), filename(_filename), loopDepth(0) {} PExpression ScriptParser::Parse(void) { try { return new ExpRootBlock(ParseBlock(false, NULL)); } catch (const AvisynthError &ae) { env->ThrowError("%s\n(%s, line %d, column %d)", ae.msg, filename, tokenizer.GetLine(), tokenizer.GetColumn(code)); } #ifndef _DEBUG catch (...) { env->ThrowError("Parse: Unrecognized exception!"); } #endif return 0; // To make VC++ happy. Why isn't the __declspec(noreturn) on ThrowError good enough? } void ScriptParser::Expect(int op, const char* msg=0) { if (tokenizer.IsOperator(op)) tokenizer.NextToken(); else { if (msg) env->ThrowError(msg); else { if (op < 256) env->ThrowError("Script error: expected `%c'", op); else env->ThrowError("Script error: expected `%c%c'", (op>>8), (op&255)); } } } PExpression ScriptParser::ParseFunctionDefinition(void) { /* bool global_spcified = false; if (tokenizer.IsIdentifier("global")) { tokenizer.NextToken(); } */ const char* name = nullptr; if (tokenizer.IsIdentifier()) { name = tokenizer.AsIdentifier(); tokenizer.NextToken(); } const char* var_names[max_args]; int var_count = 0; char param_types[4096]; int param_chars=0; bool param_floats[max_args]; const char* param_names[max_args]; int param_count=0; // variable capture if (tokenizer.IsOperator('[')) { if (name != nullptr) { env->ThrowError("Script error: variable capture is not supported on legacy function definition."); } tokenizer.NextToken(); bool need_comma = false; for (;;) { if (tokenizer.IsOperator(']')) { tokenizer.NextToken(); break; } if (need_comma) { Expect(',', "Script error: expected a , or ]"); } if (tokenizer.IsIdentifier()) { var_names[var_count++] = tokenizer.AsIdentifier(); } else { env->ThrowError("Script error: expected a parameter name"); } tokenizer.NextToken(); need_comma = true; } } if (!tokenizer.IsOperator('{')) { Expect('(', "Script error: expected ( or { after function name"); bool need_comma = false; bool named_arg_found = false; for (;;) { if (tokenizer.IsOperator(')')) { tokenizer.NextToken(); break; } if (need_comma) { Expect(',', "Script error: expected a , or )"); } if (param_count == max_args) { env->ThrowError("Script error: parameter list too long"); } param_floats[param_count] = false; char type = '.'; char array_kind = ' '; // can be * (zero_or_more) or + (one_or_more) Tokenizer lookahead(&tokenizer); if (lookahead.IsIdentifier() || lookahead.IsString()) { // we have a variable type preceding its name if (tokenizer.IsIdentifier("val")) type = '.'; else if (tokenizer.IsIdentifier("bool")) type = 'b'; else if (tokenizer.IsIdentifier("int")) type = 'i'; // also accepts 64 bit long since v11 else if (tokenizer.IsIdentifier("float")) { param_floats[param_count] = true; type = 'f'; // also accepts doubles since v11 } else if (tokenizer.IsIdentifier("string")) type = 's'; else if (tokenizer.IsIdentifier("clip")) type = 'c'; else if (tokenizer.IsIdentifier("func")) type = 'n'; // AVS+ 161028 array type in user defined functions else if (tokenizer.IsIdentifier("array") || tokenizer.IsIdentifier("val_array")) { array_kind = '*'; type = '.'; // or: isArray = false; type = 'a'; ? No. Keeping the old syntax // but .+ must be the very last parameter if parameter is unnamed } else if (tokenizer.IsIdentifier("array_nz") || tokenizer.IsIdentifier("val_array_nz")) { array_kind = '+'; type = '.'; // _nz: non-zero size } else if (tokenizer.IsIdentifier("bool_array")) { array_kind = '*'; type = 'b'; } else if (tokenizer.IsIdentifier("bool_array_nz")) { array_kind = '+'; type = 'b'; } else if (tokenizer.IsIdentifier("int_array")) { array_kind = '*'; type = 'i'; } else if (tokenizer.IsIdentifier("int_array_nz")) { array_kind = '+'; type = 'i'; } else if (tokenizer.IsIdentifier("float_array")) { array_kind = '*'; type = 'f'; } else if (tokenizer.IsIdentifier("float_array_nz")) { array_kind = '+'; type = 'f'; } else if (tokenizer.IsIdentifier("string_array")) { array_kind = '*'; type = 's'; } else if (tokenizer.IsIdentifier("string_array_nz")) { array_kind = '+'; type = 's'; } else if (tokenizer.IsIdentifier("clip_array")) { array_kind = '*'; type = 'c'; } else if (tokenizer.IsIdentifier("clip_array_nz")) { array_kind = '+'; type = 'c'; } else if (tokenizer.IsIdentifier("func_array")) { array_kind = '*'; type = 'n'; } else if (tokenizer.IsIdentifier("func_array_nz")) { array_kind = '+'; type = 'n'; } else env->ThrowError("Script error: expected \"val\", \"bool\", \"int\", \"float\", \"string\", \"array\", or \"clip\" (or their \"_array\" or \"_array_nz\" versions"); tokenizer.NextToken(); } if (tokenizer.IsIdentifier()) { if (named_arg_found) env->ThrowError("Script error: can't have a named (quoted) parameter followed by an ordinary parameter"); param_names[param_count++] = tokenizer.AsIdentifier(); } else if (tokenizer.IsString()) { named_arg_found = true; const char* param_name = param_names[param_count++] = tokenizer.AsString(); int len = lstrlen(param_name); if (param_chars + lstrlen(param_name) >= 4000) env->ThrowError("Script error: parameter list too long"); param_types[param_chars] = '['; memcpy(¶m_types[param_chars+1], param_name, len); param_types[param_chars+len+1] = ']'; param_chars += len+2; } else { env->ThrowError("Script error: expected a parameter name"); } param_types[param_chars++] = type; if(array_kind == '*' || array_kind == '+') param_types[param_chars++] = array_kind; // zero or more / one or more tokenizer.NextToken(); need_comma = true; } } int line = tokenizer.GetLine(); param_types[param_chars] = 0; PExpression body = new ExpRootBlock(ParseBlock(true, NULL)); const char* saved_param_signature = env->SaveString(param_types); if(name != nullptr) { // legacy function definition ScriptFunction* sf = new ScriptFunction(body, param_floats, param_names, param_count); env->AtExit(ScriptFunction::Delete, sf); env->AddFunction(name, saved_param_signature, ScriptFunction::Execute, sf, "$UserFunctions$"); return new ExpLegacyFunctionDefinition(); } if (name) { auto envi = static_cast(env); envi->UpdateFunctionExports(name, saved_param_signature, "$UserFunctions$"); } return new ExpFunctionDefinition(body, name, saved_param_signature, param_floats, param_names, param_count, var_names, var_count, filename, line); // was before 20200324: // bool is_global = global_spcified || (var_count == 0); // return new ExpFunctionDefinition(name, sf, is_global); } PExpression ScriptParser::ParseBlock(bool braced, bool *empty) { if (braced) { // allow newlines (and hence comments) before '{' -- Gavino 7 Dec 2009 while (tokenizer.IsNewline()) tokenizer.NextToken(); Expect('{'); } // the purpose of this array and the accompanying code is to produce // a nice balanced binary tree of ExpSequence objects, so that the // maximum call depth in Evaluate grows logarithmically instead of // linearly. // For every i, either trees[i]==0 or it's a balanced tree of (1<ThrowError("Script error: found } without a matching {"); } } else if (tokenizer.IsEOF()) { if (braced) { env->ThrowError("Script error: end of file reached without matching }"); } else { break; } } else { bool stop; PExpression exp = ParseStatement(&stop); if (!braced && exp) { auto ep = dynamic_cast((Expression*)(void*)exp); if (ep != nullptr) { // Inhibit legacy function definition to get into expression tree. // Or else "return last" would be needed before them. // We check actual type runtime with dynamic cast. exp = nullptr; } } if (exp && !ignore_remainder) { if (filename) exp = new ExpLine(exp, filename, tokenizer.GetLine()); for (int i=0; i<20; ++i) { if (trees[i]) { exp = new ExpSequence(trees[i], exp); trees[i] = 0; } else { trees[i] = exp; break; } } } ignore_remainder |= stop; } } PExpression result = trees[0]; for (int i=1; i<20; ++i) { if (trees[i]) result = result ? PExpression(new ExpSequence(trees[i], result)) : trees[i]; } if (result) { if (empty) *empty = false; return result; } else { if (empty) *empty = true; return PExpression(new ExpConstant(AVSValue())); } } PExpression ScriptParser::ParseStatement(bool* stop) { *stop = false; // null statement if (tokenizer.IsNewline() || tokenizer.IsEOF()) { return 0; } /* // original AVS2.6/old Avs+: function definition returns 0 // Function declaration moved more inner // Since Neo/3.6.0 we have function objects besides script functions. // Thus return 0 is conditional and handled outside. else if (tokenizer.IsIdentifier("function")) { tokenizer.NextToken(); ParseFunctionDefinition(); return 0; } */ // exception handling else if (tokenizer.IsIdentifier("try")) { tokenizer.NextToken(); PExpression try_block = ParseBlock(true, NULL); while (tokenizer.IsNewline()) tokenizer.NextToken(); if (!tokenizer.IsIdentifier("catch")) env->ThrowError("Script error: expected `catch'"); tokenizer.NextToken(); Expect('('); if (!tokenizer.IsIdentifier()) env->ThrowError("Script error: expected identifier"); const char* id = tokenizer.AsIdentifier(); tokenizer.NextToken(); Expect(')'); return new ExpTryCatch(try_block, id, ParseBlock(true, NULL)); } // 'if', 'while', 'for': else if (tokenizer.IsIdentifier("if")) { return ParseIf(); } else if (tokenizer.IsIdentifier("while")) { return ParseWhile(); } else if (tokenizer.IsIdentifier("for")) { return ParseFor(); } // return statement else if (tokenizer.IsIdentifier("return")) { *stop = true; tokenizer.NextToken(); return new ExpReturn(ParseAssignmentWithRet()); } // break statement else if (tokenizer.IsIdentifier("break")) { if (loopDepth <= 0) throw AvisynthError("'Break' statement outside of loop."); tokenizer.NextToken(); return new ExpBreak(); } // continue statement else if (tokenizer.IsIdentifier("continue")) { if (loopDepth <= 0) throw AvisynthError("'Continue' statement outside of loop."); tokenizer.NextToken(); return new ExpContinue(); } else { return ParseAssignment(); } } PExpression ScriptParser::ParseIf(void) { bool blockEmpty; PExpression If, Then, Else = 0; tokenizer.NextToken(); Expect('('); If = ParseAssignmentWithRet(); Expect(')'); Then = ParseBlock(true, &blockEmpty); if (blockEmpty) Then = NULL; while (tokenizer.IsNewline()) tokenizer.NextToken(); if (tokenizer.IsIdentifier("else")) { tokenizer.NextToken(); if (tokenizer.IsIdentifier("if")) { Else = ParseIf(); } else { Else = ParseBlock(true, &blockEmpty); if (blockEmpty) Else = NULL; } } return new ExpBlockConditional(If, Then, Else); } PExpression ScriptParser::ParseWhile(void) { tokenizer.NextToken(); Expect('('); const PExpression cond = ParseAssignmentWithRet(); Expect(')'); ++loopDepth; bool blockEmpty; PExpression body = ParseBlock(true, &blockEmpty); if (blockEmpty) body = NULL; --loopDepth; return new ExpWhileLoop(cond, body); } PExpression ScriptParser::ParseFor(void) { tokenizer.NextToken(); Expect('('); if (!tokenizer.IsIdentifier()) env->ThrowError("Script error: expected a variable name"); const char* id = tokenizer.AsIdentifier(); tokenizer.NextToken(); Expect('='); const PExpression init = ParseAssignmentWithRet(); Expect(','); const PExpression limit = ParseAssignmentWithRet(); PExpression step = NULL; if (tokenizer.IsOperator(',')) { tokenizer.NextToken(); step = ParseAssignmentWithRet(); } else { step = PExpression(new ExpConstant(AVSValue(1))); } Expect(')'); ++loopDepth; bool blockEmpty; PExpression body = ParseBlock(true, &blockEmpty); if (blockEmpty) body = NULL; --loopDepth; return new ExpForLoop(id, init, limit, step, body); } PExpression ScriptParser::ParseAssignment(void) { if (tokenizer.IsIdentifier("global")) { tokenizer.NextToken(); if (!tokenizer.IsIdentifier()) env->ThrowError("Script error: `global' must be followed by a variable name"); const char* name = tokenizer.AsIdentifier(); tokenizer.NextToken(); Expect('='); PExpression exp = ParseConditional(); return new ExpGlobalAssignment(name, exp); } PExpression exp = ParseAssignmentWithRet(); if (tokenizer.IsOperator('=')) { const char* name = exp->GetLvalue(); if (!name) env->ThrowError("Script error: left operand of `=' must be a variable name"); tokenizer.NextToken(); exp = ParseAssignmentWithRet(); return new ExpAssignment(name, exp); } return exp; } PExpression ScriptParser::ParseAssignmentWithRet(void) { PExpression exp = ParseConditional(); if (tokenizer.IsOperator(":="_i)) { const char* name = exp->GetLvalue(); if (!name) env->ThrowError("Script error: left operand of `:=' must be a variable name"); tokenizer.NextToken(); exp = ParseAssignmentWithRet(); return new ExpAssignment(name, exp, true); } return exp; } PExpression ScriptParser::ParseConditional(void) { PExpression a = ParseOr(); if (tokenizer.IsOperator('?')) { tokenizer.NextToken(); PExpression b = ParseAssignmentWithRet(); Expect(':'); PExpression c = ParseAssignmentWithRet(); return new ExpConditional(a, b, c); } return a; } PExpression ScriptParser::ParseOr(void) { PExpression left = ParseAnd(); if (tokenizer.IsOperator("||"_i)) { tokenizer.NextToken(); PExpression right = ParseOr(); return new ExpOr(left, right); } return left; } PExpression ScriptParser::ParseAnd(void) { PExpression left = ParseComparison(); if (tokenizer.IsOperator("&&"_i)) { tokenizer.NextToken(); PExpression right = ParseAnd(); return new ExpAnd(left, right); } return left; } PExpression ScriptParser::ParseComparison(void) { PExpression left = ParseAddition(false); PExpression result; int op; while ((op = GetTokenAsComparisonOperator()) != 0) { tokenizer.NextToken(); PExpression right = ParseAddition(false); PExpression term; switch (op) { case "=="_i: term = new ExpEqual(left, right); break; case "!="_i: term = new ExpNot(new ExpEqual(left, right)); break; case "<>"_i: term = new ExpNot(new ExpEqual(left, right)); break; case '<': term = new ExpLess(left, right); break; case ">="_i: term = new ExpNot(new ExpLess(left, right)); break; case '>': term = new ExpLess(right, left); break; case "<="_i: term = new ExpNot(new ExpLess(right, left)); break; } result = !result ? term : PExpression(new ExpAnd(result, term)); left = right; } return result ? result : left; } PExpression ScriptParser::ParseAddition(bool negationOnHold) //update exterior calls to ParseAddition(false) { PExpression left = ParseMultiplication(negationOnHold); bool plus = tokenizer.IsOperator('+'); bool minus = tokenizer.IsOperator('-'); bool doubleplus = tokenizer.IsOperator("++"_i); if (plus || minus || doubleplus) { tokenizer.NextToken(); PExpression right = ParseAddition(minus); if (doubleplus) { return new ExpDoublePlus(left, right); } return new ExpPlus(left, right); //no longer ExpMinus 'right' will be negated when needed } return left; } PExpression ScriptParser::ParseMultiplication(bool negationOnHold) { PExpression left = ParseUnary(); for (;;) { bool mult = tokenizer.IsOperator('*'); bool div = tokenizer.IsOperator('/'); bool mod = tokenizer.IsOperator('%'); if (mult || div || mod) tokenizer.NextToken(); else break; //exits the while if not a mult op PExpression right = ParseUnary(); if (mult) left = new ExpMult(left, right); else if (div) left = new ExpDiv(left, right); else left = new ExpMod(left, right); } if (negationOnHold) //negate the factorised result if needed left = new ExpNegate(left); return left; } PExpression ScriptParser::ParseUnary(void) { // accept '+' with anything while (tokenizer.IsOperator('+')) tokenizer.NextToken(); if (tokenizer.IsOperator('-')) { tokenizer.NextToken(); return new ExpNegate(ParseUnary()); } else if (tokenizer.IsOperator('!')) { tokenizer.NextToken(); return new ExpNot(ParseUnary()); } else { return ParseOOP(); } } PExpression ScriptParser::ParseOOP(void) { // check if need convert [] brackets to function calls: Array() and ArrayGet() // no context and [: e.g. x = [23,2] --> x = Array(23,2) PExpression left; if (tokenizer.IsOperator('[')) left = ParseArray(nullptr); else left = ParseFunction(nullptr); while (tokenizer.IsOperator('.') || tokenizer.IsOperator('[')) { // OOP '.' or array indexing // somename.function( ... // somename[ ... : e.g. x = a[23,2] --> x = a.ArrayGet(23,2) // context is 'somename' const bool isArraySpecifier = tokenizer.IsOperator('['); tokenizer.NextToken(); if(isArraySpecifier) left = ParseArray(left); else left = ParseFunction(left); } return left; } PExpression ScriptParser::ParseArray(PExpression context) { PExpression left; if (context) left = new ExpVariableReference("ArrayGet"); // x = a[2,1] -> x = a.ArrayGet(2,1) else left = new ExpVariableReference("Array"); // x = [23,3] --> x = Array(23,3) PExpression result = ParseCall(left, context, true); // true: array syntax return result; } PExpression ScriptParser::ParseFunction(PExpression context) { PExpression left = ParseAtom(); if (context || tokenizer.IsOperator('(')) { return ParseCall(left, context, false); // false: function syntax } return left; } /* -NEW_AVSVALUE means arrays - AVSValue deep copy for arrays (arrays in arrays in ...) constant script arrays array_variable = [[1, 2, 3], [4, 5, 8], "hello"] dictionary = [["one", 1], ["two", 2]] empty = [] subarray = array_variable[0] val = subarray[2] val2 = array_variable[1, 3] str = array_variable[2] n = ArraySize(array_variable) #3 n2 = ArraySize(empty) #0 val3 = dictionary["two"] - arrays as filter parameters(named and unnamed) : new 'a' type or use '.+' or '.*' and check AVSValue IsArray() Concept is incompatible with avs 2.5 plugins due to their 'baked' interface code */ PExpression ScriptParser::ParseCall(PExpression left, PExpression context, bool isArraySpecifier) { // though parser can do here arrays in general, isArraySpecifier is always false for non AVS_NEWVALUE // array references are using [] brackets which are here // converted to Array() and ArrayGet functions depending on the position // x = a[23] --> x = a.ArrayGet(23) has a variable reference (context is not null) // x = [2,3] -> x = Array(2,3) no context // function PExpression args[max_args]; const char* arg_names[max_args]; memset(arg_names, 0, sizeof(arg_names)); int params_count = 0; int i=0; if (context) args[i++] = context; // first arg is the object before '.' or '[' if ( isArraySpecifier || tokenizer.IsOperator('(')) { if(!(context != nullptr && isArraySpecifier)) // ParseOOP already had [ and also the next token tokenizer.NextToken(); const char end_bracket = isArraySpecifier ? ']' : ')'; // arrays are delimited by ], functions by ) bool need_comma = false; for (;;) { if(tokenizer.IsOperator(end_bracket)) { tokenizer.NextToken(); break; } if (need_comma) { if(isArraySpecifier) Expect(',', "Script error: expected a , or ]"); else Expect(',', "Script error: expected a , or )"); } // check for named argument syntax (name=val) for functions if (!isArraySpecifier && tokenizer.IsIdentifier()) { Tokenizer lookahead(&tokenizer); if (lookahead.IsOperator('=')) { arg_names[i] = tokenizer.AsIdentifier(); tokenizer.NextToken(); tokenizer.NextToken(); } } if (i == max_args) { env->ThrowError("Script error: argument list too long"); } args[i++] = ParseAssignmentWithRet(); params_count++; need_comma = true; } } if (isArraySpecifier && params_count == 0) { if (context != nullptr) env->ThrowError("Script error: array indexing must have at least one index"); // contextless case is empty array definition: x = [] } const char* name = left->GetLvalue(); if (name && i == 1 && args[0]->GetLvalue() && lstrcmpi(name, "func") == 0) { // special case the parser should deal with // "func(LegacyFunctionName)" left = new ExpFunctionWrapper(args[0]->GetLvalue()); } else { // we have to set this true for array definitions x = [2,3] or else an // implicite "last" will be passed on by ExpFunctionCall::Evaluate const bool oop_notation_aka_disable_implicite_last = !!context || isArraySpecifier; left = new ExpFunctionCall(name, left, args, arg_names, i, oop_notation_aka_disable_implicite_last); } if (tokenizer.IsOperator('(')) { return ParseCall(left, nullptr, false); } return left; } PExpression ScriptParser::ParseAtom(void) { if (tokenizer.IsIdentifier("function")) { tokenizer.NextToken(); return ParseFunctionDefinition(); } else if (tokenizer.IsIdentifier()) { const char* name = tokenizer.AsIdentifier(); tokenizer.NextToken(); return new ExpVariableReference(name); } else if (tokenizer.IsInt()) { int result = tokenizer.AsInt(); tokenizer.NextToken(); return new ExpConstant(result); } else if (tokenizer.IsLong()) { int64_t result = tokenizer.AsLong(); tokenizer.NextToken(); return new ExpConstant(result); } else if (tokenizer.IsFloat()) { double result = tokenizer.AsFloat(); tokenizer.NextToken(); return new ExpConstant(result); } else if (tokenizer.IsString()) { const char* result = tokenizer.AsString(); tokenizer.NextToken(); return new ExpConstant(result); } #ifdef ARRAYS_AT_TOKENIZER_LEVEL else if (tokenizer.IsArray()) { std::vector* result = tokenizer.AsArray(); // PF tokenizer returns new array tokenizer.NextToken(); return new ExpConstant(result); } #endif else if (tokenizer.IsOperator('(')) { tokenizer.NextToken(); PExpression result = ParseAssignmentWithRet(); Expect(')'); return result; } else if (tokenizer.IsOperator('[')) { // array // with NEW_AVSVALUE this case is unreachable env->ThrowError("Script error: array is not supported on this version of avisynth"); return 0; } else { env->ThrowError("Script error: syntax error"); return 0; } } int ScriptParser::GetTokenAsComparisonOperator() { if (!tokenizer.IsOperator()) return 0; int op = tokenizer.AsOperator(); if (op == "=="_i || op == "!="_i || op == "<>"_i || op == '<' || op == '>' || op == "<="_i || op == ">="_i) return op; else return 0; } ================================================ FILE: avs_core/core/parser/scriptparser.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __ScriptParser_H__ #define __ScriptParser_H__ #include #include "expression.h" #include "tokenizer.h" #include "script.h" /******************************************************************** ********************************************************************/ class ScriptParser /** * Insert intelligent comment here **/ { public: ScriptParser(IScriptEnvironment* _env, const char* _code, const char* _filename); PExpression Parse(void); enum {max_args=1024}; // fixme: consider using vectors private: IScriptEnvironment2* const env; Tokenizer tokenizer; const char* const code; const char* const filename; int loopDepth; // how many loops are we in during parsing void Expect(int op, const char* msg); PExpression ParseFunctionDefinition(void); PExpression ParseBlock(bool braced, bool *empty); PExpression ParseStatement(bool* stop); PExpression ParseAssignment(void); PExpression ParseAssignmentWithRet(void); PExpression ParseConditional(void); PExpression ParseOr(void); PExpression ParseAnd(void); PExpression ParseComparison(void); PExpression ParseAddition(bool negationOnHold); PExpression ParseMultiplication(bool negationOnHold); PExpression ParseUnary(void); PExpression ParseOOP(void); PExpression ParseArray(PExpression context); PExpression ParseFunction(PExpression context); PExpression ParseCall(PExpression left, PExpression context, bool isArraySpecifier); PExpression ParseAtom(void); PExpression ParseIf(void); PExpression ParseWhile(void); PExpression ParseFor(void); // helper for ParseComparison int GetTokenAsComparisonOperator(); }; // The following allows us to write multi-character tokens as string literals. // Originally, non-conformant multi-character characters were used. // For example: int('012') == 0x303132. Hence, the rightmost character // is placed at the least significant byte. static constexpr int operator ""_i(const char s[], const size_t len) { int acc = 0; for (size_t i = 0; i < len; ++i) acc = (acc << 8) + (unsigned char) s[i]; return acc; } #endif // __ScriptParser_H__ ================================================ FILE: avs_core/core/parser/tokenizer.cpp ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include "tokenizer.h" #include "../InternalEnvironment.h" #ifdef AVS_WINDOWS #include #else #include #endif #include #include /**************************** ******* Tokenizer ****** ***************************/ Tokenizer::Tokenizer(const char* pc, IScriptEnvironment* _env) : env(_env) { this->pc = pc; this->line = 1; this->type = 0; NextToken(); } Tokenizer::Tokenizer(Tokenizer* old) : env(old->env) { pc = old->pc; line = old->line; type = old->type; NextToken(); } bool Tokenizer::IsIdentifier(const char* id) const { return IsIdentifier() && !lstrcmpi(id, identifier); } void Tokenizer::NextToken() { if (IsNewline()) line++; // skip whitespace, comments, and escaped newlines for (;;) { SkipWhitespace(); if (*pc == '\\') { // eat backslash followed by newline const char* const old_pc = pc; pc++; SkipWhitespace(); if (*pc == '\n' || *pc == '\r') { SkipNewline(); continue; } else { token_start = old_pc; env->ThrowError("Script error: `\\' can only appear at the beginning or end of a line"); } } else if (*pc == '\n' || *pc == '\r') { // skip newline if it's followed by backslash or `{' } const char* const old_pc = pc; const int old_line = line; do { SkipNewline(); SkipWhitespace(); } while (*pc == '\n' || *pc == '\r'); if (*pc == '\\') { pc++; continue; } else if (*pc == '{') { break; } else { pc = old_pc; line = old_line; break; } } else if (*pc == '#') { // skip from # to end of line (comment) while (*pc != 0 && *pc != '\n' && *pc != '\r') pc++; break; } else if (pc[0] == '/' && pc[1] == '*') { // Block comment /* */ const char *end = strstr(pc+2, "*/"); if (!end) env->ThrowError("Parse error: block comment missing closing */"); for (const char *cp = pc+2; cp < end; cp++) { if (*cp == '\n') { line++; } } pc = end+2; continue; } else if (pc[0] == '*' && pc[1] == '/') { env->ThrowError("Parse error: orphan block comment closing */"); } else if (pc[0] == '[' && pc[1] == '*') { // Nestable block comment [* *] const char *end = strstr(pc+2, "*]"); const char *nest = strstr(pc+2, "[*"); while (nest && nest+1 < end) { end = strstr(end+2, "*]"); nest = strstr(nest+2, "[*"); } if (!end) env->ThrowError("Parse error: nestable block comment missing closing *]"); for (const char *cp = pc+2; cp < end; cp++) { if (*cp == '\n') { line++; } } pc = end+2; continue; } else if (pc[0] == '*' && pc[1] == ']') { env->ThrowError("Parse error: orphan nestable block comment closing *]"); } else { break; } } token_start = pc; switch (*pc) { case 0: type = 0; break; case '\n': case '\r': SkipNewline(); type = 'n'; line--; break; case '.': // a '.' followed by a digit is a number, otherwise it's an operator if (isdigit(pc[1])) { GetNumber(); } else { ++pc; SetToOperator('.'); } break; case '<': // these operators have versions followed by '=' if ((pc[1] == '=') || (pc[1] == '>')) { SetToOperator(pc[0] * 256 + pc[1]); pc += 2; } else { SetToOperator(*pc++); } break; case '>': // these operators have versions followed by '=' case '!': case '=': if (pc[1] != '=') { SetToOperator(*pc++); } else { SetToOperator(pc[0] * 256 + pc[1]); pc += 2; } break; case '+': // these operators have single and double (++, &&, ||, ==) versions case '&': case '|': if (pc[1] != pc[0]) { SetToOperator(*pc++); } else { SetToOperator(pc[0] * 256 + pc[1]); pc += 2; } break; case '{': // these operators are always lone characters case '}': case '(': case ')': case '[': // variable capture for function definition case ']': case ',': case '?': case ':': case '-': case '*': case '/': case '%': SetToOperator(*pc++); break; case '$': // hexadecimal constant $FFFFFFFF remains -1 int; // or suffixed with L for 64 bit data: 0xFFFFFFFFL becomes 0x00000000FFFFFFFF { bool long64bit = false; type = 'l'; longlong = 0; ++pc; do { if (*pc >= '0' && *pc <= '9') longlong = longlong * 16 + (*pc - '0'); else if (*pc >= 'a' && *pc <= 'f') longlong = longlong * 16 + (*pc - 'a' + 10); else if (*pc >= 'A' && *pc <= 'F') longlong = longlong * 16 + (*pc - 'A' + 10); else if (*pc == 'L' || *pc == 'l') { long64bit = true; ++pc; break; // nothing allowed after L cast } else env->ThrowError("$ must be followed by a hexadecimal number"); } while (isalnum(*++pc)); if (!long64bit) { // Default is integer. // Thus we can avoid the color (like $FFFFFFFF) constants // to be casted to 64 bit. type = 'i'; integer = (int)longlong; } } break; default: if(*pc == '"' || (*pc == 'e' && pc[1] == '"')) { // string bool escape = false; if (*pc == 'e') { escape = true; ++pc; } const char *start, *end; if (pc[1] == '"' && pc[2] == '"') { // """...""" start = pc+3; bool escaped_quotation = false; auto tmp_start = start; do { end = strstr(tmp_start, "\"\"\""); if (!end) env->ThrowError("Parse error: string missing closing quotation marks"); escaped_quotation = escape && (*(end - 1) == '\\'); if (escaped_quotation) tmp_start = end + 1; } while (escaped_quotation); while (end[3] == '"') end++; pc = end+3; } else { // "..." start = pc+1; bool escaped_quotation = false; auto tmp_start = start; do { end = strchr(tmp_start, '"'); if (!end) env->ThrowError("Parse error: string missing closing quotation mark"); escaped_quotation = escape && (*(end - 1) == '\\'); if (escaped_quotation) tmp_start = end + 1; } while (escaped_quotation); /* I like the ability to have newlines in strings, thanks */ // const char *cr = strchr(start, '\r'), *lf = strchr(start, '\n'); // if ((cr && cr < end) || (lf && lf < end)) // env->ThrowError("Parse error: newline found in string"); pc = end+1; } for (const char *cp = start; cp < end; cp++) { if (*cp == '\n') { line++; } } type = 's'; string = static_cast(env)->SaveString(start, int(end-start), escape); } else if (isdigit(*pc)) { // number GetNumber(); } else if (*pc == '_' || isalpha(*pc)) { // identifier do { pc++; } while (*pc == '_' || isalnum(*pc)); type = 'I'; identifier = env->SaveString(token_start, int(pc - token_start)); if (!lstrcmpi(identifier, "__END__")) { type = 0; } } else { env->ThrowError("unexpected character \"%c\"", *pc); } break; } } int Tokenizer::GetColumn(const char* start_of_string) const { const char* x = pc; while (x > start_of_string && x[-1] != '\n' && x[-1] != '\r') x--; return int(pc-x); } void Tokenizer::SkipWhitespace() { while (*pc == ' ' || *pc == '\t') pc++; } void Tokenizer::SkipNewline() { if (*pc == '\n' || *pc == '\r') { pc++; line++; if ((*pc == '\n' || *pc == '\r') && *pc != *(pc-1)) pc++; } } void Tokenizer::AssertType(char expected_type) const { if (type != expected_type) ThrowTypeMismatch(expected_type, type, env); } void Tokenizer::GetNumber() { // old: start by assuming an int and switch to float if necessary // v11: default precision is 64 bit // start by assuming long and switch to double if necessary constexpr int64_t INT64_MAX_DIV_10 = INT64_MAX / 10; constexpr int64_t INT64_MAX_MOD_10 = INT64_MAX % 10; type = 'l'; longlong = 0; double dtemp = 0; double place = 1; do { if (*pc == '.') { // first, gather into double type = 'f'; ++pc; while (isdigit(*pc)) { place *= 10; dtemp = dtemp * 10 + (*pc - '0'); ++pc; } break; } else { if (type != 'f') { // Check for potential overflow before performing the operation, but go on anyway if (longlong > INT64_MAX_DIV_10 || (longlong == INT64_MAX_DIV_10 && (*pc - '0') > INT64_MAX_MOD_10)) type = 'f'; else longlong = longlong * 10 + (*pc - '0'); } dtemp = dtemp * 10 + (*pc - '0'); // gather always } ++pc; } while (isdigit(*pc) || *pc == '.'); dtemp /= place; if (dtemp >= DBL_MAX) env->ThrowError("Tokenizer: Number is to big."); if (type == 'f') { double_pt = dtemp; // v11: type name remained 'f' but content is double } else if (longlong <= INT_MAX) { // store into a more simple type type = 'i'; integer = (int)longlong; } } void Tokenizer::SetToOperator(int o) { type = 'o'; op = o; } /**** Helper Functions ****/ static const char* GetTypeName(char type) { switch (type) { case 0: return "undefined"; case 'a': return "array"; case 'b': return "boolean"; case 'c': return "clip"; case 'I': return "identifier"; case 'f': return "floating-point"; // v11: double case 'i': return "integer"; case 'l': return "long"; case 'o': return "operator"; case 's': return "string"; default: return "unknown"; } } void ThrowTypeMismatch(char expected, char actual, IScriptEnvironment* env) { env->ThrowError("Tokenizer: expected type '%s' doesn't match actual type '%s' (this is a bug)", GetTypeName(expected), GetTypeName(actual)); } ================================================ FILE: avs_core/core/parser/tokenizer.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __Tokenizer_H__ #define __Tokenizer_H__ #include #include /********************************************************* *********************************************************/ class Tokenizer /** * Breaks up scripts into tokens **/ { public: Tokenizer(const char* pc, IScriptEnvironment* _env); explicit Tokenizer(Tokenizer* old); void NextToken(); // unlike AVSValue, these Is-of-Type checks are exact inline bool IsIdentifier() const { return type == 'I'; } inline bool IsOperator() const { return type == 'o'; } inline bool IsInt() const { return type == 'i'; } inline bool IsFloat() const { return type == 'f'; } // means by double internally inline bool IsLong() const { return type == 'l'; } inline bool IsString() const { return type == 's'; } #ifdef ARRAYS_AT_TOKENIZER_LEVEL inline bool IsArray() const { return type == 'a'; } #endif inline bool IsNewline() const { return type == 'n'; } inline bool IsEOF() const { return type == 0; } bool IsIdentifier(const char* id) const; inline bool IsOperator(int o) const { return IsOperator() && o == op; } const char* AsIdentifier() const { AssertType('I'); return identifier; } int AsOperator() const { AssertType('o'); return op; } int AsInt() const { AssertType('i'); return integer; } //float AsFloat() const { AssertType('f'); return floating_pt; } double AsFloat() const { AssertType('f'); return double_pt; } // v11: using double internally int64_t AsLong() const { AssertType('l'); return longlong; } const char* AsString() const { AssertType('s'); return string; } #ifdef ARRAYS_AT_TOKENIZER_LEVEL std::vector* AsArray() const { AssertType('a'); return array2; } #endif int GetLine() const { return line; } int GetColumn(const char* start_of_string) const; private: void SkipWhitespace(); void SkipNewline(); void GetNumber(); void AssertType(char expected_type) const; void SetToOperator(int o); IScriptEnvironment* const env; const char* token_start; const char* pc; int line; char type; // 'I'dentifier, 'o'perator, 'i'nt, 'f'loat, 's'tring, 'n'ewline, 'a'rray, 'l'ong, 0=eof. no 'd', float holds double union { const char* identifier; const char* string; int op; // '+', '++', '.', ',', '(', ')','[', ']', 0=eoln int integer; //float floating_pt; replaced by double internally int64_t longlong; // if it fits, integer is used instead (leave as much compatibility) double double_pt; #ifdef ARRAYS_AT_TOKENIZER_LEVEL // not used now, finally arrays are implemented with helper script functions std::vector* array2; #endif }; }; /**** Helper functions ****/ void ThrowTypeMismatch(char expected, char actual, IScriptEnvironment* env); #endif // __Tokenizer_H__ ================================================ FILE: avs_core/core/strings.cpp ================================================ // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include #ifdef AVS_WINDOWS #include #include #else #include #include "parser/os/win32_string_compat.h" #endif #include #include "strings.h" #include #include #include #include #include #include static inline char tolower(char c) { // Works for letters of the english alphabet in ASCII return ((c >=65) && (c <=90)) ? c + 32 : c; } bool streqi(const char* s1, const char* s2) { // Why we dont use Windows's lstrcmpi? It is by multiple orders of magnitude slower and non-portable. // lstrcmpi handles locales and UTF and whatnot, but because variable and function names in Avisynth // are limited to ASCII, we don't need that funcationality. while(1) { if ((*s1 == 0) && (*s2 == 0)) return true; if (tolower(*s1) != tolower(*s2)) return false; ++s1; ++s2; } assert(0); return false; } std::string concat(const std::string &s1, const std::string &s2) { std::string ret(s1); return ret.append(s2); } bool replace(std::string &haystack, const std::string &needle, const std::string &newStr) { bool replaced = false; for(size_t pos = 0; ; pos += newStr.length()) { // Locate the substring to replace pos = haystack.find(needle, pos); if(pos == std::string::npos) break; // Replace by erasing and inserting haystack.erase(pos, needle.length()); haystack.insert(pos, newStr); replaced = true; } return replaced; } bool replace_beginning(std::string &haystack, const std::string &needle, const std::string &newStr) { // Locate the substring to replace size_t pos = haystack.find(needle); if(pos == std::string::npos) return false; if(pos != 0) return false; // Replace by erasing and inserting haystack.erase( pos, needle.length() ); haystack.insert( pos, newStr ); return true; } bool replace(std::string &haystack, char needle, char newChar) { std::string haystack_bck = haystack; std::replace(haystack.begin(),haystack.end(), needle, newChar); return haystack.compare(haystack_bck) != 0; } const char* ws = " \t\n\r\f\v"; std::string trim(const std::string& s) { auto wsfront = std::find_if_not(s.begin(), s.end(), [](int c) {return isspace(c); }); auto wsback = std::find_if_not(s.rbegin(), s.rend(), [](int c) {return isspace(c); }).base(); return (wsback <= wsfront ? std::string() : std::string(wsfront, wsback)); } /*********************************** ******* wchar_t-utf-ansi ****** **********************************/ #ifdef AVS_WINDOWS std::unique_ptr AnsiToUtf8(const char* input) { int wlen = MultiByteToWideChar(AreFileApisANSI() ? CP_ACP : CP_OEMCP, 0, input, -1, NULL, 0); wchar_t* wstr = new wchar_t[wlen]; MultiByteToWideChar(AreFileApisANSI() ? CP_ACP : CP_OEMCP, 0, input, -1, wstr, wlen); const auto utf8len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL); // The length comes with the \0 terminator // Allocate a buffer for the UTF-8 string auto s_utf8 = std::make_unique(utf8len); // Convert the UTF-16 string from UTF-8 WideCharToMultiByte(CP_UTF8, 0, wstr, -1, s_utf8.get(), (int)utf8len, NULL, NULL); delete[] wstr; return s_utf8; } std::unique_ptr WideCharToUtf8(const wchar_t* w_string) { const auto utf8len = WideCharToMultiByte(CP_UTF8, 0, w_string, -1, NULL, 0, 0, 0) - 1; // w/o the \0 terminator auto s_utf8 = std::make_unique(utf8len + 1); WideCharToMultiByte(CP_UTF8, 0, w_string, -1, s_utf8.get(), (int)utf8len + 1, 0, 0); return s_utf8; } std::unique_ptr WideCharToAnsi(const wchar_t* w_string) { const auto len = wcslen(w_string); auto s_ansi = std::make_unique(len + 1); WideCharToMultiByte(AreFileApisANSI() ? CP_ACP : CP_OEMCP, 0, w_string, -1, s_ansi.get(), (int)len + 1, NULL, NULL); // replaces out-of-CP chars by ? // int succ = wcstombs(s_ansi, w_string, len +1); // no good, stops at non-replacable unicode chars. If wcstombs encounters a wide character it cannot convert to a multibyte character, it returns 1 cast to type size_t and sets errno to EILSEQ. return s_ansi; } std::unique_ptr WideCharToAnsiACP(const wchar_t* w_string) { const auto len = wcslen(w_string); auto s_ansi = std::make_unique(len + 1); WideCharToMultiByte(CP_ACP, 0, w_string, -1, s_ansi.get(), (int)len + 1, NULL, NULL); // replaces out-of-CP chars by ? // int succ = wcstombs(s_ansi, w_string, len +1); // no good, stops at non-replacable unicode chars. If wcstombs encounters a wide character it cannot convert to a multibyte character, it returns 1 cast to type size_t and sets errno to EILSEQ. return s_ansi; } std::unique_ptr WideCharToUtf8_maxn(const wchar_t* w_string, size_t maxn) { const auto utf8len = WideCharToMultiByte(CP_UTF8, 0, w_string, (int)maxn, NULL, 0, 0, 0); // no \0 terminator check requested here auto s_utf8 = std::make_unique(utf8len + 1); WideCharToMultiByte(CP_UTF8, 0, w_string, -1, s_utf8.get(), utf8len, 0, 0); s_utf8[utf8len] = 0; return s_utf8; } std::unique_ptr WideCharToAnsi_maxn(const wchar_t* w_string, size_t maxn) { auto s_ansi = std::make_unique(maxn + 1); WideCharToMultiByte(AreFileApisANSI() ? CP_ACP : CP_OEMCP, 0, w_string, -1, s_ansi.get(), (int)maxn, NULL, NULL); // replaces out-of-CP chars by ? s_ansi[maxn] = 0; return s_ansi; } std::unique_ptr AnsiToWideChar(const char* s_ansi) { const size_t bufsize = strlen(s_ansi) + 1; auto w_string = std::make_unique(bufsize); MultiByteToWideChar(AreFileApisANSI() ? CP_ACP : CP_OEMCP, 0, s_ansi, -1, w_string.get(), (int)bufsize); //mbstowcs(script_name_w, script_name, len); // ansi to wchar_t, does not convert properly out-of-the box return w_string; } std::unique_ptr AnsiToWideCharACP(const char* s_ansi) { const size_t bufsize = strlen(s_ansi) + 1; auto w_string = std::make_unique(bufsize); MultiByteToWideChar(CP_ACP, 0, s_ansi, -1, w_string.get(), (int)bufsize); //mbstowcs(script_name_w, script_name, len); // ansi to wchar_t, does not convert properly out-of-the box return w_string; } std::unique_ptr Utf8ToWideChar(const char* s_utf8) { const size_t wchars_count = MultiByteToWideChar(CP_UTF8, 0, s_utf8, -1, NULL, 0); const size_t bufsize = wchars_count + 1; auto w_string = std::make_unique(bufsize); MultiByteToWideChar(CP_UTF8, 0, s_utf8, -1, w_string.get(), (int)bufsize); return w_string; } std::string Utf8ToAnsi(const char* s_utf8) { std::string s; auto w = Utf8ToWideChar(s_utf8); auto ansi = WideCharToAnsi(w.get()); // replaces out-of-CP chars by ? s = ansi.get(); return s; } #endif std::string double_to_string(double d) { char s[50]; // safe size for a double #ifdef MSVC _locale_t locale = _create_locale(LC_NUMERIC, "C"); // force '.' as decimal separator _sprintf_l(s, "%lf", locale, d); _free_locale(locale); #else sprintf(s, "%lf", d); #endif return s; } std::string GetFullPathNameWrapUtf8(const std::string& f) { #ifdef AVS_WINDOWS // assume f is utf-8 auto f_wide = Utf8ToWideChar(f.c_str()); auto p = fs::absolute(fs::path(f_wide.get()).lexically_normal()); auto w = p.wstring(); // UTF-16 on Windows auto utf8 = WideCharToUtf8(w.c_str()); return std::string(utf8.get()); #else return fs::absolute(fs::path(f).lexically_normal()).generic_string(); #endif } size_t str_utf8_size(const std::string& s) { // Does not handle combined codepoints, e.g. diacritic mark modifications // Leading UTF8 byte: // 1 byte 0xxxxxxx // 2 bytes 110xxxxx // 3 bytes 1110xxxx // 4 bytes 11110xxx size_t len = 0; for (char c : s) { if ((c & 0xc0) != 0x80) // Not a trailing byte 10xxxxxx len++; } return len; } // converts a 16 bit unicode codepoint to its utf8 string representation std::string U16_to_utf8(uint16_t u16) { uint8_t bytes[3]; int size = 0; // check the range of the UTF-16 code point if (u16 <= 0x007F) { // one byte, 0xxxxxxx bytes[0] = static_cast(u16); size = 1; } else if (u16 <= 0x07FF) { // two bytes, 110xxxxx 10xxxxxx bytes[0] = static_cast(0xC0 | ((u16 >> 6) & 0x1F)); bytes[1] = static_cast(0x80 | (u16 & 0x3F)); size = 2; } else { // three bytes, 1110xxxx 10xxxxxx 10xxxxxx bytes[0] = static_cast(0xE0 | ((u16 >> 12) & 0x0F)); bytes[1] = static_cast(0x80 | ((u16 >> 6) & 0x3F)); bytes[2] = static_cast(0x80 | (u16 & 0x3F)); size = 3; } // convert the array of bytes to a string std::string u8str(bytes, bytes + size); return u8str; } // for posix: always assume utf8 std::string charToUtf8(const char* text, bool utf8) { std::string s; // AVS_POSIX: utf8 is always true, no ANSI here #ifdef AVS_POSIX utf8 = true; #endif if (utf8) { s = text; // no change } #ifdef AVS_WINDOWS else { // ANSI (or system local Active CP, since Win10 it can be UTF8), Windows auto source = AnsiToUtf8(text); s = source.get(); } #endif return s; } ================================================ FILE: avs_core/core/strings.h ================================================ // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef AVSCORE_STRINGS_H #define AVSCORE_STRINGS_H #include #include #include bool streqi(const char* s1, const char* s2); std::string concat(const std::string &s1, const std::string &s2); bool replace_beginning(std::string &_haystack, const std::string &needle, const std::string &newStr); bool replace(std::string &haystack, const std::string &needle, const std::string &newStr); bool replace(std::string &haystack, char needle, char newChar); std::string trim(const std::string& s); #ifdef AVS_WINDOWS std::unique_ptr AnsiToUtf8(const char* input); std::unique_ptr WideCharToUtf8(const wchar_t* w_string); std::unique_ptr WideCharToAnsi(const wchar_t* w_string); std::unique_ptr WideCharToAnsiACP(const wchar_t* w_string); std::unique_ptr WideCharToUtf8_maxn(const wchar_t* w_string, size_t maxn); std::unique_ptr WideCharToAnsi_maxn(const wchar_t* w_string, size_t maxn); std::unique_ptr AnsiToWideChar(const char* s_ansi); std::unique_ptr AnsiToWideCharACP(const char* s_ansi); std::unique_ptr Utf8ToWideChar(const char* s_utf8); std::string Utf8ToAnsi(const char* s_utf8); #endif std::string GetFullPathNameWrapUtf8(const std::string& f); // Converts a double to string using the "C" locale (always '.' as decimal // separator), matching the behaviour of String() and AVSValue_to_string(). std::string double_to_string(double d); size_t str_utf8_size(const std::string& s); std::string U16_to_utf8(uint16_t u16); std::string charToUtf8(const char* text, bool utf8); #endif // AVSCORE_STRINGS_H ================================================ FILE: avs_core/core/vartable.h ================================================ // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef AVSCORE_VARTABLE_H #define AVSCORE_VARTABLE_H #include "strings.h" #include "avs/alignment.h" #include "avs/minmax.h" #include #include #include #include #include struct iequal_to_ascii { bool operator()(const char* str1, const char* str2) const { return streqi(str1, str2); } }; struct ihash_ascii { std::size_t operator()(const char* s) const { // NOTE the connection between the hash() and equals() functions! // In order for the hash table to work correctly, if two strings compare // equal, they MUST have the same hash. size_t hash = 0; while (*s) hash = hash * 101 + tolower(*s++); return hash; } }; // Custom hash function for composite keys (const char* pointer + size_t length) struct CompositeKeyDjb2Hash { size_t operator()(const std::pair& key) const { const char* str = key.first; size_t len = key.second; size_t hash = 5381; while (len--) { hash = ((hash << 5) + hash) + *str; ++str; } return hash; } }; // Custom equality function for composite keys struct CompositeKeyEqual { bool operator()(const std::pair& lhs, const std::pair& rhs) const { return (lhs.second == rhs.second) && (std::strncmp(lhs.first, rhs.first, lhs.second) == 0); } }; // This doles out storage space for strings. No space is ever freed // until the class instance is destroyed (which happens when a script // file is closed). class StringDump { enum { BLOCK_SIZE = 32768 }; char* current_block; size_t block_pos, block_size; // string cache std::unordered_map, const char*, CompositeKeyDjb2Hash, CompositeKeyEqual> cache; // Get the pointer to the string (if it exists) const char* get_string(const char* keyStr, size_t keyLen) { auto it = cache.find({ keyStr, keyLen }); if (it != cache.end()) { return it->second; // Return existing pointer } else { return nullptr; } } void add_string(const char* keyStr, size_t keyLen) { cache[{keyStr, keyLen}] = keyStr; } void ensure_length(size_t len) { if (block_pos + len + 1 > block_size) { char* new_block = new char[block_size = max(block_size, len + 1 + sizeof(char*))]; //_RPT0(0, "StringDump: Allocating new stringblock.\r\n"); *(char**)new_block = current_block; // beginning of block holds pointer to previous block current_block = new_block; block_pos = sizeof(char*); } } public: StringDump() : current_block(0), block_pos(BLOCK_SIZE), block_size(BLOCK_SIZE) {} ~StringDump() { _RPT0(0, "StringDump: DeAllocating all stringblocks.\r\n"); char* p = current_block; while (p) { char* next = *(char**)p; delete[] p; p = next; } } // SaveString with len==-1 can store more than 'int' sized data // up to size_t theoretically even on 32 bits. // Public interface defines 'len' as int, this can we live with. char* SaveString(const char* s, int _len = -1, bool escape = false) { size_t srclen = (_len == -1) ? strlen(s) : _len >= 0 ? static_cast(_len) : 0; size_t len; std::string ss; if (escape) { ss.reserve(srclen); // worst case. Note: input string may not be closed by 0x00 // PF: no need for WideString conversion, utf8 lower 128 ascii characters are freely searchable w/o conversion len = 0; for (size_t i = 0; s[i] && i(test_ptr); ensure_length(len); char* result = current_block + block_pos; memcpy(result, s, len); result[len] = 0; block_pos += AlignNumber(len + 1, sizeof(char*)); // Keep word-aligned add_string(result, len); // update cache return result; } void Clear() { if (current_block) { // deallocate string blocks except the first one while (char* p = *(char**)current_block) { delete[] current_block; current_block = p; } block_pos = sizeof(char*); block_size = BLOCK_SIZE; } } }; class VarFrame { typedef std::unordered_map ValueMap; ValueMap variables; public: VarFrame() { variables.max_load_factor(0.8f); } // This method will not modify the *val argument if it returns false. bool Get(const char* name, AVSValue *val) const { ValueMap::const_iterator v = variables.find(name); if (v != variables.end()) { *val = v->second; return true; } return false; } bool Set(const char* name, const AVSValue& val) { std::pair ret = variables.insert(ValueMap::value_type(name, val)); ret.first->second = val; return ret.second; } void Clear() { variables.clear(); } }; class VarStringFrame : public VarFrame { StringDump string_dump; public: char* SaveString(const char* s, int len = -1, bool escape = false) { return string_dump.SaveString(s, len, escape); } void Clear() { //string_dump.Clear(); // do not destroy string (it is destroyed at destructor) VarFrame::Clear(); } }; class ConcurrentVarStringFrame : protected VarStringFrame { // avoid write/read concurrency of global variables in runtime scripts in MT mutable std::mutex var_mutex; public: // This method will not modify the *val argument if it returns false. bool Get(const char* name, AVSValue *val) const { std::lock_guard lock(var_mutex); // avoid concurrency for global variables return VarFrame::Get(name, val); } bool Set(const char* name, const AVSValue& val) { std::lock_guard lock(var_mutex); // avoid concurrency for global variables return VarFrame::Set(name, val); } char* SaveString(const char* s, int len = -1, bool escape = false) { std::lock_guard lock(var_mutex); // avoid concurrency for global variables return VarStringFrame::SaveString(s, len, escape); } void Clear() { std::lock_guard lock(var_mutex); // avoid concurrency for global variables VarStringFrame::Clear(); } }; class VarTable { private: ConcurrentVarStringFrame* topFrame; std::vector> stackFrames; std::vector> globalFrames; std::vector> stackPool; std::vector> globalPool; public: VarTable(ConcurrentVarStringFrame* topFrame) : topFrame(topFrame) { Push(); } void Clear() { stackFrames.clear(); globalFrames.clear(); stackPool.clear(); globalPool.clear(); } void Push() { if (stackPool.size() > 0) { stackFrames.emplace_back(std::move(stackPool.back())); stackPool.pop_back(); } else { stackFrames.emplace_back(new VarFrame()); } } void Pop() { assert(stackFrames.size() > 0); stackFrames.back()->Clear(); stackPool.emplace_back(std::move(stackFrames.back())); stackFrames.pop_back(); } void PushGlobal() { Push(); if (globalPool.size() > 0) { globalFrames.emplace_back(std::move(globalPool.back())); globalPool.pop_back(); } else { globalFrames.emplace_back(new VarStringFrame()); } } void PopGlobal() { Pop(); assert(globalFrames.size() > 0); globalFrames.back()->Clear(); globalPool.emplace_back(std::move(globalFrames.back())); globalFrames.pop_back(); } bool Set(const char* name, const AVSValue& val) { return stackFrames.back()->Set(name, val); } bool SetGlobal(const char* name, const AVSValue& val) { if (globalFrames.size() > 0) { return globalFrames.back()->Set(name, val); } return topFrame->Set(name, val); } bool Get(const char* name, AVSValue *val) const { if (stackFrames.size() > 0 && stackFrames.back()->Get(name, val)) { return true; } for (auto it = globalFrames.rbegin(); it != globalFrames.rend(); ++it) { if ((**it).Get(name, val)) { return true; } } return topFrame->Get(name, val); } char* SaveString(const char* s, int len = -1, bool escape = false) { if (globalFrames.size() > 0) { return globalFrames.back()->SaveString(s, len, escape); } return topFrame->SaveString(s, len, escape); } }; #endif // AVSCORE_VARTABLE_H ================================================ FILE: avs_core/core/version.h.in ================================================ #ifndef _AVS_VERSION_H_ #define _AVS_VERSION_H_ #include "arch.h" #define AVS_PPSTR_(x) #x #define AVS_PPSTR(x) AVS_PPSTR_(x) #define AVS_PROJECT AviSynth+ #define AVS_MAJOR_VER 3 #define AVS_MINOR_VER 7 #define AVS_BUGFIX_VER 5 #ifdef RELEASE_TARBALL #define AVS_FULLVERSION AVS_PPSTR(AVS_PROJECT) " " AVS_PPSTR(AVS_MAJOR_VER) "." AVS_PPSTR(AVS_MINOR_VER) "." AVS_PPSTR(AVS_BUGFIX_VER) " (" AVS_PPSTR(AVS_ARCH) ")" #else #define AVS_DEVNEXT_REV @AVS_DEVNEXT_REV@ #define AVS_DEV_REVDATE @AVS_DEV_REVDATE@ #define AVS_DEV_GITHASH @AVS_DEV_GITHASH@ #define AVS_SEQREV @AVS_SEQREV@ // e.g. 1576 #define AVS_BRANCH @AVS_BRANCH@ // e.g. master #define AVS_FULLVERSION AVS_PPSTR(AVS_PROJECT) " " AVS_PPSTR(AVS_MAJOR_VER) "." AVS_PPSTR(AVS_MINOR_VER) "." AVS_PPSTR(AVS_BUGFIX_VER) " (r" AVS_PPSTR(AVS_SEQREV) ", " AVS_PPSTR(AVS_BRANCH) ", " AVS_PPSTR(AVS_ARCH) ")" #endif #endif // _AVS_VERSION_H_ ================================================ FILE: avs_core/filters/AviSource/AVIIndex.cpp ================================================ // Packaged with Avisynth v1.0 beta. // http://www.math.berkeley.edu/~benrg/avisynth.html // VirtualDub - Video processing and capture application // Copyright (C) 1998-2000 Avery Lee // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include #include "AVIIndex.h" // #pragma warning(disable: 4244) // conversion from __int64, possible loss of data /////////////////////////////////////////////////////////////////////////// class AVIIndexChainNode { public: enum { ENTS=2048 }; AVIIndexChainNode *next; AVIIndexEntry2 ient[ENTS]; int num_ents; AVIIndexChainNode() { num_ents = 0; next = NULL; } bool add(FOURCC ckid, __int64 pos, long size, bool is_keyframe) { if (num_ents < ENTS) { ient[num_ents].ckid = ckid; ient[num_ents].pos = pos; ient[num_ents].size = is_keyframe ? size : 0x80000000+size; ++num_ents; return true; } return false; } void put(AVIINDEXENTRY *&avieptr) { int i; for(i=0; ickid = ient[i].ckid; avieptr->dwFlags = ient[i].size & 0x80000000 ? 0 : AVIIF_KEYFRAME; avieptr->dwChunkOffset = DWORD(ient[i].pos); avieptr->dwChunkLength = ient[i].size & 0x7FFFFFFF; ++avieptr; } } void put(AVIIndexEntry2 *&avie2ptr) { int i; for(i=0; idwSizeKeyframe = ient[i].size; avie3ptr->dwOffset = (DWORD)(ient[i].pos - offset); ++avie3ptr; } } }; /////////////////////////////////////////////////////////////////////////// AVIIndexChain::AVIIndexChain() { head = tail = NULL; total_ents = 0; } void AVIIndexChain::delete_chain() { AVIIndexChainNode *aicn = head,*aicn2; while(aicn) { aicn2 = aicn->next; delete aicn; aicn = aicn2; } head = tail = NULL; } AVIIndexChain::~AVIIndexChain() { delete_chain(); } bool AVIIndexChain::add(AVIINDEXENTRY *avie) { if (!tail || !tail->add(avie->ckid, avie->dwChunkOffset, avie->dwChunkLength, !!(avie->dwFlags & AVIIF_KEYFRAME))) { AVIIndexChainNode *aicn = new AVIIndexChainNode(); if (tail) tail->next = aicn; else head=aicn; tail = aicn; if (tail->add(avie->ckid, avie->dwChunkOffset, avie->dwChunkLength, !!(avie->dwFlags & AVIIF_KEYFRAME))) { ++total_ents; return true; } return false; } ++total_ents; return true; } bool AVIIndexChain::add(AVIIndexEntry2 *avie2) { return add(avie2->ckid, avie2->pos, avie2->size & 0x7FFFFFFF, !!(avie2->size & 0x80000000)); } bool AVIIndexChain::add(FOURCC ckid, __int64 pos, long size, bool is_keyframe) { if (!tail || !tail->add(ckid, pos, size, is_keyframe)) { AVIIndexChainNode *aicn = new AVIIndexChainNode(); if (tail) tail->next = aicn; else head=aicn; tail = aicn; if (tail->add(ckid, pos, size, is_keyframe)) { ++total_ents; return true; } return false; } ++total_ents; return true; } void AVIIndexChain::put(AVIINDEXENTRY *avietbl) { AVIIndexChainNode *aicn = head; while(aicn) { aicn->put(avietbl); aicn=aicn->next; } delete_chain(); } void AVIIndexChain::put(AVIIndexEntry2 *avie2tbl) { AVIIndexChainNode *aicn = head; while(aicn) { aicn->put(avie2tbl); aicn=aicn->next; } delete_chain(); } void AVIIndexChain::put(AVIIndexEntry3 *avie3tbl, __int64 offset) { AVIIndexChainNode *aicn = head; while(aicn) { aicn->put(avie3tbl, offset); aicn=aicn->next; } delete_chain(); } AVIIndex::AVIIndex() { index = NULL; index2 = NULL; index3 = NULL; } AVIIndex::~AVIIndex() { delete[] index; delete[] index2; delete[] index3; } bool AVIIndex::makeIndex() { if (!allocateIndex(total_ents)) return false; put(indexPtr()); return true; } bool AVIIndex::makeIndex2() { if (!allocateIndex2(total_ents)) return false; put(index2Ptr()); return true; } bool AVIIndex::makeIndex3(__int64 offset) { if (!allocateIndex3(total_ents)) return false; put(index3Ptr(), offset); return true; } void AVIIndex::clear() { delete_chain(); delete[] index; delete[] index2; delete[] index3; index = NULL; index2 = NULL; index3 = NULL; total_ents = 0; } ================================================ FILE: avs_core/filters/AviSource/AVIIndex.h ================================================ // Packaged with Avisynth v1.0 beta. // http://www.math.berkeley.edu/~benrg/avisynth.html // VirtualDub - Video processing and capture application // Copyright (C) 1998-2000 Avery Lee // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #ifndef f_AVIINDEX_H #define f_AVIINDEX_H #include #include class AVIIndexChainNode; class AVIIndexEntry2 { public: __int64 pos; union { FOURCC ckid; int fileno; }; LONG size; }; class AVIIndexEntry3 { public: DWORD dwOffset; DWORD dwSizeKeyframe; }; class AVIIndexChain { protected: AVIIndexChainNode *head, *tail; void delete_chain(); public: int total_ents; AVIIndexChain(); virtual ~AVIIndexChain(); bool add(AVIINDEXENTRY *avie); bool add(AVIIndexEntry2 *avie2); bool add(FOURCC ckid, __int64 pos, long len, bool is_keyframe); void put(AVIINDEXENTRY *avietbl); void put(AVIIndexEntry2 *avie2tbl); void put(AVIIndexEntry3 *avie3tbl, __int64 offset); }; class AVIIndex : public AVIIndexChain { protected: AVIINDEXENTRY *index; AVIIndexEntry2 *index2; AVIIndexEntry3 *index3; int index_len; AVIINDEXENTRY *allocateIndex(int total_entries) { return index = new AVIINDEXENTRY[index_len = total_entries]; } AVIIndexEntry2 *allocateIndex2(int total_entries) { return index2 = new AVIIndexEntry2[index_len = total_entries]; } AVIIndexEntry3 *allocateIndex3(int total_entries) { return index3 = new AVIIndexEntry3[index_len = total_entries]; } public: AVIIndex(); virtual ~AVIIndex(); bool makeIndex(); bool makeIndex2(); bool makeIndex3(__int64 offset); void clear(); AVIINDEXENTRY *indexPtr() { return index; } AVIIndexEntry2 *index2Ptr() { return index2; } AVIIndexEntry3 *index3Ptr() { return index3; } AVIIndexEntry2 *takeIndex2() { AVIIndexEntry2 *idx = index2; index2 = NULL; return idx; } int size() { return total_ents; } int indexLen() { return index_len; } }; #endif ================================================ FILE: avs_core/filters/AviSource/AVIReadHandler.cpp ================================================ // VirtualDub - Video processing and capture application // Copyright (C) 1998-2001 Avery Lee // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include #include #include "AVIReadHandler.h" //#include "FastReadStream.h" //#include "ProgressDialog.h" #include "AVIIndex.h" #include "Error.h" #include "list.h" #include "Fixes.h" #include "File64.h" #include "clip_info.h" #include "../core/internal.h" #include #include #include "../core/strings.h" #pragma warning(disable: 4706) // assignment within conditional expression // These two functions translate VirtualDub exceptions to Avisynth exceptions. char exception_conversion_buffer[2048]; AvisynthError MyError(const char* fmt, ...) { va_list val; va_start(val, fmt); wvsprintf(exception_conversion_buffer, fmt, val); va_end(val); return AvisynthError(exception_conversion_buffer); } AvisynthError MyWin32Error(const char *format, DWORD err, ...) { char szError[128]; char szTemp[256]; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 0, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), szError, sizeof szError, NULL); if (szError[0]) { size_t l = strlen(szError); if (l>1 && szError[l-2] == '\r') szError[l-2] = 0; else if (szError[l-1] == '\n') szError[l-1] = 0; } va_list val; va_start(val, err); wvsprintf(szTemp, format, val); va_end(val); wsprintf(exception_conversion_buffer, szTemp, szError); return AvisynthError(exception_conversion_buffer); } // Copied over from VD_misc.cpp, as the only function being used from there static bool isValidFOURCC(FOURCC fcc) { return isprint((unsigned char)(fcc>>24)) && isprint((unsigned char)(fcc>>16)) && isprint((unsigned char)(fcc>> 8)) && isprint((unsigned char)(fcc )); } //#define STREAMING_DEBUG // HACK!!!! CRITICAL_SECTION g_diskcs; bool g_disklockinited=false; /////////////////////////////////////////// typedef __int64 QUADWORD; // The following comes from the OpenDML 1.0 spec for extended AVI files // bIndexType codes // #define AVI_INDEX_OF_INDEXES 0x00 // when each entry in aIndex // array points to an index chunk #define AVI_INDEX_OF_CHUNKS 0x01 // when each entry in aIndex // array points to a chunk in the file #define AVI_INDEX_IS_DATA 0x80 // when each entry is aIndex is // really the data // bIndexSubtype codes for INDEX_OF_CHUNKS #define AVI_INDEX_2FIELD 0x01 // when fields within frames // are also indexed struct _avisuperindex_entry { QUADWORD qwOffset; // absolute file offset, offset 0 is // unused entry?? DWORD dwSize; // size of index chunk at this offset DWORD dwDuration; // time span in stream ticks }; struct _avistdindex_entry { DWORD dwOffset; // qwBaseOffset + this is absolute file offset DWORD dwSize; // bit 31 is set if this is NOT a keyframe }; struct _avifieldindex_entry { DWORD dwOffset; DWORD dwSize; DWORD dwOffsetField2; }; #pragma pack(push) #pragma pack(2) #pragma warning( push ) #pragma warning (disable: 4200) // nonstandard extension used : zero-sized array in struct/union typedef struct _avisuperindex_chunk { FOURCC fcc; // ’ix##’ DWORD cb; // size of this structure WORD wLongsPerEntry; // must be 4 (size of each entry in aIndex array) BYTE bIndexSubType; // must be 0 or AVI_INDEX_2FIELD BYTE bIndexType; // must be AVI_INDEX_OF_INDEXES DWORD nEntriesInUse; // number of entries in aIndex array that // are used DWORD dwChunkId; // ’##dc’ or ’##db’ or ’##wb’, etc DWORD dwReserved[3]; // must be 0 struct _avisuperindex_entry aIndex[]; } AVISUPERINDEX, * PAVISUPERINDEX; typedef struct _avistdindex_chunk { FOURCC fcc; // ’ix##’ DWORD cb; WORD wLongsPerEntry; // must be sizeof(aIndex[0])/sizeof(DWORD) BYTE bIndexSubType; // must be 0 BYTE bIndexType; // must be AVI_INDEX_OF_CHUNKS DWORD nEntriesInUse; // DWORD dwChunkId; // ’##dc’ or ’##db’ or ’##wb’ etc.. QUADWORD qwBaseOffset; // all dwOffsets in aIndex array are // relative to this DWORD dwReserved3; // must be 0 struct _avistdindex_entry aIndex[]; } AVISTDINDEX, * PAVISTDINDEX; typedef struct _avifieldindex_chunk { FOURCC fcc; DWORD cb; WORD wLongsPerEntry; BYTE bIndexSubType; BYTE bIndexType; DWORD nEntriesInUse; DWORD dwChunkId; QUADWORD qwBaseOffset; DWORD dwReserved3; struct _avifieldindex_entry aIndex[]; } AVIFIELDINDEX, * PAVIFIELDINDEX; #pragma warning( pop ) #pragma pack(pop) /////////////////////////////////////////////////////////////////////////// IAVIReadStream::~IAVIReadStream() { } /////////////////////////////////////////////////////////////////////////// class AVIStreamNode; class AVIReadHandler; class AVIReadCache { public: long cache_hit_bytes, cache_miss_bytes; int reads; AVIReadCache(int nlines, int nstream, AVIReadHandler *root, AVIStreamNode *psnData); ~AVIReadCache(); void ResetStatistics(); bool WriteBegin(__int64 pos, long len); void Write(void *buffer, long len); void WriteEnd(); long Read(void *dest, __int64 chunk_pos, __int64 pos, long len); long getMaxRead() { return (lines_max - 1) << 4; } private: AVIStreamNode *psnData; __int64 (*buffer)[2]; int lines_max, lines; long read_tail, write_tail, write_hdr; int write_offset; int stream; AVIReadHandler *source; }; class AVIStreamNode : public ListNode2 { public: AVIStreamHeader_fixed hdr; char *pFormat; long lFormatLen; AVIIndex index; __int64 bytes; bool keyframe_only; bool was_VBR; double bitrate_mean; double bitrate_stddev; double max_deviation; // seconds int handler_count; class AVIReadCache *cache; int streaming_count; __int64 stream_push_pos; __int64 stream_bytes; int stream_pushes; long length; long frames; List2 listHandlers; AVIStreamNode(); ~AVIStreamNode(); void FixVBRAudio(); }; AVIStreamNode::AVIStreamNode() { pFormat = NULL; bytes = 0; handler_count = 0; streaming_count = 0; stream_bytes = 0; stream_pushes = 0; cache = NULL; was_VBR = false; } AVIStreamNode::~AVIStreamNode() { delete [] pFormat; delete cache; } void AVIStreamNode::FixVBRAudio() { WAVEFORMATEX *pWaveFormat = (WAVEFORMATEX *)pFormat; // If this is an MP3 stream, undo the Nandub 1152 value. if (pWaveFormat->wFormatTag == 0x0055) { pWaveFormat->nBlockAlign = 1; } // Determine VBR statistics. was_VBR = true; const AVIIndexEntry2 *pent = index.index2Ptr(); __int64 size_accum = 0; __int64 max_dev = 0; double size_sq_sum = 0.0; for(int i=0; i>1)); if (dev<0) dev = -dev; if (dev > max_dev) max_dev = dev; size_accum += size; size_sq_sum += (double)size*size; } // I hate probability & sadistics. // // Var(X) = E(X2) - E(X)^2 // = S(X2)/n - (S(x)/n)^2 // = (n*S(X2) - S(X)^2)/n^2 // // SD(x) = sqrt(n*S(X2) - S(X)^2) / n double frames_per_second = (double)hdr.dwRate / (double)hdr.dwScale; double sum1_bits = bytes * 8.0; double sum2_bits = size_sq_sum * 64.0; bitrate_mean = (sum1_bits / frames) * frames_per_second; bitrate_stddev = sqrt(frames * sum2_bits - sum1_bits * sum1_bits) / frames * frames_per_second; max_deviation = (double)max_dev * 8.0 / bitrate_mean; // Assume that each audio block is of the same duration. hdr.dwRate = (DWORD)(bitrate_mean/8.0 + 0.5); hdr.dwScale = pWaveFormat->nBlockAlign; hdr.dwSampleSize = pWaveFormat->nBlockAlign; } /////////////////////////////////////////////////////////////////////////// class AVIFileDesc : public ListNode2 { public: HANDLE hFile; HANDLE hFileUnbuffered; __int64 i64Size; }; class AVIStreamNode; class AVIReadHandler final: public IAVIReadHandler, private File64 { public: bool fDisableFastIO; AVIReadHandler(const wchar_t *); AVIReadHandler(PAVIFILE); ~AVIReadHandler(); void AddRef(); void Release(); IAVIReadStream *GetStream(DWORD fccType, LONG lParam); void EnableFastIO(bool); bool isOptimizedForRealtime(); bool isStreaming(); bool isIndexFabricated(); bool AppendFile(const wchar_t *pszFile); bool getSegmentHint(const char **ppszPath); void EnableStreaming(int stream); void DisableStreaming(int stream); void AdjustRealTime(bool fRealTime); bool Stream(AVIStreamNode *, int64_t pos); int64_t getStreamPtr(); void FixCacheProblems(class AVIReadStream *); long ReadData(int stream, void *buffer, int64_t position, long len); private: // enum { STREAM_SIZE = 65536 }; enum { STREAM_SIZE = 1048576 }; enum { STREAM_RT_SIZE = 65536 }; enum { STREAM_BLOCK_SIZE = 4096 }; IAvisynthClipInfo *pAvisynthClipInfo; PAVIFILE paf; int ref_count; int64_t i64StreamPosition; int streams; char *streamBuffer; int sbPosition; int sbSize; long fStreamsActive; int nRealTime; int nActiveStreamers; bool fFakeIndex; int64_t i64Size; int nFiles, nCurrentFile; char * pSegmentHint; // Whenever a file is aggressively recovered, do not allow streaming. bool bAggressivelyRecovered; List2 listStreams; List2 listFiles; void _construct(const wchar_t *pszFile_w); void _parseFile(List2& streams); bool _parseStreamHeader(List2& streams, DWORD dwLengthLeft, bool& bIndexDamaged); bool _parseIndexBlock(List2& streams, int count, __int64); void _parseExtendedIndexBlock(List2& streams, AVIStreamNode *pasn, __int64 fpos, DWORD dwLength); void _destruct(); char * _StreamRead(long& bytes); void _SelectFile(int file); }; IAVIReadHandler *CreateAVIReadHandler(PAVIFILE paf) { return new AVIReadHandler(paf); } IAVIReadHandler *CreateAVIReadHandler(const wchar_t *pszFile_w) { return new AVIReadHandler(pszFile_w); } /////////////////////////////////////////////////////////////////////////// AVIReadCache::AVIReadCache(int nlines, int nstream, AVIReadHandler *root, AVIStreamNode *psnData) { buffer = new(std::nothrow) __int64[nlines][2]; if (!buffer) throw MyMemoryError(); this->psnData = psnData; lines = 0; lines_max = nlines; read_tail = 0; write_tail = 0; stream = nstream; source = root; ResetStatistics(); } AVIReadCache::~AVIReadCache() { delete[] buffer; } void AVIReadCache::ResetStatistics() { reads = 0; cache_hit_bytes = cache_miss_bytes = 0; } bool AVIReadCache::WriteBegin(__int64 pos, long len) { int needed; // delete lines as necessary to make room needed = 1 + (len+15)/16; if (needed > lines_max) return false; while(lines+needed > lines_max) { int siz = (int)((buffer[read_tail][1]+15)/16 + 1); read_tail += siz; lines -= siz; if (read_tail >= lines_max) read_tail -= lines_max; } // write in header // _RPT1(0,"\tbeginning write at line %ld\n", write_tail); write_hdr = write_tail; write_offset = 0; buffer[write_tail][0] = pos; buffer[write_tail][1] = 0; if (++write_tail >= lines_max) write_tail = 0; return true; } void AVIReadCache::Write(void *src, long len) { long dest; // copy in data buffer[write_hdr][1] += len; dest = write_tail + (len + write_offset + 15)/16; if (dest > lines_max) { int tc = (lines_max - write_tail)*16 - write_offset; memcpy((char *)&buffer[write_tail][0] + write_offset, src, tc); memcpy(&buffer[0][0], (char *)src + tc, len - tc); write_tail = (len-tc)/16; write_offset = (len-tc)&15; } else { memcpy((char *)&buffer[write_tail][0] + write_offset, src, len); write_tail += (len+write_offset)/16; if (write_tail >= lines_max) write_tail = 0; write_offset = (len+write_offset) & 15; } } void AVIReadCache::WriteEnd() { long cnt = (long)(1 + (buffer[write_hdr][1]+15)/16); lines += cnt; write_tail = write_hdr + cnt; if (write_tail >= lines_max) write_tail -= lines_max; // _RPT3(0,"\twrite complete -- header at line %d, size %ld, next line %ld\n", write_hdr, (long)buffer[write_hdr][1], write_tail); } // #pragma function(memcpy) long AVIReadCache::Read(void *dest, __int64 chunk_pos, __int64 pos, long len) { long ptr; __int64 offset; // _RPT3(0,"Read request: chunk %16I64, pos %16I64d, %ld bytes\n", chunk_pos, pos, len); ++reads; do { // scan buffer looking for a range that contains data ptr = read_tail; while(ptr != write_tail) { offset = pos - buffer[ptr][0]; // _RPT4(0,"line %8d: pos %16I64d, len %ld bytes (%ld lines)\n", ptr, buffer[ptr][0], (long)buffer[ptr][1], (long)(buffer[ptr][1]+15)/16); if (offset>=0 && offset < buffer[ptr][1]) { long end; // cache hit // _RPT1(0, "cache hit (offset %" PRIu64 ")\n", chunk_pos); cache_hit_bytes += len; while (cache_hit_bytes > 16777216) { cache_miss_bytes >>= 1; cache_hit_bytes >>= 1; } if (len > (long)(buffer[ptr][1]*16 - offset)) len = (long)(buffer[ptr][1]*16 - offset); ptr += 1+((long)offset>>4); if (ptr >= lines_max) ptr -= lines_max; end = ptr + ((len+((long)offset&15)+15)>>4); if (end > lines_max) { long tc = (lines_max - ptr)*16 - ((long)offset&15); memcpy(dest, (char *)&buffer[ptr][0] + ((long)offset&15), tc); memcpy((char *)dest + tc, (char *)&buffer[0][0], len-tc); } else { memcpy(dest, (char *)&buffer[ptr][0] + ((long)offset&15), len); } return len; } // _RPT4(0,"[x] line %8d: pos %16I64d, len %ld bytes (%ld lines)\n", ptr, buffer[ptr][0], (long)buffer[ptr][1], (long)(buffer[ptr][1]+15)/16); ptr += (long)(1+(buffer[ptr][1] + 15)/16); if (ptr >= lines_max) ptr -= lines_max; } if (source->getStreamPtr() > chunk_pos) break; } while(source->Stream(psnData, chunk_pos)); // OutputDebugString("cache miss\n"); // _RPT1(0, "cache miss (offset %" PRIu64 ")\n", chunk_pos); cache_miss_bytes += len; while (cache_miss_bytes > 16777216) { cache_miss_bytes >>= 1; cache_hit_bytes >>= 1; } return source->ReadData(stream, dest, pos, len); } /////////////////////////////////////////////////////////////////////////// class AVIReadTunnelStream : public IAVIReadStream { public: AVIReadTunnelStream(AVIReadHandler *, PAVISTREAM, IAvisynthClipInfo *pClipInfo); ~AVIReadTunnelStream(); HRESULT BeginStreaming(long lStart, long lEnd, long lRate); HRESULT EndStreaming(); HRESULT Info(AVISTREAMINFO *pasi, long lSize); bool IsKeyFrame(long lFrame); HRESULT Read(long lStart, long lSamples, void *lpBuffer, long cbBuffer, long *plBytes, long *plSamples); long Start(); long End(); long PrevKeyFrame(long lFrame); long NextKeyFrame(long lFrame); long NearestKeyFrame(long lFrame); HRESULT FormatSize(long lFrame, long *plSize); HRESULT ReadFormat(long lFrame, void *pFormat, long *plSize); bool isStreaming(); bool isKeyframeOnly(); bool getVBRInfo(double& bitrate_mean, double& bitrate_stddev, double& maxdev) { return false; } private: IAvisynthClipInfo *const pAvisynthClipInfo; AVIReadHandler *const parent; const PAVISTREAM pas; }; /////////////////////////////////////////////////////////////////////////// AVIReadTunnelStream::AVIReadTunnelStream(AVIReadHandler *_parent, PAVISTREAM _pas, IAvisynthClipInfo *pClipInfo) : pAvisynthClipInfo(pClipInfo) , parent(_parent) , pas(_pas) { parent->AddRef(); } AVIReadTunnelStream::~AVIReadTunnelStream() { pas->Release(); parent->Release(); } HRESULT AVIReadTunnelStream::BeginStreaming(long lStart, long lEnd, long lRate) { return AVIStreamBeginStreaming(pas, lStart, lEnd, lRate); } HRESULT AVIReadTunnelStream::EndStreaming() { return AVIStreamEndStreaming(pas); } HRESULT AVIReadTunnelStream::Info(AVISTREAMINFO *pasi, long lSize) { return AVIStreamInfo(pas, pasi, lSize); } bool AVIReadTunnelStream::IsKeyFrame(long lFrame) { return !!AVIStreamIsKeyFrame(pas, lFrame); } HRESULT AVIReadTunnelStream::Read(long lStart, long lSamples, void *lpBuffer, long cbBuffer, long *plBytes, long *plSamples) { HRESULT hr; hr = AVIStreamRead(pas, lStart, lSamples, lpBuffer, cbBuffer, plBytes, plSamples); if (pAvisynthClipInfo) { const char *pszErr; if (pAvisynthClipInfo->GetError(&pszErr)) throw MyError("Avisynth read error:\n%s", pszErr); } return hr; } long AVIReadTunnelStream::Start() { return AVIStreamStart(pas); } long AVIReadTunnelStream::End() { return AVIStreamEnd(pas); } long AVIReadTunnelStream::PrevKeyFrame(long lFrame) { return AVIStreamPrevKeyFrame(pas, lFrame); } long AVIReadTunnelStream::NextKeyFrame(long lFrame) { return AVIStreamNextKeyFrame(pas, lFrame); } long AVIReadTunnelStream::NearestKeyFrame(long lFrame) { return AVIStreamNearestKeyFrame(pas, lFrame); } HRESULT AVIReadTunnelStream::FormatSize(long lFrame, long *plSize) { return AVIStreamFormatSize(pas, lFrame, plSize); } HRESULT AVIReadTunnelStream::ReadFormat(long lFrame, void *pFormat, long *plSize) { return AVIStreamReadFormat(pas, lFrame, pFormat, plSize); } bool AVIReadTunnelStream::isStreaming() { return false; } bool AVIReadTunnelStream::isKeyframeOnly() { return false; } /////////////////////////////////////////////////////////////////////////// class AVIReadStream : public IAVIReadStream, public ListNode2 { friend AVIReadHandler; public: AVIReadStream(AVIReadHandler *, AVIStreamNode *, int); ~AVIReadStream(); HRESULT BeginStreaming(long lStart, long lEnd, long lRate); HRESULT EndStreaming(); HRESULT Info(AVISTREAMINFO *pasi, long lSize); bool IsKeyFrame(long lFrame); HRESULT Read(long lStart, long lSamples, void *lpBuffer, long cbBuffer, long *plBytes, long *plSamples); long Start(); long End(); long PrevKeyFrame(long lFrame); long NextKeyFrame(long lFrame); long NearestKeyFrame(long lFrame); HRESULT FormatSize(long lFrame, long *plSize); HRESULT ReadFormat(long lFrame, void *pFormat, long *plSize); bool isStreaming(); bool isKeyframeOnly(); void Reinit(); bool getVBRInfo(double& bitrate_mean, double& bitrate_stddev, double& maxdev); private: AVIReadHandler *parent; AVIStreamNode *psnData; AVIIndexEntry2 *pIndex; //AVIReadCache *rCache; long& length; long& frames; long sampsize; int streamno; bool fStreamingEnabled; bool fStreamingActive; int iStreamTrackCount; long lStreamTrackValue; long lStreamTrackInterval; bool fRealTime; __int64 i64CachedPosition; AVIIndexEntry2 *pCachedEntry; }; /////////////////////////////////////////////////////////////////////////// AVIReadStream::AVIReadStream(AVIReadHandler *parent, AVIStreamNode *psnData, int streamno) :length(psnData->length) ,frames(psnData->frames) { this->parent = parent; this->psnData = psnData; this->streamno = streamno; fStreamingEnabled = false; fStreamingActive = false; fRealTime = false; parent->AddRef(); pIndex = psnData->index.index2Ptr(); sampsize = psnData->hdr.dwSampleSize; // Hack to imitate Microsoft's parser. It seems to ignore this value // for audio streams. if (psnData->hdr.fccType == streamtypeAUDIO) sampsize = ((WAVEFORMATEX *)psnData->pFormat)->nBlockAlign; if (sampsize) { i64CachedPosition = 0; pCachedEntry = pIndex; } psnData->listHandlers.AddTail(this); } AVIReadStream::~AVIReadStream() { EndStreaming(); parent->Release(); Remove(); } void AVIReadStream::Reinit() { pIndex = psnData->index.index2Ptr(); i64CachedPosition = 0; pCachedEntry = pIndex; } HRESULT AVIReadStream::BeginStreaming(long lStart, long lEnd, long lRate) { if (fStreamingEnabled) return 0; // OutputDebugString(lRate>1500 ? "starting: fast" : "starting: slow"); if (lRate <= 1500) { parent->AdjustRealTime(true); fRealTime = true; } else fRealTime = false; if (parent->fDisableFastIO) return 0; if (!psnData->streaming_count) { // if (!(psnData->cache = new AVIReadCache(psnData->hdr.fccType == 'sdiv' ? 65536 : 16384, streamno, parent, psnData))) // return AVIERR_MEMORY; psnData->stream_bytes = 0; psnData->stream_pushes = 0; psnData->stream_push_pos = 0; } ++psnData->streaming_count; fStreamingEnabled = true; fStreamingActive = false; iStreamTrackCount = 0; lStreamTrackValue = -1; lStreamTrackInterval = -1; return 0; } HRESULT AVIReadStream::EndStreaming() { if (!fStreamingEnabled) return 0; if (fRealTime) parent->AdjustRealTime(false); if (fStreamingActive) parent->DisableStreaming(streamno); fStreamingEnabled = false; fStreamingActive = false; if (!--psnData->streaming_count) { delete psnData->cache; psnData->cache = NULL; } return 0; } HRESULT AVIReadStream::Info(AVISTREAMINFO *pasi, long lSize) { AVISTREAMINFO asi; memset(&asi, 0, sizeof asi); asi.fccType = psnData->hdr.fccType; asi.fccHandler = psnData->hdr.fccHandler; asi.dwFlags = psnData->hdr.dwFlags; asi.wPriority = psnData->hdr.wPriority; asi.wLanguage = psnData->hdr.wLanguage; asi.dwScale = psnData->hdr.dwScale; asi.dwRate = psnData->hdr.dwRate; asi.dwStart = psnData->hdr.dwStart; asi.dwLength = psnData->hdr.dwLength; asi.dwInitialFrames = psnData->hdr.dwInitialFrames; asi.dwSuggestedBufferSize = psnData->hdr.dwSuggestedBufferSize; asi.dwQuality = psnData->hdr.dwQuality; asi.dwSampleSize = psnData->hdr.dwSampleSize; asi.rcFrame.top = psnData->hdr.rcFrame.top; asi.rcFrame.left = psnData->hdr.rcFrame.left; asi.rcFrame.right = psnData->hdr.rcFrame.right; asi.rcFrame.bottom = psnData->hdr.rcFrame.bottom; if (lSize < sizeof asi) memcpy(pasi, &asi, lSize); else { memcpy(pasi, &asi, sizeof asi); memset((char *)pasi + sizeof asi, 0, lSize - sizeof asi); } return 0; } bool AVIReadStream::IsKeyFrame(long lFrame) { if (sampsize) return true; else { if (lFrame < 0 || lFrame >= length) return false; return !(pIndex[lFrame].size & 0x80000000); } } HRESULT AVIReadStream::Read(long lStart, long lSamples, void *lpBuffer, long cbBuffer, long *plBytes, long *plSamples) { long lActual; if (lStart < 0 || lStart >= length || (lSamples <= 0 && lSamples != AVISTREAMREAD_CONVENIENT)) { // umm... dummy! can't read outside of stream! if (plBytes) *plBytes = 0; if (plSamples) *plSamples = 0; return 0; } // blocked or discrete? if (sampsize) { AVIIndexEntry2 *avie2, *avie2_limit = pIndex+frames; __int64 byte_off = (__int64)lStart * sampsize; __int64 bytecnt; __int64 actual_bytes=0; __int64 block_pos; // too small to hold a sample? if (lpBuffer && cbBuffer < sampsize) { if (plBytes) *plBytes = sampsize * lSamples; if (plSamples) *plSamples = lSamples; return AVIERR_BUFFERTOOSMALL; } // find the frame that has the starting sample -- try and work // from our last position to save time if (byte_off >= i64CachedPosition) { block_pos = i64CachedPosition; avie2 = pCachedEntry; byte_off -= block_pos; } else { block_pos = 0; avie2 = pIndex; } while(byte_off >= (avie2->size & 0x7FFFFFFF)) { byte_off -= (avie2->size & 0x7FFFFFFF); block_pos += (avie2->size & 0x7FFFFFFF); ++avie2; } pCachedEntry = avie2; i64CachedPosition = block_pos; // Client too lazy to specify a size? if (lSamples == AVISTREAMREAD_CONVENIENT) { lSamples = ((avie2->size & 0x7FFFFFFF) - (long)byte_off) / sampsize; if (!lSamples && avie2+1 < avie2_limit) lSamples = ((avie2[0].size & 0x7FFFFFFF) + (avie2[1].size & 0x7FFFFFFF) - (long)byte_off) / sampsize; if (lSamples < 0) lSamples = 1; } // trim down sample count if (lpBuffer && lSamples > cbBuffer / sampsize) lSamples = cbBuffer / sampsize; if (lStart+lSamples > length) lSamples = length - lStart; bytecnt = lSamples * sampsize; // begin reading frames from this point on if (lpBuffer) { // detect streaming if (fStreamingEnabled) { // We consider the client to be streaming if we detect at least // 3 consecutive accesses if (lStart == lStreamTrackValue) { ++iStreamTrackCount; if (iStreamTrackCount >= 15) { __int64 streamptr = parent->getStreamPtr(); __int64 fptrdiff = streamptr - avie2->pos; if (!parent->isStreaming() || streamptr<0 || (fptrdiff<4194304 && fptrdiff>-4194304)) { if (!psnData->cache) psnData->cache = new AVIReadCache(psnData->hdr.fccType == MAKEFOURCC('v','i','d','s') ? 131072 : 16384, streamno, parent, psnData); else psnData->cache->ResetStatistics(); if (!fStreamingActive) { fStreamingActive = true; parent->EnableStreaming(streamno); } #ifdef STREAMING_DEBUG OutputDebugString("[a] streaming enabled\n"); #endif } } else { #ifdef STREAMING_DEBUG OutputDebugString("[a] streaming detected\n"); #endif } } else { #ifdef STREAMING_DEBUG OutputDebugString("[a] streaming disabled\n"); #endif iStreamTrackCount = 0; if (fStreamingActive) { fStreamingActive = false; parent->DisableStreaming(streamno); } } } while(bytecnt > 0) { long tc; tc = (avie2->size & 0x7FFFFFFF) - (long)byte_off; if (tc > bytecnt) tc = (long)bytecnt; if (psnData->cache && fStreamingActive && tc < psnData->cache->getMaxRead()) { //OutputDebugString("[a] attempting cached read\n"); lActual = psnData->cache->Read(lpBuffer, avie2->pos, avie2->pos + byte_off + 8, tc); psnData->stream_bytes += lActual; } else lActual = parent->ReadData(streamno, lpBuffer, avie2->pos + byte_off + 8, tc); if (lActual < 0) break; actual_bytes += lActual; ++avie2; byte_off = 0; if (lActual < tc) break; bytecnt -= tc; lpBuffer = (char *)lpBuffer + tc; } if (actual_bytes < sampsize) { if (plBytes) *plBytes = 0; if (plSamples) *plSamples = 0; return AVIERR_FILEREAD; } actual_bytes -= actual_bytes % sampsize; if (plBytes) *plBytes = (long)actual_bytes; if (plSamples) *plSamples = (long)actual_bytes / sampsize; lStreamTrackValue = lStart + (long)actual_bytes / sampsize; } else { if (plBytes) *plBytes = (long)bytecnt; if (plSamples) *plSamples = lSamples; } } else { AVIIndexEntry2 *avie2 = &pIndex[lStart]; if (lpBuffer && (avie2->size & 0x7FFFFFFF) > cbBuffer) { if (plBytes) *plBytes = avie2->size & 0x7FFFFFFF; if (plSamples) *plSamples = 1; return AVIERR_BUFFERTOOSMALL; } if (lpBuffer) { // detect streaming if (fStreamingEnabled && lStart != lStreamTrackValue) { if (lStreamTrackValue>=0 && lStart-lStreamTrackValue == lStreamTrackInterval) { if (++iStreamTrackCount >= 15) { __int64 streamptr = parent->getStreamPtr(); __int64 fptrdiff = streamptr - avie2->pos; if (!parent->isStreaming() || streamptr<0 || (fptrdiff<4194304 && fptrdiff>-4194304)) { if (!psnData->cache) psnData->cache = new AVIReadCache(psnData->hdr.fccType == MAKEFOURCC('v','i','d','s') ? 131072 : 16384, streamno, parent, psnData); else psnData->cache->ResetStatistics(); if (!fStreamingActive) { fStreamingActive = true; parent->EnableStreaming(streamno); } #ifdef STREAMING_DEBUG OutputDebugString("[v] streaming activated\n"); #endif } } else { #ifdef STREAMING_DEBUG OutputDebugString("[v] streaming detected\n"); #endif } } else { iStreamTrackCount = 0; #ifdef STREAMING_DEBUG OutputDebugString("[v] streaming disabled\n"); #endif if (lStreamTrackValue>=0 && lStart > lStreamTrackValue) { lStreamTrackInterval = lStart - lStreamTrackValue; } else lStreamTrackInterval = -1; if (fStreamingActive) { fStreamingActive = false; parent->DisableStreaming(streamno); } } lStreamTrackValue = lStart; } // read data long size = avie2->size & 0x7FFFFFFF; if (psnData->cache && fStreamingActive && size < psnData->cache->getMaxRead()) { //OutputDebugString("[v] attempting cached read\n"); lActual = psnData->cache->Read(lpBuffer, avie2->pos, avie2->pos + 8, size); psnData->stream_bytes += lActual; } else lActual = parent->ReadData(streamno, lpBuffer, avie2->pos+8, size); if (lActual != size) { if (plBytes) *plBytes = 0; if (plSamples) *plSamples = 0; return AVIERR_FILEREAD; } } if (plBytes) *plBytes = avie2->size & 0x7FFFFFFF; if (plSamples) *plSamples = 1; } if (psnData->cache && fStreamingActive) { // Are we experiencing a high rate of cache misses? if (psnData->cache->cache_miss_bytes*2 > psnData->cache->cache_hit_bytes && psnData->cache->reads > 50) { // sh*t, notify the parent that we have cache misses so it can check which stream is // screwing up, and disable streaming on feeds that are too far off parent->FixCacheProblems(this); iStreamTrackCount = 0; } }/* else if (fStreamingEnabled) { // hmm... our cache got killed! iStreamTrackCount = 0; }*/ return 0; } long AVIReadStream::Start() { return 0; } long AVIReadStream::End() { return length; } long AVIReadStream::PrevKeyFrame(long lFrame) { if (sampsize) return lFrame>0 ? lFrame-1 : -1; if (lFrame < 0) return -1; if (lFrame >= length) lFrame = length; while(--lFrame > 0) if (!(pIndex[lFrame].size & 0x80000000)) return lFrame; return -1; } long AVIReadStream::NextKeyFrame(long lFrame) { if (sampsize) return lFrame= length) return -1; while(++lFrame < length) if (!(pIndex[lFrame].size & 0x80000000)) return lFrame; return -1; } long AVIReadStream::NearestKeyFrame(long lFrame) { long lprev; if (sampsize) return lFrame; if (IsKeyFrame(lFrame)) return lFrame; lprev = PrevKeyFrame(lFrame); if (lprev < 0) return 0; else return lprev; } HRESULT AVIReadStream::FormatSize(long lFrame, long *plSize) { *plSize = psnData->lFormatLen; return 0; } HRESULT AVIReadStream::ReadFormat(long lFrame, void *pFormat, long *plSize) { if (!pFormat) { *plSize = psnData->lFormatLen; return 0; } if (*plSize < psnData->lFormatLen) { memcpy(pFormat, psnData->pFormat, *plSize); } else { memcpy(pFormat, psnData->pFormat, psnData->lFormatLen); *plSize = psnData->lFormatLen; } return 0; } bool AVIReadStream::isStreaming() { return psnData->cache && fStreamingActive; } bool AVIReadStream::isKeyframeOnly() { return psnData->keyframe_only; } bool AVIReadStream::getVBRInfo(double& bitrate_mean, double& bitrate_stddev, double& maxdev) { if (psnData->was_VBR) { bitrate_mean = psnData->bitrate_mean; bitrate_stddev = psnData->bitrate_stddev; maxdev = psnData->max_deviation; return true; } return false; } /////////////////////////////////////////////////////////////////////////// AVIReadHandler::AVIReadHandler(const wchar_t *s) : pAvisynthClipInfo(0) , bAggressivelyRecovered(false) { this->hFile = INVALID_HANDLE_VALUE; this->hFileUnbuffered = INVALID_HANDLE_VALUE; this->paf = NULL; ref_count = 1; streams=0; fStreamsActive = 0; fDisableFastIO = false; streamBuffer = NULL; nRealTime = 0; nActiveStreamers = 0; fFakeIndex = false; nFiles = 1; nCurrentFile = 0; pSegmentHint = NULL; if (!g_disklockinited) { g_disklockinited=true; InitializeCriticalSection(&g_diskcs); } _construct(s); } AVIReadHandler::AVIReadHandler(PAVIFILE paf) { this->hFile = INVALID_HANDLE_VALUE; this->hFileUnbuffered = INVALID_HANDLE_VALUE; this->paf = paf; ref_count = 1; streams=0; streamBuffer = NULL; pSegmentHint = NULL; fFakeIndex = false; if (FAILED(paf->QueryInterface(IID_IAvisynthClipInfo, (void **)&pAvisynthClipInfo))) pAvisynthClipInfo = NULL; else { const char *s; if (pAvisynthClipInfo->GetError(&s)) { char* msg = _strdup(s); pAvisynthClipInfo->Release(); paf->Release(); try { throw MyError("Avisynth open failure:%s\n", msg); } catch (...) { free(msg); throw; } } } } AVIReadHandler::~AVIReadHandler() { _destruct(); } void AVIReadHandler::_construct(const wchar_t *pszFile_w) { try { AVIFileDesc *pDesc; // open file hFile = CreateFileW(pszFile_w, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (INVALID_HANDLE_VALUE == hFile) throw MyWin32Error("Couldn't open %s: %%s", GetLastError(), WideCharToAnsi(pszFile_w).get()); hFileUnbuffered = CreateFileW( pszFile_w, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, NULL ); i64FilePosition = 0; // recursively parse file _parseFile(listStreams); // Create first link if (!(pDesc = new(std::nothrow) AVIFileDesc)) throw MyMemoryError(); pDesc->hFile = hFile; pDesc->hFileUnbuffered = hFileUnbuffered; pDesc->i64Size = i64Size = _sizeFile(); listFiles.AddHead(pDesc); } catch(...) { _destruct(); throw; } } bool AVIReadHandler::AppendFile(const wchar_t *pszFile_w) { List2 newstreams; AVIStreamNode *pasn_old, *pasn_new, *pasn_old_next=NULL, *pasn_new_next=NULL; AVIFileDesc *pDesc; nCurrentFile = -1; // open file hFile = CreateFileW(pszFile_w, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (INVALID_HANDLE_VALUE == hFile) throw MyWin32Error("Couldn't open %s: %%s", GetLastError(), WideCharToAnsi(pszFile_w).get()); hFileUnbuffered = CreateFileW( pszFile_w, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, NULL ); try { _parseFile(newstreams); pasn_old = listStreams.AtHead(); pasn_new = newstreams.AtHead(); while(!!(pasn_old_next = pasn_old->NextFromHead()) && !!(pasn_new_next = pasn_new->NextFromHead())) { const char *szPrefix; switch(pasn_old->hdr.fccType) { case streamtypeAUDIO: szPrefix = "Cannot append segment: The audio streams "; break; case streamtypeVIDEO: szPrefix = "Cannot append segment: The video streams "; break; case MAKEFOURCC('i', 'v', 'a', 's'): szPrefix = "Cannot append segment: The DV streams "; break; default: szPrefix = ""; break; } // If it's not an audio or video stream, why do we care? if (szPrefix) { // allow ivas as a synonym for vids FOURCC fccOld = pasn_old->hdr.fccType; FOURCC fccNew = pasn_new->hdr.fccType; if (fccOld != fccNew) throw MyError("Cannot append segment: The stream types do not match."); // if (pasn_old->hdr.fccHandler != pasn_new->hdr.fccHandler) // throw MyError("%suse incompatible compression types.", szPrefix); // A/B ?= C/D ==> AD ?= BC if ((__int64)pasn_old->hdr.dwScale * pasn_new->hdr.dwRate != (__int64)pasn_new->hdr.dwScale * pasn_old->hdr.dwRate) throw MyError("%shave different sampling rates (%.5f vs. %.5f)" ,szPrefix ,(double)pasn_old->hdr.dwRate / pasn_old->hdr.dwScale ,(double)pasn_new->hdr.dwRate / pasn_new->hdr.dwScale ); if (pasn_old->hdr.dwSampleSize != pasn_new->hdr.dwSampleSize) throw MyError("%shave different block sizes (%d vs %d).", szPrefix, pasn_old->hdr.dwSampleSize, pasn_new->hdr.dwSampleSize); // I hate PCMWAVEFORMAT. bool fOk = pasn_old->lFormatLen == pasn_new->lFormatLen && !memcmp(pasn_old->pFormat, pasn_new->pFormat, pasn_old->lFormatLen); if (pasn_old->hdr.fccType == streamtypeAUDIO) if (((WAVEFORMATEX *)pasn_old->pFormat)->wFormatTag == WAVE_FORMAT_PCM && ((WAVEFORMATEX *)pasn_new->pFormat)->wFormatTag == WAVE_FORMAT_PCM) fOk = !memcmp(pasn_old->pFormat, pasn_new->pFormat, sizeof(PCMWAVEFORMAT)); if (!fOk) throw MyError("%shave different data formats.", szPrefix); } pasn_old = pasn_old_next; pasn_new = pasn_new_next; } if (pasn_old_next || pasn_new_next) throw MyError("Cannot append segment: The segment has a different number of streams."); if (!(pDesc = new(std::nothrow) AVIFileDesc)) throw MyMemoryError(); pDesc->hFile = hFile; pDesc->hFileUnbuffered = hFileUnbuffered; pDesc->i64Size = _sizeFile(); } catch(const AvisynthError&) { while((pasn_new = newstreams.RemoveHead())) delete pasn_new; CloseHandle(hFile); if (hFileUnbuffered != INVALID_HANDLE_VALUE) CloseHandle(hFileUnbuffered); throw; } // Accept segment; begin merging process. pasn_old = listStreams.AtHead(); while((pasn_old_next = pasn_old->NextFromHead())) { pasn_new = newstreams.RemoveHead(); // Fix up header. pasn_old->hdr.dwLength += pasn_new->hdr.dwLength; if (pasn_new->hdr.dwSuggestedBufferSize > pasn_old->hdr.dwSuggestedBufferSize) pasn_old->hdr.dwSuggestedBufferSize = pasn_new->hdr.dwSuggestedBufferSize; pasn_old->bytes += pasn_new->bytes; pasn_old->frames += pasn_new->frames; pasn_old->length += pasn_new->length; // Merge indices. int oldlen = pasn_old->index.indexLen(); AVIIndexEntry2 *idx_old = pasn_old->index.takeIndex2(); AVIIndexEntry2 *idx_new = pasn_new->index.index2Ptr(); int i; pasn_old->index.clear(); for(i=0; iindex.add(&idx_old[i]); } delete[] idx_old; for(i=pasn_new->index.indexLen(); i; i--) { idx_new->size ^= 0x80000000; idx_new->pos += (__int64)nFiles << 48; pasn_old->index.add(idx_new++); } pasn_old->index.makeIndex2(); // Notify all handlers. AVIReadStream *pStream, *pStreamNext; pStream = pasn_old->listHandlers.AtHead(); while((pStreamNext = pStream->NextFromHead())) { pStream->Reinit(); pStream = pStreamNext; } // Next! pasn_old = pasn_old_next; delete pasn_new; } ++nFiles; listFiles.AddTail(pDesc); return true; } void AVIReadHandler::_parseFile(List2& streamlist) { FOURCC fccType; DWORD dwLength; bool index_found = false; bool fAcceptIndexOnly = true; bool hyperindexed = false; bool bScanRequired = false; AVIStreamNode *pasn, *pasn_next; __int64 i64ChunkMoviPos = 0; DWORD dwChunkMoviLength = 0; if (!_readChunkHeader(fccType, dwLength)) throw MyError("Invalid AVI file: File is less than 8 bytes"); if (fccType != FOURCC_RIFF) throw MyError("Invalid AVI file: Not a RIFF file"); // If the RIFF header is <4 bytes, assume it was an improperly closed // file. _readFile2(&fccType, 4); if (fccType != MAKEFOURCC('A', 'V', 'I', ' ')) throw MyError("Invalid AVI file: RIFF type is not 'AVI'"); // Aggressive mode recovery does extensive validation and searching to attempt to // recover an AVI. It is significantly slower, however. We place the flag here // so we can set it if something dreadfully wrong is with the AVI. bool bAggressive = false; // begin parsing chunks while(_readChunkHeader(fccType, dwLength)) { // _RPT4(0,"%08I64x %08I64x Chunk '%-4s', length %08lx\n", _posFile()+dwLengthLeft, _posFile(), &fccType, dwLength); // Invalid FCCs are bad. If we find one, set the aggressive flag so if a scan // starts, we aggressively search for and validate data. if (!isValidFOURCC(fccType)) { bAggressive = true; break; } switch(fccType) { case FOURCC_LIST: _readFile2(&fccType, 4); // Some idiot Premiere plugin is writing AVI files with an invalid // size field in the LIST/hdrl chunk. if (dwLength<4 && fccType != listtypeAVIHEADER) throw MyError("Invalid AVI file: LIST chunk <4 bytes"); if (dwLength < 4) dwLength = 0; else dwLength -= 4; // _RPT1(0,"\tList type '%-4s'\n", &fccType); switch(fccType) { case MAKEFOURCC('m','o','v','i'): if (dwLength < 8) { i64ChunkMoviPos = _posFile(); dwChunkMoviLength = 0xFFFFFFF0; dwLength = 0; } else { i64ChunkMoviPos = _posFile(); dwChunkMoviLength = dwLength; } if (fAcceptIndexOnly) goto terminate_scan; break; case listtypeAVIHEADER: dwLength = 0; // silently enter the header block break; case listtypeSTREAMHEADER: if (!_parseStreamHeader(streamlist, dwLength, bScanRequired)) fAcceptIndexOnly = false; else hyperindexed = true; ++streams; dwLength = 0; break; } break; case ckidAVINEWINDEX: // idx1 if (!hyperindexed) { index_found = _parseIndexBlock(streamlist, dwLength/16, i64ChunkMoviPos); dwLength &= 15; } break; case ckidAVIPADDING: // JUNK break; case MAKEFOURCC('s', 'e', 'g', 'm'): // VirtualDub segment hint block delete [] pSegmentHint; if (!(pSegmentHint = new(std::nothrow) char[dwLength])) throw MyMemoryError(); _readFile2(pSegmentHint, dwLength); if (dwLength&1) _skipFile2(1); dwLength = 0; break; } if (dwLength) { if (!_skipFile2(dwLength + (dwLength&1))) break; } // Quit as soon as we see the index block. if (fccType == ckidAVINEWINDEX) break; } if (i64ChunkMoviPos == 0) throw MyError("This AVI file doesn't have a movie data block (movi)!"); terminate_scan: if (!hyperindexed && !index_found) bScanRequired = true; if (bScanRequired) { // It's possible that we were in the middle of reading an index when an error // occurred, so we need to clear all of the indices for all streams. pasn = streamlist.AtHead(); while((pasn_next = pasn->NextFromHead())) { pasn->index.clear(); pasn = pasn_next; } // obtain length of file and limit scanning if so __int64 i64FileSize = _sizeFile(); DWORD dwLengthLeft = dwChunkMoviLength; // long short_length = (long)((dwChunkMoviLength + 1023i64) >> 10); // long long_length = (long)((i64FileSize - i64ChunkMoviPos + 1023i64) >> 10); // __int64 length = (hyperindexed || bAggressive) ? long_length : short_length; // ProgressDialog pd(NULL, "AVI Import Filter", bAggressive ? "Reconstructing missing index block (aggressive mode)" : "Reconstructing missing index block", length, true); // pd.setValueFormat("%ldK of %ldK"); fFakeIndex = true; _seekFile(i64ChunkMoviPos); // For standard AVI files, stop as soon as the movi chunk is exhausted or // the end of the AVI file is hit. For OpenDML files, continue as long as // valid chunks are found. bool bStopWhenLengthExhausted = !hyperindexed && !bAggressive; for(;;) { // pd.advance((long)((_posFile() - i64ChunkMoviPos)/1024)); // pd.check(); // Exit if we are out of movi chunk -- except for OpenDML files. if (!bStopWhenLengthExhausted && dwLengthLeft < 8) break; // Validate the FOURCC itself but avoid validating the size, since it // may be too large for the last LIST/movi. if (!_readChunkHeader(fccType, dwLength)) break; bool bValid = isValidFOURCC(fccType) && ((_posFile() + dwLength) <= i64FileSize); // In aggressive mode, verify that a valid FOURCC follows this chunk. if (bAggressive) { int64_t current_pos = _posFile(); int64_t rounded_length = (dwLength+1LL) & ~1LL; if (current_pos + dwLength > i64FileSize) bValid = false; else if (current_pos + rounded_length <= i64FileSize-8) { FOURCC fccNext; DWORD dwLengthNext; _seekFile(current_pos + rounded_length); if (!_readChunkHeader(fccNext, dwLengthNext)) break; bValid &= isValidFOURCC(fccNext) && ((_posFile() + dwLengthNext) <= i64FileSize); _seekFile(current_pos); } } if (!bValid) { // Notify the user that recovering this file requires stronger measures. if (!bAggressive) { bAggressive = true; bStopWhenLengthExhausted = false; // pd.setCaption("Reconstructing missing index block (aggressive mode)"); // pd.setLimit(long_length); } // Backup by seven bytes and continue. _seekFile(_posFile()-7); continue; } int stream; // _RPT2(0,"(stream header) Chunk '%-4s', length %08lx\n", &fccType, dwLength); dwLengthLeft -= 8+(dwLength + (dwLength&1)); // Skip over the chunk. Don't skip over RIFF chunks of type AVIX, or // LIST chunks of type 'movi'. if (dwLength) { if (fccType == MAKEFOURCC('R','I','F','F') || fccType == MAKEFOURCC('L','I','S','T')) { FOURCC fccType2; if (!_readFile(&fccType2, 4)) break; if (fccType2 != MAKEFOURCC('A','V','I','X') && fccType2 != MAKEFOURCC('m','o','v','i')) { if (!_skipFile2(dwLength + (dwLength&1) - 4)) break; } } else { if (!_skipFile2(dwLength + (dwLength&1))) break; } } if (_posFile() > i64FileSize) break; if (isxdigit(fccType&0xff) && isxdigit((fccType>>8)&0xff)) { stream = StreamFromFOURCC(fccType); if (stream >=0 && stream < streams) { pasn = streamlist.AtHead(); while(stream-- && (pasn_next = pasn->NextFromHead())) pasn = pasn_next; if (pasn && pasn_next) { // Set the keyframe flag for the first sample in the stream, or // if this is known to be a keyframe-only stream. Do not set the // keyframe flag if the frame has zero bytes (drop frame). pasn->index.add(fccType, _posFile()-(dwLength + (dwLength&1))-8, dwLength, (!pasn->bytes || pasn->keyframe_only) && dwLength>0); pasn->bytes += dwLength; } } } } } bAggressivelyRecovered |= bAggressive; // glue together indices pasn = streamlist.AtHead(); while((pasn_next = pasn->NextFromHead())) { if (!pasn->index.makeIndex2()) throw MyMemoryError(); pasn->frames = pasn->index.indexLen(); // Clear sample size for video streams! if (pasn->hdr.fccType == streamtypeVIDEO) pasn->hdr.dwSampleSize=0; // Sample size == nBlockAlign for audio if (pasn->hdr.fccType == streamtypeAUDIO) { const AVIIndexEntry2 *pIdx = pasn->index.index2Ptr(); long nBlockAlign = ((WAVEFORMATEX *)pasn->pFormat)->nBlockAlign; pasn->hdr.dwSampleSize = nBlockAlign; for(int i=0; iframes; ++i) { long s = pIdx[i].size & 0x7FFFFFFF; if (s && s < nBlockAlign) { pasn->FixVBRAudio(); break; } } } if (pasn->hdr.dwSampleSize) pasn->length = (long)pasn->bytes / pasn->hdr.dwSampleSize; else pasn->length = pasn->frames; pasn = pasn_next; } // throw MyError("Parse complete. Aborting."); } bool AVIReadHandler::_parseStreamHeader(List2& streamlist, DWORD dwLengthLeft, bool& bIndexDamaged) { AVIStreamNode *pasn; FOURCC fccType; DWORD dwLength; bool hyperindexed = false; if (!(pasn = new(std::nothrow) AVIStreamNode())) throw MyMemoryError(); try { while(dwLengthLeft >= 8 && _readChunkHeader(fccType, dwLength)) { // _RPT2(0,"(stream header) Chunk '%-4s', length %08lx\n", &fccType, dwLength); dwLengthLeft -= 8; if (dwLength > dwLengthLeft) throw MyError("Invalid AVI file: chunk size extends outside of parent"); dwLengthLeft -= (dwLength + (dwLength&1)); switch(fccType) { case ckidSTREAMHEADER: memset(&pasn->hdr, 0, sizeof pasn->hdr); if (dwLength < sizeof pasn->hdr) { _readFile2(&pasn->hdr, dwLength); if (dwLength & 1) _skipFile(1); } else { _readFile2(&pasn->hdr, sizeof pasn->hdr); _skipFile(dwLength+(dwLength&1) - sizeof pasn->hdr); } dwLength = 0; pasn->keyframe_only = false; break; case ckidSTREAMFORMAT: if (!(pasn->pFormat = new(std::nothrow) char[pasn->lFormatLen = dwLength])) throw MyMemoryError(); _readFile2(pasn->pFormat, dwLength); if (pasn->hdr.fccType == streamtypeVIDEO) { switch(((BITMAPINFOHEADER *)pasn->pFormat)->biCompression) { case 0: case MAKEFOURCC('R', 'A', 'W', ' '): // ' WAR' case MAKEFOURCC('D', 'I', 'B', ' '): // ' BID' case MAKEFOURCC('d', 'm', 'b', '1'): // '1bmd' case MAKEFOURCC('m', 'j', 'p', 'g'): // 'gpjm' case MAKEFOURCC('M', 'J', 'P', 'G'): // 'GPJM' case MAKEFOURCC('V', 'Y', 'U', 'Y'): // 'YUYV' case MAKEFOURCC('Y', 'U', 'Y', '2'): // '2YUY' case MAKEFOURCC('U', 'Y', 'V', 'Y'): // 'YVYU' case MAKEFOURCC('Y', 'V', 'Y', 'U'): // 'UYVY' case MAKEFOURCC('Y', 'V', '1', '2'): // '21VY' case MAKEFOURCC('Y', 'V', '1', '6'): // '61VY' case MAKEFOURCC('Y', 'V', '2', '4'): // '42VY' case MAKEFOURCC('Y', '4', '1', 'B'): // 'B14Y' case MAKEFOURCC('Y', '8', '0', '0'): // '008Y' case MAKEFOURCC('Y', '8', ' ', ' '): // ' 8Y' case MAKEFOURCC('I', '4', '2', '0'): // '024I' case MAKEFOURCC('Y', '4', '1', 'P'): // 'P14Y' case MAKEFOURCC('c', 'y', 'u', 'v'): // 'vuyc' case MAKEFOURCC('H', 'F', 'Y', 'U'): // 'UYFH' case MAKEFOURCC('b', 't', '2', '0'): // '02tb' pasn->keyframe_only = true; } } if (dwLength & 1) _skipFile(1); dwLength = 0; break; case MAKEFOURCC('i', 'n', 'd', 'x'): // OpenDML extended index { __int64 posFileSave = _posFile(); try { _parseExtendedIndexBlock(streamlist, pasn, -1, dwLength); } catch(const AvisynthError&) { bIndexDamaged = true; } _seekFile(posFileSave); } hyperindexed = true; break; case ckidAVIPADDING: // JUNK break; } if (dwLength) { if (!_skipFile2(dwLength + (dwLength&1))) break; } } if (dwLengthLeft) _skipFile2(dwLengthLeft); } catch(...) { delete pasn; throw; } // _RPT1(0,"Found stream: type %s\n", pasn->hdr.fccType==streamtypeVIDEO ? "video" : pasn->hdr.fccType==streamtypeAUDIO ? "audio" : "unknown"); streamlist.AddTail(pasn); return hyperindexed; } bool AVIReadHandler::_parseIndexBlock(List2& streamlist, int count, __int64 movi_offset) { AVIINDEXENTRY avie[32]; AVIStreamNode *pasn, *pasn_next; bool absolute_addr = true; // Some AVI files have relative addresses in their AVI index chunks, and some // relative. They're supposed to be relative to the 'movi' chunk; all versions // of VirtualDub using fast write routines prior to build 4936 generate absolute // addresses (oops). AVIFile and ActiveMovie are both ambivalent. I guess we'd // better be as well. while(count > 0) { int tc = count; int i; if (tc>32) tc=32; count -= tc; if (tc*int(sizeof(AVIINDEXENTRY)) != _readFile(avie, tc*sizeof(AVIINDEXENTRY))) { pasn = streamlist.AtHead(); while((pasn_next = pasn->NextFromHead())) { pasn->index.clear(); pasn->bytes = 0; pasn = pasn_next; } return false; } for(i=0; iNextFromHead()) && stream--) pasn = pasn_next; if (pasn && pasn_next) { if (absolute_addr) pasn->index.add(&avie[i]); else pasn->index.add(avie[i].ckid, (movi_offset-4) + (__int64)avie[i].dwChunkOffset, avie[i].dwChunkLength, !!(avie[i].dwFlags & AVIIF_KEYFRAME)); pasn->bytes += avie[i].dwChunkLength; } } } return true; } void AVIReadHandler::_parseExtendedIndexBlock(List2& streamlist, AVIStreamNode *pasn, __int64 fpos, DWORD dwLength) { #pragma warning( push ) #pragma warning (disable: 4815) // zero-sized array in stack object will have no elements union { AVISUPERINDEX idxsuper; AVISTDINDEX idxstd; }; #pragma warning( pop ) union { struct _avisuperindex_entry superent[64]; DWORD dwHeap[256]; }; int entries, tp; int i; __int64 i64FPSave = _posFile(); if (fpos>=0) _seekFile(fpos); _readFile2((char *)&idxsuper + 8, sizeof(AVISUPERINDEX) - 8); switch(idxsuper.bIndexType) { case AVI_INDEX_OF_INDEXES: // sanity check if (idxsuper.wLongsPerEntry != 4) throw MyError("Invalid superindex block in stream"); // if (idxsuper.bIndexSubType != 0) // throw MyError("Field indexes not supported"); entries = idxsuper.nEntriesInUse; while(entries > 0) { tp = sizeof superent / sizeof superent[0]; if (tp>entries) tp=entries; _readFile2(superent, tp*sizeof superent[0]); for(i=0; i 0) { tp = (sizeof dwHeap / sizeof dwHeap[0]) / idxstd.wLongsPerEntry; if (tp>entries) tp=entries; _readFile2(dwHeap, tp*idxstd.wLongsPerEntry*sizeof(DWORD)); if (idxstd.wLongsPerEntry == 6) for(i=0; iindex.add(idxstd.dwChunkId, (idxstd.qwBaseOffset+dwOffset)-8, dwSize, true); pasn->bytes += dwSize; } else for(i=0; iindex.add(idxstd.dwChunkId, (idxstd.qwBaseOffset+dwOffset)-8, dwSize&0x7FFFFFFF, !(dwSize&0x80000000)); pasn->bytes += dwSize & 0x7FFFFFFF; } entries -= tp; } } break; default: throw MyError("Unknown hyperindex type"); } _seekFile(i64FPSave); } void AVIReadHandler::_destruct() { AVIStreamNode *pasn; AVIFileDesc *pDesc; if (pAvisynthClipInfo) pAvisynthClipInfo->Release(); if (paf) AVIFileRelease(paf); while((pasn = listStreams.RemoveTail())) delete pasn; delete streamBuffer; if (listFiles.IsEmpty()) { if (hFile != INVALID_HANDLE_VALUE) CloseHandle(hFile); if (hFileUnbuffered != INVALID_HANDLE_VALUE) CloseHandle(hFileUnbuffered); } else while((pDesc = listFiles.RemoveTail())) { CloseHandle(pDesc->hFile); CloseHandle(pDesc->hFileUnbuffered); delete pDesc; } delete [] pSegmentHint; } /////////////////////////////////////////////////////////////////////////// void AVIReadHandler::Release() { if (!--ref_count) delete this; } void AVIReadHandler::AddRef() { ++ref_count; } IAVIReadStream *AVIReadHandler::GetStream(DWORD fccType, LONG lParam) { if (paf) { PAVISTREAM pas; HRESULT hr; hr = AVIFileGetStream(paf, &pas, fccType, lParam); if (FAILED(hr)) return NULL; return new AVIReadTunnelStream(this, pas, pAvisynthClipInfo); } else { AVIStreamNode *pasn, *pasn_next; int streamno = 0; pasn = listStreams.AtHead(); while((pasn_next = pasn->NextFromHead())) { if (pasn->hdr.fccType == fccType && !lParam--) break; pasn = pasn_next; ++streamno; } if (pasn_next) { return new AVIReadStream(this, pasn, streamno); } return NULL; } } void AVIReadHandler::EnableFastIO(bool f) { fDisableFastIO = !f; } bool AVIReadHandler::isOptimizedForRealtime() { return nRealTime!=0; } bool AVIReadHandler::isStreaming() { return nActiveStreamers!=0; } bool AVIReadHandler::isIndexFabricated() { return fFakeIndex; } bool AVIReadHandler::getSegmentHint(const char **ppszPath) { if (!pSegmentHint) { if (ppszPath) *ppszPath = NULL; return false; } if (ppszPath) *ppszPath = pSegmentHint+1; return !!pSegmentHint[0]; } /////////////////////////////////////////////////////////////////////////// void AVIReadHandler::EnableStreaming(int stream) { if (!fStreamsActive) { if (!(streamBuffer = new(std::nothrow) char[STREAM_SIZE])) throw MyMemoryError(); i64StreamPosition = -1; sbPosition = sbSize = 0; } fStreamsActive |= (1<>48)) _SelectFile((int)(i64StreamPosition>>48)); if (sbPosition >= sbSize) { if (nRealTime || (((i64StreamPosition&0x0000FFFFFFFFFFFFLL)+sbSize) & -STREAM_BLOCK_SIZE)+STREAM_SIZE > i64Size) { i64StreamPosition += sbSize; sbPosition = 0; _seekFile(i64StreamPosition & 0x0000FFFFFFFFFFFFLL); sbSize = _readFile(streamBuffer, STREAM_RT_SIZE); if (sbSize < 0) { sbSize = 0; throw MyWin32Error("Failure streaming AVI file: %%s.",GetLastError()); } } else { i64StreamPosition += sbSize; sbPosition = (int)i64StreamPosition & (STREAM_BLOCK_SIZE-1); i64StreamPosition &= -STREAM_BLOCK_SIZE; _seekFileUnbuffered(i64StreamPosition & 0x0000FFFFFFFFFFFFLL); sbSize = _readFileUnbuffered(streamBuffer, STREAM_SIZE); if (sbSize < 0) { sbSize = 0; throw MyWin32Error("Failure streaming AVI file: %%s.",GetLastError()); } } } if (sbPosition >= sbSize) return NULL; if (bytes > sbSize - sbPosition) bytes = sbSize - sbPosition; sbPosition += bytes; return streamBuffer + sbPosition - bytes; } bool AVIReadHandler::Stream(AVIStreamNode *pusher, __int64 pos) { // Do not stream aggressively recovered files. if (bAggressivelyRecovered) return false; bool read_something = false; if (!streamBuffer) return false; if (i64StreamPosition == -1) { i64StreamPosition = pos; sbPosition = 0; } if (pos < i64StreamPosition+sbPosition) return false; // >4Mb past current position!? if (pos > i64StreamPosition+sbPosition+4194304) { // OutputDebugString("Resetting streaming position!\n"); i64StreamPosition = pos; sbSize = sbPosition = 0; } /* if (pusher->hdr.fccType == 'sdiv') OutputDebugString("pushed by video\n"); else OutputDebugString("pushed by audio\n");*/ ++pusher->stream_pushes; pusher->stream_push_pos = pos; while(pos >= i64StreamPosition+sbPosition) { long actual, left; char *src; FOURCC hdr[2]; int stream; // read next header left = 8; while(left > 0) { actual = left; src = _StreamRead(actual); if (!src) return read_something; memcpy((char *)hdr + (8-left), src, actual); left -= actual; } stream = StreamFromFOURCC(hdr[0]); if (isxdigit(hdr[0]&0xff) && isxdigit((hdr[0]>>8)&0xff) && stream<32 && ((1L<NextFromHead())) { if (streamno == stream) { long left = hdr[1] + (hdr[1]&1); bool fWrite = pasn->cache->WriteBegin(i64StreamPosition + sbPosition, left); char *dst; while(left > 0) { actual = left; dst = _StreamRead(actual); if (!dst) { if (fWrite) pasn->cache->WriteEnd(); return read_something; } if (fWrite) pasn->cache->Write(dst, actual); left -= actual; } if (fWrite) pasn->cache->WriteEnd(); read_something = true; break; } pasn = pasn_next; ++streamno; } } else { if (hdr[0] != FOURCC_LIST && hdr[0] != FOURCC_RIFF) { long actual; // skip chunk left = hdr[1] + (hdr[1] & 1); // Determine if the chunk is overly large. If the chunk is too large, don't // stream through it. if (left > 262144) return read_something; while(left > 0) { actual = left; if (!_StreamRead(actual)) return read_something; left -= actual; } } else { left = 4; while(left > 0) { actual = left; if (!_StreamRead(actual)) return read_something; left -= actual; } } } } return true; } __int64 AVIReadHandler::getStreamPtr() { return i64StreamPosition + sbPosition; } void AVIReadHandler::FixCacheProblems(AVIReadStream *arse) { AVIStreamNode *pasn, *pasn_next; // The simplest fix is simply to disable caching on the stream that's // cache-missing. However, this is a bad idea if the problem is a low-bandwidth // audio stream that's outrunning a high-bandwidth video stream behind it. // Check the streaming leader, and if the streaming leader is comparatively // low bandwidth and running at least 512K ahead of the cache-missing stream, // disable its cache. AVIStreamNode *stream_leader = NULL; int stream_leader_no=0; int streamno=0; pasn = listStreams.AtHead(); while((pasn_next = pasn->NextFromHead())) { if (pasn->cache) if (!stream_leader || pasn->stream_pushes > stream_leader->stream_pushes) { stream_leader = pasn; stream_leader_no = streamno; } pasn = pasn_next; ++streamno; } if (stream_leader && stream_leader->stream_bytes*2 < arse->psnData->stream_bytes && stream_leader->stream_push_pos >= arse->psnData->stream_push_pos+524288) { #ifdef STREAMING_DEBUG OutputDebugString("caching disabled on fast puny leader\n"); #endif delete stream_leader->cache; stream_leader->cache = NULL; DisableStreaming(stream_leader_no); i64StreamPosition = -1; sbPosition = sbSize = 0; } else { #ifdef STREAMING_DEBUG OutputDebugString("disabling caching at request of client\n"); #endif arse->EndStreaming(); if (arse->psnData == stream_leader) { i64StreamPosition = -1; sbPosition = sbSize = 0; } } // Reset cache statistics on all caches. pasn = listStreams.AtHead(); while((pasn_next = pasn->NextFromHead())) { if (pasn->cache) pasn->cache->ResetStatistics(); pasn = pasn_next; } } long AVIReadHandler::ReadData(int stream, void *buffer, __int64 position, long len) { if (nCurrentFile<0 || nCurrentFile != (int)(position>>48)) _SelectFile((int)(position>>48)); // _RPT3(0,"Reading from file %d, position %I64x, size %d\n", nCurrentFile, position, len); if (!_seekFile2(position & 0x0000FFFFFFFFFFFFLL)) return -1; return _readFile(buffer, len); } void AVIReadHandler::_SelectFile(int file) { AVIFileDesc *pDesc, *pDesc_next; nCurrentFile = file; pDesc = listFiles.AtHead(); while((pDesc_next = pDesc->NextFromHead()) && file--) pDesc = pDesc_next; hFile = pDesc->hFile; hFileUnbuffered = pDesc->hFileUnbuffered; i64Size = pDesc->i64Size; } ================================================ FILE: avs_core/filters/AviSource/AVIReadHandler.h ================================================ // VirtualDub - Video processing and capture application // Copyright (C) 1998-2001 Avery Lee // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #ifndef f_AVIREADHANDLER_H #define f_AVIREADHANDLER_H #include #include // These are meant as AVIFile replacements. They're not quite to AVIFile // specs, but they'll do for now. class IAVIReadStream { public: virtual ~IAVIReadStream(); virtual HRESULT BeginStreaming(long lStart, long lEnd, long lRate)=0; virtual HRESULT EndStreaming()=0; virtual HRESULT Info(AVISTREAMINFO *pasi, long lSize)=0; virtual bool IsKeyFrame(long lFrame)=0; virtual HRESULT Read(long lStart, long lSamples, void *lpBuffer, long cbBuffer, long *plBytes, long *plSamples)=0; virtual long Start()=0; virtual long End()=0; virtual long PrevKeyFrame(long lFrame)=0; virtual long NextKeyFrame(long lFrame)=0; virtual long NearestKeyFrame(long lFrame)=0; virtual HRESULT FormatSize(long lFrame, long *plSize)=0; virtual HRESULT ReadFormat(long lFrame, void *pFormat, long *plSize)=0; virtual bool isStreaming()=0; virtual bool isKeyframeOnly()=0; virtual bool getVBRInfo(double& bitrate_mean, double& bitrate_stddev, double& maxdev)=0; }; class IAVIReadHandler { public: virtual void AddRef()=0; virtual void Release()=0; virtual IAVIReadStream *GetStream(DWORD fccType, LONG lParam)=0; virtual void EnableFastIO(bool)=0; virtual bool isOptimizedForRealtime()=0; virtual bool isStreaming()=0; virtual bool isIndexFabricated()=0; virtual bool AppendFile(const wchar_t *pszFile)=0; virtual bool getSegmentHint(const char **ppszPath)=0; }; IAVIReadHandler *CreateAVIReadHandler(PAVIFILE paf); IAVIReadHandler *CreateAVIReadHandler(const wchar_t *pszFile); #endif ================================================ FILE: avs_core/filters/AviSource/AudioSource.cpp ================================================ // VirtualDub - Video processing and capture application // Copyright (C) 1998-2001 Avery Lee // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. //#include "gui.h" #include "AudioSource.h" #include "AVIReadHandler.h" //extern HWND g_hWnd; // TODO: Remove in 1.5.0 // #pragma warning(disable: 4018) // signed/unsigned mismatch AudioSourceWAV::AudioSourceWAV(char *szFile, LONG inputBufferSize) { MMIOINFO mmi; memset(&mmi,0,sizeof mmi); mmi.cchBuffer = inputBufferSize; hmmioFile = mmioOpen(szFile, &mmi, MMIO_READ | MMIO_ALLOCBUF); } AudioSourceWAV::~AudioSourceWAV() { mmioClose(hmmioFile, 0); } BOOL AudioSourceWAV::init() { if (!hmmioFile) return FALSE; chunkRIFF.fccType = mmioFOURCC('W','A','V','E'); if (MMSYSERR_NOERROR != mmioDescend(hmmioFile, &chunkRIFF, NULL, MMIO_FINDRIFF)) return FALSE; chunkDATA.ckid = mmioFOURCC('f','m','t',' '); if (MMSYSERR_NOERROR != mmioDescend(hmmioFile, &chunkDATA, &chunkRIFF, MMIO_FINDCHUNK)) return FALSE; if (!allocFormat(chunkDATA.cksize)) return FALSE; if (LONG(chunkDATA.cksize) != mmioRead(hmmioFile, (char *)getWaveFormat(), chunkDATA.cksize)) return FALSE; if (MMSYSERR_NOERROR != mmioAscend(hmmioFile, &chunkDATA, 0)) return FALSE; chunkDATA.ckid = mmioFOURCC('d','a','t','a'); if (MMSYSERR_NOERROR != mmioDescend(hmmioFile, &chunkDATA, &chunkRIFF, MMIO_FINDCHUNK)) return FALSE; bytesPerSample = getWaveFormat()->nBlockAlign; //getWaveFormat()->nAvgBytesPerSec / getWaveFormat()->nSamplesPerSec; lSampleFirst = 0; lSampleLast = chunkDATA.cksize / bytesPerSample; lCurrentSample = 0; streamInfo.fccType = streamtypeAUDIO; streamInfo.fccHandler = 0; streamInfo.dwFlags = 0; streamInfo.wPriority = 0; streamInfo.wLanguage = 0; streamInfo.dwInitialFrames = 0; streamInfo.dwScale = bytesPerSample; streamInfo.dwRate = getWaveFormat()->nAvgBytesPerSec; streamInfo.dwStart = 0; streamInfo.dwLength = chunkDATA.cksize / bytesPerSample; streamInfo.dwSuggestedBufferSize = 0; streamInfo.dwQuality = 0xffffffff; streamInfo.dwSampleSize = bytesPerSample; return TRUE; } int AudioSourceWAV::_read(LONG lStart, LONG lCount, LPVOID buffer, LONG cbBuffer, LONG *lBytesRead, LONG *lSamplesRead) { LONG lBytes = lCount * bytesPerSample; if (buffer) { if (lStart != lCurrentSample) if (-1 == mmioSeek(hmmioFile, chunkDATA.dwDataOffset + bytesPerSample*lStart, SEEK_SET)) return AVIERR_FILEREAD; if (lBytes != mmioRead(hmmioFile, (char *)buffer, lBytes)) return AVIERR_FILEREAD; lCurrentSample = lStart + lCount; } *lSamplesRead = lCount; *lBytesRead = lBytes; return AVIERR_OK; } /////////////////////////// AudioSourceAVI::AudioSourceAVI(IAVIReadHandler *pAVI, bool bAutomated, int atrack) { pAVIFile = pAVI; pAVIStream = NULL; bQuiet = bAutomated; // ugh, this needs to go... V1.5.0. audiotrack = atrack; } AudioSourceAVI::~AudioSourceAVI() { if (pAVIStream) delete pAVIStream; } BOOL AudioSourceAVI::init() { LONG format_len; pAVIStream = pAVIFile->GetStream(streamtypeAUDIO, audiotrack); if (!pAVIStream) return FALSE; if (FAILED(pAVIStream->Info(&streamInfo, sizeof streamInfo))) return FALSE; pAVIStream->FormatSize(0, &format_len); if (!allocFormat(format_len)) return FALSE; if (FAILED(pAVIStream->ReadFormat(0, getFormat(), &format_len))) return FALSE; lSampleFirst = pAVIStream->Start(); lSampleLast = pAVIStream->End(); if (!bQuiet) { double mean, stddev, maxdev; if (pAVIStream->getVBRInfo(mean, stddev, maxdev)) { /* guiMessageBoxF(g_hWnd, "VBR audio stream detected", MB_OK|MB_TASKMODAL|MB_SETFOREGROUND, "VirtualDub has detected an improper VBR audio encoding in the source AVI file and will rewrite the audio header " "with standard CBR values during processing for better compatibility. This may introduce up to %.0lf ms of skew " "from the video stream. If this is unacceptable, decompress the *entire* audio stream to an uncompressed WAV file " "and recompress with a constant bitrate encoder. " "(bitrate: %.1lf %.1lf kbps)" ,maxdev*1000.0,mean*0.001, stddev*0.001); */ } } return TRUE; } void AudioSourceAVI::Reinit() { pAVIStream->Info(&streamInfo, sizeof streamInfo); lSampleFirst = pAVIStream->Start(); lSampleLast = pAVIStream->End(); } bool AudioSourceAVI::isStreaming() { return pAVIStream->isStreaming(); } void AudioSourceAVI::streamBegin(bool fRealTime) { pAVIStream->BeginStreaming(lSampleFirst, lSampleLast, fRealTime ? 1000 : 2000); } void AudioSourceAVI::streamEnd() { pAVIStream->EndStreaming(); } BOOL AudioSourceAVI::_isKey(LONG lSample) { return pAVIStream->IsKeyFrame(lSample); } int AudioSourceAVI::_read(LONG lStart, LONG lCount, LPVOID lpBuffer, LONG cbBuffer, LONG *lpBytesRead, LONG *lpSamplesRead) { int err; long lBytes, lSamples; // There are some video clips roaming around with truncated audio streams // (audio streams that state their length as being longer than they // really are). We use a kludge here to get around the problem. err = pAVIStream->Read(lStart, lCount, lpBuffer, cbBuffer, lpBytesRead, lpSamplesRead); if (err != AVIERR_FILEREAD) return err; // Suspect a truncated stream. // // AVISTREAMREAD_CONVENIENT will tell us if we're actually encountering a // true read error or not. At least for the AVI handler, it returns // AVIERR_ERROR if we've broached the end. *lpBytesRead = *lpSamplesRead = 0; while(lCount > 0) { err = pAVIStream->Read(lStart, AVISTREAMREAD_CONVENIENT, NULL, 0, &lBytes, &lSamples); if (err) return 0; if (!lSamples) return AVIERR_OK; if (lSamples > lCount) lSamples = lCount; err = pAVIStream->Read(lStart, lSamples, lpBuffer, cbBuffer, &lBytes, &lSamples); if (err) return err; lpBuffer = (LPVOID)((char *)lpBuffer + lBytes); cbBuffer -= lBytes; lCount -= lSamples; *lpBytesRead += lBytes; *lpSamplesRead += lSamples; } return AVIERR_OK; } ================================================ FILE: avs_core/filters/AviSource/AudioSource.h ================================================ // VirtualDub - Video processing and capture application // Copyright (C) 1998-2001 Avery Lee // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #ifndef f_AUDIOSOURCE_H #define f_AUDIOSOURCE_H #include "DubSource.h" class IAVIReadHandler; class IAVIReadStream; class AudioSource : public DubSource { public: WAVEFORMATEX *getWaveFormat() { return (WAVEFORMATEX *)getFormat(); } }; class AudioSourceWAV : public AudioSource { private: HMMIO hmmioFile; MMCKINFO chunkRIFF; MMCKINFO chunkDATA; LONG lCurrentSample; LONG bytesPerSample; public: AudioSourceWAV(char *fn, LONG inputBufferSize); ~AudioSourceWAV(); BOOL init(); virtual int _read(LONG lStart, LONG lCount, LPVOID lpBuffer, LONG cbBuffer, LONG *lSamplesRead, LONG *lBytesRead); }; class AudioSourceAVI : public AudioSource { private: IAVIReadHandler *pAVIFile; IAVIReadStream *pAVIStream; bool bQuiet; int audiotrack; BOOL _isKey(LONG lSample); public: AudioSourceAVI(IAVIReadHandler *pAVIFile, bool bAutomated, int atrack); ~AudioSourceAVI(); void Reinit(); bool isStreaming(); void streamBegin(bool fRealTime); void streamEnd(); BOOL init(); int _read(LONG lStart, LONG lCount, LPVOID lpBuffer, LONG cbBuffer, LONG *lSamplesRead, LONG *lBytesRead); }; #endif ================================================ FILE: avs_core/filters/AviSource/DubSource.cpp ================================================ // VirtualDub - Video processing and capture application // Copyright (C) 1998-2001 Avery Lee // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include "DubSource.h" DubSource::DubSource() { format = NULL; } DubSource::~DubSource() { delete [] format; } BOOL DubSource::init() { return TRUE; } void *DubSource::allocFormat(int format_len) { delete [] format; this->format_len = format_len; return format = new char[format_len]; } bool DubSource::isStreaming() { return false; } int DubSource::read(LONG lStart, LONG lCount, LPVOID lpBuffer, LONG cbBuffer, LONG *lBytesRead, LONG *lSamplesRead) { if (lStart < lSampleFirst) return AVIERR_BADPARAM; if (lStart >= lSampleLast) { if (lSamplesRead) *lSamplesRead = 0; if (lBytesRead) *lBytesRead = 0; return 0; } if (lCount>0 && lCount > lSampleLast - lStart) lCount = lSampleLast - lStart; return _read(lStart, lCount, lpBuffer, cbBuffer, lBytesRead, lSamplesRead); } BOOL DubSource::isKey(LONG lSample) { if (lSample=lSampleLast) return TRUE; return _isKey(lSample); } BOOL DubSource::_isKey(LONG lSample) { return TRUE; } LONG DubSource::nearestKey(LONG lSample) { return lSample; } LONG DubSource::prevKey(LONG lSample) { return lSample <= lSampleFirst ? -1 : lSample-1; } LONG DubSource::nextKey(LONG lSample) { return lSample+1 >= lSampleFirst ? -1 : lSample+1; } void DubSource::streamBegin(bool fRealTime) { } void DubSource::streamEnd() { } ================================================ FILE: avs_core/filters/AviSource/DubSource.h ================================================ // VirtualDub - Video processing and capture application // Copyright (C) 1998-2001 Avery Lee // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #ifndef f_DUBSOURCE_H #define f_DUBSOURCE_H #include #include class InputFile; class DubSource { private: char *format; int format_len; protected: void *allocFormat(int format_len); virtual BOOL _isKey(LONG lSample); public: LONG lSampleFirst, lSampleLast; AVISTREAMINFO streamInfo; DubSource(); virtual ~DubSource(); virtual BOOL init(); int read(LONG lStart, LONG lCount, LPVOID lpBuffer, LONG cbBuffer, LONG *lBytesRead, LONG *lSamplesRead); virtual int _read(LONG lStart, LONG lCount, LPVOID lpBuffer, LONG cbBuffer, LONG *lBytesRead, LONG *lSamplesRead) = 0; void *getFormat() const { return format; } int getFormatLen() const { return format_len; } virtual bool isStreaming(); BOOL isKey(LONG lSample); virtual LONG nearestKey(LONG lSample); virtual LONG prevKey(LONG lSample); virtual LONG nextKey(LONG lSample); virtual void streamBegin( bool fRealTime); virtual void streamEnd(); LONG msToSamples(LONG lMs) const { return (LONG)(((__int64)lMs * streamInfo.dwRate + (__int64)500 * streamInfo.dwScale) / ((__int64)1000 * streamInfo.dwScale)); } LONG samplesToMs(LONG lSamples) const { return (LONG)( (((__int64)lSamples * streamInfo.dwScale) * 1000 + streamInfo.dwRate/2) / streamInfo.dwRate ); } // This is more accurate than AVIStreamSampleToSample(), which does a conversion to // milliseconds and back. static LONG samplesToSamples(const AVISTREAMINFO *dest, const AVISTREAMINFO *source, LONG lSamples) { __int64 divisor = (__int64)source->dwRate * dest->dwScale; return (LONG)((((__int64)lSamples * source->dwScale) * dest->dwRate + divisor/2) / divisor); } LONG samplesToSamples(const DubSource *source, LONG lSamples) const { return samplesToSamples(&streamInfo, &source->streamInfo, lSamples); } }; #endif ================================================ FILE: avs_core/filters/AviSource/Error.h ================================================ // Avisynth v1.0 beta. Copyright 2000 Ben Rudiak-Gould. // http://www.math.berkeley.edu/~benrg/avisynth.html #ifndef f_ERROR_H #define f_ERROR_H #include #include static inline AvisynthError MyMemoryError() { return AvisynthError("Out of memory"); } // the code for these is in AVIReadHandler.cpp AvisynthError MyError(const char* fmt, ...); AvisynthError MyWin32Error(const char *format, DWORD err, ...); #endif ================================================ FILE: avs_core/filters/AviSource/FastReadStream.cpp ================================================ // Packaged with Avisynth v1.0 beta. // http://www.math.berkeley.edu/~benrg/avisynth.html // VirtualDub - Video processing and capture application // Copyright (C) 1998-2000 Avery Lee // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include #include "FastReadStream.h" #include "Error.h" #include #include #include #pragma warning(disable: 4244) // conversion from __int64, possible loss of data class FastReadStreamHeader { public: __int64 i64BlockNo; long fAccessedBits; long lBytes; long lAge; long lHistoryVal; }; FastReadStream::FastReadStream(HANDLE hFile, long lBlockCount, long lBlockSize) { this->hFile = hFile; this->iFile = -1; _Init(lBlockCount, lBlockSize); } FastReadStream::FastReadStream(int iFile, long lBlockCount, long lBlockSize) { this->hFile = INVALID_HANDLE_VALUE; this->iFile = iFile; _Init(lBlockCount, lBlockSize); } void FastReadStream::_Init(long lBlockCount, long lBlockSize) { this->lBlockCount = lBlockCount; this->lBlockSize = (lBlockSize + 4095) & -4096; this->pHeaders = new FastReadStreamHeader[this->lBlockCount]; this->pBuffer = VirtualAlloc(NULL, this->lBlockCount * this->lBlockSize, MEM_COMMIT, PAGE_READWRITE); if (!this->pHeaders || !this->pBuffer) { delete this->pHeaders; if (this->pBuffer) VirtualFree(this->pBuffer, 0, MEM_RELEASE); this->pHeaders = NULL; this->pBuffer = NULL; } else { Flush(); } lHistory = 0; } bool FastReadStream::Ready() { return pHeaders && pBuffer; } FastReadStream::~FastReadStream() { delete pHeaders; if (pBuffer) VirtualFree(pBuffer, 0, MEM_RELEASE); } /////////////////////////////////////////////////////////////////////////// // #pragma function(memcpy) long FastReadStream::Read(int stream, __int64 i64Pos, void *pDest, long lBytes) { long lOffset, lActual = 0, lToCopy; __int64 i64BlockNo; char *pBuffer2 = (char *)pDest; int iCacheBlock; // First block number and offset... i64BlockNo = i64Pos / lBlockSize; lOffset = long(i64Pos % lBlockSize); // _RPT3(0,"Read request: %ld bytes, pos %I64x, first block %I64d\n", lBytes, i64Pos, i64BlockNo); while(lBytes) { long lInBlock; lToCopy = lBlockSize - lOffset; if (lToCopy > lBytes) lToCopy = lBytes; iCacheBlock = _Commit(stream, i64BlockNo); lInBlock = pHeaders[iCacheBlock].lBytes - lOffset; // _RPT4(0,"(%ld) Reading %ld from cache block %d, offset %ld\n", stream, lToCopy, iCacheBlock, lOffset); if (lInBlock < lToCopy) { if (lInBlock > 0) { memcpy(pBuffer2, (char *)pBuffer + iCacheBlock * lBlockSize + lOffset, lInBlock); lActual += lInBlock; } break; } else memcpy(pBuffer2, (char *)pBuffer + iCacheBlock * lBlockSize + lOffset, lToCopy); pBuffer2 += lToCopy; lBytes -= lToCopy; lActual += lToCopy; ++i64BlockNo; lOffset = 0; } return lActual; } void FastReadStream::Flush() { for(int i=0; i NotLone bits fStreamNotLoneBits |= fStreamEncounteredBits & pHeaders[i].fAccessedBits; fStreamEncounteredBits |= pHeaders[i].fAccessedBits; } // Look at the histories, and choose a few candidates. for(i=0; i pHeaders[iOurLowest].lAge) iOurLowest = i; // Global oldest block if (iGlobalLowest<0 || lThisHistory > pHeaders[iGlobalLowest].lAge) iGlobalLowest = i; // Preferred lowest block if (pHeaders[i].fAccessedBits & fStreamMask && !(pHeaders[i].fAccessedBits & ~fStreamNotLoneBits)) if (iPreferred<0 || lThisHistory > pHeaders[iPreferred].lAge) iPreferred = i; } return iPreferred>=0 ? iPreferred : iOurLowest>=0 ? iOurLowest : iGlobalLowest; } int FastReadStream::_Commit(int stream, __int64 i64BlockNo) { int iCacheBlock; int i; // Already have the block? for(i=0; i= 0) { int iActual; if (-1 == _lseeki64(iFile, i64BlockNo * lBlockSize, SEEK_SET)) throw MyError("FastRead seek error: %s.", strerror(errno)); iActual = _read(iFile, (char *)pBuffer + iCacheBlock * lBlockSize, lBlockSize); if (iActual < 0) throw MyError("FastRead read error: %s.", strerror(errno)); pHeaders[iCacheBlock].lBytes = iActual; } else { LONG lLow = (LONG)i64BlockNo*lBlockSize; LONG lHigh = (LONG)((i64BlockNo*lBlockSize) >> 32); DWORD err, dwActual; if (0xFFFFFFFF == SetFilePointer(hFile, lLow, &lHigh, FILE_BEGIN)) if ((err = GetLastError()) != NO_ERROR) throw MyWin32Error("FastRead seek error: %%s", GetLastError()); if (!ReadFile(hFile, (char *)pBuffer + iCacheBlock * lBlockSize, lBlockSize, &dwActual, NULL)) throw MyWin32Error("FastRead read error: %%s", GetLastError()); pHeaders[iCacheBlock].lBytes = dwActual; } pHeaders[iCacheBlock].i64BlockNo = i64BlockNo; pHeaders[iCacheBlock].fAccessedBits = 1L< class FastReadStreamHeader; class FastReadStream { public: FastReadStream(HANDLE hFile, long lBlockCount, long lBlockSize); FastReadStream(int iFile, long lBlockCount, long lBlockSize); virtual ~FastReadStream(); bool Ready(); long Read(int stream, __int64 i64Pos, void *pBuffer, long lBytes); void Flush(); private: HANDLE hFile; int iFile; long lBlockCount; long lBlockSize; long lHistory; FastReadStreamHeader *pHeaders; void *pBuffer; void _Init(long lBlockCount, long lBlockSize); int _PickVictim(int stream); int _Commit(int stream, __int64 i64BlockNo); }; #endif ================================================ FILE: avs_core/filters/AviSource/File64.cpp ================================================ // Packaged with Avisynth v1.0 beta. // http://www.math.berkeley.edu/~benrg/avisynth.html // VirtualDub - Video processing and capture application // Copyright (C) 1998-2000 Avery Lee // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include "Error.h" #include "File64.h" // hack... extern CRITICAL_SECTION g_diskcs; //////////// File64::File64() { } File64::File64(HANDLE _hFile, HANDLE _hFileUnbuffered) : hFile(_hFile), hFileUnbuffered(_hFileUnbuffered) { i64FilePosition = 0; } long File64::_readFile(void *data, long len) { DWORD dwActual; if (!ReadFile(hFile, data, len, &dwActual, NULL)) return -1; i64FilePosition += dwActual; return (long)dwActual; } void File64::_readFile2(void *data, long len) { long lActual = _readFile(data, len); if (lActual < 0) throw MyWin32Error("Failure reading file: %%s.",GetLastError()); if (lActual != len) throw MyError("Failure reading file: Unexpected end of file"); } bool File64::_readChunkHeader(FOURCC& pfcc, DWORD& pdwLen) { DWORD dw[2]; long actual; actual = _readFile(dw, 8); if (actual != 8) return false; pfcc = dw[0]; pdwLen = dw[1]; return true; } void File64::_seekFile(__int64 i64NewPos) { LONG lHi = (LONG)(i64NewPos>>32); DWORD dwError; if (0xFFFFFFFF == SetFilePointer(hFile, (LONG)i64NewPos, &lHi, FILE_BEGIN)) if ((dwError = GetLastError()) != NO_ERROR) throw MyWin32Error("File64: %%s", dwError); i64FilePosition = i64NewPos; } bool File64::_seekFile2(__int64 i64NewPos) { LONG lHi = (LONG)(i64NewPos>>32); DWORD dwError; // _RPT1(0,"Seeking to %" PRIu64 "\n", i64NewPos); if (0xFFFFFFFF == SetFilePointer(hFile, (LONG)i64NewPos, &lHi, FILE_BEGIN)) if ((dwError = GetLastError()) != NO_ERROR) return false; i64FilePosition = i64NewPos; return true; } void File64::_skipFile(__int64 bytes) { LONG lHi = (LONG)(bytes>>32); DWORD dwError; LONG lNewLow; if (0xFFFFFFFF == (lNewLow = SetFilePointer(hFile, (LONG)bytes, &lHi, FILE_CURRENT))) if ((dwError = GetLastError()) != NO_ERROR) throw MyWin32Error("File64: %%s", dwError); i64FilePosition = (unsigned long)lNewLow | (((__int64)(unsigned long)lHi)<<32); } bool File64::_skipFile2(__int64 bytes) { LONG lHi = (LONG)(bytes>>32); DWORD dwError; LONG lNewLow; if (0xFFFFFFFF == (lNewLow = SetFilePointer(hFile, (LONG)bytes, &lHi, FILE_CURRENT))) if ((dwError = GetLastError()) != NO_ERROR) return false; i64FilePosition = (unsigned long)lNewLow | (((__int64)(unsigned long)lHi)<<32); return true; } long File64::_readFileUnbuffered(void *data, long len) { DWORD dwActual; EnterCriticalSection(&g_diskcs); if (!ReadFile(hFileUnbuffered, data, len, &dwActual, NULL)) { LeaveCriticalSection(&g_diskcs); return -1; } LeaveCriticalSection(&g_diskcs); return (long)dwActual; } void File64::_seekFileUnbuffered(__int64 i64NewPos) { LONG lHi = (LONG)(i64NewPos>>32); DWORD dwError; if (0xFFFFFFFF == SetFilePointer(hFileUnbuffered, (LONG)i64NewPos, &lHi, FILE_BEGIN)) if ((dwError = GetLastError()) != NO_ERROR) throw MyWin32Error("File64: %%s", dwError); } __int64 File64::_posFile() { return i64FilePosition; } __int64 File64::_sizeFile() { DWORD dwLow, dwHigh; DWORD dwError; dwLow = GetFileSize(hFile, &dwHigh); if (dwLow == 0xFFFFFFFF && (dwError = GetLastError()) != NO_ERROR) throw MyWin32Error("Cannot determine file size: %%s", dwError); return ((__int64)dwHigh << 32) | (unsigned long)dwLow; } ================================================ FILE: avs_core/filters/AviSource/File64.h ================================================ // Packaged with Avisynth v1.0 beta. // http://www.math.berkeley.edu/~benrg/avisynth.html // VirtualDub - Video processing and capture application // Copyright (C) 1998-2000 Avery Lee // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #ifndef f_FILE64_H #define f_FILE64_H #include #include class File64 { public: HANDLE hFile, hFileUnbuffered; __int64 i64FilePosition; File64(); File64(HANDLE _hFile, HANDLE _hFileUnbuffered); long _readFile(void *data, long len); void _readFile2(void *data, long len); bool _readChunkHeader(FOURCC& pfcc, DWORD& pdwLen); void _seekFile(__int64 i64NewPos); bool _seekFile2(__int64 i64NewPos); void _skipFile(__int64 bytes); bool _skipFile2(__int64 bytes); long _readFileUnbuffered(void *data, long len); void _seekFileUnbuffered(__int64 i64NewPos); __int64 _posFile(); __int64 _sizeFile(); }; #endif ================================================ FILE: avs_core/filters/AviSource/Fixes.h ================================================ // Packaged with Avisynth v1.0 beta. // http://www.math.berkeley.edu/~benrg/avisynth.html // VirtualDub - Video processing and capture application // Copyright (C) 1998-2000 Avery Lee // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #ifndef f_FIXES_H #define f_FIXES_H // Those stupid idiots at Microsoft forgot to change this structure // when making the VfW headers for Win32. The result is that the // AVIStreamHeader is correct in 16-bit Windows, but the 32-bit // headers define RECT as LONGs instead of SHORTs. This creates // invalid AVI files!!!! typedef struct { SHORT left; SHORT top; SHORT right; SHORT bottom; } RECT16; typedef struct { FOURCC fccType; FOURCC fccHandler; DWORD dwFlags; WORD wPriority; WORD wLanguage; DWORD dwInitialFrames; DWORD dwScale; DWORD dwRate; DWORD dwStart; DWORD dwLength; DWORD dwSuggestedBufferSize; DWORD dwQuality; DWORD dwSampleSize; RECT16 rcFrame; } AVIStreamHeader_fixed; #endif ================================================ FILE: avs_core/filters/AviSource/VD_Audio.cpp ================================================ // VirtualDub - Video processing and capture application // Copyright (C) 1998-2001 Avery Lee // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. //#include "VirtualDub.h" #include #include #include #include //#include "gui.h" //#include "crash.h" #include "Error.h" #include #include "AudioSource.h" #include "VD_Audio.h" #pragma warning(disable: 4706) // assignment within conditional expression AudioFormatConverter AudioPickConverter(WAVEFORMATEX *src, BOOL to_16bit, BOOL to_stereo); //////////////// no change converters ///////////////////////////////////// static void convert_audio_nochange8(void *dest, void *src, long count) { memcpy(dest, src, count); } static void convert_audio_nochange16(void *dest, void *src, long count) { memcpy(dest, src, count*2); } static void convert_audio_nochange32(void *dest, void *src, long count) { memcpy(dest, src, count*4); } //////////////// regular converters ///////////////////////////////////// static void convert_audio_mono8_to_mono16(void *dest, void *src, long count) { unsigned char *s = (unsigned char *)src; signed short *d = (signed short *)dest; do { *d++ = (signed short)((unsigned long)(*s++-0x80)<<8); } while(--count); } static void convert_audio_mono8_to_stereo8(void *dest, void *src, long count) { unsigned char c,*s = (unsigned char *)src; unsigned char *d = (unsigned char *)dest; do { c = *s++; *d++ = c; *d++ = c; } while(--count); } static void convert_audio_mono8_to_stereo16(void *dest, void *src, long count) { unsigned char *s = (unsigned char *)src; unsigned long c, *d = (unsigned long *)dest; do { c = ((*s++-0x80)&0xff) << 8; *d++ = c | (c<<16); } while(--count); } static void convert_audio_mono16_to_mono8(void *dest, void *src, long count) { signed short *s = (signed short *)src; unsigned char *d = (unsigned char *)dest; do { *d++ = (unsigned char)((((unsigned long)*s++)+0x8000)>>8); } while(--count); } static void convert_audio_mono16_to_stereo8(void *dest, void *src, long count) { signed short *s = (signed short *)src; unsigned char c, *d = (unsigned char *)dest; do { c = (unsigned char)((((unsigned long)*s++)+0x8000)>>8); *d++ = c; *d++ = c; } while(--count); } static void convert_audio_mono16_to_stereo16(void *dest, void *src, long count) { signed short *s = (signed short *)src; unsigned long *d = (unsigned long *)dest, c; do { c = 0xffff & *s++; *d++ = (c | (c<<16)); } while(--count); } static void convert_audio_stereo8_to_mono8(void *dest, void *src, long count) { unsigned short *s = (unsigned short *)src; unsigned char *d = (unsigned char *)dest; unsigned long c; do { c = *s++; *d++ = (unsigned char)(((c&0xff) + (c>>8))/2); } while(--count); } static void convert_audio_stereo8_to_mono16(void *dest, void *src, long count) { unsigned short *s = (unsigned short *)src; signed short *d = (signed short *)dest; unsigned long c; do { c = *s++; *d++ = (signed short)((((c&0xff) + (c>>8))<<7)-0x8000); } while(--count); } static void convert_audio_stereo8_to_stereo16(void *dest, void *src, long count) { unsigned short c,*s = (unsigned short *)src; unsigned long *d = (unsigned long *)dest; do { c = *s++; *d++ = ((unsigned long)((c-0x80)&0xff)<<8) | ((unsigned long)((c&0xff00)-0x8000)<<16); } while(--count); } static void convert_audio_stereo16_to_mono8(void *dest, void *src, long count) { unsigned long c, *s = (unsigned long *)src; unsigned char *d = (unsigned char *)dest; do { c = *s++; *d++ = (unsigned char)(((((c&0xffff)+0xffff8000)^0xffff8000) + ((signed long)c>>16) + 0x10000)>>9); } while(--count); } static void convert_audio_stereo16_to_mono16(void *dest, void *src, long count) { unsigned long c, *s = (unsigned long *)src; signed short *d = (signed short *)dest; do { c = *s++; *d++ = (signed short)(((((c&0xffff)+0xffff8000)^0xffff8000) + ((signed long)c>>16))/2); } while(--count); } static void convert_audio_stereo16_to_stereo8(void *dest, void *src, long count) { unsigned long c,*s = (unsigned long *)src; unsigned char *d = (unsigned char *)dest; do { c = *s++; *d++ = (unsigned char)((((unsigned long)(c & 0xffff))+0x8000)>>8); *d++ = (unsigned char)((((unsigned long)(c>>16))+0x8000)>>8); } while(--count); } static void convert_audio_dual8_to_mono8(void *dest, void *src, long count) { const unsigned char *s = (unsigned char *)src; unsigned char *d = (unsigned char *)dest; do { *d++ = *s; s+=2; } while(--count); } static void convert_audio_dual8_to_mono16(void *dest, void *src, long count) { unsigned char *s = (unsigned char *)src; signed short *d = (signed short *)dest; do { *d++ = (signed short)((unsigned long)(*s-0x80)<<8); s += 2; } while(--count); } static void convert_audio_dual16_to_mono8(void *dest, void *src, long count) { signed short *s = (signed short *)src; unsigned char *d = (unsigned char *)dest; do { *d++ = (unsigned char)((((unsigned long)*s)+0x8000)>>8); s += 2; } while(--count); } static void convert_audio_dual16_to_mono16(void *dest, void *src, long count) { const signed short *s = (signed short *)src; signed short *d = (signed short *)dest; do { *d++ = *s; s+=2; } while(--count); } //////////////////////////////////////////// static const AudioFormatConverter acv[]={ convert_audio_nochange8, convert_audio_mono8_to_mono16, convert_audio_mono8_to_stereo8, convert_audio_mono8_to_stereo16, convert_audio_mono16_to_mono8, convert_audio_nochange16, convert_audio_mono16_to_stereo8, convert_audio_mono16_to_stereo16, convert_audio_stereo8_to_mono8, convert_audio_stereo8_to_mono16, convert_audio_nochange16, convert_audio_stereo8_to_stereo16, convert_audio_stereo16_to_mono8, convert_audio_stereo16_to_mono16, convert_audio_stereo16_to_stereo8, convert_audio_nochange32, }; static const AudioFormatConverter acv2[]={ convert_audio_nochange8, convert_audio_mono8_to_mono16, convert_audio_mono16_to_mono8, convert_audio_nochange16, convert_audio_dual8_to_mono8, convert_audio_dual8_to_mono16, convert_audio_dual16_to_mono8, convert_audio_dual16_to_mono16, }; AudioFormatConverter AudioPickConverter(WAVEFORMATEX *src, BOOL to_16bit, BOOL to_stereo) { return acv[ (src->nChannels>1 ? 8 : 0) +(src->wBitsPerSample>8 ? 4 : 0) +(to_stereo ? 2 : 0) +(to_16bit ? 1 : 0) ]; } AudioFormatConverter AudioPickConverterSingleChannel(WAVEFORMATEX *src, bool to_16bit) { return acv2[ (src->nChannels>1 ? 4 : 0) +(src->wBitsPerSample>8 ? 2 : 0) +(to_16bit ? 1 : 0) ]; } /////////////////////////////////// AudioStream::AudioStream() { format = NULL; format_len = 0; samples_read = 0; stream_limit = 0x7FFFFFFF; } AudioStream::~AudioStream() { free(format); } WAVEFORMATEX *AudioStream::AllocFormat(long len) { if (format) { free(format); format = 0; } if (!(format = (WAVEFORMATEX *)malloc(len))) throw MyError("AudioStream: Out of memory"); format_len = len; return format; } WAVEFORMATEX *AudioStream::GetFormat() { return format; } long AudioStream::GetFormatLen() { return format_len; } long AudioStream::GetSampleCount() { return samples_read; } long AudioStream::GetLength() { return stream_limit < stream_len ? stream_limit : stream_len; } long AudioStream::Read(void *buffer, long max_samples, long *lplBytes) { long actual; if (max_samples <= 0) { *lplBytes = 0; return 0; } if (samples_read >= stream_limit) { *lplBytes = 0; return 0; } if (samples_read + max_samples > stream_limit) max_samples = stream_limit - samples_read; actual = _Read(buffer, max_samples, lplBytes); _ASSERT(actual >= 0 && actual <= max_samples); samples_read += actual; return actual; } bool AudioStream::Skip(long samples) { return false; } void AudioStream::SetLimit(long limit) { _RPT1(0,"AudioStream: limit set to %ld\n",limit); stream_limit = limit; } void AudioStream::SetSource(AudioStream *src) { source = src; stream_len = src->GetLength(); } BOOL AudioStream::isEnd() { return samples_read >= stream_limit || _isEnd(); } long AudioStream::_Read(void *buffer, long max_samples, long *lplBytes) { *lplBytes = 0; return 0; } BOOL AudioStream::_isEnd() { return FALSE; } //////////////////// AudioStreamSource::AudioStreamSource(AudioSource *src, long first_samp, long max_samples, BOOL allow_decompression) : AudioStream() { WAVEFORMATEX *iFormat = src->getWaveFormat(); WAVEFORMATEX *oFormat; WAVEFORMATEX tFormat; MMRESULT res = 0; hACStream = NULL; inputBuffer = outputBuffer = NULL; fZeroRead = false; fStart = true; pwfexTempInput = NULL; lPreskip = 0; if (max_samples < 0) max_samples = 0; // Undo any Wave Format Extensible back to standard Wave FormatEx if (iFormat->wFormatTag == WAVE_FORMAT_EXTENSIBLE && iFormat->cbSize == sizeof(WAVEFORMATEXTENSIBLE)-sizeof(WAVEFORMATEX)) { memcpy(&tFormat, iFormat, sizeof(WAVEFORMATEX)); tFormat.cbSize = 0; tFormat.wFormatTag = (WORD)((WAVEFORMATEXTENSIBLE*)iFormat)->SubFormat.Data1; iFormat = &tFormat; } if (iFormat->wFormatTag != WAVE_FORMAT_PCM && iFormat->wFormatTag != WAVE_FORMAT_IEEE_FLOAT && allow_decompression) { DWORD dwOutputBufferSize; DWORD dwOutputFormatSize; DWORD dwSuggest=0; int i; if (!AllocFormat(sizeof(WAVEFORMATEX))) throw MyMemoryError(); if (acmMetrics(NULL, ACM_METRIC_MAX_SIZE_FORMAT, (LPVOID)&dwOutputFormatSize)) throw MyError("Couldn't get ACM's max format size"); oFormat = (WAVEFORMATEX *)malloc(dwOutputFormatSize); //AllocFormat(dwOutputFormatSize); if (!oFormat) throw MyMemoryError(); #define MAX_TRIES 10 for (i=0; i<=MAX_TRIES; i++) { switch (i) { case 0: oFormat->wFormatTag = WAVE_FORMAT_IEEE_FLOAT; oFormat->nChannels = iFormat->nChannels; oFormat->nSamplesPerSec = iFormat->nSamplesPerSec; dwSuggest = ACM_FORMATSUGGESTF_WFORMATTAG | ACM_FORMATSUGGESTF_NCHANNELS | ACM_FORMATSUGGESTF_NSAMPLESPERSEC; break; case 1: oFormat->nSamplesPerSec = 0; dwSuggest = ACM_FORMATSUGGESTF_WFORMATTAG | ACM_FORMATSUGGESTF_NCHANNELS; break; case 2: oFormat->nChannels = 0; dwSuggest = ACM_FORMATSUGGESTF_WFORMATTAG; break; case 3: oFormat->wFormatTag = WAVE_FORMAT_PCM; oFormat->nChannels = iFormat->nChannels; oFormat->wBitsPerSample = 32; oFormat->nSamplesPerSec = iFormat->nSamplesPerSec; dwSuggest = ACM_FORMATSUGGESTF_WFORMATTAG | ACM_FORMATSUGGESTF_NCHANNELS | ACM_FORMATSUGGESTF_WBITSPERSAMPLE | ACM_FORMATSUGGESTF_NSAMPLESPERSEC; break; case 4: oFormat->nSamplesPerSec = 0; dwSuggest = ACM_FORMATSUGGESTF_WFORMATTAG | ACM_FORMATSUGGESTF_NCHANNELS | ACM_FORMATSUGGESTF_WBITSPERSAMPLE; break; case 5: oFormat->wBitsPerSample = 24; break; case 6: oFormat->wBitsPerSample = 0; dwSuggest = ACM_FORMATSUGGESTF_WFORMATTAG | ACM_FORMATSUGGESTF_NCHANNELS; break; case 7: oFormat->nChannels = 0; oFormat->wBitsPerSample = 32; dwSuggest = ACM_FORMATSUGGESTF_WFORMATTAG | ACM_FORMATSUGGESTF_WBITSPERSAMPLE; break; case 8: oFormat->wBitsPerSample = 24; break; case 9: oFormat->wBitsPerSample = 0; dwSuggest = ACM_FORMATSUGGESTF_WFORMATTAG; break; // Hack to get Fraunhoffer MP3 codec to accept data when wBitsPerSample==16 case 10: if(iFormat->wFormatTag == 0x0055 && iFormat->wBitsPerSample != 0) { iFormat->wBitsPerSample = 0; break; } continue; default: break; } if (acmFormatSuggest(NULL, iFormat, oFormat, dwOutputFormatSize, dwSuggest)) continue; if (oFormat->wBitsPerSample!=8 && oFormat->wBitsPerSample!=16 && oFormat->wBitsPerSample!=24 && oFormat->wBitsPerSample!=32) oFormat->wBitsPerSample=16; if (oFormat->nChannels==0) oFormat->nChannels = 2; oFormat->nBlockAlign = (oFormat->wBitsPerSample/8) * oFormat->nChannels; oFormat->nAvgBytesPerSec = oFormat->nBlockAlign * oFormat->nSamplesPerSec; oFormat->cbSize = 0; if (!(res = acmStreamOpen(&hACStream, NULL, iFormat, oFormat, NULL, 0, 0, ACM_STREAMOPENF_NONREALTIME))) break; } if (res) { free(oFormat); if (res == ACMERR_NOTPOSSIBLE) { throw MyError( "Error initializing audio stream decompression:\n" "The requested conversion is not possible.\n" "\n" "Check to make sure you have the required codec%s." , (iFormat->wFormatTag&~1)==0x160 ? " (Microsoft Audio Codec)" : "" ); } else throw MyError("Error initializing audio stream decompression."); } if (i > MAX_TRIES) { free(oFormat); throw MyError("No compatible ACM codec to decode 0x%04X audio stream to PCM.", iFormat->wFormatTag); } memcpy(GetFormat(), oFormat, sizeof(WAVEFORMATEX)); free(oFormat); if (acmStreamSize(hACStream, INPUT_BUFFER_SIZE, &dwOutputBufferSize, ACM_STREAMSIZEF_SOURCE)) throw MyError("Error initializing audio stream output size."); if (!(inputBuffer = malloc(INPUT_BUFFER_SIZE)) || !(outputBuffer = malloc(dwOutputBufferSize))) throw MyMemoryError(); memset(&ashBuffer, 0, sizeof ashBuffer); ashBuffer.cbStruct = sizeof(ACMSTREAMHEADER); ashBuffer.pbSrc = (LPBYTE)inputBuffer; ashBuffer.cbSrcLength = INPUT_BUFFER_SIZE; ashBuffer.pbDst = (LPBYTE)outputBuffer; ashBuffer.cbDstLength = dwOutputBufferSize; if (acmStreamPrepareHeader(hACStream, &ashBuffer, 0)) throw MyError("Error preparing audio decompression buffers."); ashBuffer.cbSrcLength = 0; ashBuffer.cbDstLengthUsed = 0; } else { // FIX: If we have a PCMWAVEFORMAT stream, artificially cut the format size // to sizeof(PCMWAVEFORMAT). LSX-MPEG Encoder doesn't like large PCM // formats! if (iFormat->wFormatTag == WAVE_FORMAT_PCM) { oFormat = AllocFormat(sizeof(PCMWAVEFORMAT)); memcpy(oFormat, iFormat, sizeof(PCMWAVEFORMAT)); } else { oFormat = AllocFormat(src->getFormatLen()); memcpy(oFormat, iFormat, GetFormatLen()); } } aSrc = src; stream_len = min(max_samples, aSrc->lSampleLast - first_samp); if (hACStream) { stream_len = MulDiv(stream_len, GetFormat()->nSamplesPerSec * aSrc->getWaveFormat()->nBlockAlign, aSrc->getWaveFormat()->nAvgBytesPerSec); } cur_samp = first_samp; end_samp = first_samp + max_samples; } AudioStreamSource::~AudioStreamSource() { if (hACStream) { if (ashBuffer.fdwStatus & ACMSTREAMHEADER_STATUSF_PREPARED) { ashBuffer.cbSrcLength = INPUT_BUFFER_SIZE; acmStreamUnprepareHeader(hACStream, &ashBuffer, 0); } acmStreamClose(hACStream, 0); } if (inputBuffer) free(inputBuffer); if (outputBuffer) free(outputBuffer); delete[] pwfexTempInput; } long AudioStreamSource::_Read(void *buffer, long max_samples, long *lplBytes) { LONG lSamples=0; LONG lAddedBytes=0; LONG lAddedSamples=0; int err; MMRESULT res; // add filler samples as necessary if (cur_samp < 0) { long tc = -cur_samp; const int nBlockAlign = aSrc->getWaveFormat()->nBlockAlign; if (tc > max_samples) tc = max_samples; if (GetFormat()->nChannels > 1) memset(buffer, 0, nBlockAlign*tc); else memset(buffer, 0x80, nBlockAlign*tc); buffer = (char *)buffer + nBlockAlign*tc; max_samples -= tc; lAddedBytes = tc*nBlockAlign; lAddedSamples = tc; cur_samp += tc; } // read actual samples if (hACStream) { LONG ltActualBytes, ltActualSamples; LONG lBytesLeft = max_samples * GetFormat()->nBlockAlign; LONG lTotalBytes = lBytesLeft; const int nBlockAlign = aSrc->getWaveFormat()->nBlockAlign; while(lBytesLeft > 0) { // hmm... data still in the output buffer? if (ashBuffer.cbDstLengthUsed>0) { long tc = min(lBytesLeft, long(ashBuffer.cbDstLengthUsed)); if (lPreskip) { if (tc > lPreskip) tc = lPreskip; lPreskip -= tc; } else { memcpy(buffer, outputBufferPtr, tc); buffer = (void *)((char *)buffer + tc); lBytesLeft -= tc; } outputBufferPtr += tc; ashBuffer.cbDstLengthUsed -= tc; continue; } // fill the input buffer up... if we haven't gotten a zero yet. if (ashBuffer.cbSrcLength < INPUT_BUFFER_SIZE && !fZeroRead) { LONG lBytes=0; do { LONG to_read = (INPUT_BUFFER_SIZE - ashBuffer.cbSrcLength)/nBlockAlign; if (to_read > end_samp - cur_samp) to_read = end_samp - cur_samp; err = aSrc->read(cur_samp, to_read, (char *)inputBuffer + ashBuffer.cbSrcLength, INPUT_BUFFER_SIZE - ashBuffer.cbSrcLength, <ActualBytes, <ActualSamples); if (err != AVIERR_OK && err != AVIERR_BUFFERTOOSMALL) { if (err == AVIERR_FILEREAD) throw MyError("Audio samples %lu-%lu could not be read in the source. The file may be corrupted.", cur_samp, cur_samp+to_read-1); else throw MyWin32Error("AudioStreamSource", err); } cur_samp += ltActualSamples; // _RPT1(0,"Read to %ld\n", cur_samp); ashBuffer.cbSrcLength += ltActualBytes; lBytes += ltActualBytes; } while(err != AVIERR_BUFFERTOOSMALL && ashBuffer.cbSrcLength < INPUT_BUFFER_SIZE && ltActualBytes && cur_samp < end_samp); if (!lBytes) fZeroRead = true; } // ask ACM to convert for us ashBuffer.cbSrcLengthUsed = 0; ashBuffer.cbDstLengthUsed = 0; // VDCHECKPOINT; if (ashBuffer.cbSrcLength) { res = acmStreamConvert(hACStream, &ashBuffer, (fStart ? ACM_STREAMCONVERTF_START : 0) | ACM_STREAMCONVERTF_BLOCKALIGN); if (res) throw MyError("ACM reported error on audio decompress (%lx)", res); } // VDCHECKPOINT; fStart = false; _RPT2(0,"Converted %ld bytes to %ld\n", ashBuffer.cbSrcLengthUsed, ashBuffer.cbDstLengthUsed); if (!ashBuffer.cbSrcLengthUsed && fZeroRead) break; // if ACM didn't use all the source data, copy the remainder down if (ashBuffer.cbSrcLengthUsed < ashBuffer.cbSrcLength) { long left = ashBuffer.cbSrcLength - ashBuffer.cbSrcLengthUsed; memmove(inputBuffer, (char *)inputBuffer + ashBuffer.cbSrcLengthUsed, left); ashBuffer.cbSrcLength = left; } else ashBuffer.cbSrcLength = 0; outputBufferPtr = (char *)outputBuffer; }; *lplBytes = (lTotalBytes - lBytesLeft) + lAddedBytes; return *lplBytes / GetFormat()->nBlockAlign + lAddedSamples; } else { if (max_samples > end_samp - cur_samp) max_samples = end_samp - cur_samp; if (max_samples) { if (AVIERR_OK != (err = aSrc->read(cur_samp, max_samples, buffer, 0x7FFFFFFFL, lplBytes, &lSamples))) { if (err == AVIERR_FILEREAD) throw MyError("Audio samples %lu-%lu could not be read in the source. The file may be corrupted.", cur_samp, cur_samp+max_samples-1); else throw MyWin32Error("AudioStreamSource", err); } } else lSamples = *lplBytes = 0; *lplBytes += lAddedBytes; cur_samp += lSamples; return lSamples + lAddedSamples; } } bool AudioStreamSource::Skip(long samples) { // nBlockAlign = bytes per block. // // nAvgBytesPerSec / nBlockAlign = blocks per second. // nSamplesPerSec * nBlockAlign / nAvgBytesPerSec = samples per block. if (hACStream) { const WAVEFORMATEX *pwfex = aSrc->getWaveFormat(); if (samples < MulDiv(4*pwfex->nBlockAlign, pwfex->nSamplesPerSec, pwfex->nAvgBytesPerSec)) { lPreskip += samples*GetFormat()->nBlockAlign; return true; } // Flush input and output buffers. ashBuffer.cbSrcLength = 0; ashBuffer.cbDstLengthUsed = 0; // Trigger a reseek. long new_pos = long(((samples_read + samples) * (__int64)pwfex->nAvgBytesPerSec) / ((__int64)pwfex->nBlockAlign*pwfex->nSamplesPerSec)); if (new_pos > cur_samp) cur_samp = new_pos; fStart = true; // Skip fractional samples. long samp_start = long((new_pos * (__int64)pwfex->nSamplesPerSec*pwfex->nBlockAlign) / pwfex->nAvgBytesPerSec); lPreskip = ((samples_read + samples) - samp_start)*GetFormat()->nBlockAlign; samples_read = samp_start; return true; } else { cur_samp += samples; samples_read += samples; return true; } } bool AudioStreamSource::Seek(long samples) { // nBlockAlign = bytes per block. // // nAvgBytesPerSec / nBlockAlign = blocks per second. // nSamplesPerSec * nBlockAlign / nAvgBytesPerSec = samples per block. if (samples < end_samp) fZeroRead = false; if (hACStream) { const WAVEFORMATEX *pwfex = aSrc->getWaveFormat(); if (samples > samples_read && samples - samples_read < MulDiv(4*pwfex->nBlockAlign, pwfex->nSamplesPerSec, pwfex->nAvgBytesPerSec)) { lPreskip += (samples - samples_read)*GetFormat()->nBlockAlign; return true; } // Flush input and output buffers. ashBuffer.cbSrcLength = 0; ashBuffer.cbDstLengthUsed = 0; // Trigger a reseek. long new_pos = long((samples * (__int64)pwfex->nAvgBytesPerSec) / ((__int64)pwfex->nBlockAlign*pwfex->nSamplesPerSec)); cur_samp = new_pos; fStart = true; // Skip fractional samples. long samp_start = long((new_pos * (__int64)pwfex->nSamplesPerSec*pwfex->nBlockAlign) / pwfex->nAvgBytesPerSec); lPreskip = (samples - samp_start)*GetFormat()->nBlockAlign; samples_read = samp_start; return true; } else { cur_samp = samples; samples_read = samples; return true; } } BOOL AudioStreamSource::_isEnd() { return (cur_samp >= end_samp || fZeroRead) && (!hACStream || !ashBuffer.cbDstLengthUsed); } /////////////////////////////////////////////////////////////////////////// // // AudioStreamConverter // // This audio filter handles changes in format between 8/16-bit // and mono/stereo. // /////////////////////////////////////////////////////////////////////////// AudioStreamConverter::AudioStreamConverter(AudioStream *src, bool to_16bit, bool to_stereo_or_right, bool single_only) { WAVEFORMATEX *iFormat = src->GetFormat(); WAVEFORMATEX *oFormat; bool to_stereo = single_only ? false : to_stereo_or_right; memcpy(oFormat = AllocFormat(src->GetFormatLen()), iFormat, src->GetFormatLen()); oFormat->nChannels = to_stereo ? 2 : 1; oFormat->wBitsPerSample = to_16bit ? 16 : 8; bytesPerInputSample = (iFormat->nChannels>1 ? 2 : 1) * (iFormat->wBitsPerSample>8 ? 2 : 1); bytesPerOutputSample = (to_stereo ? 2 : 1) * (to_16bit ? 2 : 1); offset = 0; if (single_only) { convRout = AudioPickConverterSingleChannel(iFormat, to_16bit); if (to_stereo_or_right && iFormat->nChannels>1) { offset = 1; if (iFormat->wBitsPerSample>8) offset = 2; } } else convRout = AudioPickConverter(iFormat, to_16bit, to_stereo); SetSource(src); oFormat->nAvgBytesPerSec = oFormat->nSamplesPerSec * bytesPerOutputSample; oFormat->nBlockAlign = (WORD)bytesPerOutputSample; if (!(cbuffer = malloc(bytesPerInputSample * BUFFER_SIZE))) throw MyError("AudioStreamConverter: out of memory"); } AudioStreamConverter::~AudioStreamConverter() { free(cbuffer); } long AudioStreamConverter::_Read(void *buffer, long samples, long *lplBytes) { long lActualSamples=0; while(samples>0) { long srcSamples; long lBytes; // figure out how many source samples we need srcSamples = samples; if (srcSamples > BUFFER_SIZE) srcSamples = BUFFER_SIZE; srcSamples = source->Read(cbuffer, srcSamples, &lBytes); if (!srcSamples) break; convRout(buffer, (char *)cbuffer + offset, srcSamples); buffer = (void *)((char *)buffer + bytesPerOutputSample * srcSamples); lActualSamples += srcSamples; samples -= srcSamples; } *lplBytes = lActualSamples * bytesPerOutputSample; return lActualSamples; } BOOL AudioStreamConverter::_isEnd() { return source->isEnd(); } bool AudioStreamConverter::Skip(long samples) { return source->Skip(samples); } /////////////////////////////////////////////////////////////////////////// // // AudioStreamResampler // // This audio filter handles changes in sampling rate. // /////////////////////////////////////////////////////////////////////////// static long audio_pointsample_8(void *dst, void *src, long accum, long samp_frac, long cnt) { unsigned char *d = (unsigned char *)dst; unsigned char *s = (unsigned char *)src; do { *d++ = s[accum>>19]; accum += samp_frac; } while(--cnt); return accum; } static long audio_pointsample_16(void *dst, void *src, long accum, long samp_frac, long cnt) { unsigned short *d = (unsigned short *)dst; unsigned short *s = (unsigned short *)src; do { *d++ = s[accum>>19]; accum += samp_frac; } while(--cnt); return accum; } static long audio_pointsample_32(void *dst, void *src, long accum, long samp_frac, long cnt) { unsigned long *d = (unsigned long *)dst; unsigned long *s = (unsigned long *)src; do { *d++ = s[accum>>19]; accum += samp_frac; } while(--cnt); return accum; } static long audio_downsample_mono8(void *dst, void *src, long *filter_bank, int filter_width, long accum, long samp_frac, long cnt) { unsigned char *d = (unsigned char *)dst; unsigned char *s = (unsigned char *)src; do { long sum = 0; int w; long *fb_ptr; unsigned char *s_ptr; w = filter_width; fb_ptr = filter_bank + filter_width * ((accum>>11)&0xff); s_ptr = s + (accum>>19); do { sum += *fb_ptr++ * (int)*s_ptr++; } while(--w); if (sum < 0) *d++ = 0; else if (sum > 0x3fffff) *d++ = 0xff; else *d++ = (unsigned char)((sum + 0x2000)>>14); accum += samp_frac; } while(--cnt); return accum; } static long audio_downsample_mono16(void *dst, void *src, long *filter_bank, int filter_width, long accum, long samp_frac, long cnt) { signed short *d = (signed short *)dst; signed short *s = (signed short *)src; do { long sum = 0; int w; long *fb_ptr; signed short *s_ptr; w = filter_width; fb_ptr = filter_bank + filter_width * ((accum>>11)&0xff); s_ptr = s + (accum>>19); do { sum += *fb_ptr++ * (int)*s_ptr++; } while(--w); if (sum < -0x20000000) *d++ = -0x8000; else if (sum > 0x1fffffff) *d++ = 0x7fff; else *d++ = (short)((sum + 0x2000)>>14); accum += samp_frac; } while(--cnt); return accum; } static long audio_downsample_stereo8(void *dst, void *src, long *filter_bank, int filter_width, long accum, long samp_frac, long cnt) { unsigned char *d = (unsigned char *)dst; unsigned char *s = (unsigned char *)src; do { long sum_l = 0, sum_r = 0; int w; long *fb_ptr; unsigned char *s_ptr; w = filter_width; fb_ptr = filter_bank + filter_width * ((accum>>11)&0xff); s_ptr = s + (accum>>19)*2; do { long f = *fb_ptr++; sum_l += f * (int)*s_ptr++; sum_r += f * (int)*s_ptr++; } while(--w); if (sum_l < 0) *d++ = 0; else if (sum_l > 0x3fffff) *d++ = 0xff; else *d++ = (unsigned char)((sum_l + 0x2000)>>14); if (sum_r < 0) *d++ = 0; else if (sum_r > 0x3fffff) *d++ = 0xff; else *d++ = (unsigned char)((sum_r + 0x2000)>>14); accum += samp_frac; } while(--cnt); return accum; } static long audio_downsample_stereo16(void *dst, void *src, long *filter_bank, int filter_width, long accum, long samp_frac, long cnt) { signed short *d = (signed short *)dst; signed short *s = (signed short *)src; do { long sum_l = 0, sum_r = 0; int w; long *fb_ptr; signed short *s_ptr; w = filter_width; fb_ptr = filter_bank + filter_width * ((accum>>11)&0xff); s_ptr = s + (accum>>19)*2; do { long f = *fb_ptr++; sum_l += f * (int)*s_ptr++; sum_r += f * (int)*s_ptr++; } while(--w); if (sum_l < -0x20000000) *d++ = -0x8000; else if (sum_l > 0x1fffffff) *d++ = 0x7fff; else *d++ = (short)((sum_l + 0x2000)>>14); if (sum_r < -0x20000000) *d++ = -0x8000; else if (sum_r > 0x1fffffff) *d++ = 0x7fff; else *d++ = (short)((sum_r + 0x2000)>>14); accum += samp_frac; } while(--cnt); return accum; } static long audio_upsample_mono8(void *dst, void *src, long accum, long samp_frac, long cnt) { unsigned char *d = (unsigned char *)dst; unsigned char *s = (unsigned char *)src; do { unsigned char *s_ptr = s + (accum>>19); long frac = (accum>>3) & 0xffff; *d++ = (unsigned char)(((int)s_ptr[0] * (0x10000 - frac) + (int)s_ptr[1] * frac) >> 16); accum += samp_frac; } while(--cnt); return accum; } static long audio_upsample_mono16(void *dst, void *src, long accum, long samp_frac, long cnt) { signed short *d = (signed short *)dst; signed short *s = (signed short *)src; do { signed short *s_ptr = s + (accum>>19); long frac = (accum>>3) & 0xffff; *d++ = short(((int)s_ptr[0] * (0x10000 - frac) + (int)s_ptr[1] * frac) >> 16); accum += samp_frac; } while(--cnt); return accum; } static long audio_upsample_stereo8(void *dst, void *src, long accum, long samp_frac, long cnt) { unsigned char *d = (unsigned char *)dst; unsigned char *s = (unsigned char *)src; do { unsigned char *s_ptr = s + (accum>>19)*2; long frac = (accum>>3) & 0xffff; *d++ = (unsigned char)(((int)s_ptr[0] * (0x10000 - frac) + (int)s_ptr[2] * frac) >> 16); *d++ = (unsigned char)(((int)s_ptr[1] * (0x10000 - frac) + (int)s_ptr[3] * frac) >> 16); accum += samp_frac; } while(--cnt); return accum; } static long audio_upsample_stereo16(void *dst, void *src, long accum, long samp_frac, long cnt) { signed short *d = (signed short *)dst; signed short *s = (signed short *)src; do { signed short *s_ptr = s + (accum>>19)*2; long frac = (accum>>3) & 0xffff; *d++ = short(((int)s_ptr[0] * (0x10000 - frac) + (int)s_ptr[2] * frac) >> 16); *d++ = short(((int)s_ptr[1] * (0x10000 - frac) + (int)s_ptr[3] * frac) >> 16); accum += samp_frac; } while(--cnt); return accum; } static int permute_index(int a, int b) { return (b-(a>>8)-1) + (a&255)*b; } static void make_downsample_filter(long *filter_bank, int filter_width, long samp_frac) { int i, j, v; double filt_max; double filtwidth_frac; filtwidth_frac = samp_frac/2048.0; filter_bank[filter_width-1] = 0; filt_max = (16384.0 * 524288.0) / samp_frac; for(i=0; i<128*filter_width; i++) { int y = 0; double d = i / filtwidth_frac; if (d<1.0) y = (int)(0.5 + filt_max*(1.0 - d)); filter_bank[permute_index(128*filter_width + i, filter_width)] = filter_bank[permute_index(128*filter_width - i, filter_width)] = y; } // Normalize the filter to correct for integer roundoff errors for(i=0; i<256*filter_width; i+=filter_width) { v=0; for(j=0; jGetFormat(); WAVEFORMATEX *oFormat; memcpy(oFormat = AllocFormat(src->GetFormatLen()), iFormat, src->GetFormatLen()); if (oFormat->nChannels>1) if (oFormat->wBitsPerSample>8) { ptsampleRout = audio_pointsample_32; upsampleRout = audio_upsample_stereo16; dnsampleRout = audio_downsample_stereo16; } else { ptsampleRout = audio_pointsample_16; upsampleRout = audio_upsample_stereo8; dnsampleRout = audio_downsample_stereo8; } else if (oFormat->wBitsPerSample>8) { ptsampleRout = audio_pointsample_16; upsampleRout = audio_upsample_mono16; dnsampleRout = audio_downsample_mono16; } else { ptsampleRout = audio_pointsample_8; upsampleRout = audio_upsample_mono8; dnsampleRout = audio_downsample_mono8; } SetSource(src); bytesPerSample = (iFormat->nChannels>1 ? 2 : 1) * (iFormat->wBitsPerSample>8 ? 2 : 1); _RPT2(0,"AudioStreamResampler: converting from %ldHz to %ldHz\n", iFormat->nSamplesPerSec, new_rate); if (integral_conversion) if (new_rate > long(iFormat->nSamplesPerSec)) // samp_frac = MulDiv(0x10000, new_rate + iFormat->nSamplesPerSec/2, iFormat->nSamplesPerSec); samp_frac = 0x80000 / ((new_rate + iFormat->nSamplesPerSec/2) / iFormat->nSamplesPerSec); else samp_frac = 0x80000 * ((iFormat->nSamplesPerSec + new_rate/2) / new_rate); else samp_frac = MulDiv(iFormat->nSamplesPerSec, 0x80000L, new_rate); stream_len = MulDiv(stream_len, 0x80000L, samp_frac); oFormat->nSamplesPerSec = MulDiv(iFormat->nSamplesPerSec, 0x80000L, samp_frac); oFormat->nAvgBytesPerSec = oFormat->nSamplesPerSec * bytesPerSample; oFormat->nBlockAlign = (WORD)bytesPerSample; holdover = 0; filter_bank = NULL; filter_width = 1; accum=0; fHighQuality = hi_quality; if (!(cbuffer = malloc(bytesPerSample * BUFFER_SIZE))) throw MyMemoryError(); // Initialize the buffer. if (oFormat->wBitsPerSample>8) memset(cbuffer, 0x00, bytesPerSample * BUFFER_SIZE); else memset(cbuffer, 0x80, bytesPerSample * BUFFER_SIZE); // If this is a high-quality downsample, allocate memory for the filter bank if (hi_quality) { if (samp_frac>0x80000) { // HQ downsample: allocate filter bank filter_width = ((samp_frac + 0x7ffff)>>19)<<1; if (!(filter_bank = new(std::nothrow) long[filter_width * 256])) { free(cbuffer); throw MyMemoryError(); } make_downsample_filter(filter_bank, filter_width, samp_frac); // Clear lower samples if (oFormat->wBitsPerSample>8) memset(cbuffer, 0, bytesPerSample*filter_width); else memset(cbuffer, 0x80, bytesPerSample*filter_width); holdover = filter_width/2; } } } AudioStreamResampler::~AudioStreamResampler() { free(cbuffer); delete filter_bank; } long AudioStreamResampler::_Read(void *buffer, long samples, long *lplBytes) { if (samp_frac == 0x80000) return source->Read(buffer, samples, lplBytes); if (samp_frac < 0x80000) return Upsample(buffer, samples, lplBytes); else return Downsample(buffer, samples, lplBytes); } long AudioStreamResampler::Upsample(void *buffer, long samples, long *lplBytes) { long lActualSamples=0; // Upsampling: producing more output samples than input // // There are two issues we need to watch here: // // o An input sample can be read more than once. In particular, even // when point sampling, we may need the last input sample again. // // o When interpolating (HQ), we need one additional sample. while(samples>0) { long srcSamples, dstSamples; long lBytes; int holdover = 0; // A negative accum value indicates that we need to reprocess a sample. // The last iteration should have left it at the bottom of the buffer // for us. In interpolation mode, we'll always have at least a 1 // sample overlap. if (accum<0) { holdover = 1; accum += 0x80000; } if (fHighQuality) ++holdover; // figure out how many source samples we need srcSamples = (long)(((__int64)samp_frac*(samples-1) + accum) >> 19) + 1 - holdover; if (fHighQuality) ++srcSamples; if (srcSamples > BUFFER_SIZE-holdover) srcSamples = BUFFER_SIZE-holdover; srcSamples = source->Read((char *)cbuffer + holdover * bytesPerSample, srcSamples, &lBytes); if (!srcSamples) break; srcSamples += holdover; // figure out how many destination samples we'll get out of what we read if (fHighQuality) dstSamples = ((srcSamples<<19) - accum - 0x80001)/samp_frac + 1; else dstSamples = ((srcSamples<<19) - accum - 1)/samp_frac + 1; if (dstSamples > samples) dstSamples = samples; if (dstSamples>=1) { if (fHighQuality) accum = upsampleRout(buffer, cbuffer, accum, samp_frac, dstSamples); else accum = ptsampleRout(buffer, cbuffer, accum, samp_frac, dstSamples); buffer = (void *)((char *)buffer + bytesPerSample * dstSamples); lActualSamples += dstSamples; samples -= dstSamples; } if (fHighQuality) accum -= ((srcSamples-1)<<19); else accum -= (srcSamples<<19); // do we need to hold a sample over? if (fHighQuality) if (accum<0) memcpy(cbuffer, (char *)cbuffer + (srcSamples-2)*bytesPerSample, bytesPerSample*2); else memcpy(cbuffer, (char *)cbuffer + (srcSamples-1)*bytesPerSample, bytesPerSample); else if (accum<0) memcpy(cbuffer, (char *)cbuffer + (srcSamples-1)*bytesPerSample, bytesPerSample); } *lplBytes = lActualSamples * bytesPerSample; // _RPT2(0,"Converter: %ld samples, %ld bytes\n", lActualSamples, *lplBytes); return lActualSamples; } long AudioStreamResampler::Downsample(void *buffer, long samples, long *lplBytes) { long lActualSamples=0; // Downsampling is even worse because we have overlap to the left and to the // right of the interpolated point. // // We need (n/2) points to the left and (n/2-1) points to the right. while(samples>0) { long srcSamples, dstSamples; long lBytes; int nhold; // Figure out how many source samples we need. // // To do this, compute the highest fixed-point accumulator we'll reach. // Truncate that, and add the filter width. Then subtract however many // samples are sitting at the bottom of the buffer. srcSamples = (long)(((__int64)samp_frac*(samples-1) + accum) >> 19) + filter_width - holdover; // Don't exceed the buffer (BUFFER_SIZE - holdover). if (srcSamples > BUFFER_SIZE - holdover) srcSamples = BUFFER_SIZE - holdover; // Read into buffer. srcSamples = source->Read((char *)cbuffer + holdover*bytesPerSample, srcSamples, &lBytes); if (!srcSamples) break; // Figure out how many destination samples we'll get out of what we // read. We'll have (srcSamples+holdover) bytes, so the maximum // fixed-pt accumulator we can hit is // (srcSamples+holdover-filter_width)<<16 + 0xffff. dstSamples = (((srcSamples+holdover-filter_width)<<19) + 0x7ffff - accum) / samp_frac + 1; if (dstSamples > samples) dstSamples = samples; if (dstSamples>=1) { if (filter_bank) accum = dnsampleRout(buffer, cbuffer, filter_bank, filter_width, accum, samp_frac, dstSamples); else accum = ptsampleRout(buffer, cbuffer, accum, samp_frac, dstSamples); buffer = (void *)((char *)buffer + bytesPerSample * dstSamples); lActualSamples += dstSamples; samples -= dstSamples; } // We're "shifting" the new samples down to the bottom by discarding // all the samples in the buffer, so adjust the fixed-pt accum // accordingly. accum -= ((srcSamples+holdover)<<19); // Oops, did we need some of those? // // If accum=0, we need (n/2) samples back. accum>=0x10000 is fewer, // accum<0 is more. nhold = - (accum>>19); // _ASSERT(nhold<=(filter_width/2)); if (nhold>0) { memmove(cbuffer, (char *)cbuffer+bytesPerSample*(srcSamples+holdover-nhold), bytesPerSample*nhold); holdover = nhold; accum += nhold<<19; } else holdover = 0; _ASSERT(accum>=0); } *lplBytes = lActualSamples * bytesPerSample; return lActualSamples; } BOOL AudioStreamResampler::_isEnd() { return accum>=0 && source->isEnd(); } /////////////////////////////////////////////////////////////////////////// // // AudioCompressor // // This audio filter handles audio compression. // /////////////////////////////////////////////////////////////////////////// struct FrustratedACMOpenData { HACMSTREAM *pp; HACMDRIVER hdrv; WAVEFORMATEX *iFormat; WAVEFORMATEX *oFormat; bool success; }; BOOL CALLBACK ACMStreamOpenCallback(HACMDRIVERID hadid, DWORD_PTR dwInstance, DWORD fdwSupport) { FrustratedACMOpenData *pfad = (FrustratedACMOpenData *)dwInstance; // Ignore drivers that don't do format conversion. if (fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CODEC) { MMRESULT res; ACMDRIVERDETAILS add; memset(&add, 0, sizeof add); add.cbStruct = sizeof add; // Attempt to open driver. res = acmDriverOpen(&pfad->hdrv, hadid, 0); if (!res) { res = acmDriverDetails(hadid, &add, 0); if (!res) { _RPT1(0,"Trying driver: [%s]\n", add.szLongName); } // Attempt our stream open! res = acmStreamOpen(pfad->pp, pfad->hdrv, pfad->iFormat, pfad->oFormat, NULL, 0, 0, ACM_STREAMOPENF_NONREALTIME); if (!res) pfad->success = true; else { res = acmStreamOpen(pfad->pp, pfad->hdrv, pfad->iFormat, pfad->oFormat, NULL, 0, 0, 0); if (!res) pfad->success = true; else acmDriverClose(pfad->hdrv, 0); } } } return !pfad->success; } AudioCompressor::AudioCompressor(AudioStream *src, WAVEFORMATEX *dst_format, long dst_format_len) : AudioStream() { WAVEFORMATEX *iFormat = src->GetFormat(); WAVEFORMATEX *oFormat; DWORD dwOutputBufferSize; MMRESULT err; hADriver = NULL; hACStream = NULL; pwfexTempOutput = NULL; inputBuffer = outputBuffer = NULL; holdBuffer = NULL; holdBufferSize = 0; holdBufferOffset = 0; // Stupid Microsoft Audio Codec. oFormat = AllocFormat(dst_format_len); memcpy(oFormat, dst_format, dst_format_len); SetSource(src); memset(&ashBuffer, 0, sizeof ashBuffer); for (;;) { // Try opening with ACM_STREAMOPENF_NONREALTIME. if (!(err = acmStreamOpen(&hACStream, NULL, iFormat, oFormat, NULL, 0, 0, ACM_STREAMOPENF_NONREALTIME))) break; // Still didn't work, try every f*cking driver. struct FrustratedACMOpenData fad; fad.pp = &hACStream; fad.hdrv = NULL; fad.iFormat = iFormat; fad.oFormat = oFormat; fad.success = false; if (!acmDriverEnum(ACMStreamOpenCallback, (DWORD_PTR)&fad, 0) && fad.success) { hADriver = fad.hdrv; break; } // Damn! if (err == ACMERR_NOTPOSSIBLE) throw MyError("Error initializing audio stream compression:\nThe requested conversion is not possible."); else throw MyError("Error initializing audio stream compression."); } if (acmStreamSize(hACStream, INPUT_BUFFER_SIZE, &dwOutputBufferSize, ACM_STREAMSIZEF_SOURCE)) throw MyError("Error querying audio compression."); if (!(inputBuffer = malloc(INPUT_BUFFER_SIZE)) || !(outputBuffer = malloc(dwOutputBufferSize))) throw MyMemoryError(); ashBuffer.cbStruct = sizeof(ACMSTREAMHEADER); ashBuffer.pbSrc = (LPBYTE)inputBuffer; ashBuffer.cbSrcLength = INPUT_BUFFER_SIZE; ashBuffer.pbDst = (LPBYTE)outputBuffer; ashBuffer.cbDstLength = dwOutputBufferSize; if (acmStreamPrepareHeader(hACStream, &ashBuffer, 0)) throw MyError("Error preparing audio compression buffers."); ashBuffer.cbSrcLength = 0; bytesPerInputSample = iFormat->nBlockAlign; bytesPerOutputSample = oFormat->nBlockAlign; fStreamEnded = FALSE; } AudioCompressor::~AudioCompressor() { if (hACStream) { if (ashBuffer.fdwStatus & ACMSTREAMHEADER_STATUSF_PREPARED) acmStreamUnprepareHeader(hACStream, &ashBuffer, 0); acmStreamClose(hACStream, 0); } if (hADriver) acmDriverClose(hADriver, 0); if (inputBuffer) free(inputBuffer); if (outputBuffer) free(outputBuffer); if (holdBuffer) free(holdBuffer); delete[] pwfexTempOutput; } void AudioCompressor::CompensateForMP3() { // Fraunhofer-IIS's MP3 codec has a compression delay that we need to // compensate for. Comparison of PCM input, F-IIS output, and // WinAmp's Nitrane output reveals that the decompressor half of the // ACM codec is fine, but the compressor inserts a delay of 1373 // (0x571) samples at the start. This is a lag of 2 frames at // 30fps and 22KHz, so it's significant enough to be noticed. At // 11KHz, this becomes a tenth of a second. Needless to say, the // F-IIS MP3 codec is a royal piece of sh*t. // // By coincidence, the MPEGLAYER3WAVEFORMAT struct has a field // called nCodecDelay which is set to this value... if (GetFormat()->wFormatTag == WAVE_FORMAT_MPEGLAYER3) { long lSamplesToRead = ((MPEGLAYER3WAVEFORMAT *)GetFormat())->nCodecDelay; // Note: LameACM does not have a codec delay! if (lSamplesToRead) { long ltActualBytes, ltActualSamples; int nBlockAlign = source->GetFormat()->nBlockAlign; do { long tc; tc = lSamplesToRead; if (tc > INPUT_BUFFER_SIZE / nBlockAlign) tc = INPUT_BUFFER_SIZE / nBlockAlign; ltActualSamples = source->Read((char *)inputBuffer, tc, <ActualBytes); lSamplesToRead -= ltActualSamples; } while(lSamplesToRead>0 && ltActualBytes); if (!ltActualBytes || source->isEnd()) fStreamEnded = TRUE; } } } void AudioCompressor::ResizeHoldBuffer(long lNewSize) { void *holdBufferTemp; if (holdBufferSize >= lNewSize) return; if (!(holdBufferTemp = malloc(holdBufferSize = ((lNewSize + 65535) & -65536)))) throw MyError("AudioCompressor: Unable to resize hold buffer"); memcpy(holdBufferTemp, holdBuffer, holdBufferOffset); free(holdBuffer); holdBuffer = holdBufferTemp; } void AudioCompressor::WriteToHoldBuffer(void *data, long lBytes) { if (lBytes + holdBufferOffset > holdBufferSize) ResizeHoldBuffer(lBytes + holdBufferOffset); memcpy((char *)holdBuffer + holdBufferOffset, data, lBytes); holdBufferOffset += lBytes; } void *AudioCompressor::Compress(long lInputSamples, long *lplSrcInputSamples, long *lplOutputBytes, long *lplOutputSamples) { LONG ltActualSamples, ltActualBytes; LONG lActualSrcSamples = 0; // _RPT1(0,"Compressor: we want to convert %ld input samples\n", lInputSamples); holdBufferOffset = 0; while(lInputSamples > 0 && !fStreamEnded) { // fill the input buffer up! if (ashBuffer.cbSrcLength < INPUT_BUFFER_SIZE) { //LONG lBytes=0; long lSamplesToRead; do { lSamplesToRead = min(lInputSamples, (INPUT_BUFFER_SIZE - (long)ashBuffer.cbSrcLength)/bytesPerInputSample); ltActualSamples = source->Read((char *)inputBuffer + ashBuffer.cbSrcLength, lSamplesToRead, <ActualBytes); ashBuffer.cbSrcLength += ltActualBytes; //lBytes += ltActualBytes; lInputSamples -= ltActualSamples; lActualSrcSamples += ltActualSamples; _ASSERT(lInputSamples >= 0); } while(ashBuffer.cbSrcLength < INPUT_BUFFER_SIZE && lInputSamples>0 && ltActualBytes); if (!ltActualBytes || source->isEnd()) fStreamEnded = TRUE; } // ask ACM to convert for us ashBuffer.cbSrcLengthUsed = 0; ashBuffer.cbDstLengthUsed = 0; // _RPT2(0,"Converting %ld bytes to %ld\n", ashBuffer.cbSrcLength, ashBuffer.cbDstLength); // VDCHECKPOINT; if (acmStreamConvert(hACStream, &ashBuffer, fStreamEnded ? ACM_STREAMCONVERTF_END : ACM_STREAMCONVERTF_BLOCKALIGN)) throw MyError("Audio Compression Manager (ACM) failure on compress"); // VDCHECKPOINT; // _RPT2(0,"Converted %ld bytes to %ld\n", ashBuffer.cbSrcLengthUsed, ashBuffer.cbDstLengthUsed); // if ACM didn't use all the source data, copy the remainder down if (ashBuffer.cbSrcLengthUsed < ashBuffer.cbSrcLength) { long left = ashBuffer.cbSrcLength - ashBuffer.cbSrcLengthUsed; memmove(inputBuffer, (char *)inputBuffer + ashBuffer.cbSrcLengthUsed, left); ashBuffer.cbSrcLength = left; } else ashBuffer.cbSrcLength = 0; // chuck all pending data to the hold buffer WriteToHoldBuffer(outputBuffer, ashBuffer.cbDstLengthUsed); } *lplOutputBytes = holdBufferOffset; *lplOutputSamples = (holdBufferOffset + bytesPerOutputSample - 1) / bytesPerOutputSample; *lplSrcInputSamples = lActualSrcSamples; // _RPT2(0,"Compressor: %ld bytes, %ld samples\n", *lplOutputBytes, *lplOutputSamples); return holdBuffer; } BOOL AudioCompressor::isEnd() { return fStreamEnded; } /////////////////////////////////////////////////////////////////////////// // // Corrects the nAvgBytesPerFrame for that stupid Fraunhofer-IIS // codec. AudioL3Corrector::AudioL3Corrector() { samples = frame_bytes = 0; read_left = 4; header_mode = true; } long AudioL3Corrector::ComputeByterate(long sample_rate) { return MulDiv(frame_bytes, sample_rate, samples); } void AudioL3Corrector::Process(void *buffer, long bytes) { static const int bitrates[2][16]={ {0, 8,16,24,32,40,48,56, 64, 80, 96,112,128,144,160,0}, {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320,0} }; static const long samp_freq[4] = {44100, 48000, 32000, 0}; int cnt=0; int tc; while(cnt < bytes) { tc = bytes - cnt; if (tc > read_left) tc = read_left; if (header_mode) memcpy(&hdr_buffer[4-read_left], buffer, tc); buffer = (char *)buffer + tc; cnt += tc; read_left -= tc; if (read_left <= 0) { if (header_mode) { // We've got a header! Process it... long hdr = *(long *)hdr_buffer; long samp_rate, framelen; if ((hdr & 0xE0FF) != 0xE0FF) throw MyError("MPEG audio sync error: try disabling MPEG audio time correction"); samp_rate = samp_freq[(hdr >> 18) & 3]; if (!((hdr >> 11) & 1)) { samp_rate /= 2; samples += 576; } else { samples += 1152; } if (!(hdr & 0x1000)) samp_rate /= 2; framelen = (bitrates[(hdr >> 11) & 1][(hdr >> 20) & 15] * (((hdr >> 11) & 1) ? 144000 : 72000)) / samp_rate; if (hdr & 0x20000) ++framelen; // update statistics frame_bytes += framelen; // start skipping the remainder read_left = framelen - 4; header_mode = false; } else { // Done skipping frame data; collect the next header read_left = 4; header_mode = true; } } } } /////////////////////////////////////////////////////////////////////////// /* long AudioTranslateVideoSubset(FrameSubset& dst, FrameSubset& src, long usPerFrame, WAVEFORMATEX *pwfex) { FrameSubsetNode *fsn = src.getFirstFrame(); const __int64 i64usPerFrame = usPerFrame; const long lSampPerSec = pwfex->nSamplesPerSec; const long nBytesPerSec = pwfex->nAvgBytesPerSec; const int nBlockAlign = pwfex->nBlockAlign; long total = 0; // I like accuracy, so let's strive for accuracy. Accumulate errors as we go; // use them to offset the starting points of subsequent segments, never being // more than 1/2 segment off. // // The conversion equation is in units of (1000000*nBlockAlign). __int64 nError = 0; __int64 nMultiplier = i64usPerFrame * nBytesPerSec; __int64 nDivisor = 1000000i64*nBlockAlign; __int64 nRound = nDivisor/2; long nTotalFramesAccumulated = 0; while(fsn) { long start, end; // Compute error. // // Ideally, we want the audio and video streams to be of the exact length. // // Audiolen = (videolen * usPerFrame * nBytesPerSec) / (1000000*nBlockAlign); nError = total*nDivisor - (nTotalFramesAccumulated * nMultiplier); _RPT1(0,"nError = %I64d\n", nError); // Add a block. start = ((__int64)fsn->start * nMultiplier + nRound + nError) / nDivisor; end = ((__int64)(fsn->start + fsn->len) * nMultiplier + nRound) / nDivisor; nTotalFramesAccumulated += fsn->len; dst.addRange(start, end-start, false); total += end-start; fsn = src.getNextFrame(fsn); } return total; } AudioSubset::AudioSubset(AudioStream *src, FrameSubset *pfs, long usPerFrame, long preskew) : AudioStream() { memcpy(AllocFormat(src->GetFormatLen()), src->GetFormat(), src->GetFormatLen()); SetSource(src); #if 1 long total = AudioTranslateVideoSubset(subset, *pfs, usPerFrame, src->GetFormat()); #else while(fsn) { long start, end; // start = ((__int64)fsn->start * i64usPerFrame * lSampPerSec) / 1000000; // end = ((__int64)(fsn->start + fsn->len) * i64usPerFrame * lSampPerSec) / 1000000; start = ((__int64)fsn->start * i64usPerFrame * nBytesPerSec + 500000*nBlockAlign) / (1000000*nBlockAlign); end = ((__int64)(fsn->start + fsn->len) * i64usPerFrame * nBytesPerSec + 500000*nBlockAlign) / (1000000*nBlockAlign); subset.addRange(start, end-start); total += end-start; fsn = pfs->getNextFrame(fsn); } #endif subset.deleteRange(0, MulDiv(preskew, src->GetFormat()->nSamplesPerSec, 1000)); stream_len = total; SetLimit(total); pfsnCur = subset.getFirstFrame(); iOffset = 0; lSrcPos = 0; lSkipSize = sizeof skipBuffer / src->GetFormat()->nBlockAlign; } AudioSubset::~AudioSubset() { } long AudioSubset::_Read(void *buffer, long samples, long *lplBytes) { int offset, actual; if (!pfsnCur) { *lplBytes = 0; return 0; } while ((offset = pfsnCur->start - lSrcPos) > 0) { long t; if (source->Skip(offset)) { lSrcPos += offset; break; } if (offset > lSkipSize) offset = lSkipSize; actual = source->Read(skipBuffer, offset, &t); if (!actual) { *lplBytes = 0; return 0; } lSrcPos += actual; } if (samples > pfsnCur->len - iOffset) samples = pfsnCur->len - iOffset; samples = source->Read(buffer, samples, lplBytes); iOffset += samples; lSrcPos += samples; while (pfsnCur && iOffset >= pfsnCur->len) { iOffset -= pfsnCur->len; pfsnCur = subset.getNextFrame(pfsnCur); } return samples; } BOOL AudioSubset::_isEnd() { return !pfsnCur || source->isEnd(); } */ /////////////////////////////////////////////////////////////////////////// // // AudioAmplifier // /////////////////////////////////////////////////////////////////////////// static void amplify8(unsigned char *dst, int count, long lFactor) { long lBias = 0x8080 - 0x80*lFactor; if (count) do { int y = ((long)*dst++ * lFactor + lBias) >> 8; if (y<0) y=0; else if (y>255) y=255; dst[-1] = (unsigned char)y; } while(--count); } static void amplify16(signed short *dst, int count, long lFactor) { if (count) do { int y = ((long)*dst++ * lFactor + 0x80) >> 8; if (y<-0x7FFF) y=-0x7FFF; else if (y>0x7FFF) y=0x7FFF; dst[-1] = (signed short)y; } while(--count); } AudioStreamAmplifier::AudioStreamAmplifier(AudioStream *src, long _lFactor) : lFactor(_lFactor) { WAVEFORMATEX *iFormat = src->GetFormat(); WAVEFORMATEX *oFormat; memcpy(oFormat = AllocFormat(src->GetFormatLen()), iFormat, src->GetFormatLen()); SetSource(src); } AudioStreamAmplifier::~AudioStreamAmplifier() { } long AudioStreamAmplifier::_Read(void *buffer, long samples, long *lplBytes) { long lActualSamples=0; long lBytes; lActualSamples = source->Read(buffer, samples, &lBytes); if (lActualSamples) { if (GetFormat()->wBitsPerSample > 8) amplify16((signed short *)buffer, lBytes/2, lFactor); else amplify8((unsigned char *)buffer, lBytes, lFactor); } if (lplBytes) *lplBytes = lBytes; return lActualSamples; } BOOL AudioStreamAmplifier::_isEnd() { return source->isEnd(); } bool AudioStreamAmplifier::Skip(long samples) { return source->Skip(samples); } ================================================ FILE: avs_core/filters/AviSource/VD_Audio.h ================================================ // VirtualDub - Video processing and capture application // Copyright (C) 1998-2001 Avery Lee // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #ifndef f_AUDIO_H #define f_AUDIO_H #include #include //#include "FrameSubset.h" // no need for this in avisynth typedef void (*AudioFormatConverter)(void *, void *, long); typedef long (*AudioPointSampler)(void *, void *, long, long, long); typedef long (*AudioUpSampler)(void *, void *, long, long, long); typedef long (*AudioDownSampler)(void *, void *, long *, int, long, long, long); class AudioSource; /////// class AudioStream { protected: WAVEFORMATEX *format; long format_len; AudioStream *source; long samples_read; long stream_len; long stream_limit; AudioStream(); WAVEFORMATEX *AllocFormat(long len); public: virtual ~AudioStream(); virtual WAVEFORMATEX *GetFormat(); virtual long GetFormatLen(); virtual long GetSampleCount(); virtual long GetLength(); virtual long _Read(void *buffer, long max_samples, long *lplBytes); virtual long Read(void *buffer, long max_samples, long *lplBytes); virtual bool Skip(long samples); virtual void SetSource(AudioStream *source); virtual void SetLimit(long limit); virtual BOOL isEnd(); virtual BOOL _isEnd(); }; class AudioStreamSource : public AudioStream { private: AudioSource *aSrc; WAVEFORMATEX *pwfexTempInput; long cur_samp; long end_samp; HACMSTREAM hACStream; ACMSTREAMHEADER ashBuffer; void *inputBuffer; void *outputBuffer; char *outputBufferPtr; long lPreskip; bool fZeroRead; bool fStart; enum { INPUT_BUFFER_SIZE = 16384 }; public: AudioStreamSource(AudioSource *src, long first_sample, long max_sample, BOOL allow_decompression); ~AudioStreamSource(); long _Read(void *buffer, long max_samples, long *lplBytes); bool Skip(long samples); bool Seek(long samples); BOOL _isEnd(); }; class AudioStreamConverter : public AudioStream { private: AudioFormatConverter convRout; void *cbuffer; int bytesPerInputSample, bytesPerOutputSample; int offset; enum { BUFFER_SIZE=4096 }; public: AudioStreamConverter(AudioStream *src, bool to_16bit, bool to_stereo_or_right, bool single_only); ~AudioStreamConverter(); long _Read(void *buffer, long max_samples, long *lplBytes); BOOL _isEnd(); bool Skip(long); }; class AudioStreamResampler : public AudioStream { private: AudioPointSampler ptsampleRout; AudioUpSampler upsampleRout; AudioDownSampler dnsampleRout; void *cbuffer; int bytesPerSample; long samp_frac; long accum; int holdover; long *filter_bank; int filter_width; bool fHighQuality; enum { BUFFER_SIZE=512 }; long Upsample(void *buffer, long samples, long *lplBytes); long Downsample(void *buffer, long samples, long *lplBytes); public: AudioStreamResampler(AudioStream *source, long new_rate, bool integral_rate, bool high_quality); ~AudioStreamResampler(); long _Read(void *buffer, long max_samples, long *lplBytes); BOOL _isEnd(); }; class AudioCompressor : public AudioStream { private: HACMSTREAM hACStream; HACMDRIVER hADriver; ACMSTREAMHEADER ashBuffer; WAVEFORMATEX *pwfexTempOutput; void *inputBuffer; void *outputBuffer; //char *outputBufferPtr; void *holdBuffer; long holdBufferSize; long holdBufferOffset; BOOL fStreamEnded; LONG bytesPerInputSample; LONG bytesPerOutputSample; enum { INPUT_BUFFER_SIZE = 16384 }; void ResizeHoldBuffer(long lNewSize); void WriteToHoldBuffer(void *data, long lBytes); public: AudioCompressor(AudioStream *src, WAVEFORMATEX *dst_format, long dst_format_len); ~AudioCompressor(); void CompensateForMP3(); void * Compress(long lInputSamples, long *lplSrcInputSamples, long *lplOutputBytes, long *lplOutputSamples); BOOL isEnd(); }; class AudioL3Corrector { private: long samples, frame_bytes, read_left; bool header_mode; char hdr_buffer[4]; public: AudioL3Corrector(); long ComputeByterate(long sample_rate); void Process(void *buffer, long bytes); }; /* class AudioSubset : public AudioStream { private: FrameSubset subset; FrameSubsetNode *pfsnCur; int iOffset; long lSrcPos; long lSkipSize; char skipBuffer[512]; public: AudioSubset(AudioStream *, FrameSubset *, long, long); ~AudioSubset(); long _Read(void *, long, long *); BOOL _isEnd(); }; */ class AudioStreamAmplifier : public AudioStream { private: long lFactor; public: AudioStreamAmplifier(AudioStream *src, long lFactor); ~AudioStreamAmplifier(); long _Read(void *buffer, long max_samples, long *lplBytes); BOOL _isEnd(); bool Skip(long); }; //long AudioTranslateVideoSubset(FrameSubset& dst, FrameSubset& src, long usPerFrame, WAVEFORMATEX *pwfex); #endif ================================================ FILE: avs_core/filters/AviSource/avi_source.cpp ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include #include "../../convert/convert.h" #include "../../filters/transform.h" #include "../../core/alignplanar.h" #include "../../core/strings.h" #include "AudioSource.h" #include "VD_Audio.h" #include "AVIReadHandler.h" #include "avi_source.h" #include #include #ifdef INTEL_INTRINSICS // Intrinsics base header + really required extension headers #if defined(_MSC_VER) #include // MSVC #else #include // GCC/MinGW/Clang/LLVM #endif #endif #include #include #include "../../core/AviHelper.h" static void __cdecl free_buffer(void* buff, IScriptEnvironment* env) { if (buff) static_cast(env)->Free(buff); } TemporalBuffer::TemporalBuffer(const VideoInfo& vi, bool bMediaPad, AVI_SpecialFormats specf, IScriptEnvironment* env) { int heightY = vi.height; int heightUV = (vi.pixel_type & VideoInfo::CS_INTERLEAVED) ? 0 : heightY >> vi.GetPlaneHeightSubsampling(PLANAR_U); if (specf == AVI_SpecialFormats::Y410) { // Y410 packed 4444 U,Y,V,A // This format is a packed 10-bit representation that includes 2 bits of alpha. // Bits 0 - 9 contain the U sample, bits 10 - 19 contain the Y sample, bits 20 - 29 contain the V sample, // and bits 30 - 31 contain the alpha value. // To indicate that a pixel is fully opaque, an application must set the two alpha bits equal to 0x03. pitchY = vi.width * sizeof(uint32_t) ; // n/a pitchUV = 0; } else if (specf == AVI_SpecialFormats::Y416) { // Y416 packed 4444 U,Y,V,A // image_size = vi->width * vi->height * 4 * sizeof(uint16_t); pitchY = vi.width * 4 * sizeof(uint16_t); // n/a pitchUV = 0; } else if (specf == AVI_SpecialFormats::v308) { // v308 packed 444 // image_size = vi->width * vi->height * 3 * sizeof(uint8_t); pitchY = vi.width * 3; // n/a pitchUV = 0; } else if (specf == AVI_SpecialFormats::v408) { // v408 packed 4444 // image_size = vi->width * vi->height * 4 * sizeof(uint8_t); pitchY = vi.width * 4; // n/a pitchUV = 0; } else if (specf == AVI_SpecialFormats::v410) { // v410 packed 444 U,Y,V // image_size = vi->width * vi->height * 4 (32 bit holds 3x10 bits); pitchY = vi.width * 4; // n/a pitchUV = 0; } else if (specf == AVI_SpecialFormats::v210) { pitchY = ((16 * ((vi.width + 5) / 6) + 127) & ~127); pitchUV = 0; } else if (specf == AVI_SpecialFormats::r210) { pitchY = ((vi.width + 63) / 64) * 256; pitchUV = 0; } else if (specf == AVI_SpecialFormats::R10k) { pitchY = vi.width * 4; pitchUV = 0; } else if (vi.IsPlanarRGB() || vi.IsPlanarRGBA()) { pitchY = vi.RowSize(); } else { if (!bMediaPad) { // do not padding at all. pitchY = vi.RowSize(); pitchUV = vi.RowSize(PLANAR_U); } else { // align 4bytes with minimum padding. pitchY = (vi.RowSize() + 3) & ~3; pitchUV = (vi.RowSize(PLANAR_U) + 3) & ~3; } } size_t sizeY = pitchY * heightY; size_t sizeUV = pitchUV * heightUV; if(specf == AVI_SpecialFormats::r210 || specf == AVI_SpecialFormats::R10k || specf == AVI_SpecialFormats::Y416 || specf == AVI_SpecialFormats::v410 || specf == AVI_SpecialFormats::v210 || specf == AVI_SpecialFormats::v308 || specf == AVI_SpecialFormats::v408 || specf == AVI_SpecialFormats::Y410 ) size = sizeY; else if (vi.IsPlanarRGB()) size = sizeY * 3; else if (vi.IsPlanarRGBA()) size = sizeY * 4; else size = sizeY + 2 * sizeUV; // maybe memcpy become fast by aligned start address. orig = env->Allocate(size, FRAME_ALIGN, AVS_POOLED_ALLOC); if (!orig) env->ThrowError("AVISource: couldn't allocate temporal buffer."); env->AtExit(free_buffer, orig); pY = reinterpret_cast(orig); pA = nullptr; if (vi.IsPlanarRGB() || vi.IsPlanarRGBA()) { // pY: G pU = pY + sizeY; // B pV = pU + sizeY; // R if (vi.IsPlanarRGBA()) pA = pV + sizeY; // A } else if (vi.pixel_type & VideoInfo::CS_UPlaneFirst) { pU = pY + sizeY; pV = pU + sizeUV; } else { pV = pY + sizeY; pU = pV + sizeUV; } } // todo: // // 10-bit+ planar RGB /* mmioFOURCC('G', '3', 00, 10); // ffmpeg GBRP10LE mmioFOURCC('G', '3', 00, 12); // ffmpeg GBRP12LE mmioFOURCC('G', '3', 00, 14); // ffmpeg GBRP14LE mmioFOURCC('G', '3', 00, 16); // ffmpeg GBRP16LE mmioFOURCC('G', '4', 00, 10); // ffmpeg GBRAP10LE mmioFOURCC('G', '4', 00, 12); // ffmpeg GBRAP12LE mmioFOURCC('G', '4', 00, 14); // ffmpeg GBRAP14LE mmioFOURCC('G', '4', 00, 16); // ffmpeg GBRAP16LE */ static PVideoFrame AdjustFrameAlignment(TemporalBuffer* frame, const VideoInfo& vi, bool bInvertFrames, AVI_SpecialFormats specf, IScriptEnvironment* env) { auto result = env->NewVideoFrame(vi); // fixme: this is source filter, add frame properties if possible BYTE* dstp = result->GetWritePtr(); int pitch = result->GetPitch(); int height = result->GetHeight(); if (bInvertFrames) { // write from bottom to top dstp += pitch * (height - 1); pitch = -pitch; } // From TemporalBuffer only frame->GetPtr() points to a proper Avisynth-aligned // memory location. Other field like frame->GetPitch or frame->GetPtr(PLANAR_U) // may not be mod16 aligned values! switch(specf) { case AVI_SpecialFormats::v210: v210_to_yuv422p10(dstp, pitch, result->GetWritePtr(PLANAR_U), result->GetWritePtr(PLANAR_V), result->GetPitch(PLANAR_U), frame->GetPtr(), vi.width, vi.height); break; case AVI_SpecialFormats::P210: case AVI_SpecialFormats::P216: case AVI_SpecialFormats::P010: case AVI_SpecialFormats::P016: Px10_16_to_yuv42xp10_16(dstp, pitch, result->GetWritePtr(PLANAR_U), result->GetWritePtr(PLANAR_V), result->GetPitch(PLANAR_U), frame->GetPtr(), frame->GetPitch(), vi.width, vi.height, result->GetHeight(PLANAR_U), specf == AVI_SpecialFormats::P016 || specf == AVI_SpecialFormats::P216, env); break; case AVI_SpecialFormats::Y416: if(vi.pixel_type == VideoInfo::CS_YUVA444P16) FromY416_c(dstp, pitch, result->GetWritePtr(PLANAR_U), result->GetWritePtr(PLANAR_V), result->GetPitch(PLANAR_U), result->GetWritePtr(PLANAR_A), result->GetPitch(PLANAR_A), frame->GetPtr(), frame->GetPitch(), vi.width, vi.height); else FromY416_c(dstp, pitch, result->GetWritePtr(PLANAR_U), result->GetWritePtr(PLANAR_V), result->GetPitch(PLANAR_U), result->GetWritePtr(PLANAR_A), result->GetPitch(PLANAR_A), frame->GetPtr(), frame->GetPitch(), vi.width, vi.height); break; case AVI_SpecialFormats::r210: From_r210_c(result->GetWritePtr(PLANAR_R), result->GetWritePtr(PLANAR_G), result->GetWritePtr(PLANAR_B), result->GetPitch(PLANAR_G), frame->GetPtr(), frame->GetPitch(), vi.width, vi.height); break; case AVI_SpecialFormats::R10k: From_R10k_c(result->GetWritePtr(PLANAR_R), result->GetWritePtr(PLANAR_G), result->GetWritePtr(PLANAR_B), result->GetPitch(PLANAR_G), frame->GetPtr(), frame->GetPitch(), vi.width, vi.height); break; case AVI_SpecialFormats::v410: v410_to_yuv444p10(dstp, pitch, result->GetWritePtr(PLANAR_U), result->GetWritePtr(PLANAR_V), result->GetPitch(PLANAR_U), frame->GetPtr(), vi.width, vi.height); break; case AVI_SpecialFormats::v308: v308_to_yuv444p8(dstp, pitch, result->GetWritePtr(PLANAR_U), result->GetWritePtr(PLANAR_V), result->GetPitch(PLANAR_U), frame->GetPtr(), vi.width, vi.height); break; case AVI_SpecialFormats::v408: v408_to_yuva444p8(dstp, pitch, result->GetWritePtr(PLANAR_U), result->GetWritePtr(PLANAR_V), result->GetWritePtr(PLANAR_A), result->GetPitch(PLANAR_U), result->GetPitch(PLANAR_A), frame->GetPtr(), vi.width, vi.height); break; case AVI_SpecialFormats::Y410: if (vi.pixel_type == VideoInfo::CS_YUVA444P10) FromY410_c(dstp, pitch, result->GetWritePtr(PLANAR_U), result->GetWritePtr(PLANAR_V), result->GetPitch(PLANAR_U), result->GetWritePtr(PLANAR_A), result->GetPitch(PLANAR_A), frame->GetPtr(), frame->GetPitch(), vi.width, vi.height); else FromY410_c(dstp, pitch, result->GetWritePtr(PLANAR_U), result->GetWritePtr(PLANAR_V), result->GetPitch(PLANAR_U), result->GetWritePtr(PLANAR_A), result->GetPitch(PLANAR_A), frame->GetPtr(), frame->GetPitch(), vi.width, vi.height); break; case AVI_SpecialFormats::b64a: { // BGRA <-> big endian ARGB with byte swap uint8_t* pdst = dstp; int srcpitch = frame->GetPitch(); // may not be mod16 const BYTE* src = frame->GetPtr(); #ifdef INTEL_INTRINSICS const bool ssse3 = (env->GetCPUFlags() & CPUF_SSSE3) != 0; const bool sse2 = (env->GetCPUFlags() & CPUF_SSE2) != 0; if (ssse3) bgra_to_argbBE_ssse3(pdst, pitch, src, srcpitch, vi.width, vi.height); else if (sse2) bgra_to_argbBE_sse2(pdst, pitch, src, srcpitch, vi.width, vi.height); else #endif // INTEL_INTRINSICS bgra_to_argbBE_c(pdst, pitch, src, srcpitch, vi.width, vi.height); } break; case AVI_SpecialFormats::b48r: { // BGR <-> 16 bits per component big-endian Red, Green and Blue with byte swap uint8_t* pdst = dstp; int srcpitch = frame->GetPitch(); const BYTE* src = frame->GetPtr(); // c only bgr_to_rgbBE_c(pdst, pitch, src, srcpitch, vi.width, vi.height); } break; default: if (vi.IsPlanarRGB() || vi.IsPlanarRGBA()) { env->BitBlt(result->GetWritePtr(PLANAR_G), result->GetPitch(PLANAR_G), frame->GetPtr(PLANAR_G), frame->GetPitch(PLANAR_G), result->GetRowSize(PLANAR_G), result->GetHeight(PLANAR_G)); env->BitBlt(result->GetWritePtr(PLANAR_B), result->GetPitch(PLANAR_B), frame->GetPtr(PLANAR_B), frame->GetPitch(PLANAR_B), result->GetRowSize(PLANAR_B), result->GetHeight(PLANAR_B)); env->BitBlt(result->GetWritePtr(PLANAR_R), result->GetPitch(PLANAR_R), frame->GetPtr(PLANAR_R), frame->GetPitch(PLANAR_R), result->GetRowSize(PLANAR_R), result->GetHeight(PLANAR_R)); if(vi.IsPlanarRGBA()) env->BitBlt(result->GetWritePtr(PLANAR_A), result->GetPitch(PLANAR_A), frame->GetPtr(PLANAR_A), frame->GetPitch(PLANAR_A), result->GetRowSize(PLANAR_A), result->GetHeight(PLANAR_A)); } else { env->BitBlt(dstp, pitch, frame->GetPtr(), frame->GetPitch(), result->GetRowSize(), result->GetHeight()); // when no U or V plane these do nothing env->BitBlt(result->GetWritePtr(PLANAR_V), result->GetPitch(PLANAR_V), frame->GetPtr(PLANAR_V), frame->GetPitch(PLANAR_V), result->GetRowSize(PLANAR_V), result->GetHeight(PLANAR_V)); env->BitBlt(result->GetWritePtr(PLANAR_U), result->GetPitch(PLANAR_U), frame->GetPtr(PLANAR_U), frame->GetPitch(PLANAR_U), result->GetRowSize(PLANAR_U), result->GetHeight(PLANAR_U)); } } // switch return result; } #ifndef MSVC static __inline LRESULT ICDecompressEx(HIC hic,DWORD dwFlags,LPBITMAPINFOHEADER lpbiSrc,LPVOID lpSrc,INT xSrc,INT ySrc,INT dxSrc,INT dySrc,LPBITMAPINFOHEADER lpbiDst,LPVOID lpDst,INT xDst,INT yDst,INT dxDst,INT dyDst) { ICDECOMPRESSEX ic; ic.dwFlags = dwFlags; ic.lpbiSrc = lpbiSrc; ic.lpSrc = lpSrc; ic.xSrc = xSrc; ic.ySrc = ySrc; ic.dxSrc = dxSrc; ic.dySrc = dySrc; ic.lpbiDst = lpbiDst; ic.lpDst = lpDst; ic.xDst = xDst; ic.yDst = yDst; ic.dxDst = dxDst; ic.dyDst = dyDst; return ICSendMessage(hic,ICM_DECOMPRESSEX,(DWORD_PTR)&ic,sizeof(ic)); } static __inline LRESULT ICDecompressExBegin(HIC hic,DWORD dwFlags,LPBITMAPINFOHEADER lpbiSrc,LPVOID lpSrc,INT xSrc,INT ySrc,INT dxSrc,INT dySrc,LPBITMAPINFOHEADER lpbiDst,LPVOID lpDst,INT xDst,INT yDst,INT dxDst,INT dyDst) { ICDECOMPRESSEX ic; ic.dwFlags = dwFlags; ic.lpbiSrc = lpbiSrc; ic.lpSrc = lpSrc; ic.xSrc = xSrc; ic.ySrc = ySrc; ic.dxSrc = dxSrc; ic.dySrc = dySrc; ic.lpbiDst = lpbiDst; ic.lpDst = lpDst; ic.xDst = xDst; ic.yDst = yDst; ic.dxDst = dxDst; ic.dyDst = dyDst; return ICSendMessage(hic,ICM_DECOMPRESSEX_BEGIN,(DWORD_PTR)&ic,sizeof(ic)); } #endif // MSVC LRESULT AVISource::DecompressBegin(LPBITMAPINFOHEADER lpbiSrc, LPBITMAPINFOHEADER lpbiDst) { if (!ex) { LRESULT result = ICDecompressBegin(hic, lpbiSrc, lpbiDst); if (result != ICERR_UNSUPPORTED) return result; else ex = true; // and fall thru } return ICDecompressExBegin(hic, 0, lpbiSrc, 0, 0, 0, lpbiSrc->biWidth, lpbiSrc->biHeight, lpbiDst, 0, 0, 0, lpbiDst->biWidth, lpbiDst->biHeight); } LRESULT AVISource::DecompressFrame(int n, bool preroll, IScriptEnvironment* env) { AVS_UNUSED(env); _RPT2(0,"AVISource: Decompressing frame %d%s\n", n, preroll ? " (preroll)" : ""); BYTE* buf = frame->GetPtr(); long bytes_read; if (!hic) { bytes_read = long(frame->GetSize()); pvideo->Read(n, 1, buf, bytes_read, &bytes_read, NULL); dropped_frame = !bytes_read; if (dropped_frame) return ICERR_OK; // If frame is 0 bytes (dropped), return instead of attempt decompressing as Vdub. } else { bytes_read = srcbuffer_size; LRESULT err = pvideo->Read(n, 1, srcbuffer, srcbuffer_size, &bytes_read, NULL); while (err == AVIERR_BUFFERTOOSMALL || (err == 0 && !srcbuffer)) { delete[] srcbuffer; pvideo->Read(n, 1, 0, srcbuffer_size, &bytes_read, NULL); srcbuffer_size = bytes_read; srcbuffer = new BYTE[bytes_read + 16]; // Provide 16 hidden guard bytes for HuffYUV, Xvid, etc bug err = pvideo->Read(n, 1, srcbuffer, srcbuffer_size, &bytes_read, NULL); } dropped_frame = !bytes_read; if (dropped_frame) return ICERR_OK; // If frame is 0 bytes (dropped), return instead of attempt decompressing as Vdub. // Fill guard bytes with 0xA5's for Xvid bug memset(srcbuffer + bytes_read, 0xA5, 16); // and a Null terminator for good measure srcbuffer[bytes_read + 15] = 0; int flags = preroll ? ICDECOMPRESS_PREROLL : 0; flags |= dropped_frame ? ICDECOMPRESS_NULLFRAME : 0; flags |= !pvideo->IsKeyFrame(n) ? ICDECOMPRESS_NOTKEYFRAME : 0; pbiSrc->biSizeImage = bytes_read; LRESULT result = !ex ? ICDecompress(hic, flags, pbiSrc, srcbuffer, &biDst, buf) : ICDecompressEx(hic, flags, pbiSrc, srcbuffer, 0, 0, vi.width, vi.height, &biDst, buf, 0, 0, vi.width, vi.height); if (result != ICERR_OK) return result; } return ICERR_OK; } void AVISource::CheckHresult(HRESULT hr, const char* msg, IScriptEnvironment* env) { if (SUCCEEDED(hr)) return; char buf[1024] = {0}; if (!FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, hr, 0, buf, 1024, NULL)) wsprintf(buf, "error code 0x%x", hr); env->ThrowError("AVISource: %s:\n%s", msg, buf); } // taken from VirtualDub bool AVISource::AttemptCodecNegotiation(DWORD fccHandler, BITMAPINFOHEADER* bmih) { // Try the handler specified in the file first. In some cases, it'll // be wrong or missing. if (fccHandler) hic = ICOpen(ICTYPE_VIDEO, fccHandler, ICMODE_DECOMPRESS); if (!hic || ICERR_OK!=ICDecompressQuery(hic, bmih, NULL)) { if (hic) ICClose(hic); // Pick a handler based on the biCompression field instead. hic = ICOpen(ICTYPE_VIDEO, bmih->biCompression, ICMODE_DECOMPRESS); if (!hic || ICERR_OK!=ICDecompressQuery(hic, bmih, NULL)) { if (hic) ICClose(hic); // This never seems to work... hic = ICLocate(ICTYPE_VIDEO, 0, bmih, NULL, ICMODE_DECOMPRESS); } } return !!hic; } static std::string fourCCtoString(DWORD fourCC) { std::ostringstream oss; for (int i = 0; i < 4; i++) { uint8_t b = fourCC & 0xFF; fourCC >>= 8; if (b < 32) oss << "[" << std::to_string(b) << "]"; else oss << char(b); } return oss.str(); } void AVISource::LocateVideoCodec(const char fourCC[], IScriptEnvironment* env) { AVISTREAMINFO asi; CheckHresult(pvideo->Info(&asi, sizeof(asi)), "couldn't get video info", env); long size = sizeof(BITMAPINFOHEADER); // Read video format. If it's a // type-1 DV, we're going to have to fake it. if (bIsType1) { pbiSrc = (BITMAPINFOHEADER *)malloc(size); if (!pbiSrc) env->ThrowError("AviSource: Could not allocate BITMAPINFOHEADER."); pbiSrc->biSize = sizeof(BITMAPINFOHEADER); pbiSrc->biWidth = 720; if (asi.dwRate > asi.dwScale*26LL) pbiSrc->biHeight = 480; else pbiSrc->biHeight = 576; pbiSrc->biPlanes = 1; pbiSrc->biBitCount = 24; pbiSrc->biCompression = MAKEFOURCC('d','v','s','d'); // 'dsvd'; pbiSrc->biSizeImage = asi.dwSuggestedBufferSize; pbiSrc->biXPelsPerMeter = 0; pbiSrc->biYPelsPerMeter = 0; pbiSrc->biClrUsed = 0; pbiSrc->biClrImportant = 0; } else { CheckHresult(pvideo->ReadFormat(0, 0, &size), "couldn't get video format size", env); pbiSrc = (LPBITMAPINFOHEADER)malloc(size); CheckHresult(pvideo->ReadFormat(0, pbiSrc, &size), "couldn't get video format", env); } vi.width = pbiSrc->biWidth; vi.height = pbiSrc->biHeight < 0 ? -pbiSrc->biHeight : pbiSrc->biHeight; vi.SetFPS(asi.dwRate, asi.dwScale); vi.num_frames = asi.dwLength; bool overridden = false; // try the requested decoder, if specified if (fourCC != NULL /*&& strlen(fourCC) == 4*/) { // no strlen! fourCC can contain zeros as well DWORD fcc = fourCC[0] | (fourCC[1] << 8) | (fourCC[2] << 16) | (fourCC[3] << 24); if (pbiSrc->biCompression != fcc) overridden = true; asi.fccHandler = pbiSrc->biCompression = fcc; } // see if we can handle the video format directly // when recognizing these formats in input fourCC, use them directly // Note: forced overrides may not work // check for only basic formats only. Known formats with special unpackers are handled outside. if (pbiSrc->biCompression == MAKEFOURCC('Y', 'U', 'Y', '2')) { // :FIXME: Handle UYVY, etc vi.pixel_type = VideoInfo::CS_YUY2; } else if (pbiSrc->biCompression == MAKEFOURCC('Y', 'V', '1', '2')) { vi.pixel_type = VideoInfo::CS_YV12; } else if (pbiSrc->biCompression == MAKEFOURCC('I', '4', '2', '0')) { vi.pixel_type = VideoInfo::CS_I420; } else if (pbiSrc->biCompression == BI_RGB && pbiSrc->biBitCount == 32) { vi.pixel_type = VideoInfo::CS_BGR32; } else if (pbiSrc->biCompression == BI_RGB && pbiSrc->biBitCount == 24) { vi.pixel_type = VideoInfo::CS_BGR24; } else if (pbiSrc->biCompression == MAKEFOURCC('G', 'R', 'E', 'Y')) { vi.pixel_type = VideoInfo::CS_Y8; } else if (pbiSrc->biCompression == MAKEFOURCC('Y', '8', '0', '0')) { vi.pixel_type = VideoInfo::CS_Y8; } else if (pbiSrc->biCompression == MAKEFOURCC('Y', '8', ' ', ' ')) { vi.pixel_type = VideoInfo::CS_Y8; } else if (pbiSrc->biCompression == MAKEFOURCC('Y', 'V', '2', '4')) { vi.pixel_type = VideoInfo::CS_YV24; } else if (pbiSrc->biCompression == MAKEFOURCC('Y', 'V', '1', '6')) { vi.pixel_type = VideoInfo::CS_YV16; } else if (pbiSrc->biCompression == MAKEFOURCC('Y', '4', '1', 'B')) { vi.pixel_type = VideoInfo::CS_YV411; } else if (pbiSrc->biCompression == MAKEFOURCC('B', 'R', 'A', 64)) { // BRA@ ie. BRA[64] vi.pixel_type = VideoInfo::CS_BGR64; } else if (pbiSrc->biCompression == MAKEFOURCC('b', '6', '4', 'a')) { // b64a vi.pixel_type = VideoInfo::CS_BGR64; } else if (pbiSrc->biCompression == MAKEFOURCC('B', 'G', 'R', 48)) { // BGR0 ie. BGR[48] vi.pixel_type = VideoInfo::CS_BGR48; } else if (pbiSrc->biCompression == MAKEFOURCC('b', '4', '8', 'r')) { // b48r vi.pixel_type = VideoInfo::CS_BGR48; } else if (pbiSrc->biCompression == MAKEFOURCC('v', '2', '1', '0')) { // v210 vi.pixel_type = VideoInfo::CS_YUV422P10; } else if (pbiSrc->biCompression == MAKEFOURCC('P', '2', '1', '0')) { // P210 vi.pixel_type = VideoInfo::CS_YUV422P10; } else if (pbiSrc->biCompression == MAKEFOURCC('P', '0', '1', '0')) { // P010 vi.pixel_type = VideoInfo::CS_YUV420P10; } else if (pbiSrc->biCompression == MAKEFOURCC('P', '0', '1', '6')) { // P016 vi.pixel_type = VideoInfo::CS_YUV420P16; } else if (pbiSrc->biCompression == MAKEFOURCC('P', '2', '1', '6')) { // P216 vi.pixel_type = VideoInfo::CS_YUV422P16; } else if (pbiSrc->biCompression == MAKEFOURCC('v', '4', '1', '0')) { // v410 vi.pixel_type = VideoInfo::CS_YUV444P10; } else if (pbiSrc->biCompression == MAKEFOURCC('Y', '4', '1', '6')) { // Y416 vi.pixel_type = VideoInfo::CS_YUV444P16; // FIXME/Decide: Y416 contains alpha, we ignore it now } else if (pbiSrc->biCompression == MAKEFOURCC('r', '2', '1', '0')) { // r210 vi.pixel_type = VideoInfo::CS_RGBP10; } else if (pbiSrc->biCompression == MAKEFOURCC('R', '1', '0', 'k')) { // R10k vi.pixel_type = VideoInfo::CS_RGBP10; } else if (pbiSrc->biCompression == MAKEFOURCC('v', '3', '0', '8')) { // v308 vi.pixel_type = VideoInfo::CS_YV24; } else if (pbiSrc->biCompression == MAKEFOURCC('v', '4', '0', '8')) { // v408 vi.pixel_type = VideoInfo::CS_YUVA444; } else if (pbiSrc->biCompression == MAKEFOURCC('Y', '4', '1', '0')) { // Y410 vi.pixel_type = VideoInfo::CS_YUVA444P10; // Y410 contains a 2 bit alpha, so we use YUVA } else { // otherwise, find someone who will decompress it switch(pbiSrc->biCompression) { case MAKEFOURCC('M','P','4','3'): // Microsoft MPEG-4 V3 '34PM' case MAKEFOURCC('D','I','V','3'): // "DivX Low-Motion" (4.10.0.3917) '3VID' case MAKEFOURCC('D','I','V','4'): // "DivX Fast-Motion" (4.10.0.3920) 4VID' case MAKEFOURCC('A','P','4','1'): // "AngelPotion Definitive" (4.0.00.3688) '14PA' if (AttemptCodecNegotiation(asi.fccHandler, pbiSrc)) return; pbiSrc->biCompression = MAKEFOURCC('M', 'P', '4', '3'); if (AttemptCodecNegotiation(asi.fccHandler, pbiSrc)) return; pbiSrc->biCompression = MAKEFOURCC('D', 'I', 'V', '3'); if (AttemptCodecNegotiation(asi.fccHandler, pbiSrc)) return; pbiSrc->biCompression = MAKEFOURCC('D', 'I', 'V', '4'); if (AttemptCodecNegotiation(asi.fccHandler, pbiSrc)) return; pbiSrc->biCompression = MAKEFOURCC('A', 'P', '4', '1'); default: if (AttemptCodecNegotiation(asi.fccHandler, pbiSrc)) return; } auto fourCCstr = fourCCtoString(asi.fccHandler); const char *s = fourCCstr.c_str(); env->SaveString(s); env->ThrowError("AVISource: couldn't locate a decompressor for fourcc %s", s); } if (!overridden) return; if (AttemptCodecNegotiation(asi.fccHandler, pbiSrc)) return; // note: it is possible that fourCC G3[0][10] cannot be negotiated // but if e.g. M0RG is negotiated here, the driver can support G3[0][10] later in icDecompressQuery auto fourCCstr = fourCCtoString(asi.fccHandler); const char* s = fourCCstr.c_str(); env->SaveString(s); env->ThrowError("AVISource: couldn't locate a decompressor for overridden fourcc %s", s); } static bool setInternalFormat_b64a(VideoInfo& vi, HIC& hic, BITMAPINFOHEADER* pbiSrc, BITMAPINFOHEADER* biDst, DWORD fourCC, int pixel_type) { vi.pixel_type = pixel_type; biDst->biSizeImage = vi.BMPSize(); biDst->biCompression = fourCC; // BRA@ ie. BRA[64] biDst->biBitCount = 64; if (hic == nullptr) return true; return (ICERR_OK == ICDecompressQuery(hic, pbiSrc, biDst)); } static bool setInternalFormat_BRA64(VideoInfo& vi, HIC& hic, BITMAPINFOHEADER* pbiSrc, BITMAPINFOHEADER* biDst, DWORD fourCC, int pixel_type) { vi.pixel_type = pixel_type; biDst->biSizeImage = vi.BMPSize(); biDst->biCompression = fourCC; // BRA@ ie. BRA[64] biDst->biBitCount = 64; if (hic == nullptr) return true; return (ICERR_OK == ICDecompressQuery(hic, pbiSrc, biDst)); } static bool setInternalFormat_BGR48(VideoInfo& vi, HIC& hic, BITMAPINFOHEADER* pbiSrc, BITMAPINFOHEADER* biDst, DWORD fourCC, int pixel_type) { vi.pixel_type = pixel_type; biDst->biSizeImage = vi.BMPSize(); biDst->biCompression = fourCC; // BGR0 ie. BGR48[64] biDst->biBitCount = 48; if (hic == nullptr) return true; return (ICERR_OK == ICDecompressQuery(hic, pbiSrc, biDst)); } static bool setInternalFormat_b48r(VideoInfo& vi, HIC& hic, BITMAPINFOHEADER* pbiSrc, BITMAPINFOHEADER* biDst, DWORD fourCC, int pixel_type) { vi.pixel_type = pixel_type; biDst->biSizeImage = vi.BMPSize(); biDst->biCompression = fourCC; // BGR0 ie. BGR48[64] biDst->biBitCount = 48; if (hic == nullptr) return true; return (ICERR_OK == ICDecompressQuery(hic, pbiSrc, biDst)); } static bool setInternalFormat_v210(VideoInfo& vi, HIC& hic, BITMAPINFOHEADER* pbiSrc, BITMAPINFOHEADER* biDst, DWORD fourCC, int pixel_type) { vi.pixel_type = pixel_type; biDst->biSizeImage = AviHelper_ImageSize(&vi, false, true, false, false, false, false, false, false); biDst->biCompression = fourCC; // v210 (422P10) biDst->biBitCount = 30; if (hic == nullptr) return true; return (ICERR_OK == ICDecompressQuery(hic, pbiSrc, biDst)); } static bool setInternalFormat_P210(VideoInfo& vi, HIC& hic, BITMAPINFOHEADER* pbiSrc, BITMAPINFOHEADER* biDst, DWORD fourCC, int pixel_type) { vi.pixel_type = pixel_type; biDst->biSizeImage = vi.BMPSize(); biDst->biCompression = fourCC; // P210 (422P10) biDst->biBitCount = 30; // should be 30, not 10+(10+10)/2 if (hic == nullptr) return true; return (ICERR_OK == ICDecompressQuery(hic, pbiSrc, biDst)); } static bool setInternalFormat_P010(VideoInfo& vi, HIC& hic, BITMAPINFOHEADER* pbiSrc, BITMAPINFOHEADER* biDst, DWORD fourCC, int pixel_type) { vi.pixel_type = pixel_type; biDst->biSizeImage = vi.BMPSize(); biDst->biCompression = fourCC; // P010 (420P10) biDst->biBitCount = 15; // 10+(10+10)/4 or 3x10? if (hic == nullptr) return true; return (ICERR_OK == ICDecompressQuery(hic, pbiSrc, biDst)); } static bool setInternalFormat_P016(VideoInfo& vi, HIC& hic, BITMAPINFOHEADER* pbiSrc, BITMAPINFOHEADER* biDst, DWORD fourCC, int pixel_type) { vi.pixel_type = pixel_type; biDst->biSizeImage = vi.BMPSize(); biDst->biCompression = fourCC; // P016 (420P16) biDst->biBitCount = 24; // 16+(16+16)/4 or 3x16? if (hic == nullptr) return true; return (ICERR_OK == ICDecompressQuery(hic, pbiSrc, biDst)); } static bool setInternalFormat_Y416(VideoInfo& vi, HIC& hic, BITMAPINFOHEADER* pbiSrc, BITMAPINFOHEADER* biDst, DWORD fourCC, int pixel_type) { vi.pixel_type = pixel_type; biDst->biSizeImage = vi.BMPSize(); biDst->biCompression = fourCC; // Y416 (444P16) biDst->biBitCount = 48; // 3x16? if (hic == nullptr) return true; return (ICERR_OK == ICDecompressQuery(hic, pbiSrc, biDst)); } static bool setInternalFormat_Y410(VideoInfo& vi, HIC& hic, BITMAPINFOHEADER* pbiSrc, BITMAPINFOHEADER* biDst, DWORD fourCC, int pixel_type) { vi.pixel_type = pixel_type; biDst->biSizeImage = AviHelper_ImageSize(&vi, false, false, false, false, false, false, false, true); biDst->biCompression = fourCC; // Y410 (444P10) biDst->biBitCount = 32; // 3x10+2? if (hic == nullptr) return true; return (ICERR_OK == ICDecompressQuery(hic, pbiSrc, biDst)); } static bool setInternalFormat_P216(VideoInfo& vi, HIC& hic, BITMAPINFOHEADER* pbiSrc, BITMAPINFOHEADER* biDst, DWORD fourCC, int pixel_type) { vi.pixel_type = pixel_type; biDst->biSizeImage = vi.BMPSize(); biDst->biCompression = fourCC; // P216 (422P16) biDst->biBitCount = 32; // 16+(16+16)/2 or 3x16? if (hic == nullptr) return true; return (ICERR_OK == ICDecompressQuery(hic, pbiSrc, biDst)); } static bool setInternalFormat_v410(VideoInfo& vi, HIC& hic, BITMAPINFOHEADER* pbiSrc, BITMAPINFOHEADER* biDst, DWORD fourCC, int pixel_type) { vi.pixel_type = pixel_type; biDst->biSizeImage = AviHelper_ImageSize(&vi, false, false, true, false, false, false, false, false); biDst->biCompression = fourCC; // v410 (444P10) biDst->biBitCount = 30; // 3x10? if (hic == nullptr) return true; return (ICERR_OK == ICDecompressQuery(hic, pbiSrc, biDst)); } static bool setInternalFormat_r210(VideoInfo& vi, HIC& hic, BITMAPINFOHEADER* pbiSrc, BITMAPINFOHEADER* biDst, DWORD fourCC, int pixel_type) { vi.pixel_type = pixel_type; biDst->biSizeImage = AviHelper_ImageSize(&vi, false, false, false, true, false, false, false, false); biDst->biCompression = fourCC; // r210 (RGBP10) biDst->biBitCount = 30; // 3x10? if (hic == nullptr) return true; return (ICERR_OK == ICDecompressQuery(hic, pbiSrc, biDst)); } static bool setInternalFormat_R10k(VideoInfo& vi, HIC& hic, BITMAPINFOHEADER* pbiSrc, BITMAPINFOHEADER* biDst, DWORD fourCC, int pixel_type) { vi.pixel_type = pixel_type; biDst->biSizeImage = AviHelper_ImageSize(&vi, false, false, false, false, true, false, false, false); biDst->biCompression = fourCC; // R10k (RGBP10) biDst->biBitCount = 30; // 3x10? if (hic == nullptr) return true; return (ICERR_OK == ICDecompressQuery(hic, pbiSrc, biDst)); } static bool setInternalFormat_v308(VideoInfo& vi, HIC& hic, BITMAPINFOHEADER* pbiSrc, BITMAPINFOHEADER* biDst, DWORD fourCC, int pixel_type) { vi.pixel_type = pixel_type; biDst->biSizeImage = AviHelper_ImageSize(&vi, false, false, false, false, false, true, false, false); biDst->biCompression = fourCC; // v308 (YV24 YUV444P8) biDst->biBitCount = 24; if (hic == nullptr) return true; return (ICERR_OK == ICDecompressQuery(hic, pbiSrc, biDst)); } static bool setInternalFormat_v408(VideoInfo& vi, HIC& hic, BITMAPINFOHEADER* pbiSrc, BITMAPINFOHEADER* biDst, DWORD fourCC, int pixel_type) { vi.pixel_type = pixel_type; biDst->biSizeImage = AviHelper_ImageSize(&vi, false, false, false, false, false, false, true, false); biDst->biCompression = fourCC; // v408 (YUVA444P8) biDst->biBitCount = 32; if (hic == nullptr) return true; return (ICERR_OK == ICDecompressQuery(hic, pbiSrc, biDst)); } AVISource::AVISource(const char filename[], bool fAudio, const char pixel_type[], const char fourCC[], int vtrack, int atrack, avi_mode_e mode, bool utf8, IScriptEnvironment* env) { srcbuffer = 0; srcbuffer_size = 0; memset(&vi, 0, sizeof(vi)); ex = false; last_frame_no = -1; pbiSrc = 0; aSrc = 0; audioStreamSource = 0; pvideo=0; pfile=0; bIsType1 = false; hic = 0; bInvertFrames = false; specf = AVI_SpecialFormats::none; bMediaPad = false; frame = 0; auto filename_w = utf8 ? Utf8ToWideChar(filename) : AnsiToWideChar(filename); auto filename_utf8 = WideCharToUtf8(filename_w.get()); AVIFileInit(); try { if (mode == MODE_NORMAL) { // if it looks like an AVI file, open in OpenDML mode; otherwise AVIFile mode HANDLE h = CreateFileW(filename_w.get(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if (h == INVALID_HANDLE_VALUE) { env->ThrowError("AVISource autodetect: couldn't open file '%s'\nError code: %d", filename_utf8.get(), GetLastError()); } unsigned int buf[3]; DWORD bytes_read; if (ReadFile(h, buf, 12, &bytes_read, NULL) && bytes_read == 12 && buf[0] == MAKEFOURCC('R','I','F','F') && buf[2] == MAKEFOURCC('A','V','I',' ')) mode = MODE_OPENDML; else mode = MODE_AVIFILE; CloseHandle(h); } if (mode == MODE_AVIFILE || mode == MODE_WAV) { // AVIFile mode PAVIFILE paf = NULL; try { // The damn .WAV clsid handler has only a 48 byte buffer to parse the filename and GPF's if (FAILED(AVIFileOpenW(&paf, filename_w.get(), OF_READ, 0))) env->ThrowError("AVIFileSource: couldn't open file '%s'", filename_utf8.get()); } catch (AvisynthError) { throw; } catch (...) { env->ThrowError("AVIFileSource: VFW failure, AVIFileOpen(%s), length of filename part must be < 48", filename); } pfile = CreateAVIReadHandler(paf); } else { // OpenDML mode pfile = CreateAVIReadHandler(filename_w.get()); } if (mode != MODE_WAV) { // check for video stream pvideo = pfile->GetStream(streamtypeVIDEO, vtrack); if (!pvideo) { // Attempt DV type 1 video. pvideo = pfile->GetStream(MAKEFOURCC('i','a','v','s'), vtrack); bIsType1 = true; } if (pvideo) { // accept code-in-the-bracker style like G4[0][16] bool inBracket = false; char buf[4+1]; int len = 0; char ch; int number = 0; const char* fc = fourCC; while ((ch = *fc++)) { if (len == 4) env->ThrowError("Avisource: fourCC must be four characters"); if (ch == '[') { if (inBracket) env->ThrowError("Avisource: fourCC syntax error: unexpected ["); inBracket = true; number = 0; continue; } if (ch == ']') { if (!inBracket) env->ThrowError("Avisource: fourCC syntax error: unexpected ]"); buf[len++] = number; inBracket = false; continue; } if (inBracket) { if(!isdigit(ch)) env->ThrowError("Avisource: fourCC parsing: only numbers allowed inside brackets"); number = number * 10 + (ch - '0'); if (number>255) env->ThrowError("Avisource: fourCC parsing: maximum code cannot exceed 255"); continue; } buf[len++] = ch; } if (inBracket) env->ThrowError("Avisource: fourCC syntax error: unclosed ["); buf[len] = 0; LocateVideoCodec(len == 0 ? nullptr : buf, env); if (hic) { if (pixel_type[0] == '+') { pixel_type += 1; bMediaPad = true; } bool forcedType = !(pixel_type[0] == 0); bool fY8 = pixel_type[0] == 0 || lstrcmpi(pixel_type, "Y8" ) == 0; bool fYV12 = pixel_type[0] == 0 || lstrcmpi(pixel_type, "YV12" ) == 0; bool fYV16 = pixel_type[0] == 0 || lstrcmpi(pixel_type, "YV16" ) == 0; bool fYV24 = pixel_type[0] == 0 || lstrcmpi(pixel_type, "YV24" ) == 0; bool fv308 = pixel_type[0] == 0 || lstrcmpi(pixel_type, "v308") == 0; bool fv408 = pixel_type[0] == 0 || lstrcmpi(pixel_type, "v408") == 0; bool fYV411 = pixel_type[0] == 0 || lstrcmpi(pixel_type, "YV411") == 0; bool fYUY2 = pixel_type[0] == 0 || lstrcmpi(pixel_type, "YUY2" ) == 0; bool fRGB32 = pixel_type[0] == 0 || lstrcmpi(pixel_type, "RGB32") == 0; bool fRGB24 = pixel_type[0] == 0 || lstrcmpi(pixel_type, "RGB24") == 0; bool fRGB48 = pixel_type[0] == 0 || lstrcmpi(pixel_type, "RGB48") == 0; bool fRGB64 = pixel_type[0] == 0 || lstrcmpi(pixel_type, "RGB64") == 0; bool fYUV420P10 = pixel_type[0] == 0 || lstrcmpi(pixel_type, "YUV420P10") == 0; bool fP010 = pixel_type[0] == 0 || lstrcmpi(pixel_type, "P010") == 0; bool fYUV420P16 = pixel_type[0] == 0 || lstrcmpi(pixel_type, "YUV420P16") == 0; bool fP016 = pixel_type[0] == 0 || lstrcmpi(pixel_type, "P016") == 0; bool fYUV422P10 = pixel_type[0] == 0 || lstrcmpi(pixel_type, "YUV422P10") == 0; // we cannot know it beforehand, don't set it true if not specified, only generic YUV422P10 is valid bool fv210 = lstrcmpi(pixel_type, "v210") == 0; bool fP210 = lstrcmpi(pixel_type, "P210") == 0; bool fYUV422P16 = pixel_type[0] == 0 || lstrcmpi(pixel_type, "YUV422P16") == 0; bool fP216 = pixel_type[0] == 0 || lstrcmpi(pixel_type, "P216") == 0; bool fYUV444P10 = pixel_type[0] == 0 || lstrcmpi(pixel_type, "YUV444P10") == 0; bool fv410 = pixel_type[0] == 0 || lstrcmpi(pixel_type, "v410") == 0; bool fY410 = pixel_type[0] == 0 || lstrcmpi(pixel_type, "Y410") == 0; bool fYUV444P16 = pixel_type[0] == 0 || lstrcmpi(pixel_type, "YUV444P16") == 0; bool fY416 = pixel_type[0] == 0 || lstrcmpi(pixel_type, "Y416") == 0; bool fRGBP = pixel_type[0] == 0 || lstrcmpi(pixel_type, "RGBP") == 0; // RGBP means planar RGB 10-16 // FIXME: 8 bit planar RGB possible? // FIXME: hint for RGBPA priority? bool fGrayscale = pixel_type[0] == 0 || lstrcmpi(pixel_type, "Y") == 0; // Y8-16 // special 10 bit RGB, multiple formats supported bool fRGBP10 = pixel_type[0] == 0 || lstrcmpi(pixel_type, "RGBP10") == 0; bool fr210 = pixel_type[0] == 0 || lstrcmpi(pixel_type, "r210") == 0; bool fR10k = pixel_type[0] == 0 || lstrcmpi(pixel_type, "R10k") == 0; // we don't set specifically v210, P010, P016, P210, P216, Y410, Y416, v308, v408 for auto. // These are set only when negotiated if (lstrcmpi(pixel_type, "AUTO") == 0) { fY8 = fYV12 = fYUY2 = fRGB32 = fRGB24 = fRGB48 = fRGB64 = true; fYUV420P10 = true; fYUV420P16 = true; fYUV422P10 = true; fYUV422P16 = true; fYUV444P10 = true; fYUV444P16 = true; fRGBP = true; fRGBP10 = true; fr210 = true; fR10k = true; fGrayscale = true; forcedType = false; } else if (lstrcmpi(pixel_type, "FULL") == 0) { fY8 = fYV12 = fYV16 = fYV24 = fYV411 = fYUY2 = fRGB32 = fRGB24 = fRGB48 = fRGB64 = true; fYUV420P10 = true; fYUV420P16 = true; fYUV422P10 = true; fYUV422P16 = true; fYUV444P10 = true; fYUV444P16 = true; fRGBP = true; fRGBP10 = true; fr210 = true; fR10k = true; fGrayscale = true; forcedType = false; } if (!(fY8 || fYV12 || fYV16 || fYV24 || fYV411 || fYUY2 || fRGB32 || fRGB24 || fRGB48 || fRGB64 || fv308 || fv408 || fYUV420P10 || fP010 || fYUV420P16 || fP016 || fYUV422P10 || fP210 || fv210 || fYUV422P16 || fP216 || fYUV444P10 || fv410 || fY410 || fYUV444P16 || fY416 || fRGBP || fRGBP10 || fr210 || fR10k || fGrayscale )) env->ThrowError("AVISource: requested format must be one of YV12/16/24, YV411, YUY2, Y8, Y, RGBP, RGBP10, r210, R10k, RGB24/32/48/64, YUV420P10/16, YUV422P10/16, YUV444P10/16, v210, P010/16, P210/16, v410, Y410, Y416, v308, v408, AUTO or FULL"); // try to decompress to YV12, YV411, YV16, YV24, YUY2, Y8, RGB32, and RGB24, RGB48, RGB64, YUV422P10 in turn memset(&biDst, 0, sizeof(BITMAPINFOHEADER)); biDst.biSize = sizeof(BITMAPINFOHEADER); biDst.biWidth = vi.width; biDst.biHeight = vi.height; biDst.biPlanes = 1; bool bOpen = true; // YV24 if (fYV24 && bOpen) { vi.pixel_type = VideoInfo::CS_YV24; biDst.biSizeImage = vi.BMPSize(); biDst.biCompression = MAKEFOURCC('Y', 'V', '2', '4'); biDst.biBitCount = 24; if (ICERR_OK == ICDecompressQuery(hic, pbiSrc, &biDst)) { _RPT0(0,"AVISource: Opening as YV24.\n"); bOpen = false; // Skip further attempts } else if (forcedType) { env->ThrowError("AVISource: the video decompressor couldn't produce YV24 output"); } } // YV16 if (fYV16 && bOpen) { vi.pixel_type = VideoInfo::CS_YV16; biDst.biSizeImage = vi.BMPSize(); biDst.biCompression = MAKEFOURCC('Y', 'V', '1', '6'); biDst.biBitCount = 16; if (ICERR_OK == ICDecompressQuery(hic, pbiSrc, &biDst)) { _RPT0(0,"AVISource: Opening as YV16.\n"); bOpen = false; // Skip further attempts } else if (forcedType) { env->ThrowError("AVISource: the video decompressor couldn't produce YV16 output"); } } // YV12 if (fYV12 && bOpen) { vi.pixel_type = VideoInfo::CS_YV12; biDst.biSizeImage = vi.BMPSize(); biDst.biCompression = MAKEFOURCC('Y', 'V', '1', '2'); biDst.biBitCount = 12; if (ICERR_OK == ICDecompressQuery(hic, pbiSrc, &biDst)) { _RPT0(0,"AVISource: Opening as YV12.\n"); bOpen = false; // Skip further attempts } else if (forcedType) { env->ThrowError("AVISource: the video decompressor couldn't produce YV12 output"); } } // ::FIXME:: Is this the most appropriate order. Not sure about YUY2 vrs YV411 // YV411 if (fYV411 && bOpen) { vi.pixel_type = VideoInfo::CS_YV411; biDst.biSizeImage = vi.BMPSize(); biDst.biCompression = MAKEFOURCC('Y', '4', '1', 'B'); biDst.biBitCount = 16; if (ICERR_OK == ICDecompressQuery(hic, pbiSrc, &biDst)) { _RPT0(0,"AVISource: Opening as YV411.\n"); bOpen = false; // Skip further attempts } else if (forcedType) { env->ThrowError("AVISource: the video decompressor couldn't produce YV411 output"); } } // YUY2 if (fYUY2 && bOpen) { vi.pixel_type = VideoInfo::CS_YUY2; biDst.biSizeImage = vi.BMPSize(); biDst.biCompression = MAKEFOURCC('Y', 'U', 'Y', '2'); // :FIXME: Handle UYVY, etc biDst.biBitCount = 16; if (ICERR_OK == ICDecompressQuery(hic, pbiSrc, &biDst)) { _RPT0(0,"AVISource: Opening as YUY2.\n"); bOpen = false; // Skip further attempts } else if (forcedType) { env->ThrowError("AVISource: the video decompressor couldn't produce YUY2 output"); } } // RGBP 10 bit special if ((fRGBP10 || fr210 || fR10k) && bOpen) { if (fRGBP10 && bOpen) { vi.pixel_type = VideoInfo::CS_RGBP10; biDst.biSizeImage = vi.BMPSize(); biDst.biCompression = MAKEFOURCC('G', '3', 0, 10); // ffmpeg GBRP10LE biDst.biBitCount = 30; if (ICERR_OK == ICDecompressQuery(hic, pbiSrc, &biDst)) { _RPT0(0, "AVISource: Opening as G3[0][10].\n"); bOpen = false; // Skip further attempts } } if ((fRGBP10 || fr210) && bOpen) { vi.pixel_type = VideoInfo::CS_RGBP10; if (setInternalFormat_r210(vi, hic, pbiSrc, &biDst, MAKEFOURCC('r', '2', '1', '0'), VideoInfo::CS_RGBP10)) { _RPT0(0, "AVISource: Opening as r210.\n"); specf = AVI_SpecialFormats::r210; bOpen = false; // Skip further attempts } } if ((fRGBP10 || fR10k) && bOpen) { vi.pixel_type = VideoInfo::CS_RGBP10; if (setInternalFormat_R10k(vi, hic, pbiSrc, &biDst, MAKEFOURCC('R', '1', '0', 'k'), VideoInfo::CS_RGBP10)) { _RPT0(0, "AVISource: Opening as R10k.\n"); specf = AVI_SpecialFormats::R10k; bOpen = false; // Skip further attempts } } if (bOpen && forcedType) { env->ThrowError("AVISource: the video decompressor couldn't produce Planar RGB 10 output"); } } // "RGBP": this is a hint that planar RGB is preferred, no specific bit depth needed if (fRGBP && bOpen) { // FIXME: consider putting here G3[0][8] and G4[0][8] vi.pixel_type = VideoInfo::CS_RGBP10; biDst.biSizeImage = vi.BMPSize(); biDst.biCompression = MAKEFOURCC('G', '3', 0, 10); // ffmpeg GBRP10LE biDst.biBitCount = 30; if (ICERR_OK == ICDecompressQuery(hic, pbiSrc, &biDst)) { _RPT0(0, "AVISource: Opening as G3[0][10].\n"); bOpen = false; // Skip further attempts } else { vi.pixel_type = VideoInfo::CS_RGBP10; if (setInternalFormat_r210(vi, hic, pbiSrc, &biDst, MAKEFOURCC('r', '2', '1', '0'), VideoInfo::CS_RGBP10)) { _RPT0(0, "AVISource: Opening as r210.\n"); specf = AVI_SpecialFormats::r210; bOpen = false; // Skip further attempts } else { vi.pixel_type = VideoInfo::CS_RGBP10; if (setInternalFormat_R10k(vi, hic, pbiSrc, &biDst, MAKEFOURCC('R', '1', '0', 'k'), VideoInfo::CS_RGBP10)) { _RPT0(0, "AVISource: Opening as R10k.\n"); specf = AVI_SpecialFormats::R10k; bOpen = false; // Skip further attempts } else { vi.pixel_type = VideoInfo::CS_RGBP12; biDst.biCompression = MAKEFOURCC('G', '3', 0, 12); // ffmpeg GBRP12LE biDst.biBitCount = 36; if (ICERR_OK == ICDecompressQuery(hic, pbiSrc, &biDst)) { _RPT0(0, "AVISource: Opening as G3[0][12].\n"); bOpen = false; // Skip further attempts } else { vi.pixel_type = VideoInfo::CS_RGBP14; biDst.biCompression = MAKEFOURCC('G', '3', 0, 14); // ffmpeg GBRP14LE biDst.biBitCount = 42; if (ICERR_OK == ICDecompressQuery(hic, pbiSrc, &biDst)) { _RPT0(0, "AVISource: Opening as G3[0][14].\n"); bOpen = false; // Skip further attempts } else { vi.pixel_type = VideoInfo::CS_RGBP16; biDst.biCompression = MAKEFOURCC('G', '3', 0, 16); // ffmpeg GBRP16LE biDst.biBitCount = 48; if (ICERR_OK == ICDecompressQuery(hic, pbiSrc, &biDst)) { _RPT0(0, "AVISource: Opening as G3[0][16].\n"); bOpen = false; // Skip further attempts } else { vi.pixel_type = VideoInfo::CS_RGBAP10; biDst.biSizeImage = vi.BMPSize(); biDst.biCompression = MAKEFOURCC('G', '4', 0, 10); // ffmpeg GBRAP10LE biDst.biBitCount = 40; // FIXME: 4*10 = 40? if (ICERR_OK == ICDecompressQuery(hic, pbiSrc, &biDst)) { _RPT0(0, "AVISource: Opening as G4[0][10].\n"); bOpen = false; // Skip further attempts } else { vi.pixel_type = VideoInfo::CS_RGBAP12; biDst.biCompression = MAKEFOURCC('G', '4', 0, 12); // ffmpeg GBRAP12LE biDst.biBitCount = 48; // FIXME: 4*12 = 48? if (ICERR_OK == ICDecompressQuery(hic, pbiSrc, &biDst)) { _RPT0(0, "AVISource: Opening as G4[0][12].\n"); bOpen = false; // Skip further attempts } else { vi.pixel_type = VideoInfo::CS_RGBAP14; biDst.biCompression = MAKEFOURCC('G', '4', 0, 14); // ffmpeg GBRAP14LE biDst.biBitCount = 56; // FIXME: 4*14 = 56? if (ICERR_OK == ICDecompressQuery(hic, pbiSrc, &biDst)) { _RPT0(0, "AVISource: Opening as G4[0][14].\n"); bOpen = false; // Skip further attempts } else { vi.pixel_type = VideoInfo::CS_RGBAP16; biDst.biCompression = MAKEFOURCC('G', '4', 0, 16); // ffmpeg GBRAP16LE biDst.biBitCount = 64; // FIXME: 4*16 = 64? if (ICERR_OK == ICDecompressQuery(hic, pbiSrc, &biDst)) { _RPT0(0, "AVISource: Opening as G4[0][16].\n"); bOpen = false; // Skip further attempts } else if (forcedType) { env->ThrowError("AVISource: the video decompressor couldn't produce Planar RGB(A) output"); } } } } } } } } } } } // RGB32 if (fRGB32 && bOpen) { vi.pixel_type = VideoInfo::CS_BGR32; biDst.biSizeImage = vi.BMPSize(); biDst.biCompression = BI_RGB; biDst.biBitCount = 32; if (ICERR_OK == ICDecompressQuery(hic, pbiSrc, &biDst)) { _RPT0(0,"AVISource: Opening as RGB32.\n"); bOpen = false; // Skip further attempts } else if (forcedType) { env->ThrowError("AVISource: the video decompressor couldn't produce RGB32 output"); } } // RGB24 if (fRGB24 && bOpen) { vi.pixel_type = VideoInfo::CS_BGR24; biDst.biSizeImage = vi.BMPSize(); biDst.biCompression = BI_RGB; biDst.biBitCount = 24; if (ICERR_OK == ICDecompressQuery(hic, pbiSrc, &biDst)) { _RPT0(0,"AVISource: Opening as RGB24.\n"); bOpen = false; // Skip further attempts } else if (forcedType) { env->ThrowError("AVISource: the video decompressor couldn't produce RGB24 output"); } } // RGB48 if (fRGB48 && bOpen) { if (setInternalFormat_BGR48(vi, hic, pbiSrc, &biDst, MAKEFOURCC('B', 'G', 'R', 48), VideoInfo::CS_BGR48)) { _RPT0(0, "AVISource: Opening as BGR0 (BGR[48]).\n"); bOpen = false; // Skip further attempts } else { // e.g. preferred by UT RGB 10 bits : UQRG if (setInternalFormat_b48r(vi, hic, pbiSrc, &biDst, MAKEFOURCC('b', '4', '8', 'r'), VideoInfo::CS_BGR48)) { _RPT0(0, "AVISource: Opening as b48r.\n"); specf = AVI_SpecialFormats::b48r; bOpen = false; // Skip further attempts } else if (forcedType) { env->ThrowError("AVISource: the video decompressor couldn't produce RGB48 output"); } } } // RGB64 if (fRGB64 && bOpen) { if (setInternalFormat_BRA64(vi, hic, pbiSrc, &biDst, MAKEFOURCC('B', 'R', 'A', 64), VideoInfo::CS_BGR64)) { _RPT0(0, "AVISource: Opening as BRA@ (BRA[64]).\n"); bOpen = false; // Skip further attempts } else { if (setInternalFormat_b64a(vi, hic, pbiSrc, &biDst, MAKEFOURCC('b', '6', '4', 'a'), VideoInfo::CS_BGR64)) { _RPT0(0, "AVISource: Opening as b64a.\n"); bOpen = false; // Skip further attempts specf = AVI_SpecialFormats::b64a; } else if (forcedType) { env->ThrowError("AVISource: the video decompressor couldn't produce RGB64 output"); } } } // Y8 if ((fY8 || fGrayscale) && bOpen) { vi.pixel_type = VideoInfo::CS_Y8; biDst.biSizeImage = vi.BMPSize(); biDst.biCompression = MAKEFOURCC('Y', '8', '0', '0'); biDst.biBitCount = 8; if (ICERR_OK == ICDecompressQuery(hic, pbiSrc, &biDst)) { _RPT0(0,"AVISource: Opening as Y800.\n"); bOpen = false; // Skip further attempts } else { biDst.biCompression = MAKEFOURCC('Y', '8', ' ', ' '); if (ICERR_OK == ICDecompressQuery(hic, pbiSrc, &biDst)) { _RPT0(0,"AVISource: Opening as Y8.\n"); bOpen = false; // Skip further attempts } else { biDst.biCompression = MAKEFOURCC('G', 'R', 'E', 'Y'); if (ICERR_OK == ICDecompressQuery(hic, pbiSrc, &biDst)) { _RPT0(0,"AVISource: Opening as GREY.\n"); bOpen = false; // Skip further attempts } else if (forcedType) { env->ThrowError("AVISource: the video decompressor couldn't produce Y8 output"); } } } } // Greyscale 'Y' no specific bit depth if (fGrayscale && bOpen) { vi.pixel_type = VideoInfo::CS_Y10; biDst.biSizeImage = vi.BMPSize(); biDst.biCompression = MAKEFOURCC('Y', '1', 0, 10); biDst.biBitCount = 10; if (ICERR_OK == ICDecompressQuery(hic, pbiSrc, &biDst)) { _RPT0(0, "AVISource: Opening as Y1[0][10].\n"); bOpen = false; // Skip further attempts } else { vi.pixel_type = VideoInfo::CS_Y12; biDst.biSizeImage = vi.BMPSize(); biDst.biCompression = MAKEFOURCC('Y', '1', 0, 12); biDst.biBitCount = 12; if (ICERR_OK == ICDecompressQuery(hic, pbiSrc, &biDst)) { _RPT0(0, "AVISource: Opening as Y1[0][12].\n"); bOpen = false; // Skip further attempts } else { vi.pixel_type = VideoInfo::CS_Y14; biDst.biSizeImage = vi.BMPSize(); biDst.biCompression = MAKEFOURCC('Y', '1', 0, 14); biDst.biBitCount = 14; if (ICERR_OK == ICDecompressQuery(hic, pbiSrc, &biDst)) { _RPT0(0, "AVISource: Opening as Y1[0][14].\n"); bOpen = false; // Skip further attempts } else { vi.pixel_type = VideoInfo::CS_Y16; biDst.biSizeImage = vi.BMPSize(); biDst.biCompression = MAKEFOURCC('Y', '1', 0, 16); biDst.biBitCount = 16; if (ICERR_OK == ICDecompressQuery(hic, pbiSrc, &biDst)) { _RPT0(0, "AVISource: Opening as Y1[0][16].\n"); bOpen = false; // Skip further attempts } else if (forcedType) { env->ThrowError("AVISource: the video decompressor couldn't produce grayscale output"); } } } } } // YUV422P10 if ((fYUV422P10 || fv210 || fP210) && bOpen) { vi.pixel_type = VideoInfo::CS_YUV422P10; if ((fv210 || fYUV422P10) && bOpen) { if (setInternalFormat_v210(vi, hic, pbiSrc, &biDst, MAKEFOURCC('v', '2', '1', '0'), VideoInfo::CS_YUV422P10)) { _RPT0(0, "AVISource: Opening as v210.\n"); specf = AVI_SpecialFormats::v210; bOpen = false; // Skip further attempts } } if ((fP210 || fYUV422P10) && bOpen) { if (setInternalFormat_P210(vi, hic, pbiSrc, &biDst, MAKEFOURCC('P', '2', '1', '0'), VideoInfo::CS_YUV422P10)) { _RPT0(0, "AVISource: Opening as P210.\n"); specf = AVI_SpecialFormats::P210; bOpen = false; // Skip further attempts } } else if (forcedType && bOpen) { env->ThrowError("AVISource: the video decompressor couldn't produce YUV422P10 output"); } } // YUV422P16 if ((fYUV422P16 || fP216) && bOpen) { vi.pixel_type = VideoInfo::CS_YUV422P16; if (setInternalFormat_P216(vi, hic, pbiSrc, &biDst, MAKEFOURCC('P', '2', '1', '6'), VideoInfo::CS_YUV422P16)) { _RPT0(0, "AVISource: Opening as P216.\n"); specf = AVI_SpecialFormats::P216; bOpen = false; // Skip further attempts } else if (forcedType) { env->ThrowError("AVISource: the video decompressor couldn't produce YUV422P16 output"); } } // YUV420P10 if ((fYUV420P10 || fP010) && bOpen) { vi.pixel_type = VideoInfo::CS_YUV420P10; if (setInternalFormat_P010(vi, hic, pbiSrc, &biDst, MAKEFOURCC('P', '0', '1', '0'), VideoInfo::CS_YUV420P10)) { _RPT0(0, "AVISource: Opening as P010.\n"); specf = AVI_SpecialFormats::P010; bOpen = false; // Skip further attempts } else if (forcedType) { env->ThrowError("AVISource: the video decompressor couldn't produce YUV420P10 output"); } } // YUV420P16 if ((fYUV420P16 || fP016) && bOpen) { vi.pixel_type = VideoInfo::CS_YUV420P16; if (setInternalFormat_P016(vi, hic, pbiSrc, &biDst, MAKEFOURCC('P', '0', '1', '6'), VideoInfo::CS_YUV420P16)) { _RPT0(0, "AVISource: Opening as P016.\n"); specf = AVI_SpecialFormats::P016; bOpen = false; // Skip further attempts } else if (forcedType) { env->ThrowError("AVISource: the video decompressor couldn't produce YUV420P16 output"); } } // YUV444P16 if ((fYUV444P16 || fY416) && bOpen) { vi.pixel_type = VideoInfo::CS_YUV444P16; if (setInternalFormat_Y416(vi, hic, pbiSrc, &biDst, MAKEFOURCC('Y', '4', '1', '6'), VideoInfo::CS_YUV444P16)) { _RPT0(0, "AVISource: Opening as Y416.\n"); specf = AVI_SpecialFormats::Y416; bOpen = false; // Skip further attempts } else if (forcedType) { env->ThrowError("AVISource: the video decompressor couldn't produce YUV444P16 output"); } } // YUV444P10 if ((fYUV444P10 || fv410 || fY410) && bOpen) { vi.pixel_type = VideoInfo::CS_YUV444P10; if ((fYUV444P10 || fv410) && setInternalFormat_v410(vi, hic, pbiSrc, &biDst, MAKEFOURCC('v', '4', '1', '0'), VideoInfo::CS_YUV444P10)) { _RPT0(0, "AVISource: Opening as v410.\n"); specf = AVI_SpecialFormats::v410; bOpen = false; // Skip further attempts } else if ((fYUV444P10 || fY410) && setInternalFormat_Y410(vi, hic, pbiSrc, &biDst, MAKEFOURCC('Y', '4', '1', '0'), VideoInfo::CS_YUVA444P10)) { _RPT0(0, "AVISource: Opening as Y410.\n"); specf = AVI_SpecialFormats::Y410; bOpen = false; // Skip further attempts } else if (forcedType) { env->ThrowError("AVISource: the video decompressor couldn't produce YUV444P10 output"); } } // v308 to YUV444P8 aka YV24 if ((fv308) && bOpen) { vi.pixel_type = VideoInfo::CS_YV24; if (setInternalFormat_v308(vi, hic, pbiSrc, &biDst, MAKEFOURCC('v', '3', '0', '8'), VideoInfo::CS_YV24)) { _RPT0(0, "AVISource: Opening as v308.\n"); specf = AVI_SpecialFormats::v308; bOpen = false; // Skip further attempts } else if (forcedType) { env->ThrowError("AVISource: the video decompressor couldn't produce v308 output"); } } // v408 to YUVA444P8 if ((fv408) && bOpen) { vi.pixel_type = VideoInfo::CS_YUVA444; if (setInternalFormat_v408(vi, hic, pbiSrc, &biDst, MAKEFOURCC('v', '4', '0', '8'), VideoInfo::CS_YUVA444)) { _RPT0(0, "AVISource: Opening as v408.\n"); specf = AVI_SpecialFormats::v408; bOpen = false; // Skip further attempts } else if (forcedType) { env->ThrowError("AVISource: the video decompressor couldn't produce v408 output"); } } // No takers! if (bOpen) env->ThrowError("AviSource: Could not open video stream in any supported format."); DecompressBegin(pbiSrc, &biDst); } else { // no hic // when we reach here, maybe a natively supported fourCC format was reported if (pbiSrc->biCompression == MAKEFOURCC('b', '6', '4', 'a')) { if (setInternalFormat_b64a(vi, hic, pbiSrc, &biDst, pbiSrc->biCompression, VideoInfo::CS_BGR64)) { _RPT0(0, "AVISource: Opening as b64a.\n"); specf = AVI_SpecialFormats::b64a; // special flag! } } if (pbiSrc->biCompression == MAKEFOURCC('B', 'R', 'A', 64)) { if (setInternalFormat_BRA64(vi, hic, pbiSrc, &biDst, pbiSrc->biCompression, VideoInfo::CS_BGR64)) { _RPT0(0, "AVISource: Opening as BRA@.\n"); } } if (pbiSrc->biCompression == MAKEFOURCC('B', 'G', 'R', 48)) { if (setInternalFormat_BGR48(vi, hic, pbiSrc, &biDst, pbiSrc->biCompression, VideoInfo::CS_BGR48)) { _RPT0(0, "AVISource: Opening as BGR[48].\n"); } } if (pbiSrc->biCompression == MAKEFOURCC('b', '4', '8', 'r')) { if (setInternalFormat_b48r(vi, hic, pbiSrc, &biDst, pbiSrc->biCompression, VideoInfo::CS_BGR48)) { _RPT0(0, "AVISource: Opening as b48r.\n"); specf = AVI_SpecialFormats::b48r; // special flag! } } if (pbiSrc->biCompression == MAKEFOURCC('v', '2', '1', '0')) { if (setInternalFormat_v210(vi, hic, pbiSrc, &biDst, pbiSrc->biCompression, VideoInfo::CS_YUV422P10)) { _RPT0(0, "AVISource: Opening as v210.\n"); specf = AVI_SpecialFormats::v210; // special flag! } } if (pbiSrc->biCompression == MAKEFOURCC('P', '2', '1', '0')) { if (setInternalFormat_P210(vi, hic, pbiSrc, &biDst, pbiSrc->biCompression, VideoInfo::CS_YUV422P10)) { _RPT0(0, "AVISource: Opening as P210.\n"); specf = AVI_SpecialFormats::P210; } } if (pbiSrc->biCompression == MAKEFOURCC('P', '0', '1', '0')) { if (setInternalFormat_P010(vi, hic, pbiSrc, &biDst, pbiSrc->biCompression, VideoInfo::CS_YUV420P10)) { _RPT0(0, "AVISource: Opening as P010.\n"); specf = AVI_SpecialFormats::P010; } } if (pbiSrc->biCompression == MAKEFOURCC('P', '0', '1', '6')) { if (setInternalFormat_P016(vi, hic, pbiSrc, &biDst, pbiSrc->biCompression, VideoInfo::CS_YUV420P16)) { _RPT0(0, "AVISource: Opening as P016.\n"); specf = AVI_SpecialFormats::P016; } } if (pbiSrc->biCompression == MAKEFOURCC('P', '2', '1', '6')) { if (setInternalFormat_P216(vi, hic, pbiSrc, &biDst, pbiSrc->biCompression, VideoInfo::CS_YUV422P16)) { _RPT0(0, "AVISource: Opening as P216.\n"); specf = AVI_SpecialFormats::P216; } } if (pbiSrc->biCompression == MAKEFOURCC('v', '4', '1', '0')) { if (setInternalFormat_v410(vi, hic, pbiSrc, &biDst, pbiSrc->biCompression, VideoInfo::CS_YUV444P10)) { _RPT0(0, "AVISource: Opening as v410.\n"); specf = AVI_SpecialFormats::v410; } } if (pbiSrc->biCompression == MAKEFOURCC('Y', '4', '1', '0')) { if (setInternalFormat_Y410(vi, hic, pbiSrc, &biDst, pbiSrc->biCompression, VideoInfo::CS_YUVA444P10)) { _RPT0(0, "AVISource: Opening as Y410.\n"); specf = AVI_SpecialFormats::Y410; } } if (pbiSrc->biCompression == MAKEFOURCC('Y', '4', '1', '6')) { if (setInternalFormat_Y416(vi, hic, pbiSrc, &biDst, pbiSrc->biCompression, VideoInfo::CS_YUV444P16)) { _RPT0(0, "AVISource: Opening as Y416.\n"); specf = AVI_SpecialFormats::Y416; } } if (pbiSrc->biCompression == MAKEFOURCC('r', '2', '1', '0')) { if (setInternalFormat_r210(vi, hic, pbiSrc, &biDst, pbiSrc->biCompression, VideoInfo::CS_RGBP10)) { _RPT0(0, "AVISource: Opening as r210.\n"); specf = AVI_SpecialFormats::r210; } } if (pbiSrc->biCompression == MAKEFOURCC('R', '1', '0', 'k')) { if (setInternalFormat_R10k(vi, hic, pbiSrc, &biDst, pbiSrc->biCompression, VideoInfo::CS_RGBP10)) { _RPT0(0, "AVISource: Opening as R10k.\n"); specf = AVI_SpecialFormats::R10k; } } if (pbiSrc->biCompression == MAKEFOURCC('v', '3', '0', '8')) { if (setInternalFormat_v308(vi, hic, pbiSrc, &biDst, pbiSrc->biCompression, VideoInfo::CS_YV24)) { _RPT0(0, "AVISource: Opening as v308.\n"); specf = AVI_SpecialFormats::v308; } } if (pbiSrc->biCompression == MAKEFOURCC('v', '4', '0', '8')) { if (setInternalFormat_v408(vi, hic, pbiSrc, &biDst, pbiSrc->biCompression, VideoInfo::CS_YUVA444)) { _RPT0(0, "AVISource: Opening as v408.\n"); specf = AVI_SpecialFormats::v408; } } } // Flip DIB formats if negative height (FIXME: Y8 too?). Flip RGB48/64 always. if ((pbiSrc->biHeight < 0 && (vi.IsRGB24() || vi.IsRGB32() || vi.IsY8())) || vi.IsRGB48() || vi.IsRGB64()) bInvertFrames = true; } else { env->ThrowError("AviSource: Could not locate video stream."); } } // check for audio stream if (fAudio) /* && pfile->GetStream(streamtypeAUDIO, 0)) */ { aSrc = new AudioSourceAVI(pfile, true, atrack); if (aSrc->init()) { audioStreamSource = new AudioStreamSource(aSrc, aSrc->lSampleFirst, aSrc->lSampleLast - aSrc->lSampleFirst, true); WAVEFORMATEX* pwfx; pwfx = audioStreamSource->GetFormat(); vi.audio_samples_per_second = pwfx->nSamplesPerSec; vi.nchannels = pwfx->nChannels; if (pwfx->wFormatTag == WAVE_FORMAT_IEEE_FLOAT) { vi.sample_type = SAMPLE_FLOAT; } else if (pwfx->wBitsPerSample == 16) { vi.sample_type = SAMPLE_INT16; } else if (pwfx->wBitsPerSample == 8) { vi.sample_type = SAMPLE_INT8; } else if (pwfx->wBitsPerSample == 24) { vi.sample_type = SAMPLE_INT24; } else if (pwfx->wBitsPerSample == 32) { vi.sample_type = SAMPLE_INT32; } vi.num_audio_samples = audioStreamSource->GetLength(); audio_stream_pos = 0; } } // try to decompress frame 0 if not audio only. dropped_frame=false; if (mode != MODE_WAV) { bMediaPad = !(!bMediaPad && !vi.IsY8() && vi.IsPlanar()); int keyframe = pvideo->NearestKeyFrame(0); frame = new TemporalBuffer(vi, bMediaPad, specf, env); LRESULT error = DecompressFrame(keyframe, false, env); if (error != ICERR_OK) // shutdown, if init not succesful. env->ThrowError("AviSource: Could not decompress frame 0"); // Cope with dud AVI files that start with drop // frames, just return the first key frame if (dropped_frame) { keyframe = pvideo->NextKeyFrame(0); error = DecompressFrame(keyframe, false, env); if (error != ICERR_OK) // shutdown, if init not succesful. env->ThrowError("AviSource: Could not decompress first keyframe %d", keyframe); } last_frame_no=0; last_frame = AdjustFrameAlignment(frame, vi, bInvertFrames, specf, env); } } catch (...) { AVISource::CleanUp(); throw; } } AVISource::~AVISource() { AVISource::CleanUp(); } void AVISource::CleanUp() { // Tritical - Jan 2006 if (hic) { !ex ? ICDecompressEnd(hic) : ICDecompressExEnd(hic); ICClose(hic); } if (pvideo) delete pvideo; if (aSrc) delete aSrc; if (audioStreamSource) delete audioStreamSource; if (pfile) pfile->Release(); AVIFileExit(); if (pbiSrc) free(pbiSrc); if (srcbuffer) // Tritical May 2005 delete[] srcbuffer; if (frame) delete frame; } const VideoInfo& AVISource::GetVideoInfo() { return vi; } PVideoFrame AVISource::GetFrame(int n, IScriptEnvironment* env) { n = clamp(n, 0, vi.num_frames-1); dropped_frame=false; if (n != last_frame_no) { // find the last keyframe int keyframe = pvideo->NearestKeyFrame(n); // maybe we don't need to go back that far if (last_frame_no < n && last_frame_no >= keyframe) keyframe = last_frame_no+1; if (keyframe < 0) keyframe = 0; bool frameok = false; //PVideoFrame frame = env->NewVideoFrameP(vi, -4); bool not_found_yet; do { not_found_yet=false; for (int i = keyframe; i <= n; ++i) { LRESULT error = DecompressFrame(i, i != n, env); if ((!dropped_frame) && (error == ICERR_OK)) frameok = true; // Better safe than sorry } last_frame_no = n; if (!last_frame && !frameok) { // Last keyframe was not valid. const int key_pre=keyframe; keyframe = pvideo->NearestKeyFrame(keyframe-1); if (keyframe < 0) keyframe = 0; if (keyframe == key_pre) env->ThrowError("AVISource: could not find valid keyframe for frame %d.", n); not_found_yet=true; } } while(not_found_yet); if (frameok) { last_frame = AdjustFrameAlignment(frame, vi, bInvertFrames, specf, env); } } return last_frame; } void AVISource::GetAudio(void* buf, __int64 start, __int64 count, IScriptEnvironment* env) { AVS_UNUSED(env); long bytes_read=0; __int64 samples_read=0; if (start < 0) { int bytes = (int)vi.BytesFromAudioSamples(min(-start, count)); memset(buf, 0, bytes); buf = (char*)buf + bytes; count -= vi.AudioSamplesFromBytes(bytes); start += vi.AudioSamplesFromBytes(bytes); } if (audioStreamSource) { if (start != audio_stream_pos) audioStreamSource->Seek((long)start); samples_read = audioStreamSource->Read(buf, (long)count, &bytes_read); audio_stream_pos = start + samples_read; } if (samples_read < count) memset((char*)buf + bytes_read, 0, (size_t)(vi.BytesFromAudioSamples(count) - bytes_read)); } bool AVISource::GetParity(int n) { AVS_UNUSED(n); return false; } int __stdcall AVISource::SetCacheHints(int cachehints,int frame_range) { AVS_UNUSED(frame_range); switch(cachehints) { case CACHE_GET_MTMODE: return MT_SERIALIZED; default: return 0; } } ================================================ FILE: avs_core/filters/AviSource/avi_source.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include "../../core/alignplanar.h" #include "VD_Audio.h" #include "AVIReadHandler.h" // AVI Decompressors require 4bytes aligned buffer with minimum padding or no padding buffer. // or other specialities. // Therefore, PVideoFrame shouldn't be used as those. typedef enum class _AVI_SpecialFormats { none, b64a, b48r, v210, P010, P016, P210, P216, v410, Y416, r210, R10k, v308, v408, Y410 } AVI_SpecialFormats; class TemporalBuffer { void* orig; BYTE* pY; BYTE* pV; BYTE* pU; BYTE* pA; int pitchY; int pitchUV; size_t size; public: TemporalBuffer(const VideoInfo& vi, bool bMediaPad, AVI_SpecialFormats specf, IScriptEnvironment* env); ~TemporalBuffer() {} int GetPitch(int plane=PLANAR_Y) { return (plane == PLANAR_Y || plane == PLANAR_G || plane == PLANAR_B || plane == PLANAR_R || plane == PLANAR_A) ? pitchY : pitchUV; } size_t GetSize() { return size; } BYTE* GetPtr(int plane=PLANAR_Y) { switch (plane) { case PLANAR_U: return pU; case PLANAR_V: return pV; case PLANAR_G: return pY; case PLANAR_B: return pU; case PLANAR_R: return pV; case PLANAR_A: return pA; default: return pY; } } }; class AVISource : public IClip { IAVIReadHandler *pfile; IAVIReadStream *pvideo; HIC hic; VideoInfo vi; BYTE* srcbuffer; int srcbuffer_size; BITMAPINFOHEADER* pbiSrc; BITMAPINFOHEADER biDst; bool ex; bool dropped_frame; bool bIsType1; bool bInvertFrames; bool bMediaPad; AVI_SpecialFormats specf; PVideoFrame last_frame; int last_frame_no; AudioSource* aSrc; AudioStreamSource* audioStreamSource; __int64 audio_stream_pos; TemporalBuffer* frame; LRESULT DecompressBegin(LPBITMAPINFOHEADER lpbiSrc, LPBITMAPINFOHEADER lpbiDst); LRESULT DecompressFrame(int n, bool preroll, IScriptEnvironment* env); void CheckHresult(HRESULT hr, const char* msg, IScriptEnvironment* env); bool AttemptCodecNegotiation(DWORD fccHandler, BITMAPINFOHEADER* bmih); void LocateVideoCodec(const char fourCC[], IScriptEnvironment* env); public: typedef enum { MODE_NORMAL = 0, MODE_AVIFILE, MODE_OPENDML, MODE_WAV } avi_mode_e; AVISource(const char filename[], bool fAudio, const char pixel_type[], const char fourCC[], int vtrack, int atrack, avi_mode_e mode, bool utf8, IScriptEnvironment* env); // mode: 0=detect, 1=avifile, 2=opendml, 3=avifile (audio only) ~AVISource(); void CleanUp(); // Tritical - Jan 2006 const VideoInfo& __stdcall GetVideoInfo(); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); void __stdcall GetAudio(void* buf, __int64 start, __int64 count, IScriptEnvironment* env) ; bool __stdcall GetParity(int n); int __stdcall SetCacheHints(int cachehints,int frame_range); static AVSValue __cdecl Create(AVSValue args, void* user_data, IScriptEnvironment* env) { // 0 1 // MODE_WAV: "s+[utf8]b" // 0 1 2 3 4 5 6 // other modes: "s+[audio]b[pixel_type]s[fourCC]s[vtrack]i[atrack]i[utf8]b" const avi_mode_e mode = (avi_mode_e)size_t(user_data); const bool fAudio = (mode == MODE_WAV) || args[1].AsBool(true); const char* pixel_type = (mode != MODE_WAV) ? args[2].AsString("") : ""; const char* fourCC = (mode != MODE_WAV) ? args[3].AsString("") : ""; const int vtrack = (mode != MODE_WAV) ? args[4].AsInt(0) : 0; const int atrack = (mode != MODE_WAV) ? args[5].AsInt(0) : 0; const int utf8 = (mode != MODE_WAV) ? args[6].AsBool(false) : args[1].AsBool(false); PClip result = new AVISource(args[0][0].AsString(), fAudio, pixel_type, fourCC, vtrack, atrack, mode, utf8, env); for (int i = 1; i < args[0].ArraySize(); ++i) { AVSValue arg[3] = { result, new AVISource(args[0][i].AsString(), fAudio, pixel_type, fourCC, vtrack, atrack, mode, utf8, env), 0 }; result = env->Invoke("UnalignedSplice", AVSValue(arg, 3)).AsClip(); } return AlignPlanar::Create(result); } }; ================================================ FILE: avs_core/filters/AviSource/clip_info.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __CLIP_INFO_H__ #define __CLIP_INFO_H__ extern "C" const GUID CLSID_CAVIFileSynth; // {E6D6B700-124D-11D4-86F3-DB80AFD98778} extern "C" const GUID IID_IAvisynthClipInfo; // {E6D6B708-124D-11D4-86F3-DB80AFD98778} struct IAvisynthClipInfo : IUnknown { virtual int __stdcall GetError(const char** ppszMessage) = 0; virtual bool __stdcall GetParity(int n) = 0; virtual bool __stdcall IsFieldBased() = 0; }; #endif ================================================ FILE: avs_core/filters/AviSource/list.cpp ================================================ // Packaged with Avisynth v1.0 beta. // http://www.math.berkeley.edu/~benrg/avisynth.html // VirtualDub - Video processing and capture application // Copyright (C) 1998-2000 Avery Lee // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. /////////////////////////////////////////////////////////////////////////// // // For those of you who say this looks familiar... it should. This is // the same linked-list style that the Amiga Exec uses, with dummy head // and tail nodes. It's really a very convienent way to implement // doubly-linked lists. // #include "list.h" List::List() { head.next = tail.prev = 0; head.prev = &tail; tail.next = &head; } ListNode *List::RemoveHead() { if (head.prev->prev) { ListNode *t = head.prev; head.prev->Remove(); return t; } return 0; } ListNode *List::RemoveTail() { if (tail.next->next) { ListNode *t = tail.next; tail.next->Remove(); return t; } return 0; } ================================================ FILE: avs_core/filters/AviSource/list.h ================================================ // Packaged with Avisynth v1.0 beta. // http://www.math.berkeley.edu/~benrg/avisynth.html // VirtualDub - Video processing and capture application // Copyright (C) 1998-2000 Avery Lee // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #ifndef f_LIST_H #define f_LIST_H class ListNode { public: ListNode *next, *prev; ListNode() {} ListNode(void *pv) {} void Remove() { next->prev = prev; prev->next = next; } void InsertAfter(ListNode *node) { next = node; prev = node->prev; if (node->prev) node->prev->next = this; node->prev = this; } void InsertBefore(ListNode *node) { next = node->next; prev = node; if (node->next) node->next->prev = this; node->next = this; } ListNode *NextFromHead() { return prev; } ListNode *NextFromTail() { return next; } }; class List { private: public: ListNode head, tail; // <--- next prev ---> // // head <-> node <-> node <-> tail List(); void AddHead(ListNode *node) { node->InsertAfter(&head); } void AddTail(ListNode *node) { node->InsertBefore(&tail); } ListNode *RemoveHead(); ListNode *RemoveTail(); bool IsEmpty() { return !head.prev->prev; } ListNode *AtHead() { return head.prev; } ListNode *AtTail() { return tail.next; } }; // Templated classes... no code. template class List2; template class ListNode2 : public ListNode { friend List2; public: ListNode2() {} ListNode2(void *pv) : ListNode(pv) {} void InsertBefore(ListNode2 *node) { ListNode::InsertBefore(node); } void InsertAfter(ListNode2 *node) { ListNode::InsertAfter(node); } void Remove() { ListNode::Remove(); } T *NextFromHead() { return (T *)ListNode::NextFromHead(); } T *NextFromTail() { return (T *)ListNode::NextFromTail(); } }; template class List2 : public List { public: List2() {} void AddHead(ListNode2 *node) { List::AddHead(node); } void AddTail(ListNode2 *node) { List::AddTail(node); } T *RemoveHead() { return (T *)List::RemoveHead(); } T *RemoveTail() { return (T *)List::RemoveTail(); } T *AtHead() { return (T *)List::AtHead(); } T *AtTail() { return (T *)List::AtTail(); } }; #endif ================================================ FILE: avs_core/filters/aarch64/turn_neon.cpp ================================================ // AviSynth+. Copyright 2025 AviSynth+ Project // https://avs-plus.net // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include #include #include "../turn.h" #include #include /* SSE Intrinsic,AArch64 NEON Equivalent,Description __m128i uint8x16_t 128-bit vector of 8-bit unsigned integers (bytes) _mm_loadl_epi64 vld1_u8 (into uint8x8_t) Load 64 bits (8 bytes) _mm_unpacklo_epi8 vzip_u8 (64 bit) vzipq_u16/vzipq_u32 (128 bit) Interleaves the low elements of two vectors _mm_unpackhi_epi8 Handled implicitly by vzip structure or equivalent to high 64-bit of vzipq output Interleaves the high elements of two vectors _mm_storel_epi64 vst1_u8 (from uint8x8_t) Store 64 bits (8 bytes) _mm_movehl_ps vget_high_u8 Extracts the high 64 bits from a 128-bit vector */ // -------------------------------------------------------------------------- // 8-bit Block Rotate 90 CW (Transpose + Flip Horizontal) // -------------------------------------------------------------------------- static AVS_FORCEINLINE void transpose_8x8x8_neon(const BYTE* AVS_RESTRICT srcp, BYTE* AVS_RESTRICT dstp, int src_pitch, int dst_pitch) { // 1. Load 8 rows (8x8 block) // Assume srcp points to the top left of the block to be rotated. uint8x8_t r0 = vld1_u8(srcp); srcp += src_pitch; uint8x8_t r1 = vld1_u8(srcp); srcp += src_pitch; uint8x8_t r2 = vld1_u8(srcp); srcp += src_pitch; uint8x8_t r3 = vld1_u8(srcp); srcp += src_pitch; uint8x8_t r4 = vld1_u8(srcp); srcp += src_pitch; uint8x8_t r5 = vld1_u8(srcp); srcp += src_pitch; uint8x8_t r6 = vld1_u8(srcp); srcp += src_pitch; uint8x8_t r7 = vld1_u8(srcp); // 2. Transpose logic (standard butterfly) // Stage 1: Swap 8-bit neighbors uint8x8x2_t t0 = vtrn_u8(r0, r1); uint8x8x2_t t1 = vtrn_u8(r2, r3); uint8x8x2_t t2 = vtrn_u8(r4, r5); uint8x8x2_t t3 = vtrn_u8(r6, r7); // Stage 2: Swap 16-bit pairs uint16x4x2_t m0 = vtrn_u16(vreinterpret_u16_u8(t0.val[0]), vreinterpret_u16_u8(t1.val[0])); uint16x4x2_t m1 = vtrn_u16(vreinterpret_u16_u8(t0.val[1]), vreinterpret_u16_u8(t1.val[1])); uint16x4x2_t m2 = vtrn_u16(vreinterpret_u16_u8(t2.val[0]), vreinterpret_u16_u8(t3.val[0])); uint16x4x2_t m3 = vtrn_u16(vreinterpret_u16_u8(t2.val[1]), vreinterpret_u16_u8(t3.val[1])); // Stage 3: Swap 32-bit quads uint32x2x2_t y04 = vtrn_u32(vreinterpret_u32_u16(m0.val[0]), vreinterpret_u32_u16(m2.val[0])); uint32x2x2_t y15 = vtrn_u32(vreinterpret_u32_u16(m1.val[0]), vreinterpret_u32_u16(m3.val[0])); uint32x2x2_t y26 = vtrn_u32(vreinterpret_u32_u16(m0.val[1]), vreinterpret_u32_u16(m2.val[1])); uint32x2x2_t y37 = vtrn_u32(vreinterpret_u32_u16(m1.val[1]), vreinterpret_u32_u16(m3.val[1])); // 3. Mirror horizontal, store // The transpose put the pixels in order 0,1,2... but Turn Right requires 7,6,5... // We reverse the bytes in each 64-bit register. auto store_rev = [&](const uint32x2x2_t& v, int idx) { // vrev64_u8 reverses bytes in the 64-bit vector (Horizontal Flip) uint8x8_t flipped = vrev64_u8(vreinterpret_u8_u32(v.val[idx])); vst1_u8(dstp, flipped); dstp += dst_pitch; }; store_rev(y04, 0); // Row 0 store_rev(y15, 0); // Row 1 store_rev(y26, 0); // Row 2 store_rev(y37, 0); // Row 3 store_rev(y04, 1); // Row 4 store_rev(y15, 1); // Row 5 store_rev(y26, 1); // Row 6 store_rev(y37, 1); // Row 7 } // -------------------------------------------------------------------------- // 16-bit Block Rotate 90 CW (Transpose + Flip Horizontal) // -------------------------------------------------------------------------- static AVS_FORCEINLINE void transpose_8x8x16_neon(const BYTE* AVS_RESTRICT srcp, BYTE* AVS_RESTRICT dstp, int src_pitch, int dst_pitch) { auto p16 = [](const BYTE* p) { return reinterpret_cast(p); }; auto d16 = [](BYTE* p) { return reinterpret_cast(p); }; // 1. Load 8 rows (8x8 block of uint16) uint16x8_t r0 = vld1q_u16(p16(srcp)); srcp += src_pitch; uint16x8_t r1 = vld1q_u16(p16(srcp)); srcp += src_pitch; uint16x8_t r2 = vld1q_u16(p16(srcp)); srcp += src_pitch; uint16x8_t r3 = vld1q_u16(p16(srcp)); srcp += src_pitch; uint16x8_t r4 = vld1q_u16(p16(srcp)); srcp += src_pitch; uint16x8_t r5 = vld1q_u16(p16(srcp)); srcp += src_pitch; uint16x8_t r6 = vld1q_u16(p16(srcp)); srcp += src_pitch; uint16x8_t r7 = vld1q_u16(p16(srcp)); // 2. Transpose logic (standard butterfly) // Stage 1: Swap 16-bit neighbors uint16x8x2_t trn0 = vtrnq_u16(r0, r1); uint16x8x2_t trn1 = vtrnq_u16(r2, r3); uint16x8x2_t trn2 = vtrnq_u16(r4, r5); uint16x8x2_t trn3 = vtrnq_u16(r6, r7); // Stage 2: Swap 32-bit pairs uint32x4x2_t q0 = vtrnq_u32(vreinterpretq_u32_u16(trn0.val[0]), vreinterpretq_u32_u16(trn1.val[0])); uint32x4x2_t q1 = vtrnq_u32(vreinterpretq_u32_u16(trn0.val[1]), vreinterpretq_u32_u16(trn1.val[1])); uint32x4x2_t q2 = vtrnq_u32(vreinterpretq_u32_u16(trn2.val[0]), vreinterpretq_u32_u16(trn3.val[0])); uint32x4x2_t q3 = vtrnq_u32(vreinterpretq_u32_u16(trn2.val[1]), vreinterpretq_u32_u16(trn3.val[1])); // Stage 3: Swap 64-bit halves (Assembly) uint64x2_t q0_0 = vreinterpretq_u64_u32(q0.val[0]); uint64x2_t q2_0 = vreinterpretq_u64_u32(q2.val[0]); uint64x2_t q1_0 = vreinterpretq_u64_u32(q1.val[0]); uint64x2_t q3_0 = vreinterpretq_u64_u32(q3.val[0]); uint64x2_t q0_1 = vreinterpretq_u64_u32(q0.val[1]); uint64x2_t q2_1 = vreinterpretq_u64_u32(q2.val[1]); uint64x2_t q1_1 = vreinterpretq_u64_u32(q1.val[1]); uint64x2_t q3_1 = vreinterpretq_u64_u32(q3.val[1]); // 3. Mirror Horizontal & Store // To reverse a 128-bit vector of 16-bit elements: [ABCDEFGH] -> [HGFEDCBA] // vrev64 swaps within halves: [DCBA][HGFE] // vext(4) swaps the halves: [HGFE][DCBA] auto store_rev = [&](uint64x2_t a, uint64x2_t b, bool high) { uint16x8_t row; if (!high) row = vreinterpretq_u16_u64(vzip1q_u64(a, b)); else row = vreinterpretq_u16_u64(vzip2q_u64(a, b)); // Flip Horizontal Logic uint16x8_t rev_halves = vrev64q_u16(row); // Swap the 64-bit halves (index 4 corresponds to 4 * 16-bit = 64 bits) uint16x8_t fully_flipped = vextq_u16(rev_halves, rev_halves, 4); vst1q_u16(d16(dstp), fully_flipped); dstp += dst_pitch; }; store_rev(q0_0, q2_0, false); // Row 0 store_rev(q1_0, q3_0, false); // Row 1 store_rev(q0_1, q2_1, false); // Row 2 store_rev(q1_1, q3_1, false); // Row 3 store_rev(q0_0, q2_0, true); // Row 4 store_rev(q1_0, q3_0, true); // Row 5 store_rev(q0_1, q2_1, true); // Row 6 store_rev(q1_1, q3_1, true); // Row 7 } // Main loop for 8 bit plane turn void turn_right_plane_8_neon(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch) { const BYTE* s0 = srcp; int w = src_rowsize & ~7; int h = src_height & ~7; for (int y = 0; y < h; y += 8) { BYTE* d0 = dstp + src_height - 8 - y; for (int x = 0; x < w; x += 8) { transpose_8x8x8_neon(s0 + x, d0, src_pitch, dst_pitch); d0 += dst_pitch * 8; } s0 += src_pitch * 8; } if (src_rowsize != w) { // Assuming turn_right_plane_8_c is the C fallback function turn_right_plane_8_c(srcp + w, dstp + w * dst_pitch, src_rowsize - w, src_height, src_pitch, dst_pitch); } if (src_height != h) { turn_right_plane_8_c(srcp + h * src_pitch, dstp, src_rowsize, src_height - h, src_pitch, dst_pitch); } } void turn_left_plane_8_neon(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch) { // The direction and stride logic is independent of the intrinsics used turn_right_plane_8_neon(srcp + (src_height - 1) * src_pitch, dstp + (src_rowsize - 1) * dst_pitch, src_rowsize, src_height, -src_pitch, -dst_pitch); } // Transposes 8 rows of 4x16-bit values (shorts/words) into 4 rows of 8x16-bit values. static AVS_FORCEINLINE void transpose_16x4x8_neon(const BYTE* srcp, BYTE* dstp, const int src_pitch, const int dst_pitch) { // Load 8 rows of 8 bytes (4 x 16-bit elements) uint64x1_t a03_l = vld1_u64(reinterpret_cast(srcp + src_pitch * 0)); uint64x1_t b03_l = vld1_u64(reinterpret_cast(srcp + src_pitch * 1)); uint64x1_t c03_l = vld1_u64(reinterpret_cast(srcp + src_pitch * 2)); uint64x1_t d03_l = vld1_u64(reinterpret_cast(srcp + src_pitch * 3)); uint64x1_t e03_l = vld1_u64(reinterpret_cast(srcp + src_pitch * 4)); uint64x1_t f03_l = vld1_u64(reinterpret_cast(srcp + src_pitch * 5)); uint64x1_t g03_l = vld1_u64(reinterpret_cast(srcp + src_pitch * 6)); uint64x1_t h03_l = vld1_u64(reinterpret_cast(srcp + src_pitch * 7)); // Convert to 16-bit vectors (4 elements) uint16x4_t a03 = vreinterpret_u16_u64(a03_l); uint16x4_t b03 = vreinterpret_u16_u64(b03_l); uint16x4_t c03 = vreinterpret_u16_u64(c03_l); uint16x4_t d03 = vreinterpret_u16_u64(d03_l); uint16x4_t e03 = vreinterpret_u16_u64(e03_l); uint16x4_t f03 = vreinterpret_u16_u64(f03_l); uint16x4_t g03 = vreinterpret_u16_u64(g03_l); uint16x4_t h03 = vreinterpret_u16_u64(h03_l); // NEON Transpose on 16-bit elements (VTRN.16) // Step 1: Interleave pairs (a/e, b/f, c/g, d/h) // SSE: _mm_unpacklo_epi16(A, B) -> A0 B0 A1 B1 ... uint16x4x2_t ae = vtrn_u16(a03, e03); // {a0 e0 a1 e1}, {a2 e2 a3 e3} uint16x4x2_t bf = vtrn_u16(b03, f03); uint16x4x2_t cg = vtrn_u16(c03, g03); uint16x4x2_t dh = vtrn_u16(d03, h03); // Step 2: Interleave pairs of pairs (ae/cg, bf/dh) uint16x4x2_t aceg01 = vtrn_u16(ae.val[0], cg.val[0]); uint16x4x2_t aceg23 = vtrn_u16(ae.val[1], cg.val[1]); uint16x4x2_t bdfh01 = vtrn_u16(bf.val[0], dh.val[0]); uint16x4x2_t bdfh23 = vtrn_u16(bf.val[1], dh.val[1]); // SSE: _mm_unpacklo_epi16(A, B) -> A0 B0 A1 B1 ... (A0 B0 C0 D0...) // Step 3: Final combination/concatenation of the 4-element blocks. // combine the left-half blocks (ACEG) with the right-half blocks (BDFH). // Output Row 0: {A0 B0 C0 D0} + {E0 F0 G0 H0} (from the first elements of the transposed groups) uint16x8_t abcdefgh0 = vcombine_u16(aceg01.val[0], bdfh01.val[0]); // Output Row 1: {A1 B1 C1 D1} + {E1 F1 G1 H1} uint16x8_t abcdefgh1 = vcombine_u16(aceg01.val[1], bdfh01.val[1]); // Output Row 2: {A2 B2 C2 D2} + {E2 F2 G2 H2} uint16x8_t abcdefgh2 = vcombine_u16(aceg23.val[0], bdfh23.val[0]); // Output Row 3: {A3 B3 C3 D3} + {E3 F3 G3 H3} uint16x8_t abcdefgh3 = vcombine_u16(aceg23.val[1], bdfh23.val[1]); // Store results // SSE: _mm_store_si128 (aligned store) vst1q_u16(reinterpret_cast(dstp + dst_pitch * 0), abcdefgh0); vst1q_u16(reinterpret_cast(dstp + dst_pitch * 1), abcdefgh1); vst1q_u16(reinterpret_cast(dstp + dst_pitch * 2), abcdefgh2); vst1q_u16(reinterpret_cast(dstp + dst_pitch * 3), abcdefgh3); } // Main loop for 16 bit plane turn void turn_right_plane_16_neon(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch) { const BYTE* s0 = srcp; int w = src_rowsize & ~15; int h = src_height & ~7; for (int y = 0; y < h; y += 8) { BYTE* d0 = dstp + src_height * 2 - 16 - y * 2; for (int x = 0; x < w; x += 16) { transpose_8x8x16_neon(s0 + x, d0, src_pitch, dst_pitch); d0 += dst_pitch * 8; } s0 += src_pitch * 8; } if (src_rowsize != w) { turn_right_plane_16_c(srcp + w, dstp + w / 2 * dst_pitch, src_rowsize - w, src_height, src_pitch, dst_pitch); } if (src_height != h) { turn_right_plane_16_c(srcp + h * src_pitch, dstp, src_rowsize, src_height - h, src_pitch, dst_pitch); } } void turn_left_plane_16_neon(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch) { turn_right_plane_16_neon(srcp + src_pitch * (src_height - 1), dstp + dst_pitch * (src_rowsize / 2 - 1), src_rowsize, src_height, -src_pitch, -dst_pitch); } // Transposes 4 rows of 4x32-bit values (words) into 4 rows of 4x32-bit values. // float helper static AVS_FORCEINLINE void transpose_32x4x4_neon(const BYTE* srcp, BYTE* dstp, const int src_pitch, const int dst_pitch) { // Load 4 128-bit vectors (4 x 32-bit elements per vector) // SSE: _mm_loadu_si128 (unaligned load) uint32x4_t a03 = vld1q_u32(reinterpret_cast(srcp + src_pitch * 0)); uint32x4_t b03 = vld1q_u32(reinterpret_cast(srcp + src_pitch * 1)); uint32x4_t c03 = vld1q_u32(reinterpret_cast(srcp + src_pitch * 2)); uint32x4_t d03 = vld1q_u32(reinterpret_cast(srcp + src_pitch * 3)); uint32x4x2_t ab = vtrnq_u32(a03, b03); uint32x4x2_t cd = vtrnq_u32(c03, d03); uint32x4_t t0 = vcombine_u32(vget_low_u32(ab.val[0]), vget_low_u32(cd.val[0])); uint32x4_t t1 = vcombine_u32(vget_low_u32(ab.val[1]), vget_low_u32(cd.val[1])); uint32x4_t t2 = vcombine_u32(vget_high_u32(ab.val[0]), vget_high_u32(cd.val[0])); uint32x4_t t3 = vcombine_u32(vget_high_u32(ab.val[1]), vget_high_u32(cd.val[1])); uint32x4x4_t result = { { t0, t1, t2, t3 } }; // Store results // SSE: _mm_storeu_si128 (unaligned store) vst1q_u32(reinterpret_cast(dstp + dst_pitch * 0), result.val[0]); vst1q_u32(reinterpret_cast(dstp + dst_pitch * 1), result.val[1]); vst1q_u32(reinterpret_cast(dstp + dst_pitch * 2), result.val[2]); vst1q_u32(reinterpret_cast(dstp + dst_pitch * 3), result.val[3]); } void turn_right_plane_32_neon(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch) { const BYTE* s0 = srcp + src_pitch * (src_height - 1); int w = src_rowsize & ~15; // 16 bytes for 32-bit elements (4 elements) int h = src_height & ~3; // mod4 height for (int y = 0; y < h; y += 4) { BYTE* d0 = dstp + y * 4; // in 4x4 units, 16 bytes = 4x32-bit elements for (int x = 0; x < w; x += 16) { transpose_32x4x4_neon(s0 + x, d0, -src_pitch, dst_pitch); d0 += 4 * dst_pitch; } s0 -= 4 * src_pitch; } // rest non-mod4 if (src_rowsize != w) { turn_right_plane_32_c(srcp + w, dstp + w / 4 * dst_pitch, src_rowsize - w, src_height, src_pitch, dst_pitch); } if (src_height != h) { turn_right_plane_32_c(srcp, dstp + h * 4, src_rowsize, src_height - h, src_pitch, dst_pitch); } } void turn_left_plane_32_neon(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch) { turn_right_plane_32_neon(srcp + src_pitch * (src_height - 1), dstp + dst_pitch * (src_rowsize / 4 - 1), src_rowsize, src_height, -src_pitch, -dst_pitch); } // The 64-bit transpose: 2x2 double-word transpose // rgb64 helper static inline void turn_right_plane_64_neon(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch) { const BYTE* s0 = srcp + src_pitch * (src_height - 1); int w = src_rowsize & ~15; // 16 bytes = 2x64-bit elements int h = src_height & ~1; for (int y = 0; y < h; y += 2) { BYTE* d0 = dstp + y * 8; for (int x = 0; x < w; x += 16) { // Load two 128-bit vectors uint64x2_t a01 = vld1q_u64(reinterpret_cast(s0 + x)); uint64x2_t b01 = vld1q_u64(reinterpret_cast(s0 + x - src_pitch)); // Manual 2x2 64-bit element transpose uint64x2x2_t ab; ab.val[0] = vcombine_u64(vget_low_u64(a01), vget_low_u64(b01)); // {a0, b0} ab.val[1] = vcombine_u64(vget_high_u64(a01), vget_high_u64(b01)); // {a1, b1} vst1q_u64(reinterpret_cast(d0), ab.val[0]); // a0 b0 vst1q_u64(reinterpret_cast(d0 + dst_pitch), ab.val[1]); // a1 b1 d0 += 2 * dst_pitch; } s0 -= 2 * src_pitch; } if (src_rowsize != w) { turn_right_plane_c(srcp + w, dstp + w / 8 * dst_pitch, 8, src_height, src_pitch, dst_pitch); } if (src_height != h) { turn_right_plane_c(srcp, dstp + h * 8, src_rowsize, 1, src_pitch, dst_pitch); } } void turn_left_rgb64_neon(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch) { turn_right_plane_64_neon(srcp, dstp, src_rowsize, src_height, src_pitch, dst_pitch); } void turn_right_rgb64_neon(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch) { turn_right_plane_64_neon(srcp + src_pitch * (src_height - 1), dstp + dst_pitch * (src_rowsize / 8 - 1), src_rowsize, src_height, -src_pitch, -dst_pitch); } // Helper: swap the two 64-bit halves of a 128-bit vector. // vextq_* with an 8-byte offset concatenates the vector with itself and takes the high half. AVS_FORCEINLINE static uint8x16_t swap64_u8(uint8x16_t v) { return vextq_u8(v, v, 8); } // lookup tables for byte and word reversal static const uint8_t idx_data_for_uint8[16] = { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; static const uint8_t idx_data_for_uint16[16] = { 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1 }; template void turn_180_plane_neon(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch) { const uint8_t* AVS_RESTRICT s0 = srcp; // always process 16 bytes at a time, 16 uint8_t or 8 uint16_t or 4 uint32_t or 2 uint64_t uint8_t* AVS_RESTRICT d0 = dstp + dst_pitch * (src_height - 1) + src_rowsize; const int mod16width = src_rowsize / 16 * 16; // mod16 width const int mod8width = src_rowsize / 8 * 8; // mod8 width const uint8x16_t idx_8 = vld1q_u8(idx_data_for_uint8); const uint8x16_t idx_16 = vld1q_u8(idx_data_for_uint16); for (int y = 0; y < src_height; ++y) { for (int x = 0; x < mod16width; x += 16) { // load 16 bytes uint8x16_t src = vld1q_u8(reinterpret_cast(s0 + x)); uint8x16_t dst; if constexpr (sizeof(T) == 8) { // 64-bit pixels: reverse pixel ORDER but DO NOT reverse bytes per pixel. // Swap the two 64-bit lanes only. uint64x2_t src64 = vreinterpretq_u64_u8(src); uint64x2_t rev = vextq_u64(src64, src64, 1); // [hi, lo] dst = vreinterpretq_u8_u64(rev); } else if constexpr (sizeof(T) == 4) { // 32-bit pixels: reverse order of the 4 dwords. // 1) reverse 32-bit elements within each 64-bit lane // 2) swap the 64-bit lanes uint32x4_t t1 = vrev64q_u32(vreinterpretq_u32_u8(src)); // per-lane 32-bit reverse uint8x16_t t1b = vreinterpretq_u8_u32(t1); dst = swap64_u8(t1b); // swap halves via vextq_u8(t1b, t1b, 8) } else if constexpr (sizeof(T) == 2) { // 16-bit pixels: reverse order of the 8 words. // 1) reverse 16-bit elements within each 64-bit lane // 2) swap the 64-bit lanes /* slower: uint16x8_t t1 = vrev64q_u16(vreinterpretq_u16_u8(src)); uint8x16_t t1b = vreinterpretq_u8_u16(t1); dst = swap64_u8(t1b); // swap halves */ // do table lookup for full 16-byte reverse dst = vqtbl1q_u8(src, idx_16); } else { // sizeof(T) == 1 // Use NEON table lookup for full 16-byte reverse // Define the index array as a static const array // let's hope, compiler optimizes this well dst = vqtbl1q_u8(src, idx_8); // this is said to have lower throughput than the vrev + vext method // but benchmark shows it quicker on RPi5 } // store reversed block to the mirror position in the destination row vst1q_u8(reinterpret_cast(d0 - 16 - x), dst); // -16 SIMD width } for (int x = mod16width; x < mod8width; x+=8) { // process 8 bytes at a time uint8x8_t src = vld1_u8(reinterpret_cast(s0 + x)); uint8x8_t dst; if constexpr (sizeof(T) == 8) { // mod8 block, size is 8, nothing to change. dst = src; // Copy src to dst directly. } else if constexpr (sizeof(T) == 4) { // 1) reverse 32-bit elements within the 64-bit lane. This is the whole job. uint32x2_t t1 = vrev64_u32(vreinterpret_u32_u8(src)); dst = vreinterpret_u8_u32(t1); // Reinterpret and assign directly } else if constexpr (sizeof(T) == 2) { // 16-bit pixels: reverse order of the 4 words. dst = vtbl1_u8(src, vld1_u8(&idx_data_for_uint16[8])); // use upper half of idx } else { // sizeof(T) == 1 dst = vtbl1_u8(src, vld1_u8(&idx_data_for_uint8[8])); // use upper half of idx } vst1_u8(reinterpret_cast(d0 - 8 - x), dst); // -8 SIMD width } if (mod8width < src_rowsize) { // plain C fallback for remaining bytes const T* s00 = reinterpret_cast(s0 + mod8width); T* d00 = reinterpret_cast(d0 - sizeof(T) - mod8width); // - sizeof(T) "SIMD" width for (int x = mod8width; x < src_rowsize; x += sizeof(T)) { *d00-- = *s00++; } } s0 += src_pitch; // next source row d0 -= dst_pitch; // previous destination row (since we started at the last) } } // instantiate template void turn_180_plane_neon(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch); template void turn_180_plane_neon(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch); template void turn_180_plane_neon(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch); template void turn_180_plane_neon(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch); // RGB functions (just calling the plane functions) void turn_left_rgb32_neon(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch) { turn_right_plane_32_neon(srcp, dstp, src_rowsize, src_height, src_pitch, dst_pitch); } void turn_right_rgb32_neon(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch) { turn_left_plane_32_neon(srcp, dstp, src_rowsize, src_height, src_pitch, dst_pitch); } ================================================ FILE: avs_core/filters/aarch64/turn_neon.h ================================================ // AviSynth+. Copyright 2025 AviSynth+ Project // https://avs-plus.net // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef _AVS_TURN_NEON_H #define _AVS_TURN_NEON_H #include #include "../turn.h" // Other filters (e.g. resampler) might also use these functions void turn_left_plane_8_neon(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch); void turn_left_plane_16_neon(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch); void turn_left_plane_32_neon(const BYTE* srcp, BYTE* dstp, int src_rowsize, int srcHeight, int src_pitch, int dst_pitch); void turn_left_rgb32_neon(const BYTE *srcp, BYTE *dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch); void turn_left_rgb64_neon(const BYTE *srcp, BYTE *dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch); void turn_right_plane_8_neon(const BYTE* srcp, BYTE* dstp, int src_rowsize, int srcHeight, int src_pitch, int dst_pitch); void turn_right_plane_16_neon(const BYTE* srcp, BYTE* dstp, int src_rowsize, int srcHeight, int src_pitch, int dst_pitch); void turn_right_plane_32_neon(const BYTE* srcp, BYTE* dstp, int src_rowsize, int srcHeight, int src_pitch, int dst_pitch); void turn_right_rgb32_neon(const BYTE *srcp, BYTE *dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch); void turn_right_rgb64_neon(const BYTE *srcp, BYTE *dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch); template void turn_180_plane_neon(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch); #endif // _AVS_TURN_NEON_H ================================================ FILE: avs_core/filters/color.cpp ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include "color.h" #include #include #if defined(AVS_BSD) || defined(AVS_MACOS) #include #else #include #endif #include #ifdef AVS_WINDOWS #include #else #include #endif #include #include "../core/internal.h" #include #include // stringstream #include // setprecision #include #include "../convert/convert_helper.h" static void coloryuv_showyuv(BYTE* pY, BYTE* pU, BYTE* pV, int y_pitch, int u_pitch, int v_pitch, int framenumber, bool full_range, int bits_per_pixel) { int internal_bitdepth = bits_per_pixel == 8 ? 8 : 10; const int luma_min = full_range ? 0 : (16 << (internal_bitdepth - 8)); const int luma_max = full_range ? (1 << internal_bitdepth) - 1 : (235 << (internal_bitdepth - 8)); const int chroma_center = 128 << (internal_bitdepth - 8); const int chroma_span = full_range ? (1 << (internal_bitdepth - 1)) - 1 : (112 << (internal_bitdepth - 8)); // +-127/+-112 const int chroma_min = chroma_center - chroma_span; // +-112 (16-240) -> +-127 (1-255) const int chroma_max = chroma_center + chroma_span; const int luma_range = luma_max - luma_min + 1; // 256/220 ,1024/880 const int chroma_range = chroma_max - chroma_min + 1; const int luma_size = chroma_range * 2; // YUV output is always 4:2:0. Horizontal subsampling 2. int luma; // Calculate luma cycle // 0,1..255,254,..1 = 2x256-2 // 0,1..1023,1022,..1 = 2*1024-2 luma = framenumber % (luma_range * 2 - 2); if (luma > luma_range - 1) luma = (luma_range * 2 - 2) - luma; luma += luma_min; // Set luma value if (bits_per_pixel == 8) { for (int y = 0; y < luma_size; y++) { memset(pY, luma, luma_size); pY += y_pitch; } } else if (bits_per_pixel <= 16) { // display size (thus luma range) covers the same as at 10 bits. if (full_range) { // stretch const float factor = (float)((1 << bits_per_pixel) - 1) / ((1 << internal_bitdepth) - 1); const int luma_target = (int)(luma * factor + 0.5f); for (int y = 0; y < luma_size; y++) { std::fill_n((uint16_t*)pY, luma_size, luma_target); pY += y_pitch; } } else { // shift const int luma_target = luma << (bits_per_pixel - internal_bitdepth); for (int y = 0; y < luma_size; y++) { std::fill_n((uint16_t*)pY, luma_size, luma_target); pY += y_pitch; } } } else { // 32 bit float const float factor = 1.0f / ((1 << internal_bitdepth) - 1); const float luma_target = luma * factor; for (int y = 0; y < luma_size; y++) { std::fill_n((float*)pY, luma_size, luma_target); pY += y_pitch; } } // Set chroma if (full_range) { if (bits_per_pixel != 32) { // 8-16 bit full const int chroma_center_target = 128 << (bits_per_pixel - 8); const int chroma_span_target = full_range ? (1 << (bits_per_pixel - 1)) - 1 : (112 << (bits_per_pixel - 8)); // +-127/+-112 const float factor = (float)chroma_span_target / chroma_span; const float chroma_center_target_plus_round = chroma_center_target + 0.5f; if (bits_per_pixel == 8) { for (int y = 0; y < chroma_range; y++) { for (int x = 0; x < chroma_range; x++) { int pixel_u = chroma_min + x; pixel_u = (int)((pixel_u - chroma_center) * factor + chroma_center_target_plus_round); pU[x] = pixel_u; } int pixel_v = chroma_min + y; pixel_v = (int)((pixel_v - chroma_center) * factor + chroma_center_target_plus_round); std::fill_n((uint8_t*)pV, chroma_range, pixel_v); pU += u_pitch; pV += v_pitch; } } else if (bits_per_pixel <= 16) { for (int y = 0; y < chroma_range; y++) { for (int x = 0; x < chroma_range; x++) { int pixel_u = chroma_min + x; pixel_u = (int)((pixel_u - chroma_center) * factor + chroma_center_target_plus_round); reinterpret_cast(pU)[x] = pixel_u; } int pixel_v = chroma_min + y; pixel_v = (int)((pixel_v - chroma_center) * factor + chroma_center_target_plus_round); std::fill_n((uint16_t*)pV, chroma_range, pixel_v); pU += u_pitch; pV += v_pitch; } } } else { // 32 bit float, full const float chroma_span_target = 0.5f; // +-0.5/+-112 const float factor = chroma_span_target / chroma_span; for (int y = 0; y < chroma_range; y++) { for (int x = 0; x < chroma_range; x++) { const int pixel_u = chroma_min + x; const float pixel_u_f = (pixel_u - chroma_center) * factor; reinterpret_cast(pU)[x] = pixel_u_f; } const int pixel_v = chroma_min + y; const float pixel_v_f = (pixel_v - chroma_center) * factor; std::fill_n((float*)pV, chroma_range, pixel_v_f); pU += u_pitch; pV += v_pitch; } } // full end } else { if (bits_per_pixel == 8) { // 8 bit limited range for (int y = 0; y < chroma_range; y++) { for (int x = 0; x < chroma_range; x++) pU[x] = chroma_min + x; const int pixel_v = chroma_min + y; std::fill_n((uint8_t*)pV, chroma_range, pixel_v); pU += u_pitch; pV += v_pitch; } } else if (bits_per_pixel <= 16) { // 16 bit limited range const int bitdiff = (bits_per_pixel - internal_bitdepth); for (int y = 0; y < chroma_range; y++) { for (int x = 0; x < chroma_range; x++) { reinterpret_cast(pU)[x] = (chroma_min + x) << bitdiff; } const int pixel_v = (chroma_min + y) << bitdiff; std::fill_n((uint16_t*)pV, chroma_range, pixel_v); pU += u_pitch; pV += v_pitch; } } else { // 32 bit float limited const float factor = 1.0f / ((1 << internal_bitdepth) - 1); for (int y = 0; y < chroma_range; y++) { for (int x = 0; x < chroma_range; x++) { reinterpret_cast(pU)[x] = (float)(chroma_min + x - chroma_center) * factor; } const float pixel_v = (float)(chroma_min + y - chroma_center) * factor; std::fill_n((float*)pV, chroma_range, pixel_v); pU += u_pitch; pV += v_pitch; } } } } // luts are only for integer bits 8/10/12/14/16. float will be realtime template static void coloryuv_create_lut(BYTE* lut8, const ColorYUVPlaneConfig* config, int bits_per_pixel, bool tweaklike_params) { pixel_t* lut = reinterpret_cast(lut8); // scale is 256/1024/4096/16384/65536 // normalize to [0..1) working range const double value_normalization_scale = (double)((int64_t)1 << bits_per_pixel); // For gamma pre-post correction. const double tv_range_lo_normalized = 16.0 / 256.0; const int lookup_size = 1 << bits_per_pixel; // 256, 1024, 4096, 16384, 65536 const int source_max = (1 << bits_per_pixel) - 1; const bool chroma = config->plane == PLANAR_U || config->plane == PLANAR_V; const bool fulls = config->range == COLORYUV_RANGE_PC_TV; const bool fulld = config->range == COLORYUV_RANGE_TV_PC; // when COLORYUV_RANGE_NONE both are the same false //----------------------- bits_conv_constants d; // When calculating src_pixel, src and dst are of the same bit depth get_bits_conv_constants(d, chroma, fulls, fulld, bits_per_pixel, bits_per_pixel); auto dst_offset_plus_round = d.dst_offset + 0.5; const int src_pixel_min = 0; const int src_pixel_max = source_max; // parameters are not scaled by bitdepth (legacy 8 bit behaviour) double gain = tweaklike_params ? config->gain : (config->gain / 256 + 1.0); double contrast = tweaklike_params ? config->contrast : (config->contrast / 256 + 1.0); double gamma = tweaklike_params ? config->gamma : (config->gamma / 256 + 1.0); double offset = config->offset / 256; // for correct Y gamma double range_factor_tv_to_pc = 255.0 / 219.0; // 16-235 ==> 0..255 double range_factor_pc_to_tv = 219.0 / 255.0; // 0..255 ==> 16-235 (219) // for coring const int tv_range_lo_luma_chroma = (16 << (bits_per_pixel - 8)); const int tv_range_hi_luma = (235 << (bits_per_pixel - 8)); const int tv_range_hi_chroma = (240 << (bits_per_pixel - 8)); // We know that the input is TV range for sure: (coring=true and !PC->TV), levels="TV->PC" or (new!) levels="TV" const bool source_is_limited = (config->clip_tv && config->range != COLORYUV_RANGE_PC_TV) || config->range == COLORYUV_RANGE_TV_PC || config->force_tv_range; for (int i = 0; i < lookup_size; i++) { double value = double(i); value /= value_normalization_scale; // normalize to [0..1). For chroma this makes the center to 0.5. value *= gain; // Applying gain // Applying contrast. For chroma, this sets saturation value = (value - 0.5) * contrast + 0.5; // integer chroma center is transformed to 0, apply contrast // in Classic AVS: constract is applied on the original value and not on the already gained value // value = (value * gain) + ((value - 0.5) * contrast + 0.5) - value + (bright - 1); value += offset; // Applying offset // Applying gamma. Only on Y if (gamma != 0) { if (source_is_limited) { // avs+ 180301- use gamma on the proper 0.0 based value if (value > tv_range_lo_normalized) { // tv->pc value = (value - tv_range_lo_normalized) * range_factor_tv_to_pc; // (v-16)*range value = pow(value, 1.0 / gamma); // pc->tv value = value * range_factor_pc_to_tv + tv_range_lo_normalized; // v*range - 16 } } else { // full (PC) range if (value > 0) value = pow(value, 1.0 / gamma); } } value *= value_normalization_scale; // back from [0..1) range if (fulls != fulld) // Range conversion value = (value - d.src_offset) * d.mul_factor + dst_offset_plus_round; else value = value + 0.5; // rounder // back to the integer world int iValue = clamp((int)value, src_pixel_min, src_pixel_max); if (config->clip_tv) // set when coring { iValue = clamp(iValue, tv_range_lo_luma_chroma, config->plane == PLANAR_Y ? tv_range_hi_luma : tv_range_hi_chroma); } lut[i] = iValue; } } // works with <= 16 bits, but used only for float static std::string coloryuv_create_lut_expr(const ColorYUVPlaneConfig* config, int bits_per_pixel, bool tweaklike_params) { const bool f32 = bits_per_pixel == 32; const bool chroma = config->plane == PLANAR_U || config->plane == PLANAR_V; // 32 bit float is already in [0..1] range but we have to make it similar to integer [0..1): needs /256 and not /255. // Reason: match to the integer behaviour // integer: normalize to [0..1) working range const double value_normalization_scale = f32 ? (256.0 / 255.0) : (double)((int64_t)1 << bits_per_pixel); // For gamma pre-post correction. we are in [0..1) working range const double tv_range_lo_normalized = 16.0 / 256.0; //const double source_max = f32 ? 1.0 : (double)((1 << bits_per_pixel) - 1); const bool fulls = config->range == COLORYUV_RANGE_PC_TV; const bool fulld = config->range == COLORYUV_RANGE_TV_PC; // when COLORYUV_RANGE_NONE both are the same false bits_conv_constants d; // When calculating src_pixel, src and dst are of the same bit depth get_bits_conv_constants(d, chroma, fulls, fulld, bits_per_pixel, bits_per_pixel); auto dst_offset_no_round = d.dst_offset; //const auto src_pixel_max = source_max; // parameters are not scaled by bitdepth (legacy 8 bit behaviour) double gain = tweaklike_params ? config->gain : (config->gain / 256 + 1.0); double contrast = tweaklike_params ? config->contrast : (config->contrast / 256 + 1.0); double gamma = tweaklike_params ? config->gamma : (config->gamma / 256 + 1.0); double offset = config->offset / 256; // always in the 256 range // for correct Y gamma double range_factor_tv_to_pc = 255.0 / 219.0; // 16-235 ==> 0..255 double range_factor_pc_to_tv = 219.0 / 255.0; // 0..255 ==> 16-235 (219) // We know that the input is TV range for sure: (coring=true and !PC->TV), levels="TV->PC" or (new!) levels="TV" const bool source_is_limited = (config->clip_tv && config->range != COLORYUV_RANGE_PC_TV) || config->range == COLORYUV_RANGE_TV_PC || config->force_tv_range; std::stringstream ss; // value = double(i), we are using floats here ss << "x"; // value = value / value_normalization_scale; if (chroma && f32) ss << " 255 * 256 / 0.5 + "; // from float chroma +/- to match with legacy integer behaviour else ss << " " << value_normalization_scale << " /"; if (gain != 1.0) ss << " " << gain << " *"; // Applying gain // value *= gain; // Applying contrast. For chroma, this sets saturation // value = (value - 0.5) * contrast + 0.5; // earlier we made measures that float chroma center is kept at 0.5 ss << " 0.5 - " << contrast << " * 0.5 +"; // value += offset; // Applying offset ss << " " << offset << " +"; // Applying gamma. Only on Y if (gamma != 0) { if (source_is_limited) { // avs+ 180301- use gamma on the proper 0.0 based value // value = value > 16scaled ? (pow((value - 16scl)*range_tv_pc,(1/gamma))*range_pc_tv+16d : value ss << " A@ " << tv_range_lo_normalized << " > " // condition: value > tv_range_lo_normalized // case: true. tv->pc, power, pc->tv << "A " << tv_range_lo_normalized << " - " << range_factor_tv_to_pc << " * " << (1.0 / gamma) << " pow " << range_factor_pc_to_tv << " * " << tv_range_lo_normalized << " + " // case: false. Original value << " A ? "; } else { // full (PC) range //if (value > 0) // value = pow(value, 1.0 / gamma); // value = value > 0 ? pow(value,(1/gamma)) : value ss << " A@ 0 > A " << (1.0 / gamma) << " pow A ? "; } } if (chroma && f32) ss << " 0.5 - 256 * 255 / "; else ss << " " << value_normalization_scale << " * "; // value *= value_normalization_scale; // back from [0..1) range if (fulls != fulld) { ss << d.src_offset << " - " << d.mul_factor << " * " << dst_offset_no_round << " + "; // value = (value - d.src_offset) * d.mul_factor + dst_offset_no_round; // no rounder, Expr will round automatically before return } else { // value = value + 0.5; // no rounder, Expr rounds } // clamp to the original valid bitdepth is done by Expr // int iValue = clamp((int)value, src_pixel_min, src_pixel_max); // ss << " " << src_pixel_min << " max " << src_pixel_max << " min "; if (config->clip_tv) // set when coring { double tv_range_lo_luma = f32 ? (16.0 / 255) : ((int64_t)16 << (bits_per_pixel - 8)); double tv_range_hi_luma = f32 ? (235.0 / 255) : ((int64_t)235 << (bits_per_pixel - 8)); double tv_range_lo_chroma = f32 ? (-112.0 / 255.0) : ((int64_t)16 << (bits_per_pixel - 8)); // 112/255.0 consistent with get_bits_conv_constants() double tv_range_hi_chroma = f32 ? (+112.0 / 255.0) : ((int64_t)240 << (bits_per_pixel - 8)); ss << (config->plane == PLANAR_Y ? tv_range_lo_luma : tv_range_lo_chroma) << " max "; ss << (config->plane == PLANAR_Y ? tv_range_hi_luma : tv_range_hi_chroma) << " min "; //iValue = clamp(iValue, tv_range_lo_luma, config->plane == PLANAR_Y ? tv_range_hi_luma : tv_range_hi_chroma); } std::string exprString = ss.str(); return exprString; } // for float, only loose_min and loose_max is counted template static void coloryuv_analyse_core(const int* freq, const int pixel_num, ColorYUVPlaneData* data, int bits_per_pixel_for_stat) { // 32 bit float reached here as split into ranges like a 16bit clip int pixel_value_count = 1 << bits_per_pixel_for_stat; // size of freq table const int pixel_256th = pixel_num / 256; // For loose max/min yes, still 1/256! double avg = 0.0; int real_min, real_max; if (!forFloat) { real_min = -1; real_max = -1; } data->loose_max = -1; data->loose_min = -1; int px_min_c = 0, px_max_c = 0; for (int i = 0; i < pixel_value_count; i++) { if (!forFloat) { avg += freq[i] * double(i); if (freq[i] > 0 && real_min == -1) { real_min = i; } } if (data->loose_min == -1) { px_min_c += freq[i]; if (px_min_c > pixel_256th) { data->loose_min = i; } } if (!forFloat) { if (freq[pixel_value_count - 1 - i] > 0 && real_max == -1) { real_max = pixel_value_count - 1 - i; } } if (data->loose_max == -1) { px_max_c += freq[pixel_value_count - 1 - i]; if (px_max_c > pixel_256th) { data->loose_max = pixel_value_count - 1 - i; } } } if (!forFloat) { avg /= pixel_num; data->average = avg; data->real_min = (float)real_min; data->real_max = (float)real_max; } } static void coloryuv_analyse_planar(const BYTE* pSrc, int src_pitch, int width, int height, ColorYUVPlaneData* data, int bits_per_pixel, bool chroma) { // We can gather statistics from float, but for population count we have to // split the range. We decide to split it into 2^16 ranges. int bits_per_pixel_for_freq = bits_per_pixel <= 16 ? bits_per_pixel : 16; int statistics_size = 1 << bits_per_pixel_for_freq; // float: 65536 int *freq = new int[statistics_size]; std::fill_n(freq, statistics_size, 0); double sum = 0.0; // for float float real_min; float real_max; if(bits_per_pixel==8) { for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { freq[pSrc[x]]++; } pSrc += src_pitch; } } else if (bits_per_pixel >= 10 && bits_per_pixel <= 14) { uint16_t mask = statistics_size - 1; // e.g. 0x3FF for 10 bit for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { freq[clamp(reinterpret_cast(pSrc)[x],(uint16_t)0,mask)]++; } pSrc += src_pitch; } } else if (bits_per_pixel == 16) { // no clamp, faster for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { freq[reinterpret_cast(pSrc)[x]]++; } pSrc += src_pitch; } } else if(bits_per_pixel==32) { // 32 bits: we populate pixels only for loose_min and loose_max // real_min and real_max, average (sum) is computed differently real_min = reinterpret_cast(pSrc)[0]; real_max = real_min; if (chroma) { const float shift = 32768.0f; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { // -0.5..0.5 (0..1.0 when FLOAT_CHROMA_IS_HALF_CENTERED) to 0..65535 // see also: ConditionalFunctions MinMax const float pixel = reinterpret_cast(pSrc)[x]; freq[clamp((int)(65535.0f*pixel + shift + 0.5f), 0, 65535)]++; // todo: SSE2 real_min = min(real_min, pixel); real_max = max(real_max, pixel); sum += pixel; } pSrc += src_pitch; } } else { for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { // 0..1 -> 0..65535 const float pixel = reinterpret_cast(pSrc)[x]; freq[clamp((int)(65535.0f*pixel + 0.5f), 0, 65535)]++; // todo: SSE2 real_min = min(real_min, pixel); real_max = max(real_max, pixel); sum += pixel; } pSrc += src_pitch; } } } if (bits_per_pixel == 32) { coloryuv_analyse_core(freq, width*height, data, bits_per_pixel_for_freq); data->average = sum / (height * width); data->real_max = real_max; data->real_min = real_min; // loose min and max was shifted by half of 16bit range. We still keep here the range if (chroma) { data->loose_max = data->loose_max - 32768; data->loose_min = data->loose_min - 32768; } // autogain treats it as a value of 16bit magnitude, show=true as well //data->loose_min = data->loose_min / 65535.0f; not now. //data->loose_max = data->loose_max / 65535.0f; } else { coloryuv_analyse_core(freq, width*height, data, bits_per_pixel_for_freq); } delete[] freq; } static void coloryuv_analyse_yuy2(const BYTE* pSrc, int src_pitch, int width, int height, ColorYUVPlaneData* dataY, ColorYUVPlaneData* dataU, ColorYUVPlaneData* dataV) { int freqY[256], freqU[256], freqV[256]; memset(freqY, 0, sizeof(freqY)); memset(freqU, 0, sizeof(freqU)); memset(freqV, 0, sizeof(freqV)); for (int y = 0; y < height; y++) { for (int x = 0; x < width*2; x+=4) { freqY[pSrc[x+0]]++; freqU[pSrc[x+1]]++; freqY[pSrc[x+2]]++; freqV[pSrc[x+3]]++; } pSrc += src_pitch; } coloryuv_analyse_core(freqY, width*height, dataY, 8); coloryuv_analyse_core(freqU, width*height/2, dataU, 8); coloryuv_analyse_core(freqV, width*height/2, dataV, 8); } static void coloryuv_autogain(const ColorYUVPlaneData* dY, const ColorYUVPlaneData* dU, const ColorYUVPlaneData* dV, ColorYUVPlaneConfig* cY, ColorYUVPlaneConfig* cU, ColorYUVPlaneConfig* cV, int bits_per_pixel, bool tweaklike_params) { int bits_per_pixel_for_freq = bits_per_pixel <= 16 ? bits_per_pixel : 16; // for float: "loose" statistics like uint16_t // always 16..235 int loose_max_limit = (235 + 1) << (bits_per_pixel_for_freq - 8); int loose_min_limit = 16 << (bits_per_pixel_for_freq - 8); int maxY = min(dY->loose_max, loose_max_limit); int minY = max(dY->loose_min, loose_min_limit); int range = maxY - minY; if (range > 0) { double scale = double(loose_max_limit - loose_min_limit) / range; cY->offset = (loose_min_limit - scale * minY) / (1 << (bits_per_pixel_for_freq - 8)); // good for float also, 0..256 range cY->gain = tweaklike_params ? scale : (256 * (scale - 1.0)); cY->changed = true; } } static void coloryuv_autowhite(const ColorYUVPlaneData* dY, const ColorYUVPlaneData* dU, const ColorYUVPlaneData* dV, ColorYUVPlaneConfig* cY, ColorYUVPlaneConfig* cU, ColorYUVPlaneConfig* cV, int bits_per_pixel) { if (bits_per_pixel == 32) { #ifdef FLOAT_CHROMA_IS_HALF_CENTERED double middle = 0.5; #else double middle = 0.0; #endif cU->offset = (middle - dU->average) * 256; // parameter is in 256 range cV->offset = (middle - dV->average) * 256; } else { double middle = (1 << (bits_per_pixel - 1)) - 1; // 128-1, 2048-1 ... cU->offset = (middle - dU->average) / (1 << (bits_per_pixel - 8)); // parameter is in 256 range cV->offset = (middle - dV->average) / (1 << (bits_per_pixel - 8)); } cU->changed = true; cV->changed = true; } // only for integer samples static void coloryuv_apply_lut_planar(BYTE* pDst, const BYTE* pSrc, int dst_pitch, int src_pitch, int width, int height, const BYTE* lut, int bits_per_pixel) { if(bits_per_pixel==8) { for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { pDst[x] = lut[pSrc[x]]; } pSrc += src_pitch; pDst += dst_pitch; } } else if (bits_per_pixel >= 10 && bits_per_pixel <= 14) { uint16_t max_pixel_value = (1 << bits_per_pixel) - 1; // protection needed for lut for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { uint16_t pixel = reinterpret_cast(pSrc)[x]; pixel = pixel <= max_pixel_value ? pixel : max_pixel_value; reinterpret_cast(pDst)[x] = reinterpret_cast(lut)[pixel]; } pSrc += src_pitch; pDst += dst_pitch; } } else if (bits_per_pixel == 16) { // no protection, faster for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { reinterpret_cast(pDst)[x] = reinterpret_cast(lut)[reinterpret_cast(pSrc)[x]]; } pSrc += src_pitch; pDst += dst_pitch; } } } static void coloryuv_apply_lut_yuy2(BYTE* pDst, const BYTE* pSrc, int dst_pitch, int src_pitch, int width, int height, const BYTE* lutY, const BYTE* lutU, const BYTE* lutV) { for (int y = 0; y < height; y++) { for (int x = 0; x < width * 2; x += 4) { pDst[x+0] = lutY[pSrc[x + 0]]; pDst[x+1] = lutU[pSrc[x + 1]]; pDst[x+2] = lutY[pSrc[x + 2]]; pDst[x+3] = lutV[pSrc[x + 3]]; } pSrc += src_pitch; pDst += dst_pitch; } } #define READ_CONDITIONAL(plane, var_name, internal_name, condVarSuffix) \ { \ std::string s = "coloryuv_" #var_name "_" #plane;\ s = s + condVarSuffix; \ const double t = env->GetVarDouble(s.c_str(), DBL_MIN); \ if (t != DBL_MIN) { \ c_##plane->internal_name = t; \ c_##plane->changed = true; \ } \ } // extra: add extra at the end of variable names: different variables for multiple instances of coloryuv static void coloryuv_read_conditional(IScriptEnvironment* env, ColorYUVPlaneConfig* c_y, ColorYUVPlaneConfig* c_u, ColorYUVPlaneConfig* c_v, const char *condVarSuffix) { READ_CONDITIONAL(y, gain, gain, condVarSuffix); READ_CONDITIONAL(y, off, offset, condVarSuffix); READ_CONDITIONAL(y, gamma, gamma, condVarSuffix); READ_CONDITIONAL(y, cont, contrast, condVarSuffix); READ_CONDITIONAL(u, gain, gain, condVarSuffix); READ_CONDITIONAL(u, off, offset, condVarSuffix); READ_CONDITIONAL(u, gamma, gamma, condVarSuffix); READ_CONDITIONAL(u, cont, contrast, condVarSuffix); READ_CONDITIONAL(v, gain, gain, condVarSuffix); READ_CONDITIONAL(v, off, offset, condVarSuffix); READ_CONDITIONAL(v, gamma, gamma, condVarSuffix); READ_CONDITIONAL(v, cont, contrast, condVarSuffix); } #undef READ_CONDITIONAL ColorYUV::ColorYUV(PClip child, double gain_y, double offset_y, double gamma_y, double contrast_y, double gain_u, double offset_u, double gamma_u, double contrast_u, double gain_v, double offset_v, double gamma_v, double contrast_v, const char* level, const char* opt, bool showyuv, bool analyse, bool autowhite, bool autogain, bool conditional, int bits, bool showyuv_fullrange, bool tweaklike_params, // ColorYUV2: 0.0/0.5/1.0/2.0/3.0 instead of -256/-128/0/256/512 const char* condVarSuffix, bool optForceUseExpr, IScriptEnvironment* env) : GenericVideoFilter(child), colorbar_bits(showyuv ? bits : 0), colorbar_fullrange(showyuv_fullrange), analyse(analyse), autowhite(autowhite), autogain(autogain), conditional(conditional), tweaklike_params(tweaklike_params), condVarSuffix(condVarSuffix), optForceUseExpr(optForceUseExpr) { luts[0] = luts[1] = luts[2] = nullptr; if (!vi.IsYUV() && !vi.IsYUVA()) env->ThrowError("ColorYUV: Only work with YUV colorspace."); bool ColorRangeCanBeGuessed = false; if (gamma_y != 0) { ColorRangeCanBeGuessed = true; // when gamma is used then we must know the color range full/limited // and the default is full_scale if gamma is not zero } configY.gain = gain_y; configY.offset = offset_y; configY.gamma = gamma_y; configY.contrast = contrast_y; configY.changed = false; configY.clip_tv = false; configY.force_tv_range = false; configY.plane = PLANAR_Y; configU.gain = gain_u; configU.offset = offset_u; configU.gamma = gamma_u; configU.contrast = contrast_u; configU.changed = false; configU.clip_tv = false; configU.force_tv_range = false; // n/a. in chroma. For gamma configU.plane = PLANAR_U; configV.gain = gain_v; configV.offset = offset_v; configV.gamma = gamma_v; configV.contrast = contrast_v; configV.changed = false; configV.clip_tv = false; configV.force_tv_range = false; // n/a. in chroma. For gamma configV.plane = PLANAR_V; // Range if (lstrcmpi(level, "TV->PC") == 0) { ColorRangeCanBeGuessed = true; // will be full configV.range = configU.range = configY.range = COLORYUV_RANGE_TV_PC; } else if (lstrcmpi(level, "PC->TV") == 0) { ColorRangeCanBeGuessed = true;// will be limited configV.range = configU.range = configY.range = COLORYUV_RANGE_PC_TV; } else if (lstrcmpi(level, "PC->TV.Y") == 0) { // ? ColorRangeCanBeGuessed = true;// will be limited configV.range = configU.range = COLORYUV_RANGE_NONE; configY.range = COLORYUV_RANGE_PC_TV; } else if (lstrcmpi(level, "TV") == 0) { // When no range conversion occurs only gamma correction // By this parameter we know it will be limited, this info is used for gamma adjustment ColorRangeCanBeGuessed = true; configV.force_tv_range = configU.force_tv_range = configY.force_tv_range = true; } else if (lstrcmpi(level, "") != 0) { env->ThrowError("ColorYUV: invalid parameter : levels"); } else { configV.range = configU.range = configY.range = COLORYUV_RANGE_NONE; } // Option if (lstrcmpi(opt, "coring") == 0) { // note: this setting can conflict with e.g. TV->PC but we do not report an error ColorRangeCanBeGuessed = true; // used to set _ColorRange=limited only if not conversion mode is specified configY.clip_tv = true; configU.clip_tv = true; configV.clip_tv = true; } else if (lstrcmpi(opt, "") != 0) { env->ThrowError("ColorYUV: invalid parameter : opt"); } if (showyuv) { if (colorbar_bits != 8 && colorbar_bits != 10 && colorbar_bits != 12 && colorbar_bits != 14 && colorbar_bits != 16 && colorbar_bits != 32) env->ThrowError("ColorYUV: bits parameter for showyuv must be 8, 10, 12, 14, 16 or 32"); switch (colorbar_bits) { case 8: vi.pixel_type = VideoInfo::CS_YV12; break; case 10: vi.pixel_type = VideoInfo::CS_YUV420P10; break; case 12: vi.pixel_type = VideoInfo::CS_YUV420P12; break; case 14: vi.pixel_type = VideoInfo::CS_YUV420P14; break; case 16: vi.pixel_type = VideoInfo::CS_YUV420P16; break; case 32: vi.pixel_type = VideoInfo::CS_YUV420PS; break; } // pre-avs+: coloryuv_showyuv is always called with full_range false const int internal_bitdepth = colorbar_bits == 8 ? 8 : 10; const int chroma_span = colorbar_fullrange ? (1 << (internal_bitdepth - 1)) - 1 : (112 << (internal_bitdepth - 8)); // +-127/+-112 const int chroma_range = 2 * chroma_span + 1; // 1..255 (+-127), 16..240 (+-112) // size limited to either 8 or 10 bits, independenly of 12/14/16 or 32bit float bit-depth vi.width = chroma_range << vi.GetPlaneWidthSubsampling(PLANAR_U); vi.height = vi.width; theColorRange = colorbar_fullrange ? ColorRange_Compat_e::AVS_COLORRANGE_FULL : ColorRange_Compat_e::AVS_COLORRANGE_LIMITED; theMatrix = Matrix_e::AVS_MATRIX_BT470_BG; // all the same theChromaLocation = ChromaLocation_e::AVS_CHROMA_CENTER; // default "mpeg1" for 4:2:0 return; } // !showyuv, real filter auto frame0 = child->GetFrame(0, env); const AVSMap* props = env->getFramePropsRO(frame0); matrix_parse_merge_with_props_def(vi.IsRGB(), vi.IsRGB(), nullptr, props, theMatrix, theColorRange, theOutColorRange, // n/a Matrix_e::AVS_MATRIX_UNSPECIFIED, // default matrix n/a configY.force_tv_range ? ColorRange_Compat_e::AVS_COLORRANGE_LIMITED : ColorRangeCanBeGuessed ? ColorRange_Compat_e::AVS_COLORRANGE_FULL : -1 /* n/a invalid */, env); // although we read _ColorRange full/limited, nothing stops us to feed with full-range clip a "TV->PC" conversion // Anyway: a frame property can set theColorRange from the default "FULL" to the actual one. switch (configY.range) { case COLORYUV_RANGE_PC_TV: case COLORYUV_RANGE_PC_TVY: theColorRange = ColorRange_Compat_e::AVS_COLORRANGE_LIMITED; break; case COLORYUV_RANGE_TV_PC: theColorRange = ColorRange_Compat_e::AVS_COLORRANGE_FULL; break; default: if (configY.force_tv_range) // "TV" overrides default "PC". Info is needed for gamma correction theColorRange = ColorRange_Compat_e::AVS_COLORRANGE_LIMITED; else if (configY.clip_tv) // coring is also sets this frame property theColorRange = ColorRange_Compat_e::AVS_COLORRANGE_LIMITED; else theColorRange = theOutColorRange; break; // leave color range as is } // theMatrix and theColorRange will set frame properties in GetFrame // prepare basic LUT int pixelsize = vi.ComponentSize(); int bits_per_pixel = vi.BitsPerComponent(); if (pixelsize == 1 || pixelsize == 2) { // no float lut. float will be realtime int lut_size = pixelsize * (1 << bits_per_pixel); // 256*1 / 1024*2 .. 65536*2 luts[0] = new BYTE[lut_size]; if (!vi.IsY()) { luts[1] = new BYTE[lut_size]; luts[2] = new BYTE[lut_size]; } if (pixelsize == 1) { coloryuv_create_lut(luts[0], &configY, bits_per_pixel, tweaklike_params); if (!vi.IsY()) { coloryuv_create_lut(luts[1], &configU, bits_per_pixel, tweaklike_params); coloryuv_create_lut(luts[2], &configV, bits_per_pixel, tweaklike_params); } } else if (pixelsize == 2) { // pixelsize==2 coloryuv_create_lut(luts[0], &configY, bits_per_pixel, tweaklike_params); if (!vi.IsY()) { coloryuv_create_lut(luts[1], &configU, bits_per_pixel, tweaklike_params); coloryuv_create_lut(luts[2], &configV, bits_per_pixel, tweaklike_params); } } } } ColorYUV::~ColorYUV() { if (luts[0]) delete[] luts[0]; if (luts[1]) delete[] luts[1]; if (luts[2]) delete[] luts[2]; } PVideoFrame __stdcall ColorYUV::GetFrame(int n, IScriptEnvironment* env) { if (colorbar_bits>0) { PVideoFrame dst = env->NewVideoFrame(vi); // no frame property source. It's like a source filter auto props = env->getFramePropsRW(dst); update_Matrix_and_ColorRange(props, theMatrix, theColorRange, env); update_ChromaLocation(props, theChromaLocation, env); // pre AVS+: full_range is always false // AVS+: showyuv_fullrange bool parameter // AVS+: bits parameter coloryuv_showyuv(dst->GetWritePtr(), dst->GetWritePtr(PLANAR_U), dst->GetWritePtr(PLANAR_V), dst->GetPitch(), dst->GetPitch(PLANAR_U), dst->GetPitch(PLANAR_V), n, colorbar_fullrange, colorbar_bits); return dst; } PVideoFrame src = child->GetFrame(n, env); PVideoFrame dst; int pixelsize = vi.ComponentSize(); int bits_per_pixel = vi.BitsPerComponent(); ColorYUVPlaneConfig // Yes, we copy these struct cY = configY, cU = configU, cV = configV; // for analysing data char text[512]; if (analyse || autowhite || autogain) { ColorYUVPlaneData dY, dU, dV; if (vi.IsYUY2()) { coloryuv_analyse_yuy2(src->GetReadPtr(), src->GetPitch(), vi.width, vi.height, &dY, &dU, &dV); } else { coloryuv_analyse_planar(src->GetReadPtr(), src->GetPitch(), vi.width, vi.height, &dY, bits_per_pixel, false); // false: not chroma if (!vi.IsY()) { const int width = vi.width >> vi.GetPlaneWidthSubsampling(PLANAR_U); const int height = vi.height >> vi.GetPlaneHeightSubsampling(PLANAR_U); coloryuv_analyse_planar(src->GetReadPtr(PLANAR_U), src->GetPitch(PLANAR_U), width, height, &dU, bits_per_pixel, true); // true: chroma coloryuv_analyse_planar(src->GetReadPtr(PLANAR_V), src->GetPitch(PLANAR_V), width, height, &dV, bits_per_pixel, true); } } if (analyse) { if (!vi.IsY()) { if (bits_per_pixel == 32) sprintf(text, " Frame: %-8u ( Luma Y / ChromaU / ChromaV )\n" " Average: ( %7.5f / %7.5f / %7.5f )\n" " Minimum: ( %7.5f / %7.5f / %7.5f )\n" " Maximum: ( %7.5f / %7.5f / %7.5f )\n" "Loose Minimum: ( %7.5f / %7.5f / %7.5f )\n" "Loose Maximum: ( %7.5f / %7.5f / %7.5f )\n", n, dY.average, dU.average, dV.average, dY.real_min, dU.real_min, dV.real_min, dY.real_max, dU.real_max, dV.real_max, (float)dY.loose_min / 65535.0f, (float)dU.loose_min / 65535.0f, (float)dV.loose_min / 65535.0f, (float)dY.loose_max / 65535.0f, (float)dU.loose_max / 65535.0f, (float)dV.loose_max / 65535.0f ); else sprintf(text, " Frame: %-8u ( Luma Y / ChromaU / ChromaV )\n" " Average: ( %7.2f / %7.2f / %7.2f )\n" " Minimum: ( %5d / %5d / %5d )\n" " Maximum: ( %5d / %5d / %5d )\n" "Loose Minimum: ( %5d / %5d / %5d )\n" "Loose Maximum: ( %5d / %5d / %5d )\n", n, dY.average, dU.average, dV.average, (int)dY.real_min, (int)dU.real_min, (int)dV.real_min, (int)dY.real_max, (int)dU.real_max, (int)dV.real_max, dY.loose_min, dU.loose_min, dV.loose_min, dY.loose_max, dU.loose_max, dV.loose_max ); } else { if (bits_per_pixel == 32) sprintf(text, " Frame: %-8u\n" " Average: %7.5f\n" " Minimum: %7.5f\n" " Maximum: %7.5f\n" "Loose Minimum: %7.5f\n" "Loose Maximum: %7.5f\n", n, dY.average, dY.real_min, dY.real_max, (float)dY.loose_min / 65535.0f, (float)dY.loose_max / 65535.0f ); else sprintf(text, " Frame: %-8u\n" " Average: %7.2f\n" " Minimum: %5d\n" " Maximum: %5d\n" "Loose Minimum: %5d\n" "Loose Maximum: %5d\n", n, dY.average, (int)dY.real_min, (int)dY.real_max, dY.loose_min, dY.loose_max ); } } if (autowhite && !vi.IsY()) { coloryuv_autowhite(&dY, &dU, &dV, &cY, &cU, &cV, bits_per_pixel); } if (autogain) { coloryuv_autogain(&dY, &dU, &dV, &cY, &cU, &cV, bits_per_pixel, tweaklike_params); } } // Read conditional variables if(conditional) coloryuv_read_conditional(env, &cY, &cU, &cV, condVarSuffix); // no float lut. float will be realtime if ((pixelsize == 1 || pixelsize == 2) && !optForceUseExpr) { BYTE *luts_live[3] = { nullptr }; BYTE *lutY = luts[0]; BYTE *lutU = luts[1]; BYTE *lutV = luts[2]; // recalculate plane LUT only if changed int lut_size = pixelsize * (1 << bits_per_pixel); // 256*1 / 1024*2 .. 65536*2 if (cY.changed) { luts_live[0] = new BYTE[lut_size]; lutY = luts_live[0]; if (pixelsize == 1) coloryuv_create_lut(lutY, &cY, bits_per_pixel, tweaklike_params); else if (pixelsize == 2) coloryuv_create_lut(lutY, &cY, bits_per_pixel, tweaklike_params); } if (!vi.IsY()) { if (cU.changed) { luts_live[1] = new BYTE[lut_size]; lutU = luts_live[1]; if (pixelsize == 1) coloryuv_create_lut(lutU, &cU, bits_per_pixel, tweaklike_params); else if (pixelsize == 2) coloryuv_create_lut(lutU, &cU, bits_per_pixel, tweaklike_params); } if (cV.changed) { luts_live[2] = new BYTE[lut_size]; lutV = luts_live[2]; if (pixelsize == 1) coloryuv_create_lut(lutV, &cV, bits_per_pixel, tweaklike_params); else if (pixelsize == 2) coloryuv_create_lut(lutV, &cV, bits_per_pixel, tweaklike_params); } } dst = env->NewVideoFrameP(vi, &src); if (vi.IsYUY2()) { coloryuv_apply_lut_yuy2(dst->GetWritePtr(), src->GetReadPtr(), dst->GetPitch(), src->GetPitch(), vi.width, vi.height, lutY, lutU, lutV); } else { coloryuv_apply_lut_planar(dst->GetWritePtr(), src->GetReadPtr(), dst->GetPitch(), src->GetPitch(), vi.width, vi.height, lutY, bits_per_pixel); if (!vi.IsY()) { const int width = vi.width >> vi.GetPlaneWidthSubsampling(PLANAR_U); const int height = vi.height >> vi.GetPlaneHeightSubsampling(PLANAR_U); coloryuv_apply_lut_planar(dst->GetWritePtr(PLANAR_U), src->GetReadPtr(PLANAR_U), dst->GetPitch(PLANAR_U), src->GetPitch(PLANAR_U), width, height, lutU, bits_per_pixel); coloryuv_apply_lut_planar(dst->GetWritePtr(PLANAR_V), src->GetReadPtr(PLANAR_V), dst->GetPitch(PLANAR_V), src->GetPitch(PLANAR_V), width, height, lutV, bits_per_pixel); } if (vi.IsYUVA()) { env->BitBlt(dst->GetWritePtr(PLANAR_A), dst->GetPitch(PLANAR_A), src->GetReadPtr(PLANAR_A), src->GetPitch(PLANAR_A), src->GetRowSize(PLANAR_A), src->GetHeight(PLANAR_A)); } } if (luts_live[0]) delete[] luts_live[0]; if (luts_live[1]) delete[] luts_live[1]; if (luts_live[2]) delete[] luts_live[2]; } // lut create and use else { // 32 bit float: expr std::string exprY = coloryuv_create_lut_expr(&cY, bits_per_pixel, tweaklike_params); std::string exprU = !vi.IsY() ? coloryuv_create_lut_expr(&cU, bits_per_pixel, tweaklike_params) : ""; std::string exprV = !vi.IsY() ? coloryuv_create_lut_expr(&cV, bits_per_pixel, tweaklike_params) : ""; std::string exprA = ""; // copy // Invoke Expr AVSValue child2; if (vi.IsY()) { AVSValue new_args[2] = { child, exprY.c_str() }; child2 = env->Invoke("Expr", AVSValue(new_args, 2)).AsClip(); } else if(vi.IsYUV()) { AVSValue new_args[4] = { child, exprY.c_str(), exprU.c_str(), exprV.c_str() }; child2 = env->Invoke("Expr", AVSValue(new_args, 4)).AsClip(); } else if (vi.IsYUVA()) { AVSValue new_args[5] = { child, exprY.c_str(), exprU.c_str(), exprV.c_str(), exprA.c_str() }; child2 = env->Invoke("Expr", AVSValue(new_args, 5)).AsClip(); } dst = child2.AsClip()->GetFrame(n, env); } if (analyse) { env->ApplyMessage(&dst, vi, text, vi.width / 4, 0xa0a0a0, 0, 0); } // when there was no such property from constructor and it could not be guessed then we do not put one if (theColorRange == ColorRange_Compat_e::AVS_COLORRANGE_FULL || theColorRange == ColorRange_Compat_e::AVS_COLORRANGE_LIMITED) { auto props = env->getFramePropsRW(dst); update_ColorRange(props, theColorRange, env); } return dst; } AVSValue __cdecl ColorYUV::Create(AVSValue args, void* , IScriptEnvironment* env) { const bool tweaklike_params = args[23].AsBool(false); // f2c = true: for tweak-like parameter interpretation const float def = tweaklike_params ? 1.0f : 0.0f; return new ColorYUV(args[0].AsClip(), args[1].AsFloat(def), // gain_y args[2].AsFloat(0.0f), // off_y bright args[3].AsFloat(def), // gamma_y args[4].AsFloat(def), // cont_y args[5].AsFloat(def), // gain_u args[6].AsFloat(0.0f), // off_u bright args[7].AsFloat(def), // gamma_u args[8].AsFloat(def), // cont_u args[9].AsFloat(def), // gain_v args[10].AsFloat(0.0f), // off_v args[11].AsFloat(def), // gamma_v args[12].AsFloat(def), // cont_v args[13].AsString(""), // levels = "", "TV->PC", "PC->TV" args[14].AsString(""), // opt = "", "coring" // args[15].AsString(""), // matrix = "", "rec.709" args[16].AsBool(false), // colorbars args[17].AsBool(false), // analyze args[18].AsBool(false), // autowhite args[19].AsBool(false), // autogain args[20].AsBool(false), // conditional args[21].AsInt(8), // bits avs+ args[22].AsBool(false), // showyuv_fullrange avs+ tweaklike_params, // for gain, gamma, cont: 0.0/0.5/1.0/2.0/3.0 instead of -256/-128/0/256/512 args[24].AsString(""), // condvarsuffix avs+ args[25].AsBool(false), // optForceUseExpr debug parameter env); } extern const AVSFunction Color_filters[] = { { "ColorYUV", BUILTIN_FUNC_PREFIX, "c[gain_y]f[off_y]f[gamma_y]f[cont_y]f" \ "[gain_u]f[off_u]f[gamma_u]f[cont_u]f" \ "[gain_v]f[off_v]f[gamma_v]f[cont_v]f" \ "[levels]s[opt]s[matrix]s[showyuv]b" \ "[analyze]b[autowhite]b[autogain]b[conditional]b" \ "[bits]i[showyuv_fullrange]b[f2c]b[condvarsuffix]s[optForceUseExpr]b", // avs+ 20180226- f2c-like parameters ColorYUV::Create}, { 0 } }; ================================================ FILE: avs_core/filters/color.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __Color_h #define __Color_h #include enum { COLORYUV_RANGE_NONE, COLORYUV_RANGE_TV_PC, COLORYUV_RANGE_PC_TV, COLORYUV_RANGE_PC_TVY }; struct ColorYUVPlaneData { double average; float real_min, real_max; int loose_min, loose_max; }; struct ColorYUVPlaneConfig { double gain, offset, gamma, contrast; int range, plane; bool clip_tv; bool changed; // for lut recalc bool force_tv_range; // telling to have TV range for gamma when no other parameters }; class ColorYUV : public GenericVideoFilter { public: ColorYUV(PClip child, double gain_y, double offset_y, double gamma_y, double contrast_y, double gain_u, double offset_u, double gamma_u, double contrast_u, double gain_v, double offset_v, double gamma_v, double contrast_v, const char* level, const char* opt, bool showyuv, bool analyse, bool autowhite, bool autogain, bool conditional, int bits, bool showyuv_fullrange, // avs+ bool tweaklike_params, // ColorYUV2: 0.0/0.5/1.0/2.0/3.0 instead of -256/-128/0/256/512 const char *condVarSuffix, bool optForceUseExpr, IScriptEnvironment* env); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) override; int __stdcall SetCacheHints(int cachehints, int frame_range) override { AVS_UNUSED(frame_range); return cachehints == CACHE_GET_MTMODE ? MT_NICE_FILTER : 0; } static AVSValue Create(AVSValue args, void*, IScriptEnvironment* env); ~ColorYUV(); private: ColorYUVPlaneConfig configY, configU, configV; int colorbar_bits; bool colorbar_fullrange; bool analyse, autowhite, autogain, conditional; bool tweaklike_params; const char* condVarSuffix; bool optForceUseExpr; BYTE *luts[3]; int theColorRange; int theOutColorRange; int theMatrix; int theChromaLocation; }; #endif // __Color_h ================================================ FILE: avs_core/filters/colorbars_const.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __COLORBARS_CONST_H #define __COLORBARS_CONST_H // ===== -I AND +Q SIGNAL CONSTANTS ===== // Extracted for reuse in vectorscope graticule rendering // RGB-native values (lifted to studio black, code 16) constexpr double MINUS_I_R = 0.0; constexpr double MINUS_I_G = 0.33856; constexpr double MINUS_I_B = 0.51916; constexpr double PLUS_Q_R = 0.34736; constexpr double PLUS_Q_G = 0.0; constexpr double PLUS_Q_B = 0.58156; // YUV-targeted values (zero-luma, produces Y=16 after BT.601 conversion) constexpr double MINUS_I_R_YUV = -0.20654; constexpr double MINUS_I_G_YUV = 0.05911; constexpr double MINUS_I_B_YUV = 0.23732; constexpr double PLUS_Q_R_YUV = 0.13144; constexpr double PLUS_Q_G_YUV = -0.13762; constexpr double PLUS_Q_B_YUV = 0.36390; // Legacy 8-bit YUV codes for direct comparison constexpr int MINUS_I_Y8_SD601 = 16; constexpr int MINUS_I_CB8_SD601 = 158; constexpr int MINUS_I_CR8_SD601 = 95; // Legacy 8-bit YUV codes (BT.601) constexpr int PLUS_Q_Y8_SD601 = 16; constexpr int PLUS_Q_CB8_SD601 = 174; constexpr int PLUS_Q_CR8_SD601 = 149; // Legacy 8-bit YUV codes (BT.709) constexpr int PLUS_Q_Y8_HD709 = 53; constexpr int PLUS_Q_CB8_HD709 = 178; constexpr int PLUS_Q_CR8_HD709 = 154; // ===== ColorBarsHD +I SIGNAL CONSTANT (BT.709) ===== // SMPTE RP 219 / EG 1: +I Signal Reference (Rec. 709 / HD) // The +I (In-phase) signal is defined by its analog IRE levels: // R = 41.2545 IRE, G = 16.6946 IRE, B = 0 IRE // Normalized Linear RGB (full range [0,1]): R: 0.412545, G: 0.166946, B: 0.000000 // After BT.709 conversion: Y=61, Cb=103, Cr=157 at 8-bit constexpr double PLUS_I_R_YUV = 0.412545; constexpr double PLUS_I_G_YUV = 0.166946; constexpr double PLUS_I_B_YUV = 0.0; // Legacy 8-bit YUV codes for +I (BT.709) constexpr int PLUS_I_Y8_HD709 = 61; constexpr int PLUS_I_CB8_HD709 = 103; constexpr int PLUS_I_CR8_HD709 = 157; #endif // __COLORBARS_CONST_H ================================================ FILE: avs_core/filters/combine.cpp ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include "combine.h" #include "../core/internal.h" #ifdef AVS_WINDOWS #include #else #include #endif #include #include #include #include /******************************************************************** ***** Declare index of new filters for Avisynth's filter engine ***** ********************************************************************/ extern const AVSFunction Combine_filters[] = { { "StackVertical", BUILTIN_FUNC_PREFIX, "cc+", StackVertical::Create }, { "StackHorizontal", BUILTIN_FUNC_PREFIX, "cc+", StackHorizontal::Create }, { "MultiOverlay", BUILTIN_FUNC_PREFIX, "cc+i+", MultiOverlay::Create }, { "ShowFiveVersions", BUILTIN_FUNC_PREFIX, "ccccc", ShowFiveVersions::Create }, // first come the custom function versions, bacause of array_of_anything finish { "Animate", BUILTIN_FUNC_PREFIX, "iisn.*", Animate::Create, (void*)1 }, // start frame, end frame, filter, function, start-args, end-args { "Animate", BUILTIN_FUNC_PREFIX, "ciisn.*", Animate::Create, (void*)1 }, // then the legacy linear version { "Animate", BUILTIN_FUNC_PREFIX, "iis.*", Animate::Create, (void *)0 }, // start frame, end frame, filter, start-args, end-args { "Animate", BUILTIN_FUNC_PREFIX, "ciis.*", Animate::Create, (void*)0 }, { "ApplyRange", BUILTIN_FUNC_PREFIX, "ciis.*", Animate::Create_Range, (void*)0 }, { 0 } }; /******************************** ******* StackVertical ****** ********************************/ StackVertical::StackVertical(const std::vector& child_array, IScriptEnvironment* env) : children(child_array) { vi = children[0]->GetVideoInfo(); for (size_t i = 1; i < children.size(); ++i) { const VideoInfo& vin = children[i]->GetVideoInfo(); if (vi.width != vin.width) env->ThrowError("StackVertical: image widths don't match"); if (!vi.IsSameColorspace(vin)) env->ThrowError("StackVertical: image formats don't match"); if (vi.num_frames < vin.num_frames) // Max of all clips vi.num_frames = vin.num_frames; vi.height += vin.height; } // reverse the order of the clips in RGB mode because it's upside-down if (vi.IsRGB() && !vi.IsPlanarRGB() && !vi.IsPlanarRGBA()) { std::reverse(children.begin(), children.end()); // get audio and parity from the first in the original list firstchildindex = (int)children.size() - 1; } else { firstchildindex = 0; } } PVideoFrame __stdcall StackVertical::GetFrame(int n, IScriptEnvironment* env) { std::vector frames; frames.reserve(children.size()); for (const auto& child: children) frames.emplace_back(child->GetFrame(n, env)); PVideoFrame dst = env->NewVideoFrameP(vi, &frames[0]); const int dst_pitch = dst->GetPitch(); const int row_size = dst->GetRowSize(); BYTE* dstp = dst->GetWritePtr(); for (const auto& src: frames) { const int src_height = src->GetHeight(); env->BitBlt(dstp, dst_pitch, src->GetReadPtr(), src->GetPitch(), row_size, src_height); dstp += dst_pitch * src_height; } if (vi.IsPlanar() && (vi.NumComponents() > 1)) { // Copy Planar const int planesYUV[4] = { PLANAR_Y, PLANAR_U, PLANAR_V, PLANAR_A}; const int planesRGB[4] = { PLANAR_G, PLANAR_B, PLANAR_R, PLANAR_A}; const int *planes = vi.IsYUV() || vi.IsYUVA() ? planesYUV : planesRGB; // first plane is already processed for (int p = 1; p < vi.NumComponents(); p++) { const int plane = planes[p]; dstp = dst->GetWritePtr(plane); const int dst_pitch = dst->GetPitch(plane); const int row_size = dst->GetRowSize(plane); for (const auto& src: frames) { const int src_height = src->GetHeight(plane); env->BitBlt(dstp, dst_pitch, src->GetReadPtr(plane), src->GetPitch(plane), row_size, src_height); dstp += dst_pitch * src_height; } } } return dst; } AVSValue __cdecl StackVertical::Create(AVSValue args, void*, IScriptEnvironment* env) { if (args[1].IsArray()) { std::vector children(1+args[1].ArraySize()); children[0] = args[0].AsClip(); for (int i = 1; i < (int)children.size(); ++i) // Copy clips children[i] = args[1][i-1].AsClip(); return new StackVertical(children, env); } else if (args[1].IsClip()) { // Make easy to call with trivial 2 clips std::vector children(2); children[0] = args[0].AsClip(); children[1] = args[1].AsClip(); return new StackVertical(children, env); } else { env->ThrowError("StackVertical: clip array not recognized!"); return 0; } } /********************************** ******* MultiOverlay ****** **********************************/ // Quick and dirty copy paste of N input clips onto the original (x,y) // optionally specifying offsets in source and dimensions MultiOverlay::MultiOverlay(const std::vector& child_array, const std::vector& position_array, IScriptEnvironment* env) : children(child_array), positions(position_array) { vi = children[0]->GetVideoInfo(); // 0th is the base clip // 1.. the clips to overlay for (size_t i = 1; i < children.size(); ++i) { const VideoInfo& vin = children[i]->GetVideoInfo(); if (!vi.IsSameColorspace(vin)) env->ThrowError("MultiOverlay: image format must match with the base"); } const size_t copy_paste_count = children.size() - 1; const size_t param_count = position_array.size(); // either 2 values per clip // target_x, target_y // or 6 values per clip // target_x, target_y, src_x, src_y, src_width, src_height if(copy_paste_count * 2 != param_count && copy_paste_count * 6 != param_count) env->ThrowError("MultiOverlay: expected 2 or 6 values per source clip."); const bool grey = vi.IsY(); const bool isRGBPfamily = vi.IsPlanarRGB() || vi.IsPlanarRGBA(); const int shift_w = (vi.IsPlanar() && !grey && !isRGBPfamily) ? vi.GetPlaneWidthSubsampling(PLANAR_U) : 0; const int shift_h = (vi.IsPlanar() && !grey && !isRGBPfamily) ? vi.GetPlaneHeightSubsampling(PLANAR_U) : 0; const int mask_w = (1 << shift_w) - 1; const int mask_h = (1 << shift_h) - 1; auto params_per_clip = param_count / copy_paste_count; for (size_t i = 0; i < copy_paste_count; i++) { const VideoInfo& vin = children[i + 1]->GetVideoInfo(); const int target_x = positions[i * params_per_clip + 0]; const int target_y = positions[i * params_per_clip + 1]; if (target_x & mask_w) env->ThrowError("MultiOverlay: target x must be mod %d for this video format", (1 << shift_w)); if (target_y & mask_h) env->ThrowError("MultiOverlay: target y must be mod %d for this video format", (1 << shift_h)); if (params_per_clip == 6) { // additional source position and dimensions const int src_x = positions[i * params_per_clip + 2]; const int src_y = positions[i * params_per_clip + 3]; if (src_x < 0 || src_y < 0) env->ThrowError("MultiOverlay: source coordinate cannot be negative."); const int src_w = positions[i * params_per_clip + 4]; const int src_h = positions[i * params_per_clip + 5]; if (src_w <= 0 || src_h <= 0) env->ThrowError("MultiOverlay: source width and height must be positive."); if (src_x & mask_w) env->ThrowError("MultiOverlay: source x must be mod %d for this video format", (1 << shift_w)); if (src_y & mask_h) env->ThrowError("MultiOverlay: source y must be mod %d for this video format", (1 << shift_h)); if (src_w & mask_w) env->ThrowError("MultiOverlay: source width must be mod %d for this video format", (1 << shift_w)); if (src_h & mask_h) env->ThrowError("MultiOverlay: source height must be mod %d for this video format", (1 << shift_h)); if (src_x + src_w > vin.width) env->ThrowError("MultiOverlay: copy exceeds clip width. x=%d, size=%d, clip width=%d", src_x, src_w, vin.width); if (src_y + src_h > vin.height) env->ThrowError("MultiOverlay: copy exceeds clip height. y=%d, size=%d, clip height=%d", src_y, src_h, vin.height); } } } PVideoFrame __stdcall MultiOverlay::GetFrame(int n, IScriptEnvironment* env) { std::vector frames; frames.reserve(children.size()); for (const auto& child : children) frames.emplace_back(child->GetFrame(n, env)); PVideoFrame dst = frames[0]; // multioverlay target clip env->MakeWritable(&dst); const size_t copy_paste_count = children.size() - 1; const size_t param_count = positions.size(); const size_t params_per_clip = param_count / copy_paste_count; // 2 or 6 const bool source_extra = params_per_clip == 6; // packed RGB is upside down const bool is_packed_rgb = vi.IsRGB24() || vi.IsRGB32() || vi.IsRGB48() || vi.IsRGB64(); const int bfp = is_packed_rgb || vi.IsYUY2() ? vi.BytesFromPixels(1) : vi.ComponentSize(); // also for packed RGBs, pixelsize is not enough const int planesPacked[] = { DEFAULT_PLANE, DEFAULT_PLANE , DEFAULT_PLANE , DEFAULT_PLANE }; const int planesYUV[4] = { PLANAR_Y, PLANAR_U, PLANAR_V, PLANAR_A }; const int planesRGB[4] = { PLANAR_G, PLANAR_B, PLANAR_R, PLANAR_A }; const int* planes = is_packed_rgb ? planesPacked : vi.IsY() || vi.IsYUV() || vi.IsYUVA() ? planesYUV : planesRGB; const int planecount = is_packed_rgb || vi.IsYUY2() ? 1 : vi.NumComponents(); for (int p = 0; p < planecount; p++) { const int plane = planes[p]; BYTE* dstp = dst->GetWritePtr(plane); const int dst_pitch = dst->GetPitch(plane); const int dst_height = dst->GetHeight(plane); // 0th was the target for (size_t i = 1; i < frames.size(); i++) { const auto& src = frames[i]; const int src_rowsize = src->GetRowSize(plane); // these may be safely overridden int src_width = src_rowsize / bfp; int src_height = src->GetHeight(plane); const BYTE* srcp = src->GetReadPtr(plane); const int src_pitch = src->GetPitch(plane); // packed RGB a Y and all 0th plane is not subsampled. const int shift_w = p == 0 ? 0 : vi.GetPlaneWidthSubsampling(plane); const int shift_h = p == 0 ? 0 : vi.GetPlaneHeightSubsampling(plane); int target_x = positions[(i - 1) * params_per_clip + 0] >> shift_w; int target_y = positions[(i - 1) * params_per_clip + 1] >> shift_h; int dst_w = dst->GetRowSize(plane) / bfp; int src_x = 0; int src_y = 0; int src_w = src_width; int src_h = src_height; if (source_extra) { src_x = positions[(i - 1) * params_per_clip + 2] >> shift_w;; src_y = positions[(i - 1) * params_per_clip + 3] >> shift_h;; src_w = positions[(i - 1) * params_per_clip + 4] >> shift_w;; src_h = positions[(i - 1) * params_per_clip + 5] >> shift_h;; } // bring negative target coordinates to 0, // adjust source position and dimension accordingly if (target_x < 0) { src_x += -target_x; src_w -= -target_x; target_x = 0; } if (target_y < 0) { src_y += -target_y; src_h -= -target_y; target_y = 0; } // check and limit dimension parameters // Already checked at filter creation: // o coordinates and dimensions are subsampling friendly // o target x and y >= 0 // o source width and height > 0 // o src_x + src_width and src_y + src_height fit in source clip dimensions if (src_h > src_height) src_h = src_height; if (target_y + src_h > dst_height) src_h -= (target_y + src_h - dst_height); if (src_w > src_width) src_w = src_width; if (target_x + src_w > dst_w) src_w -= (target_x + src_w - dst_w); if (src_w > 0 && src_h > 0) { src_height = src_h; src_width = src_w * bfp; if (is_packed_rgb) { // start from bottom: packed RGB is upside down src_y = (src->GetHeight(plane) - src_y - 1) - (src_height - 1); target_y = (dst_height - target_y - 1) - (src_height - 1); } env->BitBlt( dstp + target_x * bfp + target_y * dst_pitch, dst_pitch, srcp + src_x * bfp + src_y * src_pitch, src_pitch, src_width, src_height); } } } return dst; } AVSValue __cdecl MultiOverlay::Create(AVSValue args, void*, IScriptEnvironment* env) { std::vector children; if (args[1].IsArray()) { children.resize(1 + args[1].ArraySize()); children[0] = args[0].AsClip(); for (int i = 1; i < (int)children.size(); ++i) // Copy clips children[i] = args[1][i - 1].AsClip(); } else if (args[1].IsClip()) { // Make easy to call with trivial 2 clips children.resize(2); children[0] = args[0].AsClip(); children[1] = args[1].AsClip(); } else { env->ThrowError("MultiOverlay: clip array not recognized!"); return 0; } std::vector positions; if (!args[2].IsArray()) { env->ThrowError("MultiOverlay: position array not recognized!"); return 0; } const int pos_count = args[2].ArraySize(); if (pos_count != 2 * (children.size() - 1) && pos_count != 6 * (children.size() - 1)) env->ThrowError("MultiOverlay: position array must contain 2 or 6 entries for each clip to overlay!"); positions.resize(pos_count); // x,y for each overlay clip for (int i = 0; i < pos_count; ++i) // Copy positions, x, y, or x, y, src_x, src_y, src_width, src_height positions[i] = args[2][i].AsInt(); return new MultiOverlay(children, positions, env); } /********************************** ******* StackHorizontal ****** **********************************/ StackHorizontal::StackHorizontal(const std::vector& child_array, IScriptEnvironment* env) : children(child_array) { vi = children[0]->GetVideoInfo(); for (size_t i = 1; i < children.size(); ++i) { const VideoInfo& vin = children[i]->GetVideoInfo(); if (vi.height != vin.height) env->ThrowError("StackHorizontal: image heights don't match"); if (!vi.IsSameColorspace(vin)) env->ThrowError("StackHorizontal: image formats don't match"); if (vi.num_frames < vin.num_frames) // Max of all clips vi.num_frames = vin.num_frames; vi.width += vin.width; } } PVideoFrame __stdcall StackHorizontal::GetFrame(int n, IScriptEnvironment* env) { std::vector frames; frames.reserve(children.size()); for (const auto& child : children) frames.emplace_back(child->GetFrame(n, env)); PVideoFrame dst = env->NewVideoFrameP(vi, &frames[0]); const int dst_pitch = dst->GetPitch(); const int height = dst->GetHeight(); BYTE* dstp = dst->GetWritePtr(); for (const auto& src: frames) { const int src_rowsize = src->GetRowSize(); env->BitBlt(dstp, dst_pitch, src->GetReadPtr(), src->GetPitch(), src_rowsize, height); dstp += src_rowsize; } if (vi.IsPlanar() && (vi.NumComponents() > 1)) { // Copy Planar const int planesYUV[4] = { PLANAR_Y, PLANAR_U, PLANAR_V, PLANAR_A}; const int planesRGB[4] = { PLANAR_G, PLANAR_B, PLANAR_R, PLANAR_A}; const int *planes = vi.IsYUV() || vi.IsYUVA() ? planesYUV : planesRGB; // first plane is already processed for (int p = 1; p < vi.NumComponents(); p++) { const int plane = planes[p]; dstp = dst->GetWritePtr(plane); const int dst_pitch = dst->GetPitch(plane); const int height = dst->GetHeight(plane); for (const auto& src: frames) { const int src_rowsize = src->GetRowSize(plane); env->BitBlt(dstp, dst_pitch, src->GetReadPtr(plane), src->GetPitch(plane), src_rowsize, height); dstp += src_rowsize; } } } return dst; } AVSValue __cdecl StackHorizontal::Create(AVSValue args, void*, IScriptEnvironment* env) { if (args[1].IsArray()) { std::vector children(1+args[1].ArraySize()); children[0] = args[0].AsClip(); for (int i = 1; i < (int)children.size(); ++i) // Copy clips children[i] = args[1][i-1].AsClip(); return new StackHorizontal(children, env); } else if (args[1].IsClip()) { // Make easy to call with trivial 2 clips std::vector children(2); children[0] = args[0].AsClip(); children[1] = args[1].AsClip(); return new StackHorizontal(children, env); } else { env->ThrowError("StackHorizontal: clip array not recognized!"); return 0; } } /******************************** ******* Five Versions ****** ********************************/ ShowFiveVersions::ShowFiveVersions(PClip* children, IScriptEnvironment* env) { for (int b=0; b<5; ++b) child[b] = children[b]; vi = child[0]->GetVideoInfo(); for (int c=1; c<5; ++c) { const VideoInfo& viprime = child[c]->GetVideoInfo(); vi.num_frames = max(vi.num_frames, viprime.num_frames); if (vi.width != viprime.width || vi.height != viprime.height || vi.pixel_type != viprime.pixel_type) env->ThrowError("ShowFiveVersions: video attributes of all clips must match"); } vi.width *= 3; vi.height *= 2; } PVideoFrame __stdcall ShowFiveVersions::GetFrame(int n, IScriptEnvironment* env) { PVideoFrame dst = env->NewVideoFrame(vi); // frame property source is set later BYTE* dstp = dst->GetWritePtr(); BYTE* dstpU = dst->GetWritePtr(PLANAR_U); BYTE* dstpV = dst->GetWritePtr(PLANAR_V); const int dst_pitch = dst->GetPitch(); const int dst_pitchUV = dst->GetPitch(PLANAR_U); const int height = dst->GetHeight()/2; const int heightUV = dst->GetHeight(PLANAR_U)/2; // todo: >8 bits, planar RGB if (vi.IsYUV()) { const int wg = dst->GetRowSize()/6; for (int i=0; iGetRowSize(PLANAR_U)/6; for (int i=0; iGetRowSize()/6; for (int i=0; iGetFrame(n, env); if(c == 0) // copy frame properties from the very first env->copyFrameProps(src, dst); if (vi.IsPlanar()) { const BYTE* srcpY = src->GetReadPtr(PLANAR_Y); const BYTE* srcpU = src->GetReadPtr(PLANAR_U); const BYTE* srcpV = src->GetReadPtr(PLANAR_V); const int src_pitchY = src->GetPitch(PLANAR_Y); const int src_pitchUV = src->GetPitch(PLANAR_U); const int src_row_sizeY = src->GetRowSize(PLANAR_Y); const int src_row_sizeUV = src->GetRowSize(PLANAR_U); // staggered arrangement BYTE* dstp2 = dstp + (c>>1) * src_row_sizeY; BYTE* dstp2U = dstpU + (c>>1) * src_row_sizeUV; BYTE* dstp2V = dstpV + (c>>1) * src_row_sizeUV; if (c&1) { dstp2 += (height * dst_pitch) + src_row_sizeY /2; dstp2U += (heightUV * dst_pitchUV) + src_row_sizeUV/2; dstp2V += (heightUV * dst_pitchUV) + src_row_sizeUV/2; } env->BitBlt(dstp2, dst_pitch, srcpY, src_pitchY, src_row_sizeY, height); env->BitBlt(dstp2U, dst_pitchUV, srcpU, src_pitchUV, src_row_sizeUV, heightUV); env->BitBlt(dstp2V, dst_pitchUV, srcpV, src_pitchUV, src_row_sizeUV, heightUV); } else { const BYTE* srcp = src->GetReadPtr(); const int src_pitch = src->GetPitch(); const int src_row_size = src->GetRowSize(); // staggered arrangement BYTE* dstp2 = dstp + (c>>1) * src_row_size; if ((c&1)^vi.IsRGB()) dstp2 += (height * dst_pitch); if (c&1) dstp2 += vi.BytesFromPixels(vi.width/6); env->BitBlt(dstp2, dst_pitch, srcp, src_pitch, src_row_size, height); } } return dst; } AVSValue __cdecl ShowFiveVersions::Create(AVSValue args, void*, IScriptEnvironment* env) { PClip children[5]; for (int i=0; i<5; ++i) children[i] = args[i].AsClip(); return new ShowFiveVersions(children, env); } /************************************** ******* Animate (Recursive) ****** **************************************/ Animate::Animate( PClip context, int _first, int _last, const char* _name, const AVSValue* _args_before, const AVSValue* _args_after, int _num_args, bool _range_limit, const AVSValue& _custom_fn, IScriptEnvironment* env ) : first(_first), last(_last), num_args(_num_args), name(_name), range_limit(_range_limit), custom_fn(_custom_fn) { if (first > last) env->ThrowError("Animate: final frame number must be greater than initial."); if (first == last && (!range_limit)) env->ThrowError("Animate: final frame cannot be the same as initial frame."); // check that argument types match for (int arg=0; argThrowError("Animate: string arguments must match before and after"); } else if (a.IsBool() && b.IsBool()) { if (a.AsBool() != b.AsBool()) env->ThrowError("Animate: boolean arguments must match before and after"); } else if (a.IsFloat() && b.IsFloat()) { // ok; also catches other numeric types } else if (a.IsClip() && b.IsClip()) { // ok } else { env->ThrowError("Animate: must have two argument lists with matching types"); } } if (custom_fn.IsFunction()) { // pre-check validity // We could even check if function returns f(0.0) = 0.0 and f(1.0) = 1.0 // But we are not that serious. Who implements custom function, will take care of it if needed constexpr bool check_first = false; constexpr bool check_last = false; double result_first = 0.0; double result_last = 1.0; PFunction func = custom_fn.AsFunction(); try { // The Animate callback is a plain scalar function, no child // one compulsory double "stage" parameter const char* argnames[1] = { "stage" }; // for syntax check this is always called AVSValue test1_args[1] = { 0.0 }; const AVSValue test1_args_array = AVSValue(test1_args, 1); result_first = env->Invoke3(AVSValue(), func, test1_args_array, argnames).AsFloat(); if (check_last) { if (first != last) { AVSValue test2_args[1] = { 1.0 }; const AVSValue test2_args_array = AVSValue(test2_args, 1); result_last = env->Invoke3(AVSValue(), func, test2_args_array, argnames).AsFloat(); } } } catch (IScriptEnvironment::NotFound) { env->ThrowError("Animate: Invalid function parameter type '%s'(%s)\n" "Function must have exactly one float argument: stage", func->GetDefinition()->param_types, func->ToString(env)); } catch (const AvisynthError& error) { env->ThrowError("Animate: Error in custom function: %s\n%s", func->ToString(env), error.msg); } if (check_first && result_first != 0.0) env->ThrowError("Animate: Error in custom function, for stage 0.0: 0.0 must be returned.\n%s\n", func->ToString(env)); if (check_last && result_last != 1.0) env->ThrowError("Animate: Error in custom function, for stage 1.0: 1.0 must be returned.\n%s\n", func->ToString(env)); } // copy args, and add initial clip arg for OOP notation if (context) num_args++; args_before = std::vector(num_args*3); args_after = args_before.data() + num_args; args_now = args_after + num_args; if (context) { args_after[0] = args_before[0] = context; for (int i=1; iInvoke(name, AVSValue(args_before.data(), num_args)).AsClip(); cache_stage[0] = 0; VideoInfo vi1 = cache[0]->GetVideoInfo(); if (range_limit) { VideoInfo vi = context->GetVideoInfo(); if (vi.width != vi1.width || vi.height != vi1.height) env->ThrowError("ApplyRange: Filtered and unfiltered video frame sizes must match"); if (!vi.IsSameColorspace(vi1)) env->ThrowError("ApplyRange: Filtered and unfiltered video colorspace must match"); } else { // last clip with ending parameter values cache[1] = env->Invoke(name, AVSValue(args_after, num_args)).AsClip(); cache_stage[1] = last-first; VideoInfo vi2 = cache[1]->GetVideoInfo(); if (vi1.width != vi2.width || vi1.height != vi2.height) env->ThrowError("Animate: initial and final video frame sizes must match"); } } bool __stdcall Animate::GetParity(int n) { if (range_limit) { if ((nlast)) { return args_after[0].AsClip()->GetParity(n); } } // We could go crazy here and replicate the GetFrame // logic and share the cache_stage but it is not // really worth it. Although clips that change parity // are supported they are very confusing. return cache[0]->GetParity(n); } // 96.32 bit arithmetic helper stuff for Animate // 128-bit integer structure struct my_int128_t { int64_t H; // High 64 bits (includes sign) uint64_t L; // Low 64 bits (unsigned) }; // Function to multiply two 64-bit values and produce a 128-bit result static inline my_int128_t mul_64_64_to_128(int64_t a, int64_t b) { my_int128_t result; // Handle sign separately uint64_t sign = ((a < 0) ^ (b < 0)) ? 1 : 0; // Use absolute values for multiplication uint64_t abs_a = (a < 0) ? -a : a; uint64_t abs_b = (b < 0) ? -b : b; // Multiply using 32-bit parts to avoid overflow uint64_t a_lo = abs_a & 0xFFFFFFFF; uint64_t a_hi = abs_a >> 32; uint64_t b_lo = abs_b & 0xFFFFFFFF; uint64_t b_hi = abs_b >> 32; // Multiply the components uint64_t lo_lo = a_lo * b_lo; uint64_t hi_lo = a_hi * b_lo; uint64_t lo_hi = a_lo * b_hi; uint64_t hi_hi = a_hi * b_hi; // Combine the results uint64_t mid = (lo_lo >> 32) + (hi_lo & 0xFFFFFFFF) + (lo_hi & 0xFFFFFFFF); uint64_t carry = mid >> 32; result.L = (lo_lo & 0xFFFFFFFF) | ((mid & 0xFFFFFFFF) << 32); result.H = (hi_lo >> 32) + (lo_hi >> 32) + hi_hi + carry; // Apply sign if needed if (sign) { // Two's complement negation result.L = ~result.L + 1; result.H = ~result.H + (result.L == 0); } return result; } // Function to add two 128-bit integers static inline my_int128_t add_128(my_int128_t a, my_int128_t b) { my_int128_t result; result.L = a.L + b.L; // Check for carry result.H = a.H + b.H + (result.L < a.L ? 1 : 0); return result; } // Function to shift a 128-bit integer right by 'shift' bits static inline int64_t shift_right_128(my_int128_t a, int shift) { if (shift >= 64) { // If shifting by 64 or more, the result comes entirely from the high part return a.H >> (shift - 64); } else { // Combine portions from both high and low parts return (a.H << (64 - shift)) | (a.L >> shift); } } // Constants for 96.32 integer arithmetic constexpr int ANIMATE_INT_ARITH_SCALEBITS = 32; constexpr uint64_t ANIMATE_FULL_SCALE = 1ULL << ANIMATE_INT_ARITH_SCALEBITS; // 2^32 constexpr uint64_t ANIMATE_ROUND = ANIMATE_FULL_SCALE >> 1; // 2^31 // Main interpolation function with uint64_t factor // factor = 2^32 means 1.0 static int64_t Muldiv_64_32_integer_arithm(int64_t a, int64_t b, uint64_t factor) { // Special case handling for factor = 0 or factor = 2^32 (0.0 or 1.0) if (factor == 0) return a; else if (factor == ANIMATE_FULL_SCALE) return b; // Calculate the interpolation // (a*(1-factor) + b*factor + round) / fullscale my_int128_t temp_a, temp_b; temp_a = mul_64_64_to_128(a, ANIMATE_FULL_SCALE - factor); temp_b = mul_64_64_to_128(b, factor); my_int128_t temp = add_128(temp_a, temp_b); // Add rounding constant temp.L += ANIMATE_ROUND; // Check for carry if (temp.L < ANIMATE_ROUND) { temp.H++; } // Back to the real integer domain return shift_right_128(temp, ANIMATE_INT_ARITH_SCALEBITS); } PVideoFrame __stdcall Animate::GetFrame(int n, IScriptEnvironment* env) { if (range_limit) { if ((nlast)) { return args_after[0].AsClip()->GetFrame(n, env); } return cache[0]->GetFrame(n, env); } int stage = clamp(n, first, last) - first; for (int i=0; iGetFrame(n, env); // filter not found in cache--create it int furthest = 0; for (int j=1; j abs(stage-cache_stage[furthest])) furthest = j; int scale = last-first; double stage_mod = (double)stage / scale; // linear 0.0 .. 1.0 if (custom_fn.IsFunction()) { // custom function maps x -> fn(x), so that x=0.0 and x=1.0 still returns 0.0 and 1.0 (ideally) PFunction func = custom_fn.AsFunction(); const char* argnames[1] = { "stage" }; AVSValue actual_args[1] = { stage_mod }; const AVSValue actual_args_array = AVSValue(actual_args, 1); stage_mod = env->Invoke3(AVSValue(), func, actual_args_array, argnames).AsFloat(); // Used for integer interpolations as well. // Since normalization is at 2^32 (where 1.0 equals 2^32), and int64_t is used, // it can handle up to a 2^31 multiplier from fn(x). // However, a return value range of 0.0 to 1.0 is ideal. } const uint64_t stage_int_arith = (int64_t)(double(ANIMATE_FULL_SCALE) * stage_mod); for (int a = 0; a < num_args; ++a) { if (args_before[a].IsInt() && args_after[a].IsInt()) { // 96.32 bit arithmetic, intermediate 128 bits inside. // Uses proper rounding when returning to real integer domain. int64_t start = args_before[a].AsLong(); int64_t end = args_after[a].AsLong(); int64_t interpolated_value = Muldiv_64_32_integer_arithm(start, end, stage_int_arith); int64_t lower_bound = std::min(start, end); int64_t upper_bound = std::max(start, end); // rounding error can occur, so that the intermediate result is not between the two values if (interpolated_value < lower_bound) { interpolated_value = lower_bound; } else if (interpolated_value > upper_bound) { interpolated_value = upper_bound; } args_now[a] = interpolated_value; } else if (args_before[a].IsFloat() && args_after[a].IsFloat()) { // note: AsFloat() returns double double start = args_before[a].AsFloat(); double end = args_after[a].AsFloat(); double interpolated_value = start * (1 - stage_mod) + end * stage_mod; double lower_bound = std::min(start, end); double upper_bound = std::max(start, end); // rounding error can occur, so that the intermediate result is not between the two values if (interpolated_value < lower_bound) { interpolated_value = lower_bound; } else if (interpolated_value > upper_bound) { interpolated_value = upper_bound; } args_now[a] = interpolated_value; } else { args_now[a] = args_before[a]; // bool, string, etc.. no transition } } #if 0 // old classic linear, 32 bit only kept for reference int scale = last - first; for (int a=0; aInvoke(name, AVSValue(args_now, num_args)).AsClip(); return cache[furthest]->GetFrame(n, env); } void __stdcall Animate::GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) { if (range_limit) { // Applyrange - hard switch between streams. const VideoInfo& vi1 = cache[0]->GetVideoInfo(); const int64_t start_switch = vi1.AudioSamplesFromFrames(first); const int64_t end_switch = vi1.AudioSamplesFromFrames(last+1); if ( (start+count <= start_switch) || (start >= end_switch) ) { // Everything unfiltered args_after[0].AsClip()->GetAudio(buf, start, count, env); return; } else if ( (start < start_switch) || (start+count > end_switch) ) { // We are at one or both switchover points // The bit before if (start_switch > start) { const int64_t pre_count = start_switch - start; args_after[0].AsClip()->GetAudio(buf, start, pre_count, env); // UnFiltered start += pre_count; count -= pre_count; buf = (void*)( (BYTE*)buf + vi1.BytesFromAudioSamples(pre_count) ); } // The bit in the middle const int64_t filt_count = (end_switch < start+count) ? (end_switch - start) : count; cache[0]->GetAudio(buf, start, filt_count, env); // Filtered start += filt_count; count -= filt_count; buf = (void*)( (BYTE*)buf + vi1.BytesFromAudioSamples(filt_count) ); // The bit after if (count > 0) args_after[0].AsClip()->GetAudio(buf, start, count, env); // UnFiltered return; } // Everything filtered } cache[0]->GetAudio(buf, start, count, env); // Filtered } AVSValue __cdecl Animate::Create(AVSValue args, void* user_data, IScriptEnvironment* env) { auto anim_kind = reinterpret_cast(user_data); // 0: legacy 1: extra callback function parameter PClip context; // When function parameter exists, it shifts the parameter array by one const int param_index = (anim_kind == 0) ? 3 : 4; // Convert the clip-at-zeroth-param version to the other signature. if (args[0].IsClip()) { // ciis.* -> iis.* // ciisn.* -> iisn.* context = args[0].AsClip(); args = AVSValue(&args[1], param_index + 1); } const int first = args[0].AsInt(); const int last = args[1].AsInt(); const char* const name = args[2].AsString(); int n = args[param_index].ArraySize(); if (n&1) env->ThrowError("Animate: must have two argument lists of the same length"); // two sets return new Animate(context, first, last, name, &args[param_index][0], &args[param_index][n>>1], n>>1, false, anim_kind == 0 ? AVSValue() : args[3], env); } AVSValue __cdecl Animate::Create_Range(AVSValue args, void*, IScriptEnvironment* env) { PClip context = args[0].AsClip(); const int first = args[1].AsInt(); const int last = args[2].AsInt(); const char* const name = args[3].AsString(); int n = args[4].ArraySize(); return new Animate(context, first, last, name, &args[4][0], &args[4][0], n, true, AVSValue(), env); } ================================================ FILE: avs_core/filters/combine.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __Combine_H__ #define __Combine_H__ #include #include /******************************************************************** ********************************************************************/ class MultiOverlay : public IClip /** * Class to Overlay multiple clips in one pass **/ { private: std::vector children; std::vector positions; VideoInfo vi; public: MultiOverlay(const std::vector& child_array, const std::vector& position_array, IScriptEnvironment* env); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); inline void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) { children[0]->GetAudio(buf, start, count, env); } inline const VideoInfo& __stdcall GetVideoInfo() { return vi; } inline bool __stdcall GetParity(int n) { return children[0]->GetParity(n); } int __stdcall SetCacheHints(int cachehints, int frame_range) { AVS_UNUSED(frame_range); return cachehints == CACHE_GET_MTMODE ? MT_NICE_FILTER : 0; } static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env); }; class StackVertical : public IClip /** * Class to stack clips vertically **/ { private: std::vector children; VideoInfo vi; int firstchildindex; public: StackVertical(const std::vector& child_array, IScriptEnvironment* env); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); inline void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) { children[firstchildindex]->GetAudio(buf, start, count, env); } inline const VideoInfo& __stdcall GetVideoInfo() { return vi; } inline bool __stdcall GetParity(int n) { return children[firstchildindex]->GetParity(n); } int __stdcall SetCacheHints(int cachehints, int frame_range) { AVS_UNUSED(frame_range); return cachehints == CACHE_GET_MTMODE ? MT_NICE_FILTER : 0; } static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env); }; class StackHorizontal : public IClip /** * Class to stack clips vertically **/ { private: std::vector children; VideoInfo vi; public: StackHorizontal(const std::vector& child_array, IScriptEnvironment* env); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); inline void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) { children[0]->GetAudio(buf, start, count, env); } inline const VideoInfo& __stdcall GetVideoInfo() { return vi; } inline bool __stdcall GetParity(int n) { return children[0]->GetParity(n); } int __stdcall SetCacheHints(int cachehints, int frame_range) { AVS_UNUSED(frame_range); return cachehints == CACHE_GET_MTMODE ? MT_NICE_FILTER : 0; } static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env); }; class ShowFiveVersions : public IClip /** * Class to show every pulldown combination **/ { public: ShowFiveVersions(PClip* children, IScriptEnvironment* env); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); inline void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) { child[0]->GetAudio(buf, start, count, env); } inline const VideoInfo& __stdcall GetVideoInfo() { return vi; } inline bool __stdcall GetParity(int n) { return child[0]->GetParity(n); } int __stdcall SetCacheHints(int cachehints,int frame_range) { AVS_UNUSED(cachehints); AVS_UNUSED(frame_range); return 0; }; static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env); private: PClip child[5]; VideoInfo vi; }; class Animate : public IClip /** * Class to allow recursive animation of multiple clips (see docs) * **/ { enum { cache_size = 3 }; PClip cache[cache_size]; int cache_stage[cache_size]; const int first, last; std::vector args_before; AVSValue *args_after, *args_now; int num_args; const char* name; bool range_limit; AVSValue custom_fn; public: Animate( PClip context, int _first, int _last, const char* _name, const AVSValue* _args_before, const AVSValue* _args_after, int _num_args, bool _range_limit, const AVSValue& _custom_fn, IScriptEnvironment* env ); virtual ~Animate() { } PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env); inline const VideoInfo& __stdcall GetVideoInfo() { return cache[0]->GetVideoInfo(); } bool __stdcall GetParity(int n); int __stdcall SetCacheHints(int cachehints,int frame_range) { AVS_UNUSED(frame_range); switch (cachehints) { case CACHE_GET_MTMODE: return MT_MULTI_INSTANCE; } return 0; // We do not pass cache requests upwards. }; static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env); static AVSValue __cdecl Create_Range(AVSValue args, void*, IScriptEnvironment* env); }; #endif // __Combine_H__ ================================================ FILE: avs_core/filters/conditional/conditional.cpp ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include "conditional.h" #include "../../core/parser/scriptparser.h" #include "conditional_reader.h" #include #ifdef AVS_WINDOWS #include #else #include #endif #include #include "../../core/internal.h" #include "../../core/InternalEnvironment.h" extern const AVSFunction Conditional_filters[] = { // 2020.03.28 bool "local" parameter like in gRunT. Default false. Note! AvsNeo works as local=true, but it's incompatible with old Avisynth // with "function" input local default is true { "ConditionalSelect", BUILTIN_FUNC_PREFIX, "csc+[show]b[local]b", ConditionalSelect::Create }, { "ConditionalSelect", BUILTIN_FUNC_PREFIX, "cnc+[show]b[local]b", ConditionalSelect::Create }, // function input { "ConditionalFilter", BUILTIN_FUNC_PREFIX, "cccsss[show]b[local]b", ConditionalFilter::Create, (void *)0 }, // easy syntax from GConditionalFilter, args3 and 4 to "=" and "true": { "ConditionalFilter", BUILTIN_FUNC_PREFIX, "cccs[show]b[local]b", ConditionalFilter::Create, (void *)1 }, { "ConditionalFilter", BUILTIN_FUNC_PREFIX, "cccn[show]b[local]b", ConditionalFilter::Create, (void *)2 }, // function input { "ScriptClip", BUILTIN_FUNC_PREFIX, "cs[show]b[after_frame]b[local]b", ScriptClip::Create }, { "ScriptClip", BUILTIN_FUNC_PREFIX, "cn[show]b[after_frame]b[local]b", ScriptClip::Create }, // function input { "ConditionalReader", BUILTIN_FUNC_PREFIX, "css[show]b[condvarsuffix]s[local]b", ConditionalReader::Create }, { "FrameEvaluate", BUILTIN_FUNC_PREFIX, "cs[show]b[after_frame]b[local]b", ScriptClip::Create_eval }, { "WriteFile", BUILTIN_FUNC_PREFIX, "c[filename]ss+[append]b[flush]b[local]b", Write::Create }, { "WriteFileIf", BUILTIN_FUNC_PREFIX, "c[filename]ss+[append]b[flush]b[local]b", Write::Create_If }, { "WriteFileStart", BUILTIN_FUNC_PREFIX, "c[filename]ss+[append]b[local]b", Write::Create_Start }, { "WriteFileEnd", BUILTIN_FUNC_PREFIX, "c[filename]ss+[append]b[local]b", Write::Create_End }, { "WriteFile", BUILTIN_FUNC_PREFIX, "c[filename]sn+[append]b[flush]b[local]b", Write::Create }, // function input { "WriteFileIf", BUILTIN_FUNC_PREFIX, "c[filename]sn+[append]b[flush]b[local]b", Write::Create_If }, // function input { "WriteFileStart", BUILTIN_FUNC_PREFIX, "c[filename]sn+[append]b[local]b", Write::Create_Start }, // function input { "WriteFileEnd", BUILTIN_FUNC_PREFIX, "c[filename]sn+[append]b[local]b", Write::Create_End }, // function input { "UseVar", BUILTIN_FUNC_PREFIX, "cs+", UseVar::Create }, // in conditional_reader.cpp, see property getters in conditional_functions.cpp // value from Function { "propSet", BUILTIN_FUNC_PREFIX, "csn[mode]i", SetProperty::Create, (void *)0 }, // auto from function result type { "propSetInt", BUILTIN_FUNC_PREFIX, "csn[mode]i", SetProperty::Create, (void*)1 }, // forced check for int { "propSetFloat", BUILTIN_FUNC_PREFIX, "csn[mode]i", SetProperty::Create, (void*)2 }, // forced check for float { "propSetString", BUILTIN_FUNC_PREFIX, "csn[mode]i", SetProperty::Create, (void*)3 }, // forced check for string { "propSetArray", BUILTIN_FUNC_PREFIX, "csn", SetProperty::Create, (void*)4 }, // no mode parameter, full entry refresh { "propSetClip", BUILTIN_FUNC_PREFIX, "csn[mode]i", SetProperty::Create, (void*)5 }, // forced check for clip // value from direct data { "propSet", BUILTIN_FUNC_PREFIX, "csi[mode]i", SetProperty::Create, (void*)10 }, { "propSet", BUILTIN_FUNC_PREFIX, "csf[mode]i", SetProperty::Create, (void*)11 }, { "propSet", BUILTIN_FUNC_PREFIX, "css[mode]i", SetProperty::Create, (void*)12 }, { "propSet", BUILTIN_FUNC_PREFIX, "csa", SetProperty::Create, (void*)13 }, // no mode parameter, full entry refresh { "propSet", BUILTIN_FUNC_PREFIX, "csc[mode]i", SetProperty::Create, (void*)14 }, { "propDelete", BUILTIN_FUNC_PREFIX, "cs+", DeleteProperty::Create }, { "propClearAll", BUILTIN_FUNC_PREFIX, "c", ClearProperties::Create }, { "propShow", BUILTIN_FUNC_PREFIX, "c[size]i[showtype]b[font]s[text_color]i[halo_color]i[bold]b[x]f[y]f[align]i[props]s+", ShowProperties::Create }, { "propCopy", BUILTIN_FUNC_PREFIX, "cc[merge]b[props]s+[exclude]b", CopyProperties::Create}, { 0 } }; #define W_DIVISOR 5 // Width divisor for onscreen messages /******************************** * Conditional Select * * Returns each one frame from N sources * based on an integer evaluator. ********************************/ ConditionalSelect::ConditionalSelect(PClip _child, AVSValue _script, int _num_args, PClip *_child_array, bool _show, bool _local, IScriptEnvironment* env) : GenericVideoFilter(_child), script(_script), num_args(_num_args), child_array(_child_array), show(_show), local(_local) { child_devs = DEV_TYPE_ANY; for (int i=0; iGetVideoInfo(); if (vi.height != vin.height) env->ThrowError("ConditionalSelect: The sources must all have the same height!"); if (vi.width != vin.width) env->ThrowError("ConditionalSelect: The sources must all have the same width!"); if (!vi.IsSameColorspace(vin)) env->ThrowError("ConditionalSelect: The sources must all be the same colorspace!"); if (vi.num_frames < vin.num_frames) // Max of all clips vi.num_frames = vin.num_frames; child_devs &= GetDeviceTypes(child_array[i]); } if (child_devs == 0) { env->ThrowError("ConditionalSelect: No common device among sources!"); } } ConditionalSelect::~ConditionalSelect() { delete[] child_array; } int __stdcall ConditionalSelect::SetCacheHints(int cachehints, int frame_range) { AVS_UNUSED(frame_range); switch (cachehints) { case CACHE_GET_MTMODE: return MT_NICE_FILTER; case CACHE_GET_DEV_TYPE: return child_devs; case CACHE_GET_CHILD_DEV_TYPE: return DEV_TYPE_ANY; } return 0; // We do not pass cache requests upwards. } PVideoFrame __stdcall ConditionalSelect::GetFrame(int n, IScriptEnvironment* env_) { InternalEnvironment* IEnv = GetAndRevealCamouflagedEnv(env_); IScriptEnvironment* env = static_cast(IEnv); AVSValue prev_last; AVSValue prev_current_frame; std::unique_ptr var_frame; AVSValue child_val = child; if (!local) { prev_last = env->GetVarDef("last"); // Store previous last prev_current_frame = env->GetVarDef("current_frame"); // Store previous current_frame env->SetVar("last", child_val); // Set implicit last env->SetVar("current_frame", (AVSValue)n); // Set frame to be tested by the conditional filters. } else { // Neo's default, correct but incompatible with previous Avisynth versions var_frame = std::unique_ptr(new GlobalVarFrame(IEnv)); // allocate new frame env->SetGlobalVar("last", child_val); // Set explicit last env->SetGlobalVar("current_frame", (AVSValue)n); // Set frame to be tested by the conditional filters. } AVSValue result; try { if (script.IsString()) { ScriptParser parser(env, script.AsString(), "[Conditional Select, Expression]"); PExpression exp = parser.Parse(); result = exp->Evaluate(env); } else { //auto& func = script.AsFunction(); // c++ strict conformance: cannot Convert PFunction to PFunction& const PFunction& func = script.AsFunction(); const AVSValue empty_args_array = AVSValue(nullptr, 0); // Invoke_ parameter is const AVSValue&, don't do it inline. if (!IEnv->Invoke_(&result, child_val, func->GetLegacyName(), func->GetDefinition(), empty_args_array, 0)) { env->ThrowError( "ConditionalSelect: Invalid function parameter type '%s'(%s)\n" "Function should have one clip argument or no argument", func->GetDefinition()->param_types, func->ToString(env)); } } if (!result.IsInt()) env->ThrowError("Conditional Select: Expression must return an integer!"); } catch (const AvisynthError &error) { if (!local) { env->SetVar("last", prev_last); // Restore implicit last env->SetVar("current_frame", prev_current_frame); // Restore current_frame } const int num_frames = child->GetVideoInfo().num_frames; PVideoFrame dst = child->GetFrame(min(num_frames-1, n), env); env->MakeWritable(&dst); env->ApplyMessageEx(&dst, vi, error.msg, vi.width/W_DIVISOR, 0xa0a0a0, 0, 0, true); return dst; } if (!local) { env->SetVar("last", prev_last); // Restore implicit last env->SetVar("current_frame", prev_current_frame); // Restore current_frame } const int i = result.AsInt(); PVideoFrame dst; if (i < 0 || i >= num_args) { const int num_frames = child->GetVideoInfo().num_frames; dst = child->GetFrame(min(num_frames-1, n), env); } else { const int num_frames = child_array[i]->GetVideoInfo().num_frames; dst = child_array[i]->GetFrame(min(num_frames-1, n), env); } if (show) { char text[32]; snprintf(text, sizeof(text)-1, "Expression Result:%i\n", result.AsInt()); text[sizeof(text)-1] = '\0'; env->MakeWritable(&dst); env->ApplyMessage(&dst, vi, text, vi.width/4, 0xa0a0a0, 0, 0); } return dst; } AVSValue __cdecl ConditionalSelect::Create(AVSValue args, void* , IScriptEnvironment* env) { int num_args = 0; PClip* child_array = 0; if(!args[1].IsFunction() && (!args[1].IsString() || !args[1].AsString(nullptr))) env->ThrowError("Conditional Select: expression missing!"); if (args[2].IsArray()) { num_args = args[2].ArraySize(); child_array = new PClip[num_args]; for (int i = 0; i < num_args; ++i) // Copy clips child_array[i] = args[2][i].AsClip(); } else if (args[2].IsClip()) { // Make easy to call with trivial 1 clip num_args = 1; child_array = new PClip[1]; child_array[0] = args[2].AsClip(); } else { env->ThrowError("Conditional Select: clip array not recognized!"); } const bool runtime_local_default = args[1].IsFunction() ? true : false; // Avisynth compatibility: false, Neo: true. functions are legacy Neo return new ConditionalSelect(args[0].AsClip(), args[1], num_args, child_array, args[3].AsBool(false), args[4].AsBool(runtime_local_default), env); } /******************************** * Conditional filter * * Returns each one frame from two sources, * based on an evaluator. ********************************/ ConditionalFilter::ConditionalFilter(PClip _child, PClip _source1, PClip _source2, AVSValue _condition1, AVSValue _evaluator, AVSValue _condition2, bool _show, bool _local, IScriptEnvironment* env) : GenericVideoFilter(_child), source1(_source1), source2(_source2), eval1(_condition1), eval2(_condition2), show(_show), local(_local) { evaluator = NONE; if (lstrcmpi(_evaluator.AsString(), "equals") == 0 || lstrcmpi(_evaluator.AsString(), "=") == 0 || lstrcmpi(_evaluator.AsString(), "==") == 0) evaluator = EQUALS; if (lstrcmpi(_evaluator.AsString(), "greaterthan") == 0 || lstrcmpi(_evaluator.AsString(), ">") == 0) evaluator = GREATERTHAN; if (lstrcmpi(_evaluator.AsString(), "lessthan") == 0 || lstrcmpi(_evaluator.AsString(), "<") == 0) evaluator = LESSTHAN; if (evaluator == NONE) env->ThrowError("ConditionalFilter: Evaluator could not be recognized!"); VideoInfo vi1 = source1->GetVideoInfo(); VideoInfo vi2 = source2->GetVideoInfo(); if (vi1.height != vi2.height) env->ThrowError("ConditionalFilter: The two sources must have the same height!"); if (vi1.width != vi2.width) env->ThrowError("ConditionalFilter: The two sources must have the same width!"); if (!vi1.IsSameColorspace(vi2)) env->ThrowError("ConditionalFilter: The two sources must be the same colorspace!"); vi.height = vi1.height; vi.width = vi1.width; vi.pixel_type = vi1.pixel_type; vi.num_frames = max(vi1.num_frames,vi2.num_frames); vi.num_audio_samples = vi1.num_audio_samples; vi.audio_samples_per_second = vi1.audio_samples_per_second; vi.image_type = vi1.image_type; vi.fps_denominator = vi1.fps_denominator; vi.fps_numerator = vi1.fps_numerator; vi.nchannels = vi1.nchannels; vi.sample_type = vi1.sample_type; child_devs = (GetDeviceTypes(source1) & GetDeviceTypes(source2)); if (child_devs == 0) { env->ThrowError("ConditionalFilter: The two sources must support the same device!"); } } const char* const t_TRUE="TRUE"; const char* const t_FALSE="FALSE"; int __stdcall ConditionalFilter::SetCacheHints(int cachehints, int frame_range) { AVS_UNUSED(frame_range); switch (cachehints) { case CACHE_GET_MTMODE: return MT_NICE_FILTER; case CACHE_GET_DEV_TYPE: return child_devs; case CACHE_GET_CHILD_DEV_TYPE: return DEV_TYPE_ANY; } return 0; // We do not pass cache requests upwards. } PVideoFrame __stdcall ConditionalFilter::GetFrame(int n, IScriptEnvironment* env_) { InternalEnvironment* IEnv = GetAndRevealCamouflagedEnv(env_); IScriptEnvironment* env = static_cast(IEnv); AVSValue prev_last; AVSValue prev_current_frame; std::unique_ptr var_frame; AVSValue child_val = child; if (!local) { prev_last = env->GetVarDef("last"); // Store previous last prev_current_frame = env->GetVarDef("current_frame"); // Store previous current_frame env->SetVar("last", (AVSValue)child_val); // Set implicit last env->SetVar("current_frame", (AVSValue)n); // Set frame to be tested by the conditional filters. } else { // Neo's default, correct but incompatible with previous Avisynth versions var_frame = std::unique_ptr(new GlobalVarFrame(IEnv)); // allocate new frame env->SetGlobalVar("last", child_val); // Set explicit last env->SetGlobalVar("current_frame", (AVSValue)n); // Set frame to be tested by the conditional filters. } VideoInfo vi1 = source1->GetVideoInfo(); VideoInfo vi2 = source2->GetVideoInfo(); AVSValue e1_result; AVSValue e2_result; try { if (eval1.IsString()) { ScriptParser parser(env, eval1.AsString(), "[Conditional Filter, Expresion 1]"); PExpression exp = parser.Parse(); e1_result = exp->Evaluate(env); ScriptParser parser2(env, eval2.AsString(), "[Conditional Filter, Expression 2]"); exp = parser2.Parse(); e2_result = exp->Evaluate(env); } else { //auto& func = eval1.AsFunction(); // c++ strict conformance: cannot Convert PFunction to PFunction& const PFunction& func = eval1.AsFunction(); const AVSValue empty_args_array = AVSValue(nullptr, 0); // Invoke_ parameter is const AVSValue&, don't do it inline. if (!IEnv->Invoke_(&e1_result, child_val, func->GetLegacyName(), func->GetDefinition(), empty_args_array, 0)) { env->ThrowError( "ConditionalFilter: Invalid function parameter type '%s'(%s)\n" "Function should have one clip argument or no argument", func->GetDefinition()->param_types, func->ToString(env)); } e2_result = true; } } catch (const AvisynthError &error) { const char* error_msg = error.msg; PVideoFrame dst = source1->GetFrame(n,env); env->MakeWritable(&dst); env->ApplyMessageEx(&dst, vi1, error_msg, vi.width/W_DIVISOR, 0xa0a0a0, 0, 0, true); if (!local) { env->SetVar("last", prev_last); // Restore implicit last env->SetVar("current_frame", prev_current_frame); // Restore current_frame } return dst; } if (!local) { env->SetVar("last", prev_last); // Restore implicit last env->SetVar("current_frame", prev_current_frame); // Restore current_frame } bool test_int=false; bool test_string=false; int e1 = 0; int e2 = 0; double f1 = 0.0; double f2 = 0.0; try { if (e1_result.IsString()) { if (!e2_result.IsString()) env->ThrowError("Conditional filter: Second expression did not return a string, as in first string expression."); test_string = true; test_int = true; e1 = lstrcmp(e1_result.AsString(), e2_result.AsString()); e2 = 0; } else if (e1_result.IsBool()) { if (!(e2_result.IsInt() || e2_result.IsBool())) env->ThrowError("Conditional filter: Second expression did not return an integer or bool, as in first bool expression."); test_int = true; e1 = e1_result.AsBool(); e2 = e2_result.IsInt() ? e2_result.AsInt() : e2_result.AsBool(); } else if (e1_result.IsInt()) { if (e2_result.IsInt() || e2_result.IsBool()) { test_int = true; e1 = e1_result.AsInt(); e2 = e2_result.IsInt() ? e2_result.AsInt() : e2_result.AsBool(); } else if (e2_result.IsFloat()) { f1 = (float)e1_result.AsFloat(); f2 = (float)e2_result.AsFloat(); } else env->ThrowError("Conditional filter: Second expression did not return a float, integer or bool, as in first integer expression."); } else if (e1_result.IsFloat()) { f1 = (float)e1_result.AsFloat(); if (!e2_result.IsFloat()) env->ThrowError("Conditional filter: Second expression did not return a float or an integer, as in first float expression."); f2 = (float)e2_result.AsFloat(); } else { env->ThrowError("ConditionalFilter: First expression did not return an integer, bool or float!"); } } catch (const AvisynthError &error) { const char* error_msg = error.msg; PVideoFrame dst = source1->GetFrame(n,env); env->MakeWritable(&dst); env->ApplyMessageEx(&dst, vi1, error_msg, vi.width/W_DIVISOR, 0xa0a0a0, 0, 0, true); return dst; } bool state = false; if (test_int) { // String and Int compare if (evaluator == EQUALS) if (e1 == e2) state = true; if (evaluator == GREATERTHAN) if (e1 > e2) state = true; if (evaluator == LESSTHAN) if (e1 < e2) state = true; } else { // Float compare if (evaluator == EQUALS) if (fabs(f1-f2)<0.000001) state = true; // Exact equal will sometimes be rounded to wrong values. if (evaluator == GREATERTHAN) if (f1 > f2) state = true; if (evaluator == LESSTHAN) if (f1 < f2) state = true; } if (show) { char text[400]; if (test_string) { snprintf(text, sizeof(text)-1, "Left side Conditional Result:%.40s\n" "Right side Conditional Result:%.40s\n" "Evaluate result: %s\n", e1_result.AsString(), e2_result.AsString(), (state) ? t_TRUE : t_FALSE ); } else if (test_int) { snprintf(text, sizeof(text)-1, "Left side Conditional Result:%i\n" "Right side Conditional Result:%i\n" "Evaluate result: %s\n", e1, e2, (state) ? t_TRUE : t_FALSE ); } else { snprintf(text, sizeof(text)-1, "Left side Conditional Result:%7.4f\n" "Right side Conditional Result:%7.4f\n" "Evaluate result: %s\n", f1, f2, (state) ? t_TRUE : t_FALSE ); } PVideoFrame dst = (state) ? source1->GetFrame(min(vi1.num_frames-1,n),env) : source2->GetFrame(min(vi2.num_frames-1,n),env); env->MakeWritable(&dst); env->ApplyMessage(&dst, vi, text, vi.width/4, 0xa0a0a0, 0, 0); return dst; } if (state) return source1->GetFrame(min(vi1.num_frames-1,n),env); return source2->GetFrame(min(vi1.num_frames-1,n),env); } void __stdcall ConditionalFilter::GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) { source1->GetAudio(buf, start, count, env); } AVSValue __cdecl ConditionalFilter::Create(AVSValue args, void* user_data, IScriptEnvironment* env) { intptr_t userdata = (intptr_t)user_data; const bool runtime_local_default = args[3].IsFunction() ? true : false; // Avisynth compatibility: false, Neo: true. functions are legacy Neo if (userdata == 0) return new ConditionalFilter(args[0].AsClip(), args[1].AsClip(), args[2].AsClip(), args[3], args[4], args[5], args[6].AsBool(false), args[7].AsBool(runtime_local_default), env); else // like GConditional filter shortcut: no "=" "true" needed return new ConditionalFilter(args[0].AsClip(), args[1].AsClip(), args[2].AsClip(), args[3], "=", "true", args[4].AsBool(false), args[5].AsBool(runtime_local_default), env); } /************************** * ScriptClip. * * Returns the value of a script evaluated at each frame. * * Implicit last, and current frame is set on each frame. **************************/ ScriptClip::ScriptClip(PClip _child, AVSValue _script, bool _show, bool _only_eval, bool _eval_after_frame, bool _local, IScriptEnvironment* env) : GenericVideoFilter(_child), script(_script), show(_show), only_eval(_only_eval), eval_after(_eval_after_frame), local(_local) { AVS_UNUSED(env); } int __stdcall ScriptClip::SetCacheHints(int cachehints, int frame_range) { switch (cachehints) { case CACHE_GET_MTMODE: return MT_NICE_FILTER; case CACHE_GET_DEV_TYPE: return (child->GetVersion() >= 5) ? child->SetCacheHints(CACHE_GET_DEV_TYPE, 0) : 0; } return 0; // We do not pass cache requests upwards. } PVideoFrame __stdcall ScriptClip::GetFrame(int n, IScriptEnvironment* env_) { InternalEnvironment* IEnv = GetAndRevealCamouflagedEnv(env_); IScriptEnvironment* env = static_cast(IEnv); AVSValue prev_last; AVSValue prev_current_frame; std::unique_ptr var_frame; AVSValue child_val = child; if (!local) { prev_last = env->GetVarDef("last"); // Store previous last prev_current_frame = env->GetVarDef("current_frame"); // Store previous current_frame env->SetVar("last", (AVSValue)child_val); // Set implicit last env->SetVar("current_frame", (AVSValue)n); // Set frame to be tested by the conditional filters. } else { // Neo's default, correct but incompatible with previous Avisynth versions var_frame = std::unique_ptr(new GlobalVarFrame(IEnv)); // allocate new frame env->SetGlobalVar("last", child_val); // Set explicit last env->SetGlobalVar("current_frame", (AVSValue)n); // Set frame to be tested by the conditional filters. } if (show) { PVideoFrame dst = child->GetFrame(n,env); const char* text = script.IsString() ? script.AsString() : script.AsFunction()->ToString(env); env->MakeWritable(&dst); env->ApplyMessage(&dst, vi, text, vi.width/6, 0xa0a0a0, 0, 0); if (!local) { env->SetVar("last", prev_last); // Restore implicit last env->SetVar("current_frame", prev_current_frame); // Restore current_frame } return dst; } AVSValue result; PVideoFrame eval_return; // Frame to be returned if script should be evaluated AFTER frame has been fetched. Otherwise not used. if (eval_after) eval_return = child->GetFrame(n,env); try { if (script.IsString()) { ScriptParser parser(env, script.AsString(), "[ScriptClip]"); PExpression exp = parser.Parse(); result = exp->Evaluate(env); } else { const PFunction& func = script.AsFunction(); const AVSValue empty_args_array = AVSValue(nullptr, 0); // Invoke_ parameter is const AVSValue&, don't do it inline. const Function* fd = func->GetDefinition(); if (!IEnv->Invoke_(&result, child_val, func->GetLegacyName(),fd , empty_args_array, 0)) { /* fd is nullptr: ps = function propSetterFunc(Clip c) { propSetInt("frameluma_sc_func",func(AverageLuma)) } ScriptClip(func(ps)) */ if (fd == nullptr) env->ThrowError( "ScriptClip: Invalid function parameter type '%s'(%s)\n" "Function should have one clip argument or no argument", "", func->ToString(env)); else env->ThrowError( "ScriptClip: Invalid function parameter type '%s'(%s)\n" "Function should have one clip argument or no argument", func->GetDefinition()->param_types, func->ToString(env)); } } } catch (const AvisynthError &error) { const char* error_msg = error.msg; PVideoFrame dst = child->GetFrame(n,env); env->MakeWritable(&dst); env->ApplyMessageEx(&dst, vi, error_msg, vi.width/W_DIVISOR, 0xa0a0a0, 0, 0, true); if (!local) { env->SetVar("last", prev_last); // Restore implicit last env->SetVar("current_frame", prev_current_frame); // Restore current_frame } return dst; } if (!local) { env->SetVar("last", prev_last); // Restore implicit last env->SetVar("current_frame", prev_current_frame); // Restore current_frame } if (eval_after && only_eval) return eval_return; if (only_eval) return child->GetFrame(n,env); const char* error = NULL; VideoInfo vi2 = vi; if (!result.IsClip()) { if (result.IsBool()) error = "ScriptClip: Function did not return a video clip! (Was a bool)"; else if (result.IsInt()) error = "ScriptClip: Function did not return a video clip! (Was an int)"; else if (result.IsFloat()) error = "ScriptClip: Function did not return a video clip! (Was a float)"; else if (result.IsString()) error = "ScriptClip: Function did not return a video clip! (Was a string)"; else if (result.IsArray()) error = "ScriptClip: Function did not return a video clip! (Was an array)"; else if (!result.Defined()) error = "ScriptClip: Function did not return a video clip! (Was the undefined value)"; else error = "ScriptClip: Function did not return a video clip! (type is unknown)"; } else { vi2 = result.AsClip()->GetVideoInfo(); if (!vi.IsSameColorspace(vi2)) { error = "ScriptClip: Function did not return a video clip of the same colorspace as the source clip!"; } else if (vi2.width != vi.width) { error = "ScriptClip: Function did not return a video clip with the same width as the source clip!"; } else if (vi2.height != vi.height) { error = "ScriptClip: Function did not return a video clip with the same height as the source clip!"; } } if (error != NULL) { PVideoFrame dst = child->GetFrame(n,env); env->MakeWritable(&dst); env->ApplyMessage(&dst, vi, error, vi.width/W_DIVISOR, 0xa0a0a0, 0, 0); return dst; } n = min(n,vi2.num_frames-1); // We ignore it if the new clip is not as long as the current one. This can allow the resulting clip to be one frame. return result.AsClip()->GetFrame(n,env); } AVSValue __cdecl ScriptClip::Create(AVSValue args, void* , IScriptEnvironment* env) { const bool runtime_local_default = args[1].IsFunction() ? true : false; // Avisynth compatibility: false, Neo: true. functions are legacy Neo return new ScriptClip(args[0].AsClip(), args[1], args[2].AsBool(false),false, args[3].AsBool(false), args[4].AsBool(runtime_local_default), env); } AVSValue __cdecl ScriptClip::Create_eval(AVSValue args, void* , IScriptEnvironment* env) { const bool runtime_local_default = args[1].IsFunction() ? true : false; // Avisynth compatibility: false, Neo: true. functions are legacy Neo return new ScriptClip(args[0].AsClip(), args[1], args[2].AsBool(false),true, args[3].AsBool(false), args[4].AsBool(runtime_local_default), env);} ================================================ FILE: avs_core/filters/conditional/conditional.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include class ConditionalSelect : public GenericVideoFilter { public: ConditionalSelect(PClip _child, AVSValue _script, int _num_args, PClip *_child_array, bool _show, bool _local, IScriptEnvironment* env); ~ConditionalSelect(); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); int __stdcall SetCacheHints(int cachehints, int frame_range); static AVSValue __cdecl Create(AVSValue args, void* user_data, IScriptEnvironment* env); private: AVSValue script; const int num_args; PClip *child_array; const bool show; bool local; int child_devs; }; class ConditionalFilter : public GenericVideoFilter /** * Conditional **/ { enum Eval { NONE = 0, EQUALS = 1, GREATERTHAN = 2, LESSTHAN = 4 }; public: ConditionalFilter(PClip _child, PClip _source1, PClip _source2, AVSValue _condition1, AVSValue _evaluator, AVSValue _condition2, bool _show, bool _local, IScriptEnvironment* env); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env); int __stdcall SetCacheHints(int cachehints, int frame_range); static AVSValue __cdecl Create(AVSValue args, void* user_data, IScriptEnvironment* env); private: PClip source1; PClip source2; Eval evaluator; AVSValue eval1; AVSValue eval2; bool show; bool local; int child_devs; }; class ScriptClip : public GenericVideoFilter { public: ScriptClip(PClip _child, AVSValue _script, bool _show, bool _only_eval, bool _eval_after_frame, bool _local, IScriptEnvironment* env); int __stdcall SetCacheHints(int cachehints, int frame_range); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); static AVSValue __cdecl Create(AVSValue args, void* user_data, IScriptEnvironment* env); static AVSValue __cdecl Create_eval(AVSValue args, void* user_data, IScriptEnvironment* env); private: AVSValue script; bool show; bool only_eval; bool eval_after; bool local; // like in gRunT, watch at Neo and AVS+ differences! Compatibility is local=false }; ================================================ FILE: avs_core/filters/conditional/conditional_functions.cpp ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include "conditional_functions.h" #include "../focus.h" // sad #ifdef INTEL_INTRINSICS #include "intel/conditional_functions_sse.h" #include "../intel/focus_sse.h" // sad #endif #include "../../core/internal.h" #include #include #include #include #include #include #include "../core/AVSMap.h" extern const AVSFunction Conditional_funtions_filters[] = { { "AverageLuma", BUILTIN_FUNC_PREFIX, "c[offset]i", AveragePlane::Create, (void *)PLANAR_Y }, { "AverageChromaU", BUILTIN_FUNC_PREFIX, "c[offset]i", AveragePlane::Create, (void *)PLANAR_U }, { "AverageChromaV", BUILTIN_FUNC_PREFIX, "c[offset]i", AveragePlane::Create, (void *)PLANAR_V }, { "AverageR", BUILTIN_FUNC_PREFIX, "c[offset]i", AveragePlane::Create, (void *)PLANAR_R }, { "AverageG", BUILTIN_FUNC_PREFIX, "c[offset]i", AveragePlane::Create, (void *)PLANAR_G }, { "AverageB", BUILTIN_FUNC_PREFIX, "c[offset]i", AveragePlane::Create, (void *)PLANAR_B }, { "AverageA", BUILTIN_FUNC_PREFIX, "c[offset]i", AveragePlane::Create, (void *)PLANAR_A }, //{ "AverageSat","c[offset]i", AverageSat::Create }, Sum(SatLookup[U,V])/N, SatLookup[U,V]=1.4087*sqrt((U-128)**2+(V-128)**2) //{ "AverageHue","c[offset]i", AverageHue::Create }, Sum(HueLookup[U,V])/N, HueLookup[U,V]=40.5845*Atan2(U-128,V-128) { "RGBDifference", BUILTIN_FUNC_PREFIX, "cc", ComparePlane::Create, (void *)-1 }, { "LumaDifference", BUILTIN_FUNC_PREFIX, "cc", ComparePlane::Create, (void *)PLANAR_Y }, { "ChromaUDifference", BUILTIN_FUNC_PREFIX, "cc", ComparePlane::Create, (void *)PLANAR_U }, { "ChromaVDifference", BUILTIN_FUNC_PREFIX, "cc", ComparePlane::Create, (void *)PLANAR_V }, { "RDifference", BUILTIN_FUNC_PREFIX, "cc", ComparePlane::Create, (void *)PLANAR_R }, { "GDifference", BUILTIN_FUNC_PREFIX, "cc", ComparePlane::Create, (void *)PLANAR_G }, { "BDifference", BUILTIN_FUNC_PREFIX, "cc", ComparePlane::Create, (void *)PLANAR_B }, //{ "SatDifference","cc", CompareSat::Create }, Sum(Abs(SatLookup[U1,V1]-SatLookup[U2,V2]))/N //{ "HueDifference","cc", CompareHue::Create }, Sum(Abs(HueLookup[U1,V1]-HueLookup[U2,V2]))/N { "YDifferenceFromPrevious", BUILTIN_FUNC_PREFIX, "c", ComparePlane::Create_prev, (void *)PLANAR_Y }, { "UDifferenceFromPrevious", BUILTIN_FUNC_PREFIX, "c", ComparePlane::Create_prev, (void *)PLANAR_U }, { "VDifferenceFromPrevious", BUILTIN_FUNC_PREFIX, "c", ComparePlane::Create_prev, (void *)PLANAR_V }, { "RGBDifferenceFromPrevious", BUILTIN_FUNC_PREFIX, "c", ComparePlane::Create_prev, (void *)-1 }, { "RDifferenceFromPrevious", BUILTIN_FUNC_PREFIX, "c", ComparePlane::Create_prev, (void *)PLANAR_R }, { "GDifferenceFromPrevious", BUILTIN_FUNC_PREFIX, "c", ComparePlane::Create_prev, (void *)PLANAR_G }, { "BDifferenceFromPrevious", BUILTIN_FUNC_PREFIX, "c", ComparePlane::Create_prev, (void *)PLANAR_B }, //{ "SatDifferenceFromPrevious","c", CompareSat::Create_prev }, //{ "HueDifferenceFromPrevious","c", CompareHue::Create_prev }, { "YDifferenceToNext", BUILTIN_FUNC_PREFIX, "c[offset]i", ComparePlane::Create_next, (void *)PLANAR_Y }, { "UDifferenceToNext", BUILTIN_FUNC_PREFIX, "c[offset]i", ComparePlane::Create_next, (void *)PLANAR_U }, { "VDifferenceToNext", BUILTIN_FUNC_PREFIX, "c[offset]i", ComparePlane::Create_next, (void *)PLANAR_V }, { "RGBDifferenceToNext", BUILTIN_FUNC_PREFIX, "c[offset]i", ComparePlane::Create_next, (void *)-1 }, { "RDifferenceToNext", BUILTIN_FUNC_PREFIX, "c[offset]i", ComparePlane::Create_next, (void *)PLANAR_R }, { "GDifferenceToNext", BUILTIN_FUNC_PREFIX, "c[offset]i", ComparePlane::Create_next, (void *)PLANAR_G }, { "BDifferenceToNext", BUILTIN_FUNC_PREFIX, "c[offset]i", ComparePlane::Create_next, (void *)PLANAR_B }, //{ "SatDifferenceFromNext","c[offset]i", CompareSat::Create_next }, //{ "HueDifferenceFromNext","c[offset]i", CompareHue::Create_next }, { "PlaneMinMaxStats", BUILTIN_FUNC_PREFIX, "c[threshold]f[offset]i[plane]i[setvar]b", MinMaxPlane::Create_minmax_stats, (void*)-1 }, { "YPlaneMax", BUILTIN_FUNC_PREFIX, "c[threshold]f[offset]i", MinMaxPlane::Create_max, (void *)PLANAR_Y }, { "YPlaneMin", BUILTIN_FUNC_PREFIX, "c[threshold]f[offset]i", MinMaxPlane::Create_min, (void *)PLANAR_Y }, { "YPlaneMedian", BUILTIN_FUNC_PREFIX, "c[offset]i", MinMaxPlane::Create_median, (void *)PLANAR_Y }, { "UPlaneMax", BUILTIN_FUNC_PREFIX, "c[threshold]f[offset]i", MinMaxPlane::Create_max, (void *)PLANAR_U }, { "UPlaneMin", BUILTIN_FUNC_PREFIX, "c[threshold]f[offset]i", MinMaxPlane::Create_min, (void *)PLANAR_U }, { "UPlaneMedian", BUILTIN_FUNC_PREFIX, "c[offset]i", MinMaxPlane::Create_median, (void *)PLANAR_U }, { "VPlaneMax", BUILTIN_FUNC_PREFIX, "c[threshold]f[offset]i", MinMaxPlane::Create_max, (void *)PLANAR_V }, // AVS+! was before: missing offset parameter { "VPlaneMin", BUILTIN_FUNC_PREFIX, "c[threshold]f[offset]i", MinMaxPlane::Create_min, (void *)PLANAR_V }, // AVS+! was before: missing offset parameter { "VPlaneMedian", BUILTIN_FUNC_PREFIX, "c[offset]i", MinMaxPlane::Create_median, (void *)PLANAR_V }, { "RPlaneMax", BUILTIN_FUNC_PREFIX, "c[threshold]f[offset]i", MinMaxPlane::Create_max, (void *)PLANAR_R }, { "RPlaneMin", BUILTIN_FUNC_PREFIX, "c[threshold]f[offset]i", MinMaxPlane::Create_min, (void *)PLANAR_R }, { "RPlaneMedian", BUILTIN_FUNC_PREFIX, "c[offset]i", MinMaxPlane::Create_median, (void *)PLANAR_R }, { "GPlaneMax", BUILTIN_FUNC_PREFIX, "c[threshold]f[offset]i", MinMaxPlane::Create_max, (void *)PLANAR_G }, { "GPlaneMin", BUILTIN_FUNC_PREFIX, "c[threshold]f[offset]i", MinMaxPlane::Create_min, (void *)PLANAR_G }, { "GPlaneMedian", BUILTIN_FUNC_PREFIX, "c[offset]i", MinMaxPlane::Create_median, (void *)PLANAR_G }, { "BPlaneMax", BUILTIN_FUNC_PREFIX, "c[threshold]f[offset]i", MinMaxPlane::Create_max, (void *)PLANAR_B }, { "BPlaneMin", BUILTIN_FUNC_PREFIX, "c[threshold]f[offset]i", MinMaxPlane::Create_min, (void *)PLANAR_B }, { "BPlaneMedian", BUILTIN_FUNC_PREFIX, "c[offset]i", MinMaxPlane::Create_median, (void *)PLANAR_B }, { "YPlaneMinMaxDifference", BUILTIN_FUNC_PREFIX, "c[threshold]f[offset]i", MinMaxPlane::Create_minmax, (void *)PLANAR_Y }, { "UPlaneMinMaxDifference", BUILTIN_FUNC_PREFIX, "c[threshold]f[offset]i", MinMaxPlane::Create_minmax, (void *)PLANAR_U }, // AVS+! was before: missing offset parameter { "VPlaneMinMaxDifference", BUILTIN_FUNC_PREFIX, "c[threshold]f[offset]i", MinMaxPlane::Create_minmax, (void *)PLANAR_V }, // AVS+! was before: missing offset parameter { "RPlaneMinMaxDifference", BUILTIN_FUNC_PREFIX, "c[threshold]f[offset]i", MinMaxPlane::Create_minmax, (void *)PLANAR_R }, { "GPlaneMinMaxDifference", BUILTIN_FUNC_PREFIX, "c[threshold]f[offset]i", MinMaxPlane::Create_minmax, (void *)PLANAR_G }, { "BPlaneMinMaxDifference", BUILTIN_FUNC_PREFIX, "c[threshold]f[offset]i", MinMaxPlane::Create_minmax, (void *)PLANAR_B }, //{ "SatMax","c[threshold]f[offset]i", MinMaxPlane::Create_maxsat }, ++accum[SatLookup[U,V]] //{ "SatMin","c[threshold]f[offset]i", MinMaxPlane::Create_minsat }, //{ "SatMedian","c[offset]i", MinMaxPlane::Create_mediansat }, //{ "SatMinMaxDifference","c[threshold]f[offset]i", MinMaxPlane::Create_minmaxsat }, //{ "HueMax","c[threshold]f[offset]i", MinMaxPlane::Create_maxhue }, ++accum[HueLookup[U,V]] //{ "HueMin","c[threshold]f[offset]i", MinMaxPlane::Create_minhue }, //{ "HueMedian","c[offset]i", MinMaxPlane::Create_medianhue }, //{ "HueMinMaxDifference","c[threshold]f[offset]i", MinMaxPlane::Create_minmaxhue }, // frame property setters in conditional_reader { "propGetAny", BUILTIN_FUNC_PREFIX, "cs[index]i[offset]i", GetProperty::Create, (void*)0 }, { "propGetInt", BUILTIN_FUNC_PREFIX, "cs[index]i[offset]i", GetProperty::Create, (void *)1 }, { "propGetFloat", BUILTIN_FUNC_PREFIX, "cs[index]i[offset]i", GetProperty::Create, (void*)2 }, { "propGetString", BUILTIN_FUNC_PREFIX, "cs[index]i[offset]i", GetProperty::Create, (void*)3 }, { "propGetClip", BUILTIN_FUNC_PREFIX, "cs[index]i[offset]i", GetProperty::Create, (void*)4 }, { "propGetDataSize", BUILTIN_FUNC_PREFIX, "cs[index]i[offset]i", GetPropertyDataSize::Create }, { "propNumElements", BUILTIN_FUNC_PREFIX, "cs[offset]i", GetPropertyNumElements::Create}, { "propNumKeys", BUILTIN_FUNC_PREFIX, "c[offset]i", GetPropertyNumKeys::Create}, { "propGetKeyByIndex", BUILTIN_FUNC_PREFIX, "c[index]i[offset]i", GetPropertyKeyByIndex::Create}, { "propGetType", BUILTIN_FUNC_PREFIX, "cs[offset]i", GetPropertyType::Create}, { "propGetAsArray", BUILTIN_FUNC_PREFIX, "cs[offset]i", GetPropertyAsArray::Create}, { "propGetAll", BUILTIN_FUNC_PREFIX, "c[offset]i", GetAllProperties::Create}, { 0 } }; AVSValue AveragePlane::Create(AVSValue args, void* user_data, IScriptEnvironment* env) { int plane = (int)reinterpret_cast(user_data); return AvgPlane(args[0], user_data, plane, args[1].AsInt(0), env); } // Average plane template static double get_sum_of_pixels_c(const BYTE* srcp8, size_t height, size_t width, size_t pitch) { typedef typename std::conditional < sizeof(pixel_t) == 4, double, int64_t>::type sum_t; sum_t accum = 0; // int32 holds sum of maximum 16 Mpixels for 8 bit, and 65536 pixels for uint16_t pixels const pixel_t *srcp = reinterpret_cast(srcp8); pitch /= sizeof(pixel_t); for (size_t y = 0; y < height; y++) { for (size_t x = 0; x < width; x++) { accum += srcp[x]; } srcp += pitch; } return (double)accum; } AVSValue AveragePlane::AvgPlane(AVSValue clip, void* , int plane, int offset, IScriptEnvironment* env) { if (!clip.IsClip()) env->ThrowError("Average Plane: No clip supplied!"); PClip child = clip.AsClip(); VideoInfo vi = child->GetVideoInfo(); // input clip to always planar if (vi.IsRGB() && !vi.IsPlanar()) { AVSValue new_args[1] = { child }; if (vi.IsRGB24() || vi.IsRGB48()) child = env->Invoke("ConvertToPlanarRGB", AVSValue(new_args, 1)).AsClip(); else // RGB32, RGB64 child = env->Invoke("ConvertToPlanarRGBA", AVSValue(new_args, 1)).AsClip(); vi = child->GetVideoInfo(); } else if (vi.IsYUY2()) { AVSValue new_args[2] = { child, false }; child = env->Invoke("ConvertToYUV422", AVSValue(new_args, 2)).AsClip(); vi = child->GetVideoInfo(); } if (!vi.IsPlanar()) env->ThrowError("Average Plane: Only planar YUV or planar RGB images supported!"); if (plane == PLANAR_A) { if (!vi.IsPlanarRGBA() && !vi.IsYUVA()) env->ThrowError("Average Plane: clip has no Alpha plane!"); } else if(vi.IsRGB()) { if (plane != PLANAR_R && plane != PLANAR_G && plane != PLANAR_B) env->ThrowError("Average Plane: not a valid plane for an RGB clip!"); } else if (vi.IsY()){ if (plane != PLANAR_Y) env->ThrowError("Average Plane: not a valid plane for an greyscale clip!"); } else { if (plane != PLANAR_Y && plane != PLANAR_U && plane != PLANAR_V) env->ThrowError("Average Plane: not a valid plane for a YUV clip!"); } AVSValue cn = env->GetVarDef("current_frame"); if (!cn.IsInt()) env->ThrowError("Average Plane: This filter can only be used within run-time filters"); int n = cn.AsInt(); n = min(max(n+offset,0), vi.num_frames-1); PVideoFrame src = child->GetFrame(n,env); int pixelsize = vi.ComponentSize(); const BYTE* srcp = src->GetReadPtr(plane); int height = src->GetHeight(plane); int width = src->GetRowSize(plane) / pixelsize; int pitch = src->GetPitch(plane); if (width == 0 || height == 0) env->ThrowError("Average Plane: plane does not exist!"); double sum = 0.0; int total_pixels = width*height; bool sum_in_32bits; if (pixelsize == 4) sum_in_32bits = false; else // worst case sum_in_32bits = ((int64_t)total_pixels * (pixelsize == 1 ? 255 : 65535)) <= std::numeric_limits::max(); #ifdef INTEL_INTRINSICS if ((pixelsize==1) && sum_in_32bits && (env->GetCPUFlags() & CPUF_SSE2) && width >= 16) { sum = get_sum_of_pixels_sse2(srcp, height, width, pitch); } else #ifdef X86_32 if ((pixelsize==1) && sum_in_32bits && (env->GetCPUFlags() & CPUF_INTEGER_SSE) && width >= 8) { sum = get_sum_of_pixels_isse(srcp, height, width, pitch); } else #endif #endif { if(pixelsize==1) sum = get_sum_of_pixels_c(srcp, height, width, pitch); else if(pixelsize==2) sum = get_sum_of_pixels_c(srcp, height, width, pitch); else // pixelsize==4 sum = get_sum_of_pixels_c(srcp, height, width, pitch); } float f = (float)(sum / (height * width)); return (AVSValue)f; } AVSValue ComparePlane::Create(AVSValue args, void* user_data, IScriptEnvironment* env) { int plane = (int)reinterpret_cast(user_data); return CmpPlane(args[0],args[1], user_data, plane, env); } AVSValue ComparePlane::Create_prev(AVSValue args, void* user_data, IScriptEnvironment* env) { int plane = (int)reinterpret_cast(user_data); return CmpPlaneSame(args[0], user_data, -1, plane, env); } AVSValue ComparePlane::Create_next(AVSValue args, void* user_data, IScriptEnvironment* env) { int plane = (int)reinterpret_cast(user_data); return CmpPlaneSame(args[0], user_data, args[1].AsInt(1), plane, env); } template static double get_sad_c(const BYTE* c_plane8, const BYTE* t_plane8, size_t height, size_t width, size_t c_pitch, size_t t_pitch) { const pixel_t *c_plane = reinterpret_cast(c_plane8); const pixel_t *t_plane = reinterpret_cast(t_plane8); c_pitch /= sizeof(pixel_t); t_pitch /= sizeof(pixel_t); typedef typename std::conditional < sizeof(pixel_t) == 4, double, int64_t>::type sum_t; sum_t accum = 0; // int32 holds sum of maximum 16 Mpixels for 8 bit, and 65536 pixels for uint16_t pixels for (size_t y = 0; y < height; y++) { for (size_t x = 0; x < width; x++) { accum += std::abs(t_plane[x] - c_plane[x]); } c_plane += c_pitch; t_plane += t_pitch; } return (double)accum; } template static double get_sad_rgb_c(const BYTE* c_plane8, const BYTE* t_plane8, size_t height, size_t width, size_t c_pitch, size_t t_pitch) { const pixel_t *c_plane = reinterpret_cast(c_plane8); const pixel_t *t_plane = reinterpret_cast(t_plane8); c_pitch /= sizeof(pixel_t); t_pitch /= sizeof(pixel_t); int64_t accum = 0; // packed rgb: integer type only for (size_t y = 0; y < height; y++) { for (size_t x = 0; x < width; x+=4) { accum += std::abs(t_plane[x] - c_plane[x]); accum += std::abs(t_plane[x+1] - c_plane[x+1]); accum += std::abs(t_plane[x+2] - c_plane[x+2]); } c_plane += c_pitch; t_plane += t_pitch; } return (double)accum; } AVSValue ComparePlane::CmpPlane(AVSValue clip, AVSValue clip2, void* , int plane, IScriptEnvironment* env) { if (!clip.IsClip()) env->ThrowError("Plane Difference: No clip supplied!"); if (!clip2.IsClip()) env->ThrowError("Plane Difference: Second parameter is not a clip!"); PClip child = clip.AsClip(); VideoInfo vi = child->GetVideoInfo(); PClip child2 = clip2.AsClip(); VideoInfo vi2 = child2->GetVideoInfo(); if (plane !=-1 ) { if (!vi.IsPlanar() || !vi2.IsPlanar()) env->ThrowError("Plane Difference: Only planar YUV or planar RGB images supported!"); } else { if(vi.IsPlanarRGB() || vi.IsPlanarRGBA()) env->ThrowError("RGB Difference: Planar RGB is not supported here (clip 1)"); if(vi2.IsPlanarRGB() || vi2.IsPlanarRGBA()) env->ThrowError("RGB Difference: Planar RGB is not supported here (clip 2)"); if (!vi.IsRGB()) env->ThrowError("RGB Difference: RGB difference can only be tested on RGB images! (clip 1)"); if (!vi2.IsRGB()) env->ThrowError("RGB Difference: RGB difference can only be tested on RGB images! (clip 2)"); plane = 0; } AVSValue cn = env->GetVarDef("current_frame"); if (!cn.IsInt()) env->ThrowError("Plane Difference: This filter can only be used within run-time filters"); int n = cn.AsInt(); n = clamp(n,0,vi.num_frames-1); PVideoFrame src = child->GetFrame(n,env); PVideoFrame src2 = child2->GetFrame(n,env); int pixelsize = vi.ComponentSize(); const BYTE* srcp = src->GetReadPtr(plane); const BYTE* srcp2 = src2->GetReadPtr(plane); const int height = src->GetHeight(plane); const int rowsize = src->GetRowSize(plane); const int width = rowsize / pixelsize; const int pitch = src->GetPitch(plane); const int height2 = src2->GetHeight(plane); const int rowsize2 = src2->GetRowSize(plane); const int width2 = rowsize2 / pixelsize; const int pitch2 = src2->GetPitch(plane); if(vi.ComponentSize() != vi2.ComponentSize()) env->ThrowError("Plane Difference: Bit-depth are not the same!"); if (width == 0 || height == 0) env->ThrowError("Plane Difference: plane does not exist!"); if (height != height2 || width != width2) env->ThrowError("Plane Difference: Images are not the same size!"); #ifdef X86_32 int bits_per_pixel = vi.BitsPerComponent(); int total_pixels = width*height; bool sum_in_32bits; if (pixelsize == 4) sum_in_32bits = false; else // worst case check sum_in_32bits = ((int64_t)total_pixels * ((1 << bits_per_pixel) - 1)) <= std::numeric_limits::max(); #endif double sad = 0.0; // for c: width, for sse: rowsize if (vi.IsRGB32() || vi.IsRGB64()) { #ifdef INTEL_INTRINSICS if ((pixelsize == 2) && (env->GetCPUFlags() & CPUF_SSE2) && rowsize >= 16) { // int64 internally, no sum_in_32bits sad = (double)calculate_sad_8_or_16_sse2(srcp, srcp2, pitch, pitch2, width*pixelsize, height); // in focus. 21.68/21.39 } else if ((pixelsize == 1) && (env->GetCPUFlags() & CPUF_SSE2) && rowsize >= 16) { sad = (double)calculate_sad_8_or_16_sse2(srcp, srcp2, pitch, pitch2, rowsize, height); // in focus, no overflow } else #ifdef X86_32 if ((pixelsize==1) && sum_in_32bits && (env->GetCPUFlags() & CPUF_INTEGER_SSE) && width >= 8) { sad = get_sad_rgb_isse(srcp, srcp2, height, rowsize, pitch, pitch2); } else #endif #endif { if (pixelsize == 1) sad = (double)get_sad_rgb_c(srcp, srcp2, height, width, pitch, pitch2); else // pixelsize==2 sad = (double)get_sad_rgb_c(srcp, srcp2, height, width, pitch, pitch2); } } else { #ifdef INTEL_INTRINSICS if ((pixelsize==2) && (env->GetCPUFlags() & CPUF_SSE2) && rowsize >= 16) { sad = (double)calculate_sad_8_or_16_sse2(srcp, srcp2, pitch, pitch2, rowsize, height); // in focus, no overflow } else if ((pixelsize==1) && (env->GetCPUFlags() & CPUF_SSE2) && rowsize >= 16) { sad = (double)calculate_sad_8_or_16_sse2(srcp, srcp2, pitch, pitch2, rowsize, height); // in focus, no overflow } else #ifdef X86_32 if ((pixelsize==1) && sum_in_32bits && (env->GetCPUFlags() & CPUF_INTEGER_SSE) && width >= 8) { sad = get_sad_isse(srcp, srcp2, height, rowsize, pitch, pitch2); } else #endif #endif { if(pixelsize==1) sad = get_sad_c(srcp, srcp2, height, width, pitch, pitch2); else if(pixelsize==2) sad = get_sad_c(srcp, srcp2, height, width, pitch, pitch2); else // pixelsize==4 sad = get_sad_c(srcp, srcp2, height, width, pitch, pitch2); } } float f; if (vi.IsRGB32() || vi.IsRGB64()) f = (float)((sad * 4) / (height * width * 3)); // why * 4/3? alpha plane was masked out, anyway else f = (float)(sad / (height * width)); return (AVSValue)f; } AVSValue ComparePlane::CmpPlaneSame(AVSValue clip, void* , int offset, int plane, IScriptEnvironment* env) { if (!clip.IsClip()) env->ThrowError("Plane Difference: No clip supplied!"); PClip child = clip.AsClip(); VideoInfo vi = child->GetVideoInfo(); if (plane ==-1 ) { if (!vi.IsRGB() || vi.IsPlanarRGB() || vi.IsPlanarRGBA()) env->ThrowError("RGB Difference: RGB difference can only be calculated on packed RGB images"); plane = 0; } else { if (!vi.IsPlanar()) env->ThrowError("Plane Difference: Only planar YUV or planar RGB images images supported!"); } AVSValue cn = env->GetVarDef("current_frame"); if (!cn.IsInt()) env->ThrowError("Plane Difference: This filter can only be used within run-time filters"); int n = cn.AsInt(); n = clamp(n,0,vi.num_frames-1); int n2 = clamp(n+offset,0,vi.num_frames-1); PVideoFrame src = child->GetFrame(n,env); PVideoFrame src2 = child->GetFrame(n2,env); int pixelsize = vi.ComponentSize(); const BYTE* srcp = src->GetReadPtr(plane); const BYTE* srcp2 = src2->GetReadPtr(plane); int height = src->GetHeight(plane); int rowsize = src->GetRowSize(plane); int width = rowsize / pixelsize; int pitch = src->GetPitch(plane); int pitch2 = src2->GetPitch(plane); if (width == 0 || height == 0) env->ThrowError("Plane Difference: No chroma planes in greyscale clip!"); #ifdef X86_32 int bits_per_pixel = vi.BitsPerComponent(); int total_pixels = width * height; bool sum_in_32bits; if (pixelsize == 4) sum_in_32bits = false; else // worst case check sum_in_32bits = ((int64_t)total_pixels * ((1 << bits_per_pixel) - 1)) <= std::numeric_limits::max(); #endif double sad = 0; // for c: width, for sse: rowsize if (vi.IsRGB32() || vi.IsRGB64()) { #ifdef INTEL_INTRINSICS if ((pixelsize == 2) && (env->GetCPUFlags() & CPUF_SSE2) && rowsize >= 16) { // int64 internally, no sum_in_32bits sad = (double)calculate_sad_8_or_16_sse2(srcp, srcp2, pitch, pitch2, rowsize, height); // in focus. 21.68/21.39 } else if ((pixelsize == 1) && (env->GetCPUFlags() & CPUF_SSE2) && rowsize >= 16) { sad = (double)calculate_sad_8_or_16_sse2(srcp, srcp2, pitch, pitch2, rowsize, height); // in focus, no overflow } else #ifdef X86_32 if ((pixelsize==1) && sum_in_32bits && (env->GetCPUFlags() & CPUF_INTEGER_SSE) && width >= 8) { sad = get_sad_rgb_isse(srcp, srcp2, height, rowsize, pitch, pitch2); } else #endif #endif { if(pixelsize==1) sad = get_sad_rgb_c(srcp, srcp2, height, width, pitch, pitch2); else sad = get_sad_rgb_c(srcp, srcp2, height, width, pitch, pitch2); } } else { #ifdef INTEL_INTRINSICS if ((pixelsize==2) && (env->GetCPUFlags() & CPUF_SSE2) && rowsize >= 16) { sad = (double)calculate_sad_8_or_16_sse2(srcp, srcp2, pitch, pitch2, rowsize, height); // in focus, no overflow } else if ((pixelsize==1) && (env->GetCPUFlags() & CPUF_SSE2) && rowsize >= 16) { sad = (double)calculate_sad_8_or_16_sse2(srcp, srcp2, pitch, pitch2, rowsize, height); // in focus, no overflow } else #ifdef X86_32 if ((pixelsize==1) && sum_in_32bits && (env->GetCPUFlags() & CPUF_INTEGER_SSE) && width >= 8) { sad = get_sad_isse(srcp, srcp2, height, width, pitch, pitch2); } else #endif #endif { if(pixelsize==1) sad = get_sad_c(srcp, srcp2, height, width, pitch, pitch2); else if (pixelsize==2) sad = get_sad_c(srcp, srcp2, height, width, pitch, pitch2); else // pixelsize==4 sad = get_sad_c(srcp, srcp2, height, width, pitch, pitch2); } } float f; if (vi.IsRGB32() || vi.IsRGB64()) f = (float)((sad * 4) / (height * width * 3)); else f = (float)(sad / (height * width)); return (AVSValue)f; } AVSValue MinMaxPlane::Create_minmax_stats(AVSValue args, void* user_data, IScriptEnvironment* env) { const int plane = args[3].AsInt(0); // 0:Y or R 1:U or G 2: V or B 3:A if (plane < 0 || plane>3) env->ThrowError("MinMax Stats: plane index must be between 0-3!"); if (!args[0].IsClip()) env->ThrowError("MinMax Stats: No clip supplied!"); VideoInfo vi = args[0].AsClip()->GetVideoInfo(); const int planes_y[4] = { PLANAR_Y, PLANAR_U, PLANAR_V, PLANAR_A }; const int planes_r[4] = { PLANAR_R, PLANAR_G, PLANAR_B, PLANAR_A }; // in 'logical' RGB order const int* planes = (vi.IsYUV() || vi.IsYUVA()) ? planes_y : planes_r; const int current_plane = planes[plane]; const int setvar = args[4].AsBool(false); return MinMax(args[0], user_data, args[1].AsDblDef(0.0), args[2].AsInt(0), current_plane, MinMaxPlane::STATS, setvar, env); } AVSValue MinMaxPlane::Create_max(AVSValue args, void* user_data, IScriptEnvironment* env) { int plane = (int)reinterpret_cast(user_data); return MinMax(args[0], user_data, args[1].AsDblDef(0.0), args[2].AsInt(0), plane, MinMaxPlane::MAX, false, env); } AVSValue MinMaxPlane::Create_min(AVSValue args, void* user_data, IScriptEnvironment* env) { int plane = (int)reinterpret_cast(user_data); return MinMax(args[0], user_data, args[1].AsDblDef(0.0), args[2].AsInt(0), plane, MinMaxPlane::MIN, false, env); } AVSValue MinMaxPlane::Create_median(AVSValue args, void* user_data, IScriptEnvironment* env) { int plane = (int)reinterpret_cast(user_data); // MEDIAN: min 50% return MinMax(args[0], user_data, 50.0, args[1].AsInt(0), plane, MinMaxPlane::MIN, false, env); } AVSValue MinMaxPlane::Create_minmax(AVSValue args, void* user_data, IScriptEnvironment* env) { int plane = (int)reinterpret_cast(user_data); return MinMax(args[0], user_data, args[1].AsDblDef(0.0), args[2].AsInt(0), plane, MinMaxPlane::MINMAX_DIFFERENCE, false, env); } template void get_minmax_float_c(const BYTE* srcp, int pitch, int w, int h, float& min, float& max, double &sum) { min = *reinterpret_cast(srcp); max = min; sum = 0; for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { const float pix = reinterpret_cast(srcp)[x]; if constexpr(average) sum += pix; if (pix < min) min = pix; if (pix > max) max = pix; } srcp += pitch; } } template void get_minmax_int_c(const BYTE* srcp, int pitch, int w, int h, int& min, int& max, int64_t& sum) { min = *reinterpret_cast(srcp); max = min; sum = 0; for (int y = 0; y < h; y++) { int tmpsum = 0; for (int x = 0; x < w; x++) { const int pix = reinterpret_cast(srcp)[x]; if constexpr (average) sum += pix; if (pix < min) min = pix; if (pix > max) max = pix; } if constexpr (average) sum += tmpsum; srcp += pitch; } } AVSValue MinMaxPlane::MinMax(AVSValue clip, void* , double threshold, int offset, int plane, int mode, bool setvar, IScriptEnvironment* env) { if (!clip.IsClip()) env->ThrowError("MinMax: No clip supplied!"); PClip child = clip.AsClip(); VideoInfo vi = child->GetVideoInfo(); if (vi.IsRGB()) { if (plane == PLANAR_Y || plane == PLANAR_U || plane == PLANAR_V) env->ThrowError("MinMax: no such plane in RGB format"); } else if (vi.IsY()) { if (plane != PLANAR_Y) env->ThrowError("MinMax: no such plane in Y (greyscale) format"); } else { if (plane == PLANAR_R || plane == PLANAR_G || plane == PLANAR_B) env->ThrowError("MinMax: no such plane in YUV format"); } if (vi.NumComponents() < 4 && plane == PLANAR_A) env->ThrowError("MinMax: no Alpha plane in this format"); // input clip to always planar if (vi.IsRGB() && !vi.IsPlanar()) { AVSValue new_args[1] = { child }; if (vi.IsRGB24() || vi.IsRGB48()) child = env->Invoke("ConvertToPlanarRGB", AVSValue(new_args, 1)).AsClip(); else // RGB32, RGB64 child = env->Invoke("ConvertToPlanarRGBA", AVSValue(new_args, 1)).AsClip(); vi = child->GetVideoInfo(); } else if (vi.IsYUY2()) { AVSValue new_args[2] = { child, false }; child = env->Invoke("ConvertToYUV422", AVSValue(new_args, 2)).AsClip(); vi = child->GetVideoInfo(); } if (!vi.IsPlanar()) env->ThrowError("MinMax: Image must be planar"); // Get current frame number AVSValue cn = env->GetVarDef("current_frame"); if (!cn.IsInt()) env->ThrowError("MinMax: This filter can only be used within run-time filters"); int n = cn.AsInt(); n = min(max(n + offset, 0), vi.num_frames - 1); // Prepare the source PVideoFrame src = child->GetFrame(n, env); const BYTE* srcp = src->GetReadPtr(plane); int pitch = src->GetPitch(plane); int pixelsize = vi.ComponentSize(); int w = src->GetRowSize(plane) / pixelsize; // good for packed rgb as well int h = src->GetHeight(plane); if (w == 0 || h == 0) env->ThrowError("MinMax: plane does not exist!"); float stats_min; float stats_max; float stats_median; float stats_thresholded_min; float stats_thresholded_max; float stats_average; if (threshold == 0 || mode == MinMaxPlane::STATS) { // special case, no histogram needed if (pixelsize == 4) // 32 bit float { double sum = 0; if (mode == MinMaxPlane::STATS) get_minmax_float_c(srcp, pitch, w, h, stats_min, stats_max, sum); else get_minmax_float_c(srcp, pitch, w, h, stats_min, stats_max, sum); if (mode == MinMaxPlane::MIN) return stats_min; else if (mode == MinMaxPlane::MAX) return stats_max; else if (mode == MinMaxPlane::MINMAX_DIFFERENCE) return stats_max - stats_min; stats_average = (float)(sum / (w * h)); // STATS: go on } else { int min, max; int64_t sum = 0; // sse4.1 is not any faster if(pixelsize == 1) if (mode == MinMaxPlane::STATS) get_minmax_int_c(srcp, pitch, w, h, min, max, sum); else get_minmax_int_c(srcp, pitch, w, h, min, max, sum); else if (mode == MinMaxPlane::STATS) get_minmax_int_c(srcp, pitch, w, h, min, max, sum); else get_minmax_int_c(srcp, pitch, w, h, min, max, sum); if (mode == MinMaxPlane::MIN) return min; else if (mode == MinMaxPlane::MAX) return max; else if (mode == MinMaxPlane::MINMAX_DIFFERENCE) return max - min; // STATS: go on stats_min = (float)min; stats_max = (float)max; stats_average = (float)((double)sum / (w * h)); } } const int bits_per_pixel = vi.BitsPerComponent(); const int max_pixel_value = (1 << bits_per_pixel) - 1; const int buffersize = pixelsize == 4 ? 65536 : (1 << bits_per_pixel); // 65536 for float, too, reason for 10-14 bits: avoid overflow uint32_t* accum_buf = new uint32_t[buffersize]; // Reset accumulators std::fill_n(accum_buf, buffersize, 0); // Count each component if (pixelsize == 1) { for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { accum_buf[srcp[x]]++; // safe } srcp += pitch; } } else if (pixelsize == 2) { for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { accum_buf[min((int)(reinterpret_cast(srcp)[x]), max_pixel_value)]++; } srcp += pitch; } } else { //pixelsize==4 float // for float results are always checked with 16 bit precision only // or else we cannot populate non-digital steps with this standard method // See similar in colors, ColorYUV analyze const bool chroma = (plane == PLANAR_U) || (plane == PLANAR_V); if (chroma) { const float shift = 32768.0f; for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { // -0.5..0.5 to 0..65535 const float pixel = reinterpret_cast(srcp)[x]; accum_buf[clamp((int)(65535.0f*pixel + shift + 0.5f), 0, 65535)]++; } srcp += pitch; } } else { for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { const float pixel = reinterpret_cast(srcp)[x]; accum_buf[clamp((int)(65535.0f * pixel + 0.5f), 0, 65535)]++; } srcp += pitch; } } } int pixels = w*h; threshold /=100.0; // Thresh now 0-1 threshold = clamp(threshold, 0.0, 1.0); unsigned int tpixels = (unsigned int)(pixels*threshold); int retval; // Find the value we need. if (mode == MinMaxPlane::MIN) { // threshold == 0 was covered already unsigned int counted=0; retval = buffersize - 1; for (int i = 0; i< buffersize;i++) { counted += accum_buf[i]; if (counted>tpixels) { retval = i; break; } } } else if (mode == MinMaxPlane::MAX) { unsigned int counted=0; retval = 0; for (int i = buffersize-1; i>=0;i--) { counted += accum_buf[i]; if (counted>tpixels) { retval = i; break; } } } else if (mode == MinMaxPlane::STATS && threshold == 0) { stats_thresholded_min = (float)stats_min; stats_thresholded_max = (float)stats_max; retval = -1; // stats: n/a } else if (mode == MinMaxPlane::MINMAX_DIFFERENCE || mode == MinMaxPlane::STATS) { // thresholded case unsigned int counted=0; int i, t_min = 0; // Find min for (i = 0; i < buffersize;i++) { counted += accum_buf[i]; if (counted>tpixels) { t_min=i; break; } } // Find max counted=0; int t_max = buffersize-1; for (i = buffersize-1; i>=0;i--) { counted += accum_buf[i]; if (counted>tpixels) { t_max=i; break; } } retval = t_max - t_min; // results <0 will be returned if threshold > 50 stats_thresholded_min = (float)t_min; stats_thresholded_max = (float)t_max; } if (mode == MinMaxPlane::STATS) { // for STATS we already have min and max, thresholded min and max // let's gather median, which is equal to 50% MIN // comment: no separate MEDIAN mode is used, already converted to MIN 50% in ctor unsigned int tpixels = (unsigned int)(pixels * 0.5f); unsigned int counted = 0; retval = buffersize - 1; for (int i = 0; i < buffersize; i++) { counted += accum_buf[i]; if (counted > tpixels) { retval = i; break; } } stats_median = (float)retval; } delete[] accum_buf; //_RPT2(0, "End of MinMax cn=%d n=%d\r", cn.AsInt(), n); if (mode == MinMaxPlane::STATS) { if (pixelsize == 4) { const bool chroma = (plane == PLANAR_U) || (plane == PLANAR_V); const float shift = chroma ? 32768.0f : 0; stats_thresholded_min = (float)((double)(stats_thresholded_min - shift) / (buffersize - 1)); // convert back to float, /65535 stats_thresholded_max = (float)((double)(stats_thresholded_max - shift) / (buffersize - 1)); // convert back to float, /65535 stats_median = (float)((double)(stats_median - shift) / (buffersize - 1)); // convert back to float, /65535 } AVSValue result[] = { stats_min, stats_max, stats_thresholded_min, stats_thresholded_max, stats_median, stats_average }; AVSValue ret = AVSValue(result, 6); if (setvar) { env->SetGlobalVar("PlaneStats_min", stats_min); env->SetGlobalVar("PlaneStats_max", stats_max); env->SetGlobalVar("PlaneStats_thmin", stats_thresholded_min); env->SetGlobalVar("PlaneStats_thmax", stats_thresholded_max); env->SetGlobalVar("PlaneStats_median", stats_median); env->SetGlobalVar("PlaneStats_average", stats_average); } return ret; } if (pixelsize == 4) { const bool chroma = (plane == PLANAR_U) || (plane == PLANAR_V); if (chroma && (mode == MIN || mode == MAX)) { const float shift = 32768.0f; return AVSValue((double)(retval - shift) / (buffersize - 1)); // convert back to float, /65535 } else { return AVSValue((double)retval / (buffersize - 1)); // convert back to float, /65535 } } else return AVSValue(retval); } AVSValue GetProperty::Create(AVSValue args, void* user_data, IScriptEnvironment* env_) { InternalEnvironment* IEnv = GetAndRevealCamouflagedEnv(env_); IScriptEnvironment* env = static_cast(IEnv); AVSValue clip = args[0]; if (!clip.IsClip()) env->ThrowError("propGetxxxxx: No clip supplied!"); PClip child = clip.AsClip(); VideoInfo vi = child->GetVideoInfo(); AVSValue cn = env->GetVarDef("current_frame"); const bool calledFromRunTime = cn.IsInt(); int propType = (int)(intptr_t)user_data; // vUnset, vInt, vFloat, vData, vNode/Clip, vFrame/*, vMethod*/ } // 0: auto // 1: integer (int64 long) // 2: float (double) // 3: char (null terminated data) // 4: Clip const char* propName = args[1].AsString(); const int index = args[2].AsInt(0); const int offset = args[3].AsInt(0); int n = calledFromRunTime ? cn.AsInt() : 0; n = min(max(n + offset, 0), vi.num_frames - 1); PVideoFrame src = child->GetFrame(n, env); const AVSMap* avsmap = env->getFramePropsRO(src); int error = 0; // check auto if (propType == 0) { char res = env->propGetType(avsmap, propName); // 'u'nset, 'i'nteger, 'f'loat, 's'string, 'c'lip, 'v'ideoframe, 'm'ethod }; switch (res) { case 'u': return AVSValue(); // unSet = AVS undefined case 'v': env->ThrowError("Error getting frame property \"%s\": video frames not supported as function return values", propName); break; case 'i': propType = 1; break; case 'f': propType = 2; break; case 's': propType = 3; break; case 'c': propType = 4; break; default: env->ThrowError("Error getting frame property \"%s\": type '%c' not supported", propName, res); } } if (propType == 1) { int64_t result = env->propGetInt(avsmap, propName, index, &error); if(!error) return AVSValue(result); // v11: no need for (int) cast } else if (propType == 2) { double result = env->propGetFloat(avsmap, propName, index, &error); if (!error) return AVSValue(result); } else if (propType == 3) { const char *result = env->propGetData(avsmap, propName, index, &error); if (!error) { result = env->SaveString(result); // property had its own storage return AVSValue(result); } } else if (propType == 4) { PClip result = env->propGetClip(avsmap, propName, index, &error); if (!error) return AVSValue(result); } else { error = AVSGetPropErrors::GETPROPERROR_TYPE; } const char* error_msg = nullptr; // really, errors are bits if (error & AVSGetPropErrors::GETPROPERROR_UNSET) error_msg = "property is not set"; else if (error & AVSGetPropErrors::GETPROPERROR_TYPE) error_msg = "wrong type"; else if (error & AVSGetPropErrors::GETPROPERROR_INDEX) error_msg = "index error"; // arrays if (error) env->ThrowError("Error getting frame property \"%s\": %s ", propName, error_msg); return AVSValue(); } AVSValue GetPropertyAsArray::Create(AVSValue args, void* , IScriptEnvironment* env_) { InternalEnvironment* IEnv = GetAndRevealCamouflagedEnv(env_); IScriptEnvironment* env = static_cast(IEnv); AVSValue clip = args[0]; if (!clip.IsClip()) env->ThrowError("propGetAsArray: No clip supplied!"); PClip child = clip.AsClip(); VideoInfo vi = child->GetVideoInfo(); AVSValue cn = env->GetVarDef("current_frame"); const bool calledFromRunTime = cn.IsInt(); const char* propName = args[1].AsString(); const int offset = args[2].AsInt(0); int n = calledFromRunTime ? cn.AsInt() : 0; n = min(max(n + offset, 0), vi.num_frames - 1); PVideoFrame src = child->GetFrame(n, env); const AVSMap* avsmap = env->getFramePropsRO(src); int error = 0; char propType = env->propGetType(avsmap, propName); if (propType == 'u') { // special: zero array return AVSValue(nullptr, 0); } // check auto int size = env->propNumElements(avsmap, propName); std::vector result(size); // propGetIntArray or propGetFloatArray is available // Pre interface V11: AVSValue is int and float, prop arrays are int64_t and double if (propType == 'i') { const int64_t* arr = env->propGetIntArray(avsmap, propName, &error); for (int i = 0; i < size; ++i) result[i] = arr[i]; // v11: no need for (int) cast } else if (propType == 'f') { const double* arr = env->propGetFloatArray(avsmap, propName, &error); for (int i = 0; i < size; ++i) result[i] = arr[i]; // v11: no need for (float) cast } else { // generic for (int i = 0; i < size; ++i) { AVSValue elem; switch (propType) { case 'i': elem = AVSValue(env->propGetInt(avsmap, propName, i, &error)); break; // though handled earlier case 'f': elem = AVSValue(env->propGetFloat(avsmap, propName, i, &error)); break; // though handled earlier case 's': { const char* s = env->propGetData(avsmap, propName, i, &error); if (!error) elem = AVSValue(env->SaveString(s)); } break; case 'v': elem = AVSValue(env->propGetFrame(avsmap, propName, i, &error)); break; case 'c': elem = AVSValue(env->propGetClip(avsmap, propName, i, &error)); break; default: elem = AVSValue(); } if (error) break; result[i] = elem; } } const char* error_msg = nullptr; // really, errors are bits if (error & AVSGetPropErrors::GETPROPERROR_UNSET) error_msg = "property is not set"; else if (error & AVSGetPropErrors::GETPROPERROR_TYPE) error_msg = "wrong type"; else if (error & AVSGetPropErrors::GETPROPERROR_INDEX) error_msg = "index error"; // arrays if (error) env->ThrowError("propGetAsArray: Error getting frame property \"%s\": %s ", propName, error_msg); return AVSValue(result.data(), size); // array deep copy } // propGetAll // fills an AVSValue array with key-value pairs // array size will be numProps // each array element is a two dimensional array [key, value] // value can be an array as well, depending on the property // only int, float and string data extracted AVSValue GetAllProperties::Create(AVSValue args, void*, IScriptEnvironment* env_) { InternalEnvironment* IEnv = GetAndRevealCamouflagedEnv(env_); IScriptEnvironment* env = static_cast(IEnv); AVSValue clip = args[0]; if (!clip.IsClip()) env->ThrowError("propGetAll: No clip supplied!"); PClip child = clip.AsClip(); VideoInfo vi = child->GetVideoInfo(); AVSValue cn = env->GetVarDef("current_frame"); const bool calledFromRunTime = cn.IsInt(); const int offset = args[1].AsInt(0); int n = calledFromRunTime ? cn.AsInt() : 0; n = min(max(n + offset, 0), vi.num_frames - 1); PVideoFrame src = child->GetFrame(n, env); const AVSMap* avsmap = env->getFramePropsRO(src); const int propNum = env->propNumKeys(avsmap); if (0 == propNum) return AVSValue(nullptr, 0); // zero sized array std::vector result(propNum); for (int index = 0; index < propNum; index++) { std::vector pair(2); const char* propName = env->propGetKey(avsmap, index); pair[0] = env->SaveString(propName); const char propType = env->propGetType(avsmap, propName); const int propNumElements = env->propNumElements(avsmap, propName); int error; AVSValue elem; if (propType == 'u') { // unSet: undefined value } else if (propType == 'i') { if(propNumElements == 1) elem = AVSValue(env->propGetInt(avsmap, propName, 0, &error)); // v11: no need for (int) cast else { std::vector avsarr(propNumElements); const int64_t* arr = env->propGetIntArray(avsmap, propName, &error); for (int i = 0; i < propNumElements; ++i) avsarr[i] = arr[i]; // v11: no need for (int) cast elem = AVSValue(avsarr.data(), propNumElements); // array deep copy } } else if (propType == 'f') { if(propNumElements == 1) elem = AVSValue(env->propGetFloat(avsmap, propName, 0, &error)); // since v11 no need for (float) cast else { std::vector avsarr(propNumElements); const double* arr = env->propGetFloatArray(avsmap, propName, &error); for (int i = 0; i < propNumElements; ++i) avsarr[i] = arr[i]; // v11: no need for (float) cast elem = AVSValue(avsarr.data(), propNumElements); // array deep copy } } else if (propType == 's') { // no string arrays const char* s = env->propGetData(avsmap, propName, 0, &error); if (!error) elem = AVSValue(env->SaveString(s)); } else if (propType == 'c') { if (propNumElements == 1) elem = AVSValue(env->propGetClip(avsmap, propName, 0, &error)); else { std::vector avsarr(propNumElements); for (int i = 0; i < propNumElements; ++i) avsarr[i] = AVSValue(env->propGetClip(avsmap, propName, i, &error)); elem = AVSValue(avsarr.data(), propNumElements); // array deep copy } } else { // 'v': ignore no such AVSValue in Avisynth } pair[1] = elem; result[index] = AVSValue(pair.data(), 2); // arrays in arrays, automatic deep copy } return AVSValue(result.data(), propNum); // array deep copy } // e.g. string length AVSValue GetPropertyDataSize::Create(AVSValue args, void* , IScriptEnvironment* env_) { InternalEnvironment* IEnv = GetAndRevealCamouflagedEnv(env_); IScriptEnvironment* env = static_cast(IEnv); AVSValue clip = args[0]; if (!clip.IsClip()) env->ThrowError("propGetDataSize: No clip supplied!"); PClip child = clip.AsClip(); VideoInfo vi = child->GetVideoInfo(); AVSValue cn = env->GetVarDef("current_frame"); const bool calledFromRunTime = cn.IsInt(); const char* propName = args[1].AsString(); const int index = args[2].AsInt(0); const int offset = args[3].AsInt(0); int n = calledFromRunTime ? cn.AsInt() : 0; n = min(max(n + offset, 0), vi.num_frames - 1); PVideoFrame src = child->GetFrame(n, env); const AVSMap* avsmap = env->getFramePropsRO(src); int error = 0; int size = env->propGetDataSize(avsmap, propName, index, &error); if (!error) return AVSValue(size); const char* error_msg = nullptr; // really, errors are bits if (error & AVSGetPropErrors::GETPROPERROR_UNSET) error_msg = "property is not set"; else if (error & AVSGetPropErrors::GETPROPERROR_TYPE) error_msg = "wrong type"; else if (error & AVSGetPropErrors::GETPROPERROR_INDEX) error_msg = "index error"; // arrays if (error) env->ThrowError("Error getting frame property data size \"%s\": %s ", propName, error_msg); return AVSValue(); } // array size of a given property, (by setProp append mode arrays can be constructed) AVSValue GetPropertyNumElements::Create(AVSValue args, void*, IScriptEnvironment* env_) { InternalEnvironment* IEnv = GetAndRevealCamouflagedEnv(env_); IScriptEnvironment* env = static_cast(IEnv); AVSValue clip = args[0]; if (!clip.IsClip()) env->ThrowError("propNumElements: No clip supplied!"); PClip child = clip.AsClip(); VideoInfo vi = child->GetVideoInfo(); AVSValue cn = env->GetVarDef("current_frame"); const bool calledFromRunTime = cn.IsInt(); const char* propName = args[1].AsString(); const int offset = args[2].AsInt(0); int n = calledFromRunTime ? cn.AsInt() : 0; n = min(max(n + offset, 0), vi.num_frames - 1); PVideoFrame src = child->GetFrame(n, env); const AVSMap* avsmap = env->getFramePropsRO(src); try { int size = env->propNumElements(avsmap, propName); return AVSValue(size); } catch (const AvisynthError& error) { env->ThrowError("propNumElements: %s", error.msg); } return AVSValue(); } // returns integer enums instead of char (string) AVSValue GetPropertyType::Create(AVSValue args, void*, IScriptEnvironment* env_) { InternalEnvironment* IEnv = GetAndRevealCamouflagedEnv(env_); IScriptEnvironment* env = static_cast(IEnv); AVSValue clip = args[0]; if (!clip.IsClip()) env->ThrowError("propGetType: No clip supplied!"); PClip child = clip.AsClip(); VideoInfo vi = child->GetVideoInfo(); AVSValue cn = env->GetVarDef("current_frame"); const bool calledFromRunTime = cn.IsInt(); const char* propName = args[1].AsString(); const int offset = args[2].AsInt(0); int n = calledFromRunTime ? cn.AsInt() : 0; n = min(max(n + offset, 0), vi.num_frames - 1); PVideoFrame src = child->GetFrame(n, env); const AVSMap* avsmap = env->getFramePropsRO(src); try { char prop_type = env->propGetType(avsmap, propName); // 'u'nset, 'i'nteger, 'f'loat, 's'string, 'c'lip, 'v'ideoframe, 'm'ethod }; switch (prop_type) { case 'u': return 0; case 'i': return 1; case 'f': return 2; case 's': return 3; case 'c': return 4; case 'v': return 5; //case 'm': return 6; default: return -1; } } catch (const AvisynthError& error) { env->ThrowError("propGetType: %s", error.msg); } return AVSValue(); } // Number of properties (keys) for a frame AVSValue GetPropertyNumKeys::Create(AVSValue args, void*, IScriptEnvironment* env_) { InternalEnvironment* IEnv = GetAndRevealCamouflagedEnv(env_); IScriptEnvironment* env = static_cast(IEnv); AVSValue clip = args[0]; if (!clip.IsClip()) env->ThrowError("propNumKeys: No clip supplied!"); PClip child = clip.AsClip(); VideoInfo vi = child->GetVideoInfo(); AVSValue cn = env->GetVarDef("current_frame"); const bool calledFromRunTime = cn.IsInt(); int n = calledFromRunTime ? cn.AsInt() : 0; int offset = args[1].AsInt(0); n = min(max(n + offset, 0), vi.num_frames - 1); PVideoFrame src = child->GetFrame(n, env); const AVSMap* avsmap = env->getFramePropsRO(src); try { int size = env->propNumKeys(avsmap); return AVSValue(size); } catch (const AvisynthError& error) { env->ThrowError("propNumKeys: %s", error.msg); } return AVSValue(); } // Get the name (key) of the Nth frame property AVSValue GetPropertyKeyByIndex::Create(AVSValue args, void*, IScriptEnvironment* env_) { InternalEnvironment* IEnv = GetAndRevealCamouflagedEnv(env_); IScriptEnvironment* env = static_cast(IEnv); AVSValue clip = args[0]; if (!clip.IsClip()) env->ThrowError("propNumKeys: No clip supplied!"); PClip child = clip.AsClip(); VideoInfo vi = child->GetVideoInfo(); AVSValue cn = env->GetVarDef("current_frame"); const bool calledFromRunTime = cn.IsInt(); const int index = args[1].AsInt(0); const int offset = args[2].AsInt(0); int n = calledFromRunTime ? cn.AsInt() : 0; n = min(max(n + offset, 0), vi.num_frames - 1); PVideoFrame src = child->GetFrame(n, env); const AVSMap* avsmap = env->getFramePropsRO(src); try { const char* prop_name = env->propGetKey(avsmap, index); return AVSValue(env->SaveString(prop_name)); } catch (const AvisynthError& error) { env->ThrowError("propGetKeyByIndex: %s", error.msg); } return AVSValue(); } ================================================ FILE: avs_core/filters/conditional/conditional_functions.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include class AveragePlane { public: static AVSValue Create(AVSValue args, void* user_data, IScriptEnvironment* env); static AVSValue AvgPlane(AVSValue clip, void* user_data, int plane, int offset, IScriptEnvironment* env); }; class ComparePlane { public: static AVSValue CmpPlane(AVSValue clip, AVSValue clip2, void* user_data, int plane, IScriptEnvironment* env); static AVSValue CmpPlaneSame(AVSValue clip, void* user_data, int offset, int plane, IScriptEnvironment* env); static AVSValue Create(AVSValue args, void* user_data, IScriptEnvironment* env); static AVSValue Create_prev(AVSValue args, void* user_data, IScriptEnvironment* env); static AVSValue Create_next(AVSValue args, void* user_data, IScriptEnvironment* env); }; class MinMaxPlane { public: static AVSValue MinMax(AVSValue clip, void* user_data, double threshold, int offset, int plane, int mode, bool setvar, IScriptEnvironment* env); static AVSValue Create_max(AVSValue args, void* user_data, IScriptEnvironment* env); static AVSValue Create_min(AVSValue args, void* user_data, IScriptEnvironment* env); static AVSValue Create_median(AVSValue args, void* user_data, IScriptEnvironment* env); static AVSValue Create_minmax(AVSValue args, void* user_data, IScriptEnvironment* env); static AVSValue Create_minmax_stats(AVSValue args, void* user_data, IScriptEnvironment* env); private: enum { MIN = 1, MAX = 2, MEDIAN = 3, MINMAX_DIFFERENCE = 4, STATS = 5 }; }; class GetProperty { public: static AVSValue Create(AVSValue args, void* user_data, IScriptEnvironment* env); }; class GetPropertyAsArray { public: static AVSValue Create(AVSValue args, void* user_data, IScriptEnvironment* env); }; class GetAllProperties { public: static AVSValue Create(AVSValue args, void* user_data, IScriptEnvironment* env); }; class GetPropertyDataSize { public: static AVSValue Create(AVSValue args, void* , IScriptEnvironment* env); }; class GetPropertyType { public: static AVSValue Create(AVSValue args, void*, IScriptEnvironment* env); }; class GetPropertyNumElements { public: static AVSValue Create(AVSValue args, void* , IScriptEnvironment* env); }; class GetPropertyNumKeys { public: static AVSValue Create(AVSValue args, void*, IScriptEnvironment* env); }; class GetPropertyKeyByIndex { public: static AVSValue Create(AVSValue args, void*, IScriptEnvironment* env); }; ================================================ FILE: avs_core/filters/conditional/conditional_reader.cpp ================================================ /* ConditionalReader (c) 2004 by Klaus Post This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. The author can be contacted at: sh0dan[at]stofanet.dk */ #include "conditional_reader.h" #include "../core/internal.h" #include "../core/parser/scriptparser.h" #include #ifdef AVS_WINDOWS #include #else #include #endif #include #include "../core/parser/scriptparser.h" #include "../core/AVSMap.h" #include #include #include #include #include #include "../convert/convert_helper.h" #include /***************************************************************************** * Helper code from XviD (http://www.xvid.org) * * Copyright (C) 2002 Foxer * 2002 Dirk Knop * 2002-2003 Edouard Gomez * 2003 Pete Ross *****************************************************************************/ /* Default buffer size for reading lines */ #define BUF_SZ 1024 /* This function returns an allocated string containing a complete line read * from the file starting at the current position */ static char * readline(FILE *f) { char *buffer = NULL; int buffer_size = 0; int pos = 0; for (;;) { int c; /* Read a character from the stream */ c = fgetc(f); /* Is that EOF or new line ? */ if(c == EOF || c == '\n') break; /* Do we have to update buffer ? */ if(pos >= buffer_size - 1) { buffer_size += BUF_SZ; char *tmpbuffer = (char*)realloc(buffer, buffer_size); if (tmpbuffer == NULL) { free(buffer); return(NULL); } buffer = tmpbuffer; } buffer[pos] = (char)c; pos++; } /* Read \n or EOF */ if (buffer == NULL) { /* EOF, so we reached the end of the file, return NULL */ if(feof(f)) return(NULL); /* Just an empty line with just a newline, allocate a 1 byte buffer to * store a zero length string */ buffer = (char*)malloc(1); if(buffer == NULL) return(NULL); } /* Zero terminated string */ if (pos && buffer[pos-1] == '\r') buffer[pos-1] = '\0'; else buffer[pos] = '\0'; return(buffer); } /* This function returns a pointer to the first non space char in the given * string or the end of the string */ static char * skipspaces(char *string) { if (string == NULL) return(NULL); while (*string != '\0') { /* Test against space chars */ if (!isspace(*string)) return(string); string++; } return(string); } /* This function returns a pointer to the first space char in the given * string or the end of the string */ static char * findspace(char *string) { if (string == NULL) return(NULL); while (*string != '\0') { /* Test against space chars */ if (isspace(*string)) return(string); string++; } return(string); } /* This function returns a boolean that tells if the string is only a * comment */ static int iscomment(char *string) { const char comments[] = { '#',';', '%', '\0' }; const char *cmtchar = comments; int iscomment = 0; if (string == NULL) return(1); string = skipspaces(string); while(*cmtchar != '\0') { if(*string == *cmtchar) { iscomment = 1; break; } cmtchar++; } return(iscomment); } // Reader ------------------------------------------------ ConditionalReader::ConditionalReader(PClip _child, const char* filename, const char _varname[], bool _show, const char *_condVarSuffix, bool _local, IScriptEnvironment* env) : GenericVideoFilter(_child), show(_show), mode(MODE_UNKNOWN), offset(0), local(_local), stringcache(0) { FILE * f; char *line = 0; int lines; variableName = _varname; // std::string if (_condVarSuffix[0]) variableName += _condVarSuffix; // append if parameter exists variableNameFixed = env->SaveString(variableName.c_str()); if ((f = fopen(filename, "rb")) == NULL) env->ThrowError("ConditionalReader: Could not open file '%s'.", filename); lines = 0; try { while ((line = readline(f)) != NULL) { char *ptr; int fields; lines++; /* We skip spaces */ ptr = skipspaces(line); /* Skip coment lines or empty lines */ if(iscomment(ptr) || *ptr == '\0') { free(line); line = 0; continue; } if (mode == MODE_UNKNOWN) { // We have not recieved a mode - We expect type. char* keyword = ptr; ptr = findspace(ptr); if (*ptr) { *ptr++ = '\0'; if (!lstrcmpi(keyword, "type")) { /* We skip spaces */ char* type = skipspaces(ptr); ptr = findspace(type); *ptr = '\0'; if (!lstrcmpi(type, "int")) { mode = MODE_INT; intVal = new int[vi.num_frames]; } else if (!lstrcmpi(type, "float")) { mode = MODE_FLOAT; floatVal = new float[vi.num_frames]; } else if (!lstrcmpi(type, "bool")) { mode = MODE_BOOL; boolVal = new bool[vi.num_frames]; } else if (!lstrcmpi(type, "string")) { mode = MODE_STRING; stringVal = new const char*[vi.num_frames]; } else { ThrowLine("ConditionalReader: Unknown 'Type' specified in line %d", lines, env); }// end if compare type SetRange(0, vi.num_frames-1, AVSValue()); }// end if compare keyword }// end if fields } else { // We have a defined mode and allocated the values. char* keyword = ptr; char* type = findspace(keyword); if (*type) *type++ = '\0'; if (!lstrcmpi(keyword, "default")) { AVSValue def = ConvertType(type, lines, env); SetRange(0, vi.num_frames-1, def); } else if (!lstrcmpi(keyword, "offset")) { fields = sscanf(type, "%d", &offset); if (fields != 1) ThrowLine("ConditionalReader: Could not read Offset in line %d", lines, env); } else if (keyword[0] == 'R' || keyword[0] == 'r') { // Range int start; int stop; type = skipspaces(type); fields = sscanf(type, "%d", &start); type = findspace(type); type = skipspaces(type); fields += sscanf(type, "%d", &stop); type = findspace(type); if (!*type || fields != 2) ThrowLine("ConditionalReader: Could not read Range in line %d", lines, env); if (start > stop) ThrowLine("ConditionalReader: The Range start frame is after the end frame in line %d", lines, env); AVSValue set = ConvertType(type+1, lines, env); SetRange(start, stop, set); } else if (keyword[0] == 'I' || keyword[0] == 'i') { // Interpolate if (mode == MODE_BOOL) ThrowLine("ConditionalReader: Cannot Interpolate booleans in line %d", lines, env); if (mode == MODE_STRING) ThrowLine("ConditionalReader: Cannot Interpolate strings in line %d", lines, env); type = skipspaces(type); int start; int stop; char start_value[64]; char stop_value[64]; fields = sscanf(type, "%d %d %63s %63s", &start, &stop, start_value, stop_value); if (fields != 4) ThrowLine("ConditionalReader: Could not read Interpolation range in line %d", lines, env); if (start > stop) ThrowLine("ConditionalReader: The Interpolation start frame is after the end frame in line %d", lines, env); start_value[63] = '\0'; AVSValue set_start = ConvertType(start_value, lines, env); stop_value[63] = '\0'; AVSValue set_stop = ConvertType(stop_value, lines, env); const int range = stop-start; const double diff = (set_stop.AsFloat() - set_start.AsFloat()) / range; for (int i = 0; i<=range; i++) { const double n = i * diff + set_start.AsFloat(); SetFrame(i+start, (mode == MODE_FLOAT) ? AVSValue(n) : AVSValue((int)(n+0.5))); } } else { int cframe; fields = sscanf(keyword, "%d", &cframe); if ((*type || mode == MODE_STRING) && fields == 1) { // allow empty string AVSValue set = ConvertType(type, lines, env); SetFrame(cframe, set); } else { ThrowLine("ConditionalReader: Do not understand line %d", lines, env); } } } // End we have defined type free(line); line = 0; }// end while still some file left to read. } catch (...) { free(line); fclose(f); CleanUp(); throw; } /* We are done with the file */ fclose(f); if (mode == MODE_UNKNOWN) env->ThrowError("ConditionalReader: Type was not defined!"); } // Converts from the char array given to the type specified. AVSValue ConditionalReader::ConvertType(const char* content, int line, IScriptEnvironment* env) { if (mode == MODE_UNKNOWN) ThrowLine("ConditionalReader: Type has not been defined. Line %d", line, env); int fields; switch (mode) { case MODE_INT: int ival; fields = sscanf(content, "%d", &ival); if (fields != 1) ThrowLine("ConditionalReader: Could not find an expected integer at line %d!", line, env); return AVSValue(ival); case MODE_FLOAT: float fval; fields = sscanf(content, "%e", &fval); if (fields != 1) ThrowLine("ConditionalReader: Could not find an expected float at line %d!", line, env); return AVSValue(fval); case MODE_BOOL: char bval[8]; bval[0] = '\0'; fields = sscanf(content, "%7s", bval); bval[7] = '\0'; if (!lstrcmpi(bval, "true")) { return AVSValue(true); } else if (!lstrcmpi(bval, "t")) { return AVSValue(true); } else if (!lstrcmpi(bval, "yes")) { return AVSValue(true); } else if (!lstrcmp(bval, "1")) { return AVSValue(true); } else if (!lstrcmpi(bval, "false")) { return AVSValue(false); } else if (!lstrcmpi(bval, "f")) { return AVSValue(false); } else if (!lstrcmpi(bval, "no")) { return AVSValue(false); } else if (!lstrcmp(bval, "0")) { return AVSValue(false); } ThrowLine("ConditionalReader: Boolean value was not true or false in line %d", line, env); case MODE_STRING: StringCache *str; // Look for an existing duplicate for (str = stringcache; str; str = str->next ) { if (!lstrcmp(str->string, content)) break; } // Could not find one, add it if (!str) { str = new StringCache; str->string = _strdup(content); str->next = stringcache; stringcache = str; } return AVSValue(str->string); } return AVSValue(); } // Sets range with both start and stopframe inclusive. void ConditionalReader::SetRange(int start_frame, int stop_frame, AVSValue v) { int i; start_frame = max(start_frame+offset, 0); stop_frame = min(stop_frame+offset, vi.num_frames-1); int p; float q; bool r; const char* s; switch (mode) { case MODE_INT: p = v.Defined() ? v.AsInt() : 0; for (i = start_frame; i <= stop_frame; i++) { intVal[i] = p; } break; case MODE_FLOAT: q = v.Defined() ? v.AsFloatf() : 0.0f; for (i = start_frame; i <= stop_frame; i++) { floatVal[i] = q; } break; case MODE_BOOL: r = v.Defined() ? v.AsBool() : false; for (i = start_frame; i <= stop_frame; i++) { boolVal[i] = r; } break; case MODE_STRING: s = v.AsString(""); for (i = start_frame; i <= stop_frame; i++) { stringVal[i] = s; } break; } } // Sets the value of one frame. void ConditionalReader::SetFrame(int framenumber, AVSValue v) { if ((framenumber+offset) < 0 || (framenumber+offset) > vi.num_frames-1 ) return; switch (mode) { case MODE_INT: intVal[framenumber+offset] = v.AsInt(); break; case MODE_FLOAT: floatVal[framenumber+offset] = v.AsFloatf(); break; case MODE_BOOL: boolVal[framenumber+offset] = v.AsBool(); break; case MODE_STRING: stringVal[framenumber+offset] = v.AsString(""); break; } } // Get the value of a frame. AVSValue ConditionalReader::GetFrameValue(int framenumber) { framenumber = clamp(framenumber, 0, vi.num_frames-1); switch (mode) { case MODE_INT: return AVSValue(intVal[framenumber]); case MODE_FLOAT: return AVSValue(floatVal[framenumber]); case MODE_BOOL: return AVSValue(boolVal[framenumber]); case MODE_STRING: return AVSValue(stringVal[framenumber]); } return AVSValue(0); } // Destructor ConditionalReader::~ConditionalReader(void) { CleanUp(); } void ConditionalReader::CleanUp(void) { switch (mode) { case MODE_INT: delete[] intVal; break; case MODE_FLOAT: delete[] floatVal; break; case MODE_BOOL: delete[] boolVal; break; case MODE_STRING: delete[] stringVal; //free the cached strings for (StringCache* str = stringcache; str; ) { StringCache* curr = str; free(str->string); str = str->next; delete curr; } stringcache = 0; break; } mode = MODE_UNKNOWN; } void ConditionalReader::ThrowLine(const char* err, int line, IScriptEnvironment* env) { env->ThrowError(err, line); } PVideoFrame __stdcall ConditionalReader::GetFrame(int n, IScriptEnvironment* env_) { AVSValue v = GetFrameValue(n); InternalEnvironment* IEnv = GetAndRevealCamouflagedEnv(env_); IScriptEnvironment* env = static_cast(IEnv); std::unique_ptr var_frame; AVSValue child_val = child; if (!local) { env->SetGlobalVar(variableNameFixed, v); } else { // Neo's default, correct but incompatible with previous Avisynth versions var_frame = std::unique_ptr(new GlobalVarFrame(IEnv)); // allocate new frame env->SetGlobalVar(variableNameFixed, v); } PVideoFrame src = child->GetFrame(n,env); if (show) { AVSValue v2 = env->Invoke("String", v); env->MakeWritable(&src); env->ApplyMessage(&src, vi, v2.AsString(""), vi.width/2, 0xa0a0a0, 0, 0); } return src; } int __stdcall ConditionalReader::SetCacheHints(int cachehints, int frame_range) { switch (cachehints) { case CACHE_GET_MTMODE: return MT_NICE_FILTER; case CACHE_GET_DEV_TYPE: return (child->GetVersion() >= 5) ? child->SetCacheHints(CACHE_GET_DEV_TYPE, 0) : 0; } return 0; // We do not pass cache requests upwards. } AVSValue __cdecl ConditionalReader::Create(AVSValue args, void*, IScriptEnvironment* env) { const bool runtime_local_default = false; // Avisynth compatibility: false, Neo: true. return new ConditionalReader(args[0].AsClip(), args[1].AsString(""), args[2].AsString("Conditional") , args[3].AsBool(false), args[4].AsString(""), args[5].AsBool(runtime_local_default), env); } // Write ------------------------------------------------ static const char EMPTY[] = ""; static const char AplusT[] = "a+t"; static const char WplusT[] = "w+t"; Write::Write(PClip _child, const char* _filename, AVSValue args, int _linecheck, bool _append, bool _flush, bool _local, IScriptEnvironment* env_) : GenericVideoFilter(_child), linecheck(_linecheck), flush(_flush), append(_append), local(_local), arglist(0) { InternalEnvironment* IEnv = GetAndRevealCamouflagedEnv(env_); IScriptEnvironment* env = static_cast(IEnv); #ifdef AVS_WINDOWS _fullpath(filename, _filename, _MAX_PATH); #else // Use realpath and handle possible failure to avoid unused-result warning. if (realpath(_filename, filename) == NULL) { // Fallback: copy original input path into filename safely. size_t len = strlen(_filename); if (len >= sizeof(filename)) len = sizeof(filename) - 1; memcpy(filename, _filename, len); filename[len] = '\0'; } #endif fout = fopen(filename, append ? AplusT : WplusT); //append or purge file if (!fout) env->ThrowError("Write: File '%s' cannot be opened.", filename); if (flush) fclose(fout); //will be reopened in FileOut arrsize = args.ArraySize(); arglist = new exp_res[arrsize]; for (int i = 0; i < arrsize; i++) { arglist[i].expression = args[i]; arglist[i].string = EMPTY; } if (linecheck != -1 && linecheck != -2) return; AVSValue prev_last; AVSValue prev_current_frame; std::unique_ptr var_frame; AVSValue child_val = child; if (!local) { prev_last = env->GetVarDef("last"); // Store previous last prev_current_frame = env->GetVarDef("current_frame"); // Store previous current_frame env->SetVar("last", child_val); // Set implicit last env->SetVar("current_frame", (AVSValue)linecheck); // special -1 or -2 } else { // Neo's default, correct but incompatible with previous Avisynth versions var_frame = std::unique_ptr(new GlobalVarFrame(IEnv)); // allocate new frame env->SetGlobalVar("last", child_val); // Set explicit last env->SetGlobalVar("current_frame", (AVSValue)linecheck); // special -1 or -2 } Write::DoEval(env); // at both write at start and write at end if (linecheck == -1) { //write at start Write::FileOut(env, AplusT); } if (!local) { env->SetVar("last", prev_last); // Restore implicit last env->SetVar("current_frame", prev_current_frame); // Restore current_frame } } PVideoFrame __stdcall Write::GetFrame(int n, IScriptEnvironment* env_) { //changed to call write AFTER the child->GetFrame InternalEnvironment* IEnv = GetAndRevealCamouflagedEnv(env_); IScriptEnvironment* env = static_cast(IEnv); PVideoFrame tmpframe = child->GetFrame(n, env); if (linecheck < 0) return tmpframe; //do nothing here when writing only start or end AVSValue prev_last; AVSValue prev_current_frame; std::unique_ptr var_frame; AVSValue child_val = child; if (!local) { prev_last = env->GetVarDef("last"); // Store previous last prev_current_frame = env->GetVarDef("current_frame"); // Store previous current_frame env->SetVar("last", (AVSValue)child_val); // Set implicit last env->SetVar("current_frame", (AVSValue)n); // Set frame to be tested by the conditional filters. } else { // Neo's default, correct but incompatible with previous Avisynth versions var_frame = std::unique_ptr(new GlobalVarFrame(IEnv)); // allocate new frame env->SetGlobalVar("last", child_val); // Set implicit last (to avoid recursive stack calls?) env->SetGlobalVar("current_frame", (AVSValue)n); // Set frame to be tested by the conditional filters. } if (Write::DoEval(env)) { Write::FileOut(env, AplusT); } if (!local) { env->SetVar("last", prev_last); // Restore implicit last env->SetVar("current_frame", prev_current_frame); // Restore current_frame } return tmpframe; }; Write::~Write(void) { if (linecheck == -2) { //write at end Write::FileOut(0, append ? AplusT : WplusT); // Allow for retruncating at actual end } if (!flush) fclose(fout); delete[] arglist; }; void Write::FileOut(IScriptEnvironment* env, const char* mode) { int i; if (flush) { fout = fopen(filename, mode); if (!fout) { if (env) env->ThrowError("Write: File '%s' cannot be opened.", filename); return; } } for (i= ( (linecheck==1) ? 1 : 0) ; iInvoke3(child, expr.AsFunction(), AVSValue(nullptr, 0)); } else { expr = expr.AsString(EMPTY); result = env->Invoke("Eval", expr); } if (!result.AsBool(true)) { keep_this_line = false; break; } } catch (const AvisynthError&) { // env->ThrowError("Write: Can't eval linecheck expression!"); // results in KEEPING the line } } else { try { if (expr.IsFunction()) { result = env->Invoke3(child, expr.AsFunction(), AVSValue(nullptr, 0)); } else { expr = expr.AsString(EMPTY); result = env->Invoke("Eval", expr); } result = env->Invoke("string",result); //convert all results to a string arglist[i].string = result.AsString(EMPTY); } catch (const AvisynthError &error) { arglist[i].string = env->SaveString(error.msg); } } } return keep_this_line; } int __stdcall Write::SetCacheHints(int cachehints, int frame_range) { switch (cachehints) { case CACHE_GET_MTMODE: return MT_SERIALIZED; } return 0; // We do not pass cache requests upwards. } AVSValue __cdecl Write::Create(AVSValue args, void*, IScriptEnvironment* env) { bool runtime_local_default = false; // Param 2: string/function or array of strings/functions if (args[2].IsFunction() || (args[2].IsArray() && args[2].ArraySize() > 0 && args[2][0].IsFunction())) runtime_local_default = true; // Avisynth compatibility: false, Neo: true. functions are legacy Neo return new Write(args[0].AsClip(), args[1].AsString(EMPTY), args[2], 0, args[3].AsBool(true),args[4].AsBool(true), args[5].AsBool(runtime_local_default), env); } AVSValue __cdecl Write::Create_If(AVSValue args, void*, IScriptEnvironment* env) { bool runtime_local_default = false; // Param 2: string/function or array of strings/functions if (args[2].IsFunction() || (args[2].IsArray() && args[2].ArraySize() > 0 && args[2][0].IsFunction())) runtime_local_default = true; // Avisynth compatibility: false, Neo: true. functions are legacy Neo return new Write(args[0].AsClip(), args[1].AsString(EMPTY), args[2], 1, args[3].AsBool(true),args[4].AsBool(true), args[5].AsBool(runtime_local_default), env); } AVSValue __cdecl Write::Create_Start(AVSValue args, void*, IScriptEnvironment* env) { bool runtime_local_default = false; // Param 2: string/function or array of strings/functions /*if (args[2].IsFunction() || (args[2].IsArray() && args[2].ArraySize() > 0 && args[2][0].IsFunction())) runtime_local_default = true; */ // Avisynth compatibility: false, Neo: also false as of 2020.03.28 return new Write(args[0].AsClip(), args[1].AsString(EMPTY), args[2], -1, args[3].AsBool(false), true, args[4].AsBool(runtime_local_default), env); } AVSValue __cdecl Write::Create_End(AVSValue args, void*, IScriptEnvironment* env) { bool runtime_local_default = false; // Param 2: string/function or array of strings/functions /* if (args[2].IsFunction() || (args[2].IsArray() && args[2].ArraySize() > 0 && args[2][0].IsFunction())) runtime_local_default = true; */ // Avisynth compatibility: false, Neo: also false as of 2020.03.28 return new Write(args[0].AsClip(), args[1].AsString(EMPTY), args[2], -2, args[3].AsBool(true), args[4].AsBool(runtime_local_default), true, env); } UseVar::UseVar(PClip _child, AVSValue vars, IScriptEnvironment* env) : GenericVideoFilter(_child) { vars_.resize(vars.ArraySize()); for (int i = 0; i < vars.ArraySize(); ++i) { auto name = vars_[i].name = vars[i].AsString(); if (!env->GetVarTry(name, &vars_[i].val)) { env->ThrowError("UseVar: No variable named %s", name); } } } UseVar::~UseVar() { } PVideoFrame __stdcall UseVar::GetFrame(int n, IScriptEnvironment* env_) { InternalEnvironment* IEnv = GetAndRevealCamouflagedEnv(env_); IScriptEnvironment* env = static_cast(IEnv); GlobalVarFrame var_frame(IEnv); // allocate new frame // set variables for (int i = 0; i < (int)vars_.size(); ++i) { env->SetGlobalVar(vars_[i].name, vars_[i].val); } return child->GetFrame(n, env); } int __stdcall UseVar::SetCacheHints(int cachehints, int frame_range) { switch (cachehints) { case CACHE_GET_MTMODE: return MT_NICE_FILTER; case CACHE_GET_DEV_TYPE: return (child->GetVersion() >= 5) ? child->SetCacheHints(CACHE_GET_DEV_TYPE, 0) : 0; } return 0; // We do not pass cache requests upwards. } AVSValue __cdecl UseVar::Create(AVSValue args, void* user_data, IScriptEnvironment* env) { return new UseVar(args[0].AsClip(), args[1], env); } #define W_DIVISOR 5 // Width divisor for onscreen messages // Avisynth+ frame property support //************************************************** // propSet, propSetInt, propSetFloat, propSetString SetProperty::SetProperty(PClip _child, const char* name, const AVSValue& value, const int kind, const int mode, IScriptEnvironment* env) : GenericVideoFilter(_child) , name(name) , value(value) , kind(kind) , append_mode(mode) { } SetProperty::~SetProperty() { } PVideoFrame __stdcall SetProperty::GetFrame(int n, IScriptEnvironment* env) { // parameter type to set, comes different for each script function version int propType = kind; // 0: auto by result type // 1: integer from function // 2: float from function // 3: char (null terminated data) from function // 4: array from function (all elements have the same type) // 5: clip from function // 10: integer from direct // 11: float from direct // 12: string from direct // 13: array from direct (all elements have the same type) // 14: clip from direct AVSValue result; const char* error_msg = nullptr; if (value.IsFunction()) { PFunction func = value.AsFunction(); try { const AVSValue empty_args_array = AVSValue(nullptr, 0); // invoke's parameter is const AVSValue&, don't do it inline. result = env->Invoke3(child, func, empty_args_array); } catch (IScriptEnvironment::NotFound) { error_msg = env->Sprintf("AddProperties: Invalid function parameter type '%s'(%s)\n" "Function should have no argument", func->GetDefinition()->param_types, func->ToString(env)); } catch (const AvisynthError& error) { error_msg = env->Sprintf("%s\nAddProperties: Error in %s", error.msg, func->ToString(env)); } } else { // direct input result = value; propType = 0; // autodetect type } PVideoFrame frame = child->GetFrame(n, env); if (error_msg) { env->MakeWritable(&frame); env->ApplyMessage(&frame, vi, error_msg, vi.width / W_DIVISOR, 0xa0a0a0, 0, 0); return frame; } /* usage: propSet("hello",1) ScriptClip("""propSetInt("frameluma",func(AverageLuma))""") ScriptClip("""propSet("frameluma2",AverageLuma)""") ScriptClip("""SubTitle(string(propGetInt("frameluma")))""") or ps = func(propSetterFunc) # make function object from function ScriptClip(ps) # pass function object to scriptclip ScriptClip(function[](clip c) { SubTitle(string(propGetInt("frameprop_demo")), y=20) }) ScriptClip(function[](clip c) { SubTitle(string(propGetInt("frameprop_demo2")), y=40) }) function propSetterFunc(Clip x) { x propSetInt("frameprop_demo", func(AverageLuma)) propSetInt("frameprop_demo2", function[]() { current_frame }) } */ try { // check auto if (propType == 0) { // 'u'nset, 'i'nteger, 'f'loat, 's'string, 'c'lip, 'v'ideoframe, 'm'ethod }; if (result.IsInt()) propType = 1; else if (result.IsFloat()) propType = 2; else if (result.IsString()) propType = 3; else if (result.IsArray()) propType = 4; else if (result.IsClip()) propType = 5; else env->ThrowError("Invalid return type (Was a %s)", GetAVSTypeName(result)); } // env->MakeWritable(&frame); // do we need this? Yes! better: MakePropertyWritable since V9 interface // Check setting a constant value to the same as it was before (int, float, string case) // We'd avoid even MakePropertyWritable and return a fully unaltered frame do { if (append_mode != AVSPropAppendMode::PROPAPPENDMODE_REPLACE) break; // only optimize replace if (propType != 1 && propType != 2 && propType != 3) break; // only optimize traditional types const AVSMap* avsmap_r = env->getFramePropsRO(frame); auto size = env->propNumElements(avsmap_r, name); // 1 if single item, >1 size of array, 0 if not exists if(size != 1) break; // no such property or property is an array char x = env->propGetType(avsmap_r, name); if (propType == 1 && x != 'i') break; // int does not match if (propType == 2 && x != 'f') break; // float does not match if (propType == 3 && x != 's') break; // string does not match if (propType == 1) { if (!result.IsInt()) break; // IsInt checks for Long as well auto val = env->propGetInt(avsmap_r, name, 0, nullptr); if (val == result.AsLong()) return frame; // value match -> return unaltered // v11: AsLong instead of AsInt } else if (propType == 2) { if (!result.IsFloat()) break; auto val = env->propGetFloat(avsmap_r, name, 0, nullptr); if (val == result.AsFloat()) return frame; // value match -> return unaltered // memo: AsFloat returns double } else if (propType == 3) { if (!result.IsString()) break; const char* val_to_set = result.AsString(); if (val_to_set == nullptr) break; auto length_to_set = strlen(val_to_set); auto length = env->propGetDataSize(avsmap_r, name, 0, nullptr); if (length != length_to_set) break; // different size const char* val_storage = env->propGetData(avsmap_r, name, 0, nullptr); if(std::memcmp(val_to_set, val_storage, length) == 0) return frame; // value match -> return unaltered } break; } while (0); env->MakePropertyWritable(&frame); AVSMap* avsmap = env->getFramePropsRW(frame); int res = 0; // special case: zero sized array -> entry deleted if (result.IsArray() && result.ArraySize() == 0) res = env->propDeleteKey(avsmap, name); // 0 is success else if (propType == 1 && result.IsInt()) // IsInt checks for Long as well res = env->propSetInt(avsmap, name, result.AsLong(), append_mode); // v11: AsLong instead of AsInt else if (propType == 2 && result.IsFloat()) res = env->propSetFloat(avsmap, name, result.AsFloat(), append_mode); else if (propType == 3 && result.IsString()) { const char* s = result.AsString(); // no need for SaveString, it has its own storage // assume string: AVSPropDataTypeHint::DATATYPEHINT_UTF8 res = env->propSetDataH(avsmap, name, s, -1, AVSPropDataTypeHint::PROPDATATYPEHINT_UTF8, append_mode); // -1: auto string length // test res = env->propSetDataH(avsmap, name, s, -1, AVSPropDataTypeHint::DATATYPEHINT_BINARY, append_mode); } else if (propType == 4 && result[0].IsInt()) { int size = result.ArraySize(); std::vector int64array(size); // avs can do int only, temporary array needed for (int i = 0; i < size; i++) { if (!result[i].IsInt()) // IsInt checks for Long as well env->ThrowError("Wrong data type in property '%s': all array elements should be the same (integer) type", name); int64array[i] = result[i].AsLong(); // all elements should be int } res = env->propSetIntArray(avsmap, name, int64array.data(), size); } else if (propType == 4 && result[0].IsFloat()) { int size = result.ArraySize(); std::vector d_array(size); // avs can do float only, temporary array needed for (int i = 0; i < size; i++) { if (!result[i].IsFloat()) env->ThrowError("Wrong data type in property '%s': all array elements should be the same (float) type", name); d_array[i] = result[i].AsFloat(); // all elements should be float/double or int/long } res = env->propSetFloatArray(avsmap, name, d_array.data(), size); } else if (propType == 4 && result[0].IsString()) { const int size = result.ArraySize(); // no such api like propSetDataArray env->propDeleteKey(avsmap, name); for (int i = 0; i < size; i++) { if (!result[i].IsString()) env->ThrowError("Wrong data type in property '%s': all array elements should be the same (string) type", name); // assume string: AVSPropDataTypeHint::DATATYPEHINT_UTF8 res = env->propSetDataH(avsmap, name, result[i].AsString(), -1, AVSPropDataTypeHint::PROPDATATYPEHINT_UTF8, AVSPropAppendMode::PROPAPPENDMODE_APPEND); // all elements should be string if (res) break; } } else if (propType == 4 && result[0].IsClip()) { int size = result.ArraySize(); // no such api like propSetClipArray env->propDeleteKey(avsmap, name); for (int i = 0; i < size; i++) { if (!result[i].IsClip()) env->ThrowError("Wrong data type in property '%s': all array elements should be the same (Clip) type", name); PClip clip = result[i].AsClip(); res = env->propSetClip(avsmap, name, clip, AVSPropAppendMode::PROPAPPENDMODE_APPEND); // all elements should be Clip if (res) break; } } else if (propType == 5 && result.IsClip()) { PClip clp = result.AsClip(); res = env->propSetClip(avsmap, name, clp, append_mode); } else { env->ThrowError("Wrong data type, property '%s' type is not %s", name, GetAVSTypeName(result)); } if (res) env->ThrowError("error setting property '%s', error = %d", name, res); // fixme: res reasons } catch (const AvisynthError& error) { error_msg = env->Sprintf("propAdd: %s", error.msg); } if (error_msg) { env->MakeWritable(&frame); env->ApplyMessage(&frame, vi, error_msg, vi.width / W_DIVISOR, 0xa0a0a0, 0, 0); } return frame; } int __stdcall SetProperty::SetCacheHints(int cachehints, int frame_range) { AVS_UNUSED(frame_range); switch (cachehints) { case CACHE_GET_MTMODE: return MT_NICE_FILTER; } return 0; // We do not pass cache requests upwards. } AVSValue __cdecl SetProperty::Create(AVSValue args, void* user_data, IScriptEnvironment* env) { const int kind = (int)(intptr_t)user_data; const int defaultMode = AVSPropAppendMode::PROPAPPENDMODE_REPLACE; int mode = AVSPropAppendMode::PROPAPPENDMODE_REPLACE; if(kind != 4) // at propSetArray there is no mode parameter mode = args[3].AsInt(defaultMode); /* paReplace = 0, paAppend = 1, paTouch = 2 */ return new SetProperty(args[0].AsClip(), args[1].AsString(), args[2], kind, mode, env); } //************************************************** // helper for property name list static bool PropNamesToArray(const char* filtername, AVSValue& _propNames, std::vector& propNames, IScriptEnvironment* env) { if (!_propNames.Defined()) return false; const int size = _propNames.ArraySize(); propNames.resize(size); for (int i = 0; i < size; i++) { const char* name = _propNames[i].AsString(); if (name == nullptr || !*name) env->ThrowError("%s error: list contains empty name.", filtername); // Recognize // - wildcards: "Myprops_*" or "ab*cd" // - regex with ^ $ delimiters std::string nameStr(name); // Check if it's already a regex if (nameStr.front() == '^' && nameStr.back() == '$') { try { std::regex re(nameStr); } catch (const std::regex_error&) { env->ThrowError("%s error: invalid regex string.", filtername); } } else { // Convert wildcard to regex if (nameStr.find('*') != std::string::npos) { nameStr = std::regex_replace(nameStr, std::regex("\\*"), ".*"); // Add regex delimiters nameStr = "^" + nameStr + "$"; } try { std::regex re(nameStr); } catch (const std::regex_error&) { env->ThrowError("%s error: invalid regex string while converting * wildcard.", filtername); } } propNames[i] = nameStr; } return true; } //************************************************** // propDelete DeleteProperty::DeleteProperty(PClip _child, AVSValue _propNames, IScriptEnvironment* env) : GenericVideoFilter(_child) { propNames_defined = PropNamesToArray("propDelete", _propNames, propNames, env); } DeleteProperty::~DeleteProperty() { } PVideoFrame __stdcall DeleteProperty::GetFrame(int n, IScriptEnvironment* env) { PVideoFrame frame = child->GetFrame(n, env); // Erase only if needed const AVSMap* avsmap_test = env->getFramePropsRO(frame); if (0 == env->propNumKeys(avsmap_test)) return frame; /* usage: propDelete("frameluma") propDelete(["_Matrix","prop2"]) */ env->MakePropertyWritable(&frame); AVSMap* avsmap = env->getFramePropsRW(frame); /* // ignore when property does not exist if (!res) { const char *error_msg = env->Sprintf("propDelete: error deleting property '%s'", name); env->ApplyMessage(&frame, vi, error_msg, vi.width / W_DIVISOR, 0xa0a0a0, 0, 0); } */ // delete selected names // positive list for (auto& s : propNames) { const char* key = s.c_str(); if (s.front() == '^' && s.back() == '$') { // positive regex list const int numKeys = env->propNumKeys(avsmap); int index = 0; for (int i = 0; i < numKeys; i++) { const char* key = env->propGetKey(avsmap, index); if (std::regex_match(key, std::regex(s))) env->propDeleteKey(avsmap, key); // 0 is success, ignored, index does not change else index++; } } else { env->propDeleteKey(avsmap, key); // 0 is success, ignored } } return frame; } int __stdcall DeleteProperty::SetCacheHints(int cachehints, int frame_range) { AVS_UNUSED(frame_range); switch (cachehints) { case CACHE_GET_MTMODE: return MT_NICE_FILTER; } return 0; // We do not pass cache requests upwards. } AVSValue __cdecl DeleteProperty::Create(AVSValue args, void*, IScriptEnvironment* env) { return new DeleteProperty(args[0].AsClip(), args[1], env); } //************************************************** // propDelete ClearProperties::ClearProperties(PClip _child, IScriptEnvironment* env) : GenericVideoFilter(_child) { } ClearProperties::~ClearProperties() { } PVideoFrame __stdcall ClearProperties::GetFrame(int n, IScriptEnvironment* env) { PVideoFrame frame = child->GetFrame(n, env); /* usage: ScriptClip("""propClear()""") */ // Erase only if needed const AVSMap* avsmap_test = env->getFramePropsRO(frame); if (0 != env->propNumKeys(avsmap_test)) { env->MakePropertyWritable(&frame); AVSMap* avsmap = env->getFramePropsRW(frame); env->clearMap(avsmap); } return frame; } int __stdcall ClearProperties::SetCacheHints(int cachehints, int frame_range) { AVS_UNUSED(frame_range); switch (cachehints) { case CACHE_GET_MTMODE: return MT_NICE_FILTER; } return 0; // We do not pass cache requests upwards. } AVSValue __cdecl ClearProperties::Create(AVSValue args, void*, IScriptEnvironment* env) { return new ClearProperties(args[0].AsClip(), env); } //************************************************** // PropPassthrough — compatibility helper for old filters that predate frame properties PropPassthrough::PropPassthrough(PClip _child, PClip _prop_src, IScriptEnvironment* env) : GenericVideoFilter(_child), prop_src(_prop_src) { } PVideoFrame __stdcall PropPassthrough::GetFrame(int n, IScriptEnvironment* env) { PVideoFrame out = child->GetFrame(n, env); // Self-healing: if the filter was updated to use NewVideoFrameP it will already // carry properties. In that case trust it and skip the copy. const AVSMap* out_map = env->getFramePropsRO(out); if (env->propNumKeys(out_map) > 0) return out; PVideoFrame src = prop_src->GetFrame(n, env); env->MakePropertyWritable(&out); env->copyFrameProps(src, out); return out; } int __stdcall PropPassthrough::SetCacheHints(int cachehints, int frame_range) { AVS_UNUSED(frame_range); switch (cachehints) { case CACHE_GET_MTMODE: return MT_NICE_FILTER; } return 0; } //************************************************** // propCopy CopyProperties::CopyProperties(PClip _child, PClip _child2, bool _merge, AVSValue _propNames, bool _exclude, IScriptEnvironment* env) : GenericVideoFilter(_child), child2(_child2), merge(_merge), exclude(_exclude) { propNames_defined = PropNamesToArray("propCopy", _propNames, propNames, env); } CopyProperties::~CopyProperties() { } AVSValue __cdecl CopyProperties::Create(AVSValue args, void*, IScriptEnvironment* env) { const bool merge = args[2].AsBool(false); const bool exclude = args[4].AsBool(false); return new CopyProperties(args[0].AsClip(), args[1].AsClip(), merge, args[3], exclude, env); } int __stdcall CopyProperties::SetCacheHints(int cachehints, int frame_range) { AVS_UNUSED(frame_range); switch (cachehints) { case CACHE_GET_MTMODE: return MT_NICE_FILTER; } return 0; // We do not pass cache requests upwards. } static void CopyOneFrameProp(const char* key, AVSMap* mapv, const AVSMap* avsmap_from, IScriptEnvironment* env) { const int numElements = env->propNumElements(avsmap_from, key); char propType = env->propGetType(avsmap_from, key); int error; // int and float (int64 and double) supports array get set if (propType == AVSPropTypes::PROPTYPE_INT) { auto srcval = env->propGetIntArray(avsmap_from, key, &error); env->propSetIntArray(mapv, key, srcval, numElements); } else if (propType == AVSPropTypes::PROPTYPE_FLOAT) { auto srcval = env->propGetFloatArray(avsmap_from, key, &error); env->propSetFloatArray(mapv, key, srcval, numElements); } else { // assumes the property is cleared beforehand // frame, clip and data (string) if (propType == AVSPropTypes::PROPTYPE_FRAME) { for (int index = 0; index < numElements; index++) { auto src = env->propGetFrame(avsmap_from, key, index, &error); env->propSetFrame(mapv, key, src, AVSPropAppendMode::PROPAPPENDMODE_APPEND); } } else if (propType == AVSPropTypes::PROPTYPE_CLIP) { for (int index = 0; index < numElements; index++) { auto src = env->propGetClip(avsmap_from, key, index, &error); env->propSetClip(mapv, key, src, AVSPropAppendMode::PROPAPPENDMODE_APPEND); } } else if (propType == AVSPropTypes::PROPTYPE_DATA) { for (int index = 0; index < numElements; index++) { // string, byte array in general auto src = env->propGetData(avsmap_from, key, index, &error); auto size = env->propGetDataSize(avsmap_from, key, index, &error); auto typehint = env->propGetDataTypeHint(avsmap_from, key, index, &error); // v11 env->propSetDataH(mapv, key, src, size, typehint, AVSPropAppendMode::PROPAPPENDMODE_APPEND); } } } } PVideoFrame __stdcall CopyProperties::GetFrame(int n, IScriptEnvironment* env) { PVideoFrame frame = child->GetFrame(n, env); PVideoFrame frame2 = child2->GetFrame(n, env); const AVSMap* avsmap_from = env->getFramePropsRO(frame2); const int propNum = env->propNumKeys(avsmap_from); if (0 == propNum) { // source has no properties at all if (!merge) { // exact copy: make target empty as well. // Erase only if needed const AVSMap* avsmap_to_test = env->getFramePropsRO(frame); if (0 != env->propNumKeys(avsmap_to_test)) { env->MakePropertyWritable(&frame); AVSMap* avsmap_to = env->getFramePropsRW(frame); env->clearMap(avsmap_to); } } // source has no properties return frame; } env->MakePropertyWritable(&frame); if (!merge) { // exact copy if (!propNames_defined) env->copyFrameProps(frame2, frame); else { // copy only selected / not excluded names AVSMap* mapv = env->getFramePropsRW(frame); env->clearMap(mapv); // clear all if (!exclude) { // positive list for (auto& s : propNames) { const char* key = s.c_str(); if (s.front() == '^' && s.back() == '$') { // positive regex list const int numKeys = env->propNumKeys(avsmap_from); for (int i = 0; i < numKeys; i++) { const char* key = env->propGetKey(avsmap_from, i); if (std::regex_match(key, std::regex(s))) { // regex match -> copy CopyOneFrameProp(key, mapv, avsmap_from, env); } } } else { CopyOneFrameProp(key, mapv, avsmap_from, env); } } } else { // negative list const int numKeys = env->propNumKeys(avsmap_from); for (int i = 0; i < numKeys; i++) { const char* key = env->propGetKey(avsmap_from, i); bool matchFound = false; for (auto& s : propNames) { if (s.front() == '^' && s.back() == '$') { // negative regex list if (std::regex_match(key, std::regex(s))) { matchFound = true; break; } } else if (s == key) { matchFound = true; break; } } if (!matchFound) { // not in negative list -> copy CopyOneFrameProp(key, mapv, avsmap_from, env); } } } } return frame; } // merge AVSMap* mapv = env->getFramePropsRW(frame); // add from source, replace if needed const int numKeys = env->propNumKeys(avsmap_from); for (int i = 0; i < numKeys; i++) { const char* key = env->propGetKey(avsmap_from, i); // merge if no list specified or name is in the list bool need_copy = true; if (propNames_defined) { need_copy = false; for (const auto& s : propNames) { if (s.front() == '^' && s.back() == '$') { // regex match if (std::regex_match(key, std::regex(s))) { need_copy = true; break; } } else if (s == key) { // plain string match need_copy = true; break; } } if (exclude) { need_copy = !need_copy; } } if(need_copy) { env->propDeleteKey(mapv, key); // delete if existed CopyOneFrameProp(key, mapv, avsmap_from, env); } } return frame; } //************************************************** // propShow ShowProperties::ShowProperties(PClip _child, int size, bool showtype, const char *_font, int _text_color, int _halo_color, bool _bold, int _x, int _y, int _align, AVSValue _propNames, IScriptEnvironment* env) : GenericVideoFilter(_child), size(size), showtype(showtype), fontname(_font), textcolor(_text_color), halocolor(_halo_color), bold(_bold), x(_x), y(_y), align(_align) { propNames_defined = PropNamesToArray("propShow", _propNames, propNames, env); } ShowProperties::~ShowProperties() { } PVideoFrame __stdcall ShowProperties::GetFrame(int n, IScriptEnvironment* env) { PVideoFrame frame = child->GetFrame(n, env); const AVSMap* avsmap = env->getFramePropsRO(frame); const int propNum = env->propNumKeys(avsmap); if (0 == propNum) return frame; std::stringstream ss; if (!propNames_defined) // no header displayed if filter is given ss << "Number of keys = " << std::to_string(propNum) << std::endl; for (int index = 0; index < propNum; index++) { const char* propName = env->propGetKey(avsmap, index); bool display = true; if (propNames_defined) { display = false; for (const auto& s : propNames) { if (s.front() == '^' && s.back() == '$') { // regex match if (std::regex_match(propName, std::regex(s))) { display = true; break; } } else if (s == propName) { // plain string match display = true; break; } } } if (display) { std::string propName_s = propName; const char propType = env->propGetType(avsmap, propName); ss << propName; if (showtype) ss << " (" << propType << ")"; ss << " = "; const int propNumElements = env->propNumElements(avsmap, propName); int error; if (propType == 'u') { // unSet: undefined value ss << ""; } else if (propType == 'i') { if (propNumElements > 1) ss << "["; const int64_t* arr = env->propGetIntArray(avsmap, propName, &error); for (int i = 0; i < propNumElements; ++i) { ss << std::to_string(arr[i]); if (i < propNumElements - 1) ss << ", "; } if (propNumElements > 1) ss << "]"; if (propName_s == "_ColorRange") { ss << " = "; switch (arr[0]) { case ColorRange_Compat_e::AVS_COLORRANGE_LIMITED: ss << "limited"; break; case ColorRange_Compat_e::AVS_COLORRANGE_FULL: ss << "full"; break; } } else if (propName_s == "_Matrix") { ss << " = "; switch (arr[0]) { case Matrix_e::AVS_MATRIX_RGB: ss << "rgb"; break; case Matrix_e::AVS_MATRIX_BT709: ss << "709"; break; case Matrix_e::AVS_MATRIX_UNSPECIFIED: ss << "unspec"; break; case Matrix_e::AVS_MATRIX_ST170_M: ss << "170m"; break; case Matrix_e::AVS_MATRIX_ST240_M: ss << "240m"; break; case Matrix_e::AVS_MATRIX_BT470_BG: ss << "470bg (601)"; break; case Matrix_e::AVS_MATRIX_BT470_M: ss << "470m (fcc)"; break; case Matrix_e::AVS_MATRIX_YCGCO: ss << "YCgCo"; break; case Matrix_e::AVS_MATRIX_BT2020_NCL: ss << "2020ncl (2020)"; break; case Matrix_e::AVS_MATRIX_BT2020_CL: ss << "2020cl"; break; case Matrix_e::AVS_MATRIX_CHROMATICITY_DERIVED_CL: ss << "chromacl"; break; case Matrix_e::AVS_MATRIX_CHROMATICITY_DERIVED_NCL: ss << "chromancl"; break; case Matrix_e::AVS_MATRIX_ICTCP: ss << "ictcp"; break; case Matrix_e::AVS_MATRIX_AVERAGE: ss << "AVERAGE-Legacy Avisynth"; break; } } else if (propName_s == "_ChromaLocation") { ss << " = "; switch (arr[0]) { case ChromaLocation_e::AVS_CHROMA_LEFT: ss << "left (mpeg2)"; break; case ChromaLocation_e::AVS_CHROMA_CENTER: ss << "center (mpeg1, jpeg)"; break; case ChromaLocation_e::AVS_CHROMA_TOP_LEFT: ss << "top_left"; break; case ChromaLocation_e::AVS_CHROMA_TOP: ss << "top"; break; case ChromaLocation_e::AVS_CHROMA_BOTTOM_LEFT: ss << "bottom_left"; break; case ChromaLocation_e::AVS_CHROMA_BOTTOM: ss << "bottom"; break; case ChromaLocation_e::AVS_CHROMA_DV: ss << "dv-Legacy Avisynth"; break; } } } else if (propType == 'f') { if (propNumElements > 1) ss << "["; const double* arr = env->propGetFloatArray(avsmap, propName, &error); for (int i = 0; i < propNumElements; ++i) { ss << std::to_string(arr[i]); if (i < propNumElements - 1) ss << ", "; } if (propNumElements > 1) ss << "]"; } else if (propType == 's') { if (propNumElements > 1) ss << "["; for (int i = 0; i < propNumElements; ++i) { const char* s = env->propGetData(avsmap, propName, i, &error); const int type = env->propGetDataTypeHint(avsmap, propName, i, &error); if (type == AVSPropDataTypeHint::PROPDATATYPEHINT_BINARY) { auto len = env->propGetDataSize(avsmap, propName, i, &error); ss << "Data length=" << len << ": ["; // print up to 16 comma separated bytes in HEX, ... at the end if there are more. int count = std::min(len, 16); for (int i = 0; i < count; ++i) { if (i > 0) ss << ","; ss << std::uppercase << std::hex << std::setw(2) << std::setfill('0') << (static_cast(s[i]) & 0xFF); } if (len > 16) ss << "..."; ss << "]"; } else { // AVSPropDataTypeHint::DATATYPEHINT_UTF8 and AVSPropDataTypeHint::DATATYPEHINT_UNKNOWN // suppose string ss << "\"" << s << "\""; } if (i < propNumElements - 1) ss << ", "; } if (propNumElements > 1) ss << "]"; } else { ss << ""; } ss << std::endl; } } std::string t = ss.str(); const char* text = t.c_str(); AVSValue args[10] = { child, text, size, fontname, textcolor, halocolor, bold, x, y, align }; const char* argnames[10] = { 0, 0, "size", "font", "text_color", "halo_color", "bold", "x", "y", "align" }; PClip child2 = env->Invoke("Text", AVSValue(args, 10), argnames).AsClip(); frame = child2->GetFrame(n, env); return frame; } int __stdcall ShowProperties::SetCacheHints(int cachehints, int frame_range) { AVS_UNUSED(frame_range); switch (cachehints) { case CACHE_GET_MTMODE: return MT_NICE_FILTER; } return 0; // We do not pass cache requests upwards. } AVSValue __cdecl ShowProperties::Create(AVSValue args, void*, IScriptEnvironment* env) { // 0 1 2 3 4 5 6 7 8 9 10 // c[size]i[showtype]b[font]s[text_color]i[halo_color]i[bold]b[x]f[y]f[align]i[props]s+ PClip clip = args[0].AsClip(); const int size = args[1].AsInt(16); const bool showtype = args[2].AsBool(false); const char* font = args[3].AsString("Terminus"); const int text_color = args[4].AsInt(0xFFFF00); const int halo_color = args[5].AsInt(0); const bool bold = args[6].AsBool(false); const int align = args[9].AsInt(7); // default top left const int info_default_x = 0; // subtitle: 8, Info: 4 const int PIXEL_MUL_FACTOR = 1; // like "Text" // similar to SubTitle/FilterInfo.Create int defx, defy; bool x_center = false; bool y_center = false; switch (align) { case 1: case 4: case 7: defx = 8; break; case 2: case 5: case 8: defx = 0; // n/a if not set later x_center = true; break; case 3: case 6: case 9: defx = clip->GetVideoInfo().width - info_default_x; break; // subtitle: 8, Info: 4 default: defx = info_default_x; break; } switch (align) { case 1: case 2: case 3: defy = clip->GetVideoInfo().height - 2; break; // bottom alignment 2 pixel above case 4: case 5: case 6: defy = 0; // n/a if not set later y_center = true; break; case 7: case 8: case 9: defy = 0; break; default: defy = (size + 4) / 8; break; } const bool isXdefined = args[7].Defined(); const bool isYdefined = args[8].Defined(); int x = int(args[7].AsDblDef(defx) * PIXEL_MUL_FACTOR + 0.5); int y = int(args[8].AsDblDef(defy) * PIXEL_MUL_FACTOR + 0.5); if (!isXdefined && x_center) x = (clip->GetVideoInfo().width >> 1) * PIXEL_MUL_FACTOR; if (!isYdefined && y_center) y = (clip->GetVideoInfo().height >> 1) * PIXEL_MUL_FACTOR; if ((align < 1) || (align > 9)) env->ThrowError("propShow: Align values are 1 - 9 mapped to your numeric pad"); return new ShowProperties(clip, size, showtype, font, text_color, halo_color, bold, x, y, align, args[10], env); } ================================================ FILE: avs_core/filters/conditional/conditional_reader.h ================================================ /* ConditionalReader (c) 2004 by Klaus Post This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. The author can be contacted at: sh0dan[at]stofanet.dk */ #include #include #include #include #include #include #ifdef AVS_POSIX #include #endif enum { MODE_UNKNOWN = -1, MODE_INT = 1, MODE_FLOAT = 2, MODE_BOOL = 3, MODE_STRING = 4 }; struct StringCache { char* string; StringCache *next; }; class ConditionalReader : public GenericVideoFilter { private: const bool show; std::string variableName; const char* variableNameFixed; int mode; int offset; const bool local; StringCache* stringcache; // fixme: to vector union { int* intVal; bool* boolVal; float* floatVal; const char* *stringVal; }; AVSValue ConvertType(const char* content, int line, IScriptEnvironment* env); void SetRange(int start_frame, int stop_frame, AVSValue v); void SetFrame(int framenumber, AVSValue v); void ThrowLine(const char* err, int line, IScriptEnvironment* env); AVSValue GetFrameValue(int framenumber); void CleanUp(void); public: ConditionalReader(PClip _child, const char* filename, const char _varname[], bool _show, const char *_condVarSuffix, bool _local, IScriptEnvironment* env); ~ConditionalReader(void); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); int __stdcall SetCacheHints(int cachehints, int frame_range); static AVSValue __cdecl Create(AVSValue args, void* user_data, IScriptEnvironment* env); }; /* ------------------------------------------------------------------------------ ** Write function to evaluate expressions per frame and write the results to file ** Ernst Peché, 2004 */ class Write : public GenericVideoFilter { private: FILE * fout; int linecheck; // 0=write each line, 1=write only if first expression == true, -1 = write at start, -2 = write at end bool flush; bool append; bool local; #ifdef AVS_WINDOWS char filename[_MAX_PATH]; #else char filename[PATH_MAX]; #endif int arrsize; struct exp_res { AVSValue expression; const char* string; }; exp_res* arglist; bool DoEval(IScriptEnvironment* env); void FileOut(IScriptEnvironment* env, const char* mode); public: Write(PClip _child, const char* _filename, AVSValue args, int _linecheck, bool _flush, bool _append, bool _local, IScriptEnvironment* env); ~Write(void); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); int __stdcall SetCacheHints(int cachehints, int frame_range); static AVSValue __cdecl Create(AVSValue args, void* user_data, IScriptEnvironment* env); static AVSValue __cdecl Create_If(AVSValue args, void* user_data, IScriptEnvironment* env); static AVSValue __cdecl Create_Start(AVSValue args, void* user_data, IScriptEnvironment* env); static AVSValue __cdecl Create_End(AVSValue args, void* user_data, IScriptEnvironment* env); }; class UseVar : public GenericVideoFilter { private: struct Var { const char* name; AVSValue val; }; std::vector vars_; public: UseVar(PClip _child, AVSValue vars, IScriptEnvironment* env); ~UseVar(); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); int __stdcall SetCacheHints(int cachehints, int frame_range); static AVSValue __cdecl Create(AVSValue args, void* user_data, IScriptEnvironment* env); }; // avs+ (vs) style frame properties class SetProperty : public GenericVideoFilter { private: const char* name; AVSValue value; const int kind; const int append_mode; // AVSPropAppendMode public: SetProperty(PClip _child, const char* name, const AVSValue& value, const int kind, const int mode, IScriptEnvironment* env); ~SetProperty(); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); int __stdcall SetCacheHints(int cachehints, int frame_range); static AVSValue __cdecl Create(AVSValue args, void* user_data, IScriptEnvironment* env); }; class DeleteProperty : public GenericVideoFilter { private: bool propNames_defined; std::vector propNames; public: DeleteProperty(PClip _child, AVSValue _propNames, IScriptEnvironment* env); ~DeleteProperty(); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); int __stdcall SetCacheHints(int cachehints, int frame_range); static AVSValue __cdecl Create(AVSValue args, void* , IScriptEnvironment* env); }; class ClearProperties : public GenericVideoFilter { private: public: ClearProperties(PClip _child, IScriptEnvironment* env); ~ClearProperties(); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); int __stdcall SetCacheHints(int cachehints, int frame_range); static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env); }; // Compatibility helper for old filters that predate frame property support. // Copies all frame properties from the filter's first input clip to its output, // but only when the output has no properties of its own (self-healing: becomes a // no-op if the plugin is later updated to pass properties e.g. by using NewVideoFrameP). class PropPassthrough : public GenericVideoFilter { private: PClip prop_src; // first input clip — source of properties public: PropPassthrough(PClip _child, PClip _prop_src, IScriptEnvironment* env); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); int __stdcall SetCacheHints(int cachehints, int frame_range); }; class CopyProperties : public GenericVideoFilter { private: PClip child2; bool merge; bool propNames_defined; std::vector propNames; bool exclude; public: CopyProperties(PClip _child, PClip _child2, bool _merge, AVSValue _propNames, bool _exclude, IScriptEnvironment* env); ~CopyProperties(); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); int __stdcall SetCacheHints(int cachehints, int frame_range); static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env); }; class ShowProperties : public GenericVideoFilter { private: int size; bool showtype; const char* const fontname; // Terminus or info_h const int textcolor, halocolor; const bool bold; int x, y; int align; bool propNames_defined; std::vector propNames; public: ShowProperties(PClip _child, int size, bool showtype, const char* _font, int _text_color, int _halo_color, bool _bold, int _x, int _y, int _align, AVSValue _propNames, IScriptEnvironment* env); ~ShowProperties(); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); int __stdcall SetCacheHints(int cachehints, int frame_range); static AVSValue __cdecl Create(AVSValue args, void* user_data, IScriptEnvironment* env); }; ================================================ FILE: avs_core/filters/conditional/intel/conditional_functions_sse.cpp ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include #include // Intrinsics base header + really required extension headers #if defined(_MSC_VER) #include // MSVC #else #include // GCC/MinGW/Clang/LLVM #endif #include // sum: sad with zero double get_sum_of_pixels_sse2(const uint8_t* srcp, size_t height, size_t width, size_t pitch) { size_t mod16_width = width / 16 * 16; int64_t result = 0; __m128i sum = _mm_setzero_si128(); __m128i zero = _mm_setzero_si128(); for (size_t y = 0; y < height; ++y) { for (size_t x = 0; x < mod16_width; x+=16) { __m128i src = _mm_load_si128(reinterpret_cast(srcp + x)); __m128i sad = _mm_sad_epu8(src, zero); sum = _mm_add_epi32(sum, sad); } for (size_t x = mod16_width; x < width; ++x) { result += srcp[x]; } srcp += pitch; } __m128i upper = _mm_castps_si128(_mm_movehl_ps(_mm_setzero_ps(), _mm_castsi128_ps(sum))); sum = _mm_add_epi32(sum, upper); result += _mm_cvtsi128_si32(sum); return (double)result; } #ifdef X86_32 double get_sum_of_pixels_isse(const uint8_t* srcp, size_t height, size_t width, size_t pitch) { size_t mod8_width = width / 8 * 8; int64_t result = 0; __m64 sum = _mm_setzero_si64(); __m64 zero = _mm_setzero_si64(); for (size_t y = 0; y < height; ++y) { for (size_t x = 0; x < mod8_width; x+=8) { __m64 src = *reinterpret_cast(srcp + x); __m64 sad = _mm_sad_pu8(src, zero); sum = _mm_add_pi32(sum, sad); } for (size_t x = mod8_width; x < width; ++x) { result += srcp[x]; } srcp += pitch; } result += _mm_cvtsi64_si32(sum); _mm_empty(); return (double)result; } size_t get_sad_isse(const uint8_t* src_ptr, const uint8_t* other_ptr, size_t height, size_t width, size_t src_pitch, size_t other_pitch) { size_t mod8_width = width / 8 * 8; size_t result = 0; __m64 sum = _mm_setzero_si64(); for (size_t y = 0; y < height; ++y) { for (size_t x = 0; x < mod8_width; x+=8) { __m64 src = *reinterpret_cast(src_ptr + x); __m64 other = *reinterpret_cast(other_ptr + x); __m64 sad = _mm_sad_pu8(src, other); sum = _mm_add_pi32(sum, sad); } for (size_t x = mod8_width; x < width; ++x) { result += std::abs(src_ptr[x] - other_ptr[x]); } src_ptr += src_pitch; other_ptr += other_pitch; } result += _mm_cvtsi64_si32(sum); _mm_empty(); return result; } size_t get_sad_rgb_isse(const uint8_t* src_ptr, const uint8_t* other_ptr, size_t height, size_t width, size_t src_pitch, size_t other_pitch) { size_t mod8_width = width / 8 * 8; size_t result = 0; __m64 rgb_mask = _mm_set1_pi32(0x00FFFFFF); __m64 sum = _mm_setzero_si64(); for (size_t y = 0; y < height; ++y) { for (size_t x = 0; x < mod8_width; x+=8) { __m64 src = *reinterpret_cast(src_ptr + x); __m64 other = *reinterpret_cast(other_ptr + x); src = _mm_and_si64(src, rgb_mask); other = _mm_and_si64(other, rgb_mask); __m64 sad = _mm_sad_pu8(src, other); sum = _mm_add_pi32(sum, sad); } for (size_t x = mod8_width; x < width; ++x) { result += std::abs(src_ptr[x] - other_ptr[x]); } src_ptr += src_pitch; other_ptr += other_pitch; } result += _mm_cvtsi64_si32(sum); _mm_empty(); return result; } #endif ================================================ FILE: avs_core/filters/conditional/intel/conditional_functions_sse.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include double get_sum_of_pixels_sse2(const uint8_t* srcp, size_t height, size_t width, size_t pitch); #ifdef X86_32 double get_sum_of_pixels_isse(const uint8_t* srcp, size_t height, size_t width, size_t pitch); size_t get_sad_isse(const uint8_t* src_ptr, const uint8_t* other_ptr, size_t height, size_t width, size_t src_pitch, size_t other_pitch); size_t get_sad_rgb_isse(const uint8_t* src_ptr, const uint8_t* other_ptr, size_t height, size_t width, size_t src_pitch, size_t other_pitch); #endif ================================================ FILE: avs_core/filters/convolution.cpp ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include #include #include // Avisynth filter: general convolution // by Richard Berg (avisynth-dev@richardberg.net) // adapted from General Convolution 3D for VDub by Gunnar Thalin (guth@home.se) // avs+: all color spaces, 8-32 bits, 7x7, 9x9, luma/chroma/alpha option #include "convolution.h" #include "../core/internal.h" #include #include #include #include /******************************************************************** ***** Declare index of new filters for Avisynth's filter engine ***** ********************************************************************/ extern const AVSFunction Convolution_filters[] = { // Please when adding parameters try not to break the legacy order - IanB July 2004 { "GeneralConvolution", BUILTIN_FUNC_PREFIX, "c[bias]f[matrix]s[divisor]f[auto]b[luma]b[chroma]b[alpha]b", GeneralConvolution::Create }, /** * GeneralConvolution(PClip clip, int divisor=1, int bias=0, string matrix) * clip = input video * bias = additive bias to adjust the total output intensity * matrix = the kernel (3x3 or 5x5). any kind of whitespace is ok, see example * divisor = divides the output of the convolution (calculated before adding bias) * auto = automaticly scale the result based on the sum of the matrix elements * luma = apply on luma (if applicable) avs+ * chroma = apply on chroma (if applicable) avs+ * alpha = apply on alpha (if applicable e.g. RGB32 converted to planar RGBA) avs+ * * clip.GeneralConvolution(matrix = "1 2 3 * 4 5 6 * 7 8 9") **/ { 0 } }; template AVS_FORCEINLINE int static_clip(int value) { if (value < mi) { return mi; } if (value > ma) { return ma; } return value; } /***************************************** ****** General Convolution 2D filter ***** *****************************************/ // safe_int_t is int or int64_t. Int is faster but for larger bitdepth int32 overflows template static void do_conv_integer(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel) { pixel_t *dstp = reinterpret_cast(dstp8); const pixel_t *srcp = reinterpret_cast(srcp8); dst_pitch /= sizeof(pixel_t); src_pitch /= sizeof(pixel_t); constexpr int limit = (matrix_size - 1) / 2; // +-1, +-2, +-3 const int max_pixel_value = (1 << bits_per_pixel) - 1; std::vector src_lineptrs; src_lineptrs.resize(limit + height + limit); // prefill line pointers for (int y = -limit; y < height + limit; y++) { if (y < 0) src_lineptrs[y + limit] = srcp + src_pitch * 0; // duplicate top else if (y < height) src_lineptrs[y + limit] = srcp + src_pitch * y; else src_lineptrs[y + limit] = srcp + src_pitch * (height - 1); // duplicate bottom } std::vector src_current_lineptrs(matrix_size); // +/-limit => 2*limit + 1 constexpr safe_int_t rounder = 1 << (20 - 1); for (int y = 0; y < height; ++y) { // prefill current vertical line pointers for (int yy = -limit; yy <= limit; yy++) { src_current_lineptrs[yy + limit] = src_lineptrs[limit + (y + yy)]; } int x = 0; // left area: check valid x for (; x < limit; x++) { safe_int_t sum = 0; // int or int64_t!!! const int *current_matrix = matrix + limit; // center of the matrix line for (int yy = 0; yy < matrix_size; yy++) { // 0..limit * 2 + 1 const pixel_t *current_line = src_current_lineptrs[yy]; for (int xx = -limit; xx <= limit; xx++) { int current_x = x + xx; if (current_x < 0) current_x = 0; else if (current_x >= width) current_x = width - 1; const int current_pixel = current_line[current_x]; const int current_weight = current_matrix[xx]; sum += current_pixel * current_weight; } current_matrix += matrix_size; // next matrix line } int result = (int)((sum * iCountDiv + rounder) >> 20) + iBias; dstp[x] = clamp(result, 0, max_pixel_value); } // middle area: no x check: fast! for (; x < width - limit; x++) { safe_int_t sum = 0; const int *current_matrix = matrix + limit; // center of the matrix line for (int yy = 0; yy < matrix_size; yy++) { // 0..limit * 2 + 1 const pixel_t *current_line = src_current_lineptrs[yy]; // compilers are smart nowadays but let's help them if constexpr (matrix_size == 3) { sum += current_line[x - 1] * current_matrix[-1] + current_line[x + 0] * current_matrix[0] + current_line[x + 1] * current_matrix[1]; } else if constexpr (matrix_size == 5) { sum += current_line[x - 2] * current_matrix[-2] + current_line[x - 1] * current_matrix[-1] + current_line[x + 0] * current_matrix[0] + current_line[x + 1] * current_matrix[1] + current_line[x + 2] * current_matrix[2]; } else { for (int xx = -limit; xx <= limit; xx++) { int current_x = x + xx; // no checking! /*if (current_x < 0) current_x = 0; else if (current_x >= width) current_x = width - 1;*/ const int current_pixel = current_line[current_x]; const int current_weight = current_matrix[xx]; sum += current_pixel * current_weight; } } current_matrix += matrix_size; // next matrix line } int result = (int)((sum * iCountDiv + rounder) >> 20) + iBias; dstp[x] = clamp(result, 0, max_pixel_value); } // right area: check valid x for (; x < width; x++) { safe_int_t sum = 0; const int *current_matrix = matrix + limit; // center of the matrix line for (int yy = 0; yy < matrix_size; yy++) { // 0..limit * 2 + 1 const pixel_t *current_line = src_current_lineptrs[yy]; for (int xx = -limit; xx <= limit; xx++) { int current_x = x + xx; if (current_x < 0) current_x = 0; else if (current_x >= width) current_x = width - 1; const int current_pixel = current_line[current_x]; const int current_weight = current_matrix[xx]; sum += current_pixel * current_weight; } current_matrix += matrix_size; // next matrix line } int result = (int)((sum * iCountDiv + rounder) >> 20) + iBias; dstp[x] = clamp(result, 0, max_pixel_value); } dstp += dst_pitch; srcp += src_pitch; } } // instantiate for 8 bit 3,5,7 and 9 template void do_conv_integer(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel); template void do_conv_integer(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel); template void do_conv_integer(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel); template void do_conv_integer(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel); template void do_conv_integer(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel); template void do_conv_integer(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel); template void do_conv_integer(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel); template void do_conv_integer(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel); template void do_conv_integer(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel); template void do_conv_integer(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel); template void do_conv_integer(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel); template void do_conv_integer(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel); template void do_conv_integer(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel); template void do_conv_integer(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel); template void do_conv_integer(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel); template void do_conv_integer(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel); template static void do_conv_float(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const float *matrix, float fCountDiv, float fBias) { float *dstp = reinterpret_cast(dstp8); const float *srcp = reinterpret_cast(srcp8); dst_pitch /= sizeof(float); src_pitch /= sizeof(float); constexpr int limit = (matrix_size - 1) / 2; // +-1, +-2, +-3 std::vector src_lineptrs; src_lineptrs.resize(limit + height + limit); // prefill line pointers for (int y = -limit; y < height + limit; y++) { if (y < 0) src_lineptrs[y + limit] = srcp + src_pitch * 0; else if (y < height) src_lineptrs[y + limit] = srcp + src_pitch * y; else src_lineptrs[y + limit] = srcp + src_pitch * (height - 1); } std::vector src_current_lineptrs(matrix_size); // +/-limit => 2*limit + 1 for (int y = 0; y < height; ++y) { // prefill current vertical line pointers for (int yy = -limit; yy <= limit; yy++) { src_current_lineptrs[yy + limit] = src_lineptrs[limit + (y + yy)]; } int x = 0; // left area: check valid x for (; x < limit; x++) { float sum = 0.0f; const float *current_matrix = matrix + limit; // center of the matrix line for (int yy = 0; yy < matrix_size; yy++) { // 0..limit * 2 + 1 const float *current_line = src_current_lineptrs[yy]; for (int xx = -limit; xx <= limit; xx++) { int current_x = x + xx; if (current_x < 0) current_x = 0; else if (current_x >= width) current_x = width - 1; const float current_pixel = current_line[current_x]; const float current_weight = current_matrix[xx]; sum += current_pixel * current_weight; } current_matrix += matrix_size; // next matrix line } float result = sum * fCountDiv + fBias; dstp[x] = result; // no clipping for float } // middle area: no x check: fast! for (; x < width - limit; x++) { float sum = 0.0f; const float *current_matrix = matrix + limit; // center of the matrix line for (int yy = 0; yy < matrix_size; yy++) { // 0..limit * 2 + 1 const float *current_line = src_current_lineptrs[yy]; // compilers are smart nowadays but let's help them if constexpr (matrix_size == 3) { sum += current_line[x - 1] * current_matrix[-1] + current_line[x + 0] * current_matrix[0] + current_line[x + 1] * current_matrix[1]; } else if constexpr (matrix_size == 5) { sum += current_line[x - 2] * current_matrix[-2] + current_line[x - 1] * current_matrix[-1] + current_line[x + 0] * current_matrix[0] + current_line[x + 1] * current_matrix[1] + current_line[x + 2] * current_matrix[2]; } else { // surprise: even MSVC unrolls this loop for 7 and 9 for (int xx = -limit; xx <= limit; xx++) { int current_x = x + xx; // no checking! /*if (current_x < 0) current_x = 0; else if (current_x >= width) current_x = width - 1;*/ const float current_pixel = current_line[current_x]; const float current_weight = current_matrix[xx]; sum += current_pixel * current_weight; } } current_matrix += matrix_size; // next matrix line } float result = sum * fCountDiv + fBias; dstp[x] = result; // no clipping for float } // right area: check valid x for (; x < width; x++) { float sum = 0.0f; const float *current_matrix = matrix + limit; // center of the matrix line for (int yy = 0; yy < matrix_size; yy++) { // 0..limit * 2 + 1 const float *current_line = src_current_lineptrs[yy]; for (int xx = -limit; xx <= limit; xx++) { int current_x = x + xx; if (current_x < 0) current_x = 0; else if (current_x >= width) current_x = width - 1; const float current_pixel = current_line[current_x]; const float current_weight = current_matrix[xx]; sum += current_pixel * current_weight; } current_matrix += matrix_size; // next matrix line } float result = sum * fCountDiv + fBias; dstp[x] = result; // no clipping for float } dstp += dst_pitch; srcp += src_pitch; } } template void do_conv_float<3>(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const float *matrix, float fCountDiv, float fBias); template void do_conv_float<5>(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const float *matrix, float fCountDiv, float fBias); template void do_conv_float<7>(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const float *matrix, float fCountDiv, float fBias); template void do_conv_float<9>(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const float *matrix, float fCountDiv, float fBias); /***** Setup stuff ****/ GeneralConvolution::GeneralConvolution(PClip _child, double _divisor, float _nBias, const char * _matrix, bool _autoscale, bool _luma, bool _chroma, bool _alpha, IScriptEnvironment* _env) : GenericVideoFilter(_child), divisor(_divisor), nBias((int)_nBias), fBias(_nBias), autoscale(_autoscale), luma(_luma), chroma(_chroma), alpha(_alpha) { if (vi.Is420() || vi.Is422() || vi.IsYV411()) { if (luma && chroma) _env->ThrowError("GeneralConvolution: both luma and chroma cannot be set for subsampled video formats"); } if (!vi.IsRGB() && !vi.IsYUV() && !vi.IsYUVA()) _env->ThrowError("GeneralConvolution requires RGB (planar or packed), greyscale or YUV(A) input"); if (divisor == 0.0) _env->ThrowError("GeneralConvolution: divisor cannot be zero"); setMatrix(_matrix, vi.BitsPerComponent() < 32, _env); // float: todo if (vi.BitsPerComponent() <= 16) { // precompute divisor int iCountT; if (autoscale) { iCountT = iNormalizeSum; } else { iCountT = 0; } // Truncate instead of round - keep in the spirit of the original code // 3.6.3: we do introduce rounding before scaling back from +20 bit range // 0x100000: 20 bit precision integer arithmetic // todo: check overflow for matrices larger than 5x5 iCountDiv = (int)(0x100000 / (iCountT == 0 ? divisor : iCountT * divisor)); if (iCountDiv == 0) _env->ThrowError("GeneralConvolution: normalizing factor is zero, check for too large elements or divisor value"); // safety check int64needed = false; // check possible overflow: // Worst case: maximum pixel values, matrix multiplications will overflow either on positive or negative direction // When max_pixel_value * sum(max(weight_pos, -weight_neg)) * iCountDiv > 1 << 31 = > int64_t needed(safe_int_t is int64_t) const int max_pixel_value = (1 << vi.BitsPerComponent()) - 1; const int maxWeightSum = max(iWeightSumPositives, -iWeightSumNegatives); if ((int64_t)max_pixel_value * maxWeightSum * std::abs(iCountDiv) >= std::numeric_limits::max()) int64needed = true; switch (vi.BitsPerComponent()) { case 8: if (nSize == 3 * 3) { if (int64needed) conversionFnPtr = do_conv_integer; else conversionFnPtr = do_conv_integer; } else if (nSize == 5 * 5) { if (int64needed) conversionFnPtr = do_conv_integer; else conversionFnPtr = do_conv_integer; } else if (nSize == 7 * 7) { if (int64needed) conversionFnPtr = do_conv_integer; else conversionFnPtr = do_conv_integer; } else if (nSize == 9 * 9) { if (int64needed) conversionFnPtr = do_conv_integer; else conversionFnPtr = do_conv_integer; } break; case 10: case 12: case 14: case 16: if (nSize == 3 * 3) { if (int64needed) conversionFnPtr = do_conv_integer; else conversionFnPtr = do_conv_integer; } else if (nSize == 5 * 5) { if (int64needed) conversionFnPtr = do_conv_integer; else conversionFnPtr = do_conv_integer; } else if (nSize == 7 * 7) { if (int64needed) conversionFnPtr = do_conv_integer; else conversionFnPtr = do_conv_integer; } else if (nSize == 9 * 9) { if (int64needed) conversionFnPtr = do_conv_integer; else conversionFnPtr = do_conv_integer; } break; } } else { // 32 bit float clip // precompute divisor float fCountT; if (autoscale) { fCountT = fNormalizeSum; } else { fCountT = 0.0f; } fCountDiv = (float)(1.0f / (fCountT == 0 ? divisor : fCountT * divisor)); if (nSize == 3 * 3) FconversionFnPtr = do_conv_float<3>; else if (nSize == 5 * 5) FconversionFnPtr = do_conv_float<5>; else if (nSize == 7 * 7) FconversionFnPtr = do_conv_float<7>; else if (nSize == 9 * 9) FconversionFnPtr = do_conv_float<9>; } } AVSValue __cdecl GeneralConvolution::Create(AVSValue args, void*, IScriptEnvironment* env) { const VideoInfo& vi_orig = args[0].AsClip()->GetVideoInfo(); // convert old RGB format to planar RGB AVSValue new_args[1] = { args[0].AsClip() }; PClip clip; if (vi_orig.IsRGB24() || vi_orig.IsRGB48()) { clip = env->Invoke("ConvertToPlanarRGB", AVSValue(new_args, 1)).AsClip(); } else if (vi_orig.IsRGB32() || vi_orig.IsRGB64()) { clip = env->Invoke("ConvertToPlanarRGBA", AVSValue(new_args, 1)).AsClip(); } else if (vi_orig.IsYUY2()) { clip = env->Invoke("ConvertToYV16", AVSValue(new_args, 1)).AsClip(); } else { clip = args[0].AsClip(); } GeneralConvolution* Result = new GeneralConvolution(clip, args[3].AsFloat(1.0f), args[1].AsFloatf(0.0f), args[2].AsString("0 0 0 0 1 0 0 0 0"), args[4].AsBool(true), args[5].AsBool(true), args[6].AsBool(true), args[7].AsBool(true), // luma, chroma, alpha, when n/a then ignored env); AVSValue new_args2[1] = { Result }; if (vi_orig.IsRGB24()) { return env->Invoke("ConvertToRGB24", AVSValue(new_args2, 1)).AsClip(); } else if (vi_orig.IsRGB48()) { return env->Invoke("ConvertToRGB48", AVSValue(new_args2, 1)).AsClip(); } else if (vi_orig.IsRGB32()) { return env->Invoke("ConvertToRGB32", AVSValue(new_args2, 1)).AsClip(); } else if (vi_orig.IsRGB64()) { return env->Invoke("ConvertToRGB64", AVSValue(new_args2, 1)).AsClip(); } else if (vi_orig.IsYUY2()) { return env->Invoke("ConvertToYUY2", AVSValue(new_args2, 1)).AsClip(); } return Result; } void GeneralConvolution::setMatrix(const char * _matrix, bool _isInteger, IScriptEnvironment* env) { char delimiter[] = "([ \t\n\r]+)"; std::regex regex(delimiter); std::string str(_matrix); std::vector out( std::sregex_token_iterator(str.begin(), str.end(), regex, -1), std::sregex_token_iterator() ); fNormalizeSum = 0.0f; iNormalizeSum = 0; iWeightSumPositives = 0; // for int32 overflow decision iWeightSumNegatives = 0; const int MAX_DIMENSION = 9; // 9 is the max matrix size which is templated nSize = 0; int dim = 3; int maxsize = dim * dim; if (_isInteger) iMatrix.resize(maxsize); else fMatrix.resize(maxsize); for (auto &s : out) { if (s.length() == 0) continue; // first string can be empty is matrix string is starting with separators if (nSize == maxsize) { if (dim == MAX_DIMENSION) { env->ThrowError("GeneralConvolution: matrix too big, maximum %dx%d elements allowed", MAX_DIMENSION, MAX_DIMENSION); } dim += 2; maxsize = dim * dim; if (_isInteger) iMatrix.resize(maxsize); else fMatrix.resize(maxsize); } if (_isInteger) { const double val = atof(s.c_str()); const int ival = (int)std::lround(val); iNormalizeSum += ival; iMatrix[nSize++] = ival; if (ival >= 0) iWeightSumPositives += ival; else iWeightSumNegatives += ival; } else { const float val = (float)atof(s.c_str()); fNormalizeSum += val; fMatrix[nSize++] = val; } } if (nSize < 9) env->ThrowError("GeneralConvolution: matrix too small, need at least 3x3 elements"); else if (nSize != maxsize) env->ThrowError("GeneralConvolution: matrix incomplete, possible size %dx%d but element count %d", dim, dim, nSize); } PVideoFrame __stdcall GeneralConvolution::GetFrame(int n, IScriptEnvironment* env) { int h = vi.height; int w = vi.width; PVideoFrame src = child->GetFrame(n, env); PVideoFrame dst = env->NewVideoFrameP(vi, &src); const int *matrix = iMatrix.data(); const float *matrixf = fMatrix.data(); int planes_y[4] = { PLANAR_Y, PLANAR_U, PLANAR_V, PLANAR_A }; int planes_r[4] = { PLANAR_G, PLANAR_B, PLANAR_R, PLANAR_A }; int *planes = (vi.IsYUV() || vi.IsYUVA()) ? planes_y : planes_r; for (int p = 0; p < vi.NumComponents(); ++p) { const int plane = planes[p]; if ((plane == PLANAR_Y && !luma) || ((plane == PLANAR_U || plane == PLANAR_V) && !chroma) || (plane == PLANAR_A && !alpha)) { env->BitBlt(dst->GetWritePtr(plane), dst->GetPitch(plane), src->GetReadPtr(plane), src->GetPitch(plane), src->GetRowSize(plane), src->GetHeight(plane)); continue; } int width = w; int height = h; if (plane == PLANAR_U || plane == PLANAR_V) { width >>= vi.GetPlaneWidthSubsampling(plane); height >>= vi.GetPlaneHeightSubsampling(plane); } if(vi.BitsPerComponent() <= 16) conversionFnPtr(dst->GetWritePtr(plane), dst->GetPitch(plane), src->GetReadPtr(plane), src->GetPitch(plane), width, height, matrix, iCountDiv, nBias, vi.BitsPerComponent()); else FconversionFnPtr(dst->GetWritePtr(plane), dst->GetPitch(plane), src->GetReadPtr(plane), src->GetPitch(plane), width, height, matrixf, fCountDiv, fBias); } return dst; // really, not other case left... packed RGB was converted to planar RGB, YUY2 to YV16 } ================================================ FILE: avs_core/filters/convolution.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. // Avisynth filter: general convolution 3d // by Richard Berg (avisynth-dev@richardberg.net) // adapted from General Convolution 3D for VDub by Gunnar Thalin (guth@home.se) #ifndef __GeneralConvolution_H__ #define __GeneralConvolution_H__ #include #include /***************************************** ****** General Convolution 2D filter ***** *****************************************/ class GeneralConvolution : public GenericVideoFilter /** This class exposes a video filter that applies general convolutions -- up to a 5x5 * kernel -- to a clip. Smaller (3x3) kernels have their own code path. SIMD support forthcoming. **/ { using do_conv_int_t = void(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel); using do_conv_float_t = void(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const float *matrix, float fCountDiv, float fBias); public: GeneralConvolution(PClip _child, double _divisor, float _nBias, const char * _matrix, bool _autoscale, bool _luma, bool _chroma, bool _alpha, IScriptEnvironment* _env); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) override; static AVSValue __cdecl Create(AVSValue args, void* user_data, IScriptEnvironment* env); int __stdcall SetCacheHints(int cachehints, int frame_range) override { AVS_UNUSED(frame_range); return cachehints == CACHE_GET_MTMODE ? MT_NICE_FILTER : 0; } protected: void setMatrix(const char * _matrix, bool _isinteger, IScriptEnvironment* env); private: double divisor; size_t nSize; int nBias; float fBias; bool autoscale; int iCountDiv; float fCountDiv; bool int64needed; bool luma; bool chroma; bool alpha; std::vector iMatrix; std::vector fMatrix; float fNormalizeSum; int iNormalizeSum; int iWeightSumPositives; int iWeightSumNegatives; do_conv_int_t *conversionFnPtr; do_conv_float_t *FconversionFnPtr; }; #endif // __GeneralConvolution_H__ ================================================ FILE: avs_core/filters/debug.cpp ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include "debug.h" #ifdef AVS_WINDOWS #include #else #include #endif #include "../core/bitblt.h" #include "../core/internal.h" /********************************************** ******* PlanarLegacyAlignment Filter ******* ******* for pitch challenged plugins ******* **********************************************/ class PlanarLegacyAlignment : public GenericVideoFilter { private: const IScriptEnvironment::PlanarChromaAlignmentMode mode; public: PlanarLegacyAlignment( PClip _child, const bool _mode, IScriptEnvironment* env ) : GenericVideoFilter(_child), mode(_mode ? IScriptEnvironment::PlanarChromaAlignmentOff // Legacy PLANAR_Y alignment : IScriptEnvironment::PlanarChromaAlignmentOn) // New PLANAR_UV priority alignment { AVS_UNUSED(env); } PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) { const IScriptEnvironment::PlanarChromaAlignmentMode oldmode = env->PlanarChromaAlignment(mode) // Set the PLANAR alignement mode ? IScriptEnvironment::PlanarChromaAlignmentOn : IScriptEnvironment::PlanarChromaAlignmentOff; PVideoFrame src = child->GetFrame(n, env); // run the GetFrame chain env->PlanarChromaAlignment(oldmode); // reset the PLANAR alignement mode return src; } static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env) { return new PlanarLegacyAlignment(args[0].AsClip(), args[1].AsBool(), env); } }; /*********************************************** ******* Echo Filter ******* ******* Call GetFrame on all source clips***** ***********************************************/ class Echo : public GenericVideoFilter { private: const int ClipCount; PClip *clips; public: Echo( PClip _child, const AVSValue _clips, IScriptEnvironment* env ) : GenericVideoFilter(_child), ClipCount(_clips.ArraySize()) { AVS_UNUSED(env); clips = new PClip[ClipCount]; for (int i=0; i < ClipCount; i++) clips[i] = _clips[i].AsClip(); } ~Echo() { delete[] clips; clips = 0; } PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) { PVideoFrame src = child->GetFrame(n, env); for (int i=0; i < ClipCount; i++) clips[i]->GetFrame(n, env); // run the GetFrame chains return src; } static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env) { return new Echo(args[0].AsClip(), args[1], env); } }; /*********************************************** ****** Preroll GetFrame/GetAudio Filter ****** ***********************************************/ class Preroll : public GenericVideoFilter { private: const int videopr; const int64_t audiopr; int videonext; int64_t audionext; public: Preroll( PClip _child, const int _videopr, const double _audiopr, IScriptEnvironment* env ) : GenericVideoFilter(_child), videopr(_videopr), audiopr(int64_t(_audiopr*vi.audio_samples_per_second+0.5)), videonext(0), audionext(0) { AVS_UNUSED(env); // Force source filter to honour preroll child->SetCacheHints(CACHE_NOTHING, 0); // Disable Video cache child->SetCacheHints(CACHE_AUDIO_NOTHING, 0); // Disable Audio cache } PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) { if (n != videonext) { int i = n - videopr; if (i < 0) i = 0; // Optimise if n is within pr frames of last if (i < videonext && n > videonext) i = videonext; while (i < n) { child->GetFrame(i, env); i += 1; } } videonext = n+1; return child->GetFrame(n, env); } void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) { if (start != audionext) { int64_t s = start - audiopr; if (s < 0) s = 0; // Optimise if start is within pr sample of last if (s < audionext && start > audionext) s = audionext; while (s < start) { int64_t c = start - s; if (c > count) c = count; child->GetAudio(buf, s, c, env); s += c; } } audionext = start+count; child->GetAudio(buf, start, count, env); } static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env) { return new Preroll(args[0].AsClip(), args[1].AsInt(0), (float)args[2].AsDblDef(0.0), env); } }; /******************************************************************** ***** Declare index of new filters for Avisynth's filter engine ***** ********************************************************************/ extern const AVSFunction Debug_filters[] = { { "Null", BUILTIN_FUNC_PREFIX, "c[copy]s", Null::Create }, // clip, copy { "SetPlanarLegacyAlignment", BUILTIN_FUNC_PREFIX, "cb", PlanarLegacyAlignment::Create }, // clip, legacy alignment { "Echo", BUILTIN_FUNC_PREFIX, "cc+", Echo::Create }, { "Preroll", BUILTIN_FUNC_PREFIX, "c[video]i[audio]f", Preroll::Create }, { NULL } }; /******************************* ******* Null Filter ******* ******* for debugging ******* ******************************/ Null::Null(PClip _child, const char * _copy, IScriptEnvironment* env) : GenericVideoFilter(_child), copy(_copy) { AVS_UNUSED(env); } Null::~Null() { } PVideoFrame __stdcall Null::GetFrame(int n, IScriptEnvironment* env) { PVideoFrame src = child->GetFrame(n, env); BYTE * foo = new BYTE[256]; BYTE * bar = new BYTE[256]; MemDebug md; md.randomFill(foo, 8, 8, 8); env->BitBlt(bar, 8, foo, 8, 8, 8); md.reset(); int i = md.randomCheck(bar, 9, 8, 8); if (i) env->ThrowError("bug found"); delete [] foo; delete [] bar; if (!lstrcmpi(copy, "makewritable")) { env->MakeWritable(&src); return src; } // TODO: no support for planar formats! if (!lstrcmpi(copy, "memcopy")) { PVideoFrame dst = env->NewVideoFrame(child->GetVideoInfo(), 16); if (dst->IsWritable() == false) env->ThrowError("new frame not writable"); // honestly don't know whether to expect this condition memcpy( dst->GetWritePtr(), src->GetReadPtr(), src->GetPitch() * src->GetHeight() ); return dst; } if (!lstrcmpi(copy, "bitblt")) { PVideoFrame dst = env->NewVideoFrame(child->GetVideoInfo(), 16); if (dst->IsWritable() == false) env->ThrowError("new frame not writable"); // honestly don't know whether to expect this condition env->BitBlt( dst->GetWritePtr(), src->GetPitch(), src->GetReadPtr(), src->GetPitch(), src->GetRowSize(), src->GetHeight() ); return dst; } //if (!lstrcmpi(copy, "none")) // do nothing return src; } AVSValue __cdecl Null::Create(AVSValue args, void*, IScriptEnvironment* env) { return new Null(args[0].AsClip(), args[1].AsString("none"), env); } MemDebug::MemDebug() : mask(0xff) { reset(); } MemDebug::~MemDebug() { } // fills a buffer with "random" (the same every time) data we can // test for after some manipulation (e.g. BitBlt) void MemDebug::randomFill(BYTE* const buf, const int pitch, const int row_size, const int height) { for(int x=0; x> (whichByte * 8)); } void MemDebug::reset() { randNum = -591377182; // pulled out of my ass whichByte = 3; } ================================================ FILE: avs_core/filters/debug.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __Null_H__ #define __Null_H__ #include class Null : public GenericVideoFilter /** * Class for debugging Avisynth internals. **/ { public: Null( PClip _child, const char * _copy, IScriptEnvironment* env ); virtual ~Null(void); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env); private: const char* copy; }; class MemDebug { public: MemDebug(void); virtual ~MemDebug(void); void randomFill(BYTE* const buf, const int pitch, const int row_size, const int height); int randomCheck(BYTE* const buf, const int pitch, const int row_size, const int height); void reset(); private: char nextNum(); int randNum; int whichByte; const int mask; }; #endif // __Null_H__ ================================================ FILE: avs_core/filters/edit.cpp ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #include "edit.h" #include "../convert/convert_audio.h" #include "../core/internal.h" #include "merge.h" #include #include #ifdef AVS_WINDOWS #include #else #include #endif #include #include #include #include /******************************************************************** ***** Declare index of new filters for Avisynth's filter engine ***** ********************************************************************/ enum { FADE_MODE_OUT0, FADE_MODE_OUT, FADE_MODE_OUT2, FADE_MODE_IN0, FADE_MODE_IN, FADE_MODE_IN2, FADE_MODE_IO0, FADE_MODE_IO, FADE_MODE_IO2 }; extern const AVSFunction Edit_filters[] = { { "AudioTrim", BUILTIN_FUNC_PREFIX, "cff[cache]b", Trim::CreateA, (void*)Trim::Default}, // start time, end time { "AudioTrim", BUILTIN_FUNC_PREFIX, "cf[cache]b", Trim::CreateA, (void*)Trim::Invalid}, // Throw Invalid argument to AudioTrim because 4 parameters expected { "AudioTrim", BUILTIN_FUNC_PREFIX, "cf[length]f[cache]b", Trim::CreateA, (void*)Trim::Length}, // start time, duration { "AudioTrim", BUILTIN_FUNC_PREFIX, "cf[end]f[cache]b", Trim::CreateA, (void*)Trim::End}, // start time, end time { "Trim", BUILTIN_FUNC_PREFIX, "cii[pad]b[cache]b", Trim::Create, (void*)Trim::Default}, // first frame, last frame[, pad audio] { "Trim", BUILTIN_FUNC_PREFIX, "ci[pad]b[cache]b", Trim::Create, (void*)Trim::Invalid}, // Throw Invalid argument to Trim because 5 parameters expected { "Trim", BUILTIN_FUNC_PREFIX, "ci[length]i[pad]b[cache]b", Trim::Create, (void*)Trim::Length}, // first frame, frame count[, pad audio] { "Trim", BUILTIN_FUNC_PREFIX, "ci[end]i[pad]b[cache]b", Trim::Create, (void*)Trim::End}, // first frame, last frame[, pad audio] { "FreezeFrame", BUILTIN_FUNC_PREFIX, "ciii", FreezeFrame::Create }, // first frame, last frame, source frame { "DeleteFrame", BUILTIN_FUNC_PREFIX, "ci+", DeleteFrame::Create }, // frame # { "DuplicateFrame", BUILTIN_FUNC_PREFIX, "ci+", DuplicateFrame::Create }, // frame # { "UnalignedSplice", BUILTIN_FUNC_PREFIX, "cc+", Splice::CreateUnaligned }, // clips { "AlignedSplice", BUILTIN_FUNC_PREFIX, "cc+", Splice::CreateAligned }, // clips { "UnalignedSplice", BUILTIN_FUNC_PREFIX, "cci", Splice::CreateUnalignedNoCache }, // clips { "AlignedSplice", BUILTIN_FUNC_PREFIX, "cci", Splice::CreateAlignedNoCache }, // clips { "Dissolve", BUILTIN_FUNC_PREFIX, "cc+i[fps]f", Dissolve::Create }, // clips, overlap frames[, fps] { "AudioDub", BUILTIN_FUNC_PREFIX, "cc", AudioDub::Create, (void*)0}, // video src, audio src { "AudioDubEx", BUILTIN_FUNC_PREFIX, "cc", AudioDub::Create, (void*)1}, // video! src, audio! src { "Reverse", BUILTIN_FUNC_PREFIX, "c", Reverse::Create }, // plays backwards { "FadeOut0", BUILTIN_FUNC_PREFIX, "ci[color]i[fps]f[color_yuv]i[colors]f+", Create_Fade, (void*)FADE_MODE_OUT0 }, { "FadeOut", BUILTIN_FUNC_PREFIX, "ci[color]i[fps]f[color_yuv]i[colors]f+", Create_Fade, (void*)FADE_MODE_OUT }, { "FadeOut2", BUILTIN_FUNC_PREFIX, "ci[color]i[fps]f[color_yuv]i[colors]f+", Create_Fade, (void*)FADE_MODE_OUT2 }, { "FadeIn0", BUILTIN_FUNC_PREFIX, "ci[color]i[fps]f[color_yuv]i[colors]f+", Create_Fade, (void*)FADE_MODE_IN0 }, { "FadeIn", BUILTIN_FUNC_PREFIX, "ci[color]i[fps]f[color_yuv]i[colors]f+", Create_Fade, (void*)FADE_MODE_IN }, { "FadeIn2", BUILTIN_FUNC_PREFIX, "ci[color]i[fps]f[color_yuv]i[colors]f+", Create_Fade, (void*)FADE_MODE_IN2 }, { "FadeIO0", BUILTIN_FUNC_PREFIX, "ci[color]i[fps]f[color_yuv]i[colors]f+", Create_Fade, (void*)FADE_MODE_IO0 }, { "FadeIO", BUILTIN_FUNC_PREFIX, "ci[color]i[fps]f[color_yuv]i[colors]f+", Create_Fade, (void*)FADE_MODE_IO }, { "FadeIO2", BUILTIN_FUNC_PREFIX, "ci[color]i[fps]f[color_yuv]i[colors]f+", Create_Fade, (void*)FADE_MODE_IO2 }, { "Loop", BUILTIN_FUNC_PREFIX, "c[times]i[start]i[end]i", Loop::Create }, // number of loops, first frame, last frames { NULL } }; /****************************** ******* NonCachedGenericVideoFilter Filter ****** ******************************/ NonCachedGenericVideoFilter::NonCachedGenericVideoFilter(PClip _child) : GenericVideoFilter(_child) { }; int __stdcall NonCachedGenericVideoFilter::SetCacheHints(int cachehints, int frame_range) { switch(cachehints) { case CACHE_DONT_CACHE_ME: return 1; case CACHE_GET_MTMODE: return MT_NICE_FILTER; case CACHE_GET_DEV_TYPE: return (child->GetVersion() >= 5) ? child->SetCacheHints(CACHE_GET_DEV_TYPE, 0) : 0; default: return GenericVideoFilter::SetCacheHints(cachehints, frame_range); } } /****************************** ******* AudioTrim Filter ****** ******************************/ Trim::Trim(double starttime, double endtime, PClip _child, trim_mode_e mode, bool _cache, IScriptEnvironment* env) : GenericVideoFilter(_child), cache(_cache) { int64_t esampleno = 0; if (!vi.HasAudio()) env->ThrowError("AudioTrim: Cannot trim if there is no audio."); audio_offset = clamp(int64_t(starttime*vi.audio_samples_per_second + 0.5), (int64_t)0ll, vi.num_audio_samples); switch (mode) { case Default: if (endtime == 0.0) esampleno = vi.num_audio_samples; else if (endtime < 0.0) esampleno = int64_t((starttime-endtime)*vi.audio_samples_per_second + 0.5); else esampleno = int64_t(endtime*vi.audio_samples_per_second + 0.5); break; case Length: if (endtime < 0.0) env->ThrowError("AudioTrim: Length must be >= 0"); esampleno = int64_t((starttime+endtime)*vi.audio_samples_per_second + 0.5); break; case End: if (endtime < starttime) env->ThrowError("AudioTrim: End must be >= Start"); esampleno = int64_t(endtime*vi.audio_samples_per_second + 0.5); break; default: env->ThrowError("Script error: Invalid arguments to function \"AudioTrim\""); } if (esampleno > vi.num_audio_samples) esampleno = vi.num_audio_samples; vi.num_audio_samples = esampleno - audio_offset; if (vi.num_audio_samples < 0) vi.num_audio_samples = 0; firstframe= vi.FramesFromAudioSamples(audio_offset); // Floor if (endtime == 0.0 && mode == Default) vi.num_frames -= firstframe; else vi.num_frames = vi.FramesFromAudioSamples(vi.num_audio_samples + vi.AudioSamplesFromFrames(1) - 1); // Ceil if (vi.num_frames < 0) vi.num_frames = 0; } AVSValue __cdecl Trim::CreateA(AVSValue args, void* user_arg, IScriptEnvironment* env) { trim_mode_e mode = (trim_mode_e)size_t(user_arg); if (mode == Trim::Invalid) env->ThrowError("Script error: Invalid arguments to function \"AudioTrim\""); const bool cache = args[3].AsBool(true); return new Trim(args[1].AsFloat(), args[2].AsFloat(), args[0].AsClip(), mode, cache, env); } /****************************** ******* Trim Filter ****** ******************************/ Trim::Trim(int _firstframe, int _lastframe, bool _padaudio, PClip _child, trim_mode_e mode, bool _cache, IScriptEnvironment* env) : GenericVideoFilter(_child), cache(_cache) { int lastframe = 0; if (!vi.HasVideo()) env->ThrowError("Trim: Cannot trim if there is no video."); firstframe = clamp(_firstframe, 0, vi.num_frames-1); switch (mode) { case Default: if (_lastframe == 0) lastframe = vi.num_frames-1; else if (_lastframe < 0) lastframe = firstframe - _lastframe - 1; else lastframe = _lastframe; lastframe = clamp(lastframe, firstframe, vi.num_frames-1); break; case Length: if (_lastframe < 0) env->ThrowError("Trim: Length must be >= 0"); lastframe = firstframe + _lastframe - 1; if (lastframe > vi.num_frames-1) lastframe = vi.num_frames-1; break; case End: if (_lastframe < firstframe) env->ThrowError("Trim: End must be >= Start"); lastframe = _lastframe; if (lastframe > vi.num_frames-1) lastframe = vi.num_frames-1; break; default: env->ThrowError("Script error: Invalid arguments to function \"Trim\""); } vi.num_frames = lastframe+1 - firstframe; audio_offset = vi.AudioSamplesFromFrames(firstframe); if (_padaudio) vi.num_audio_samples = vi.AudioSamplesFromFrames(lastframe+1) - audio_offset; else { int64_t samples; if (_lastframe == 0 && mode == Default) samples = vi.num_audio_samples; else { samples = vi.AudioSamplesFromFrames(lastframe+1); if (samples > vi.num_audio_samples) samples = vi.num_audio_samples; } if (audio_offset >= samples) vi.num_audio_samples = 0; else vi.num_audio_samples = samples - audio_offset; } } PVideoFrame Trim::GetFrame(int n, IScriptEnvironment* env) { return child->GetFrame(n+firstframe, env); } void __stdcall Trim::GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) { child->GetAudio(buf, start+audio_offset, count, env); } bool Trim::GetParity(int n) { return child->GetParity(n+firstframe); } AVSValue __cdecl Trim::Create(AVSValue args, void* user_arg, IScriptEnvironment* env) { trim_mode_e mode = (trim_mode_e)size_t(user_arg); if (mode == Trim::Invalid) env->ThrowError("Script error: Invalid arguments to function \"Trim\""); const bool cache = args[4].AsBool(true); return new Trim(args[1].AsInt(), args[2].AsInt(), args[3].AsBool(true), args[0].AsClip(), mode, cache, env); } /******************************* ******* Freeze Frame ****** *******************************/ FreezeFrame::FreezeFrame(int _first, int _last, int _source, PClip _child) : GenericVideoFilter(_child), first(_first), last(_last), source(_source) {} PVideoFrame FreezeFrame::GetFrame(int n, IScriptEnvironment* env) { return child->GetFrame((n >= first && n <= last) ? source : n, env); } bool FreezeFrame::GetParity(int n) { return child->GetParity((n >= first && n <= last) ? source : n); } AVSValue __cdecl FreezeFrame::Create(AVSValue args, void*, IScriptEnvironment* env) { AVS_UNUSED(env); return new FreezeFrame(args[1].AsInt(), args[2].AsInt(), args[3].AsInt(), args[0].AsClip()); } /****************************** ******* Delete Frame ****** ******************************/ DeleteFrame::DeleteFrame(int _frame, PClip _child) : GenericVideoFilter(_child), frame(_frame) { --vi.num_frames; } PVideoFrame DeleteFrame::GetFrame(int n, IScriptEnvironment* env) { return child->GetFrame(n + (n>=frame), env); } bool DeleteFrame::GetParity(int n) { return child->GetParity(n + (n>=frame)); } AVSValue __cdecl DeleteFrame::Create(AVSValue args, void*, IScriptEnvironment* env) { AVS_UNUSED(env); const int n = args[1].ArraySize(); int m = n-1; int *frames = new int[n]; frames[0] = args[1][0].AsInt(); for (int i=1; i=0; --k) result = new DeleteFrame(frames[k], result); delete[] frames; return result; } /********************************* ******* Duplicate Frame ****** *********************************/ DuplicateFrame::DuplicateFrame(int _frame, PClip _child) : GenericVideoFilter(_child), frame(_frame) { ++vi.num_frames; } PVideoFrame DuplicateFrame::GetFrame(int n, IScriptEnvironment* env) { return child->GetFrame(n - (n>frame), env); } bool DuplicateFrame::GetParity(int n) { return child->GetParity(n - (n>frame)); } AVSValue __cdecl DuplicateFrame::Create(AVSValue args, void*, IScriptEnvironment* env) { AVS_UNUSED(env); const int n = args[1].ArraySize(); int *frames = new int[n]; frames[0] = args[1][0].AsInt(); for (int i=1; i=0; --k) result = new DuplicateFrame(frames[k], result); delete[] frames; return result; } /******************************* ******* Splice Filter ****** *******************************/ Splice::Splice(PClip _child1, PClip _child2, bool realign_sound, bool _passCache, IScriptEnvironment* env) : GenericVideoFilter(_child1), child2(_child2), passCache(_passCache) { VideoInfo vi2 = child2->GetVideoInfo(); if (vi.HasVideo() ^ vi2.HasVideo()) env->ThrowError("Splice: one clip has video and the other doesn't (not allowed)"); if (vi.HasAudio() ^ vi2.HasAudio()) env->ThrowError("Splice: one clip has audio and the other doesn't (not allowed)"); // Check video if (vi.HasVideo()) { if (vi.width != vi2.width || vi.height != vi2.height) env->ThrowError("Splice: Frame sizes don't match"); if (!vi.IsSameColorspace(vi2)) env->ThrowError("Splice: Video formats don't match"); double fps_v1 = (double)vi.fps_numerator / (double)vi.fps_denominator; double fps_v2 = (double)vi2.fps_numerator / (double)vi2.fps_denominator; if (fabs(fps_v1-fps_v2) > 0.000001) env->ThrowError("Splice: Video framerate doesn't match"); } // Check Audio if (vi.HasAudio()) { // If sample types do not match they are both converted to float samples to avoid loss of precision. child2 = ConvertAudio::Create(child2, vi.SampleType(), SAMPLE_FLOAT); // Clip 1 is check to be same type as clip 1, if not, convert to float samples. vi2 = child2->GetVideoInfo(); child = ConvertAudio::Create(child, vi2.SampleType(), vi2.SampleType()); // Clip 1 is now be same type as clip 2. vi = child->GetVideoInfo(); if (vi.AudioChannels() != vi2.AudioChannels()) env->ThrowError("Splice: The number of audio channels doesn't match"); if (vi.SamplesPerSecond() != vi2.SamplesPerSecond()) env->ThrowError("Splice: The audio of the two clips have different samplerates! Use SSRC()/ResampleAudio()"); } video_switchover_point = vi.num_frames; if (!video_switchover_point) // We don't have video, so we cannot align sound to frames realign_sound = false; if (realign_sound) audio_switchover_point = vi.AudioSamplesFromFrames(video_switchover_point); else audio_switchover_point = vi.num_audio_samples; vi.num_frames += vi2.num_frames; if (vi.num_frames < 0) env->ThrowError("Splice: Maximum number of frames exceeded."); vi.num_audio_samples = audio_switchover_point + vi2.num_audio_samples; child_devs = (GetDeviceTypes(child) & GetDeviceTypes(child2)); } PVideoFrame Splice::GetFrame(int n, IScriptEnvironment* env) { if (n < video_switchover_point) return child->GetFrame(n, env); else return child2->GetFrame(n - video_switchover_point, env); } void Splice::GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) { if (start+count <= audio_switchover_point) child->GetAudio(buf, start, count, env); else if (start >= audio_switchover_point) child2->GetAudio(buf, start - audio_switchover_point, count, env); else { const int64_t count1 = audio_switchover_point - start; child->GetAudio(buf, start, count1, env); child2->GetAudio((char*)buf+vi.BytesFromAudioSamples(count1), 0, count-count1, env); } } bool Splice::GetParity(int n) { if (n < video_switchover_point) return child->GetParity(n); else return child2->GetParity(n - video_switchover_point); } int Splice::SetCacheHints(int cachehints,int frame_range) { switch(cachehints) { case CACHE_DONT_CACHE_ME: return 1; case CACHE_GET_MTMODE: return MT_NICE_FILTER; case CACHE_GET_DEV_TYPE: return child_devs; default: if (passCache) { child2->SetCacheHints(cachehints, frame_range); return child->SetCacheHints(cachehints, frame_range); } break; } return 0; // We do not pass cache requests upwards. } AVSValue __cdecl Splice::CreateUnaligned(AVSValue args, void*, IScriptEnvironment* env) { PClip result = args[0].AsClip(); for (int i=0; iGetVideoInfo(); if (vi.HasVideo() ^ vi2.HasVideo()) env->ThrowError("Dissolve: one clip has video and the other doesn't (not allowed)"); if (vi.HasAudio() ^ vi2.HasAudio()) env->ThrowError("Dissolve: one clip has audio and the other doesn't (not allowed)"); if (overlap<0) env->ThrowError("Dissolve: Cannot dissolve if overlap is less than zero"); if (vi.HasAudio()) { child2 = ConvertAudio::Create(child2, vi.SampleType(), SAMPLE_FLOAT); // Clip 1 is check to be same type as clip 1, if not, convert to float samples. vi2 = child2->GetVideoInfo(); child = ConvertAudio::Create(child, vi2.SampleType(), vi2.SampleType()); // Clip 1 is now be same type as clip 2. vi = child->GetVideoInfo(); if (vi.AudioChannels() != vi2.AudioChannels()) env->ThrowError("Dissolve: The number of audio channels doesn't match"); if (vi.SamplesPerSecond() != vi2.SamplesPerSecond()) env->ThrowError("Dissolve: The audio of the two clips have different samplerates! Use SSRC()/ResampleAudio()"); } if (vi.HasVideo()) { if (vi.width != vi2.width || vi.height != vi2.height) env->ThrowError("Dissolve: frame sizes don't match"); if (!(vi.IsSameColorspace(vi2))) env->ThrowError("Dissolve: video formats don't match"); pixelsize = vi.ComponentSize(); // AVS16 bits_per_pixel = vi.BitsPerComponent(); video_fade_start = vi.num_frames - overlap; video_fade_end = vi.num_frames - 1; audio_fade_start = vi.AudioSamplesFromFrames(video_fade_start); audio_fade_end = vi.AudioSamplesFromFrames(video_fade_end+1)-1; } else { video_fade_start = 0; video_fade_end = 0; audio_fade_start = vi.num_audio_samples - int64_t(Int32x32To64(vi.SamplesPerSecond(), overlap)/fps+0.5); audio_fade_end = vi.num_audio_samples-1; } audio_overlap = int(audio_fade_end - audio_fade_start); if (video_fade_start < 0) video_fade_start= 0; if (audio_fade_start < 0) audio_fade_start= 0; vi.num_frames = video_fade_start + vi2.num_frames; if (vi.num_frames < 0) env->ThrowError("Dissolve: Maximum number of frames exceeded."); vi.num_audio_samples = audio_fade_start + vi2.num_audio_samples; } bool Dissolve::GetParity(int n) { return (n < video_fade_start) ? child->GetParity(n) : child2->GetParity(n - video_fade_start); } PVideoFrame Dissolve::GetFrame(int n, IScriptEnvironment* env) { if (n < video_fade_start) return child->GetFrame(n, env); if (n > video_fade_end) return child2->GetFrame(n - video_fade_start, env); PVideoFrame a = child->GetFrame(n, env); PVideoFrame b = child2->GetFrame(n - video_fade_start, env); const double multiplier = n - video_fade_end + overlap; float weight = (float)(multiplier / (overlap + 1.0)); env->MakeWritable(&a); const int planes_y[4] = { PLANAR_Y, PLANAR_U, PLANAR_V, PLANAR_A }; const int planes_r[4] = { PLANAR_G, PLANAR_B, PLANAR_R, PLANAR_A }; const int *planes; int planeCount; planeCount = vi.IsPlanar() ? vi.NumComponents() : 1; planes = (!vi.IsPlanar() || vi.IsYUV() || vi.IsYUVA()) ? planes_y : planes_r; const int bits_per_pixel = vi.BitsPerComponent(); for (int j = 0; j < planeCount; ++j) { const int plane = planes[j]; const BYTE* b_data = b->GetReadPtr(plane); int b_pitch = b->GetPitch(plane); BYTE* a_data = a->GetWritePtr(plane); int a_pitch = a->GetPitch(plane); int row_size = a->GetRowSize(plane); int height = a->GetHeight(plane); int weight_i; int invweight_i; #ifdef INTEL_INTRINSICS MergeFuncPtr weighted_merge_planar = getMergeFunc(bits_per_pixel, env->GetCPUFlags(), a_data, b_data, weight, /*out*/weight_i, /*out*/invweight_i); #else MergeFuncPtr weighted_merge_planar = getMergeFunc(bits_per_pixel, a_data, b_data, weight, /*out*/weight_i, /*out*/invweight_i); #endif weighted_merge_planar(a_data, b_data, a_pitch, b_pitch, row_size, height, weight, weight_i, invweight_i); } return a; } void Dissolve::GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) { if (start+count <= audio_fade_start) { child->GetAudio(buf, start, count, env); return; } if (start > audio_fade_end) { child2->GetAudio(buf, start - audio_fade_start, count, env); return; } const size_t bytes = (size_t)vi.BytesFromAudioSamples(count); if (audbufsize < bytes) { delete[] audbuffer; audbuffer = new BYTE[bytes]; audbufsize = bytes; } child->GetAudio(buf, start, count, env); child2->GetAudio(audbuffer, start - audio_fade_start, count, env); const int nch = vi.AudioChannels(); const int countXnch = (int)count*nch; const int denominator = audio_overlap; int numerator = (int)(audio_fade_end - start); if (vi.IsSampleType(SAMPLE_INT16)) { short *const a = (short*)buf; const short *const b = (short*)audbuffer; int i; for (i=0; iThrowError("Dissolve: Wow - this should never happend!"); } /********************************* ******* AudioDub Filter ****** *********************************/ AudioDub::AudioDub(PClip child1, PClip child2, int mode, IScriptEnvironment* env) { const VideoInfo& vi1 = child1->GetVideoInfo(); const VideoInfo& vi2 = child2->GetVideoInfo(); const VideoInfo *vi_video=0, *vi_audio=0; if (mode) { // Unconditionally accept audio and video vchild = child1; achild = child2; vi_video = &vi1; vi_audio = &vi2; } else { if (vi1.HasVideo() && vi2.HasAudio()) { vchild = child1; achild = child2; vi_video = &vi1, vi_audio = &vi2; } else if (vi2.HasVideo() && vi1.HasAudio()) { vchild = child2; achild = child1; vi_video = &vi2, vi_audio = &vi1; } else { env->ThrowError("AudioDub: need an audio and a video track"); } } vi = *vi_video; vi.audio_samples_per_second = vi_audio->audio_samples_per_second; vi.num_audio_samples = vi_audio->num_audio_samples; vi.sample_type = vi_audio->sample_type; vi.nchannels = vi_audio->nchannels; vi.SetChannelMask(vi_audio->IsChannelMaskKnown(), vi_audio->GetChannelMask()); } const VideoInfo& AudioDub::GetVideoInfo() { return vi; } PVideoFrame AudioDub::GetFrame(int n, IScriptEnvironment* env) { return vchild->GetFrame(n, env); } bool AudioDub::GetParity(int n) { return vchild->GetParity(n); } void AudioDub::GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) { achild->GetAudio(buf, start, count, env); } int __stdcall AudioDub::SetCacheHints(int cachehints,int frame_range) { AVS_UNUSED(frame_range); switch(cachehints) { case CACHE_DONT_CACHE_ME: return 1; case CACHE_GET_MTMODE: return MT_NICE_FILTER; case CACHE_GET_DEV_TYPE: return (vchild->GetVersion() >= 5) ? vchild->SetCacheHints(CACHE_GET_DEV_TYPE, 0) : 0; default: return 0; } } AVSValue __cdecl AudioDub::Create(AVSValue args, void* mode, IScriptEnvironment* env) { return new AudioDub(args[0].AsClip(), args[1].AsClip(), (int)size_t(mode), env); } /******************************* ******* Reverse Filter ****** *******************************/ Reverse::Reverse(PClip _child) : GenericVideoFilter(_child) {} PVideoFrame Reverse::GetFrame(int n, IScriptEnvironment* env) { return child->GetFrame(vi.num_frames-n-1, env); } bool Reverse::GetParity(int n) { return child->GetParity(vi.num_frames-n-1); } void Reverse::GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) { child->GetAudio(buf, vi.num_audio_samples - start - count, count, env); const int bytes_per_sample = vi.BytesPerAudioSample(); // includes all channels const int bytes_per_channel_sample = vi.BytesPerChannelSample(); const int nch = vi.AudioChannels(); uint8_t* buf2 = reinterpret_cast(buf); switch (bytes_per_channel_sample) { case 1: // 8-bit for (int64_t i = 0; i < count / 2; ++i) { uint8_t* a_ptr = buf2 + i * bytes_per_sample; uint8_t* b_ptr = buf2 + (count - 1 - i) * bytes_per_sample; for (int c = 0; c < nch; ++c) { std::swap(a_ptr[c], b_ptr[c]); } } break; case 2: // 16-bit for (int64_t i = 0; i < count / 2; ++i) { int16_t* a_ptr = reinterpret_cast(buf2 + i * bytes_per_sample); int16_t* b_ptr = reinterpret_cast(buf2 + (count - 1 - i) * bytes_per_sample); for (int c = 0; c < nch; ++c) { std::swap(a_ptr[c], b_ptr[c]); } } break; case 3: // 24-bit, keep brute force for (int64_t i = 0; i < count / 2; ++i) { uint8_t* a_ptr = buf2 + i * bytes_per_sample; uint8_t* b_ptr = buf2 + (count - 1 - i) * bytes_per_sample; for (int c = 0; c < nch; ++c) { uint8_t* a_chan = a_ptr + c * 3; uint8_t* b_chan = b_ptr + c * 3; for (int j = 0; j < 3; ++j) { std::swap(a_chan[j], b_chan[j]); } } } break; case 4: // 32-bit int or float, separate because of swap templates if (vi.IsSampleType(SAMPLE_FLOAT)) { for (int64_t i = 0; i < count / 2; ++i) { float* a_ptr = reinterpret_cast(buf2 + i * bytes_per_sample); float* b_ptr = reinterpret_cast(buf2 + (count - 1 - i) * bytes_per_sample); for (int c = 0; c < nch; ++c) { std::swap(a_ptr[c], b_ptr[c]); } } } else { for (int64_t i = 0; i < count / 2; ++i) { int32_t* a_ptr = reinterpret_cast(buf2 + i * bytes_per_sample); int32_t* b_ptr = reinterpret_cast(buf2 + (count - 1 - i) * bytes_per_sample); for (int c = 0; c < nch; ++c) { std::swap(a_ptr[c], b_ptr[c]); } } } break; default: // generic case, no such sample size though for (int64_t i = 0; i < count / 2; ++i) { uint8_t* a_ptr = buf2 + i * bytes_per_sample; uint8_t* b_ptr = buf2 + (count - 1 - i) * bytes_per_sample; for (int c = 0; c < nch; ++c) { uint8_t* a_chan = a_ptr + c * bytes_per_channel_sample; uint8_t* b_chan = b_ptr + c * bytes_per_channel_sample; for (int j = 0; j < bytes_per_channel_sample; ++j) { std::swap(a_chan[j], b_chan[j]); } } } break; } } AVSValue __cdecl Reverse::Create(AVSValue args, void*, IScriptEnvironment* env) { AVS_UNUSED(env); return new Reverse(args[0].AsClip()); } /***************************** ****** Loop Filter ******* *****************************/ Loop::Loop(PClip _child, int times, int _start, int _end, IScriptEnvironment* env) : GenericVideoFilter(_child), start(_start), end(_end) { start = clamp(start,0,vi.num_frames-1); end = clamp(end,start,vi.num_frames-1); frames = end-start+1; if (times<0) { // Loop nearly forever vi.num_frames = 10000000; end = vi.num_frames; if (vi.HasAudio()) { if (vi.HasVideo()) { aud_start = vi.AudioSamplesFromFrames(start); aud_end = vi.AudioSamplesFromFrames(end+1) - 1; // This is the output end sample aud_count = vi.AudioSamplesFromFrames(frames); // length of each loop in samples } else { // start and end frame numbers are meaningless without video aud_start = 0; aud_count = vi.num_audio_samples; aud_end = Int32x32To64(400000, vi.audio_samples_per_second); } vi.num_audio_samples = aud_end+1; } } else { vi.num_frames += (times-1) * frames; if (vi.num_frames < 0) env->ThrowError("Loop: Maximum number of frames exceeded."); end = start + times * frames - 1; if (vi.HasAudio()) { if (vi.HasVideo()) { aud_start = vi.AudioSamplesFromFrames(start); aud_end = vi.AudioSamplesFromFrames(end+1) - 1; // This is the output end sample aud_count = vi.AudioSamplesFromFrames(frames); // length of each loop in samples } else { // start and end frame numbers are meaningless without video aud_start = 0; aud_count = vi.num_audio_samples; aud_end = vi.num_audio_samples * times; } vi.num_audio_samples += (times-1) * aud_count; } } } PVideoFrame Loop::GetFrame(int n, IScriptEnvironment* env) { return child->GetFrame(convert(n), env); } bool Loop::GetParity(int n) { return child->GetParity(convert(n)); } void Loop::GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) { int64_t get_count, get_start; const int bpas = vi.BytesPerAudioSample(); char* samples = (char*)buf; while (count > 0) { if (start > aud_end) { // tail of clip get_start = aud_start + aud_count + start - (aud_end+1); get_count = count; } else { if (start > aud_start) // loop part of clip get_start = (start - aud_start) % aud_count + aud_start; else // head of clip get_start = start; get_count = aud_count - (get_start - aud_start); // count to end of next iteration if (get_start+get_count > aud_end+1) // loop(0) case get_count = aud_end+1 - get_start; else if (start+get_count > aud_end) get_count = count; // if is last iteration do all of remainder if (get_count > count) get_count = count; } child->GetAudio(samples, get_start, get_count, env); samples += get_count * bpas; // update dest start pointer start += get_count; count -= get_count; } } __inline int Loop::convert(int n) { if (n>end) return n - end + start + frames - 1; else if (n>=start) return ((n - start) % frames) + start; else return n; } AVSValue __cdecl Loop::Create(AVSValue args, void*, IScriptEnvironment* env) { if (!args[0].AsClip()->GetVideoInfo().HasVideo() && (args[2].Defined() || args[3].Defined())) { env->ThrowError("Loop: cannot use start or end frame numbers without a video track"); } return new Loop(args[0].AsClip(), args[1].AsInt(-1), args[2].AsInt(0), args[3].AsInt(10000000),env); } /****************************** ** Assorted factory methods ** *****************************/ PClip __cdecl ColorClip(PClip a, int duration, AVSValue color, AVSValue color_yuv, AVSValue colors, float fps, IScriptEnvironment* env) { if (a->GetVideoInfo().HasVideo()) { AVSValue blackness_args[] = { a, duration, color, color_yuv, colors }; static const char* const arg_names[5] = { 0, 0, "color", "color_yuv", "colors" }; return env->Invoke("BlankClip", AVSValue(blackness_args, 5), arg_names).AsClip(); } else { AVSValue blackness_args[] = { a, duration, color, fps, color_yuv, colors }; static const char* const arg_names[6] = { 0, 0, "color", "fps", "color_yuv", "colors" }; return env->Invoke("BlankClip", AVSValue(blackness_args, 6), arg_names).AsClip(); } } AVSValue __cdecl Create_Fade(AVSValue args, void* user_data, IScriptEnvironment* env) { const int fade_type = (int)(intptr_t)user_data; const int duration = args[1].AsInt(); const float fps = args[3].AsFloatf(24.0f); int offset = 0; PClip a = args[0].AsClip(); switch (fade_type) { case FADE_MODE_OUT0: case FADE_MODE_IN0: case FADE_MODE_IO0: offset = 0; break; case FADE_MODE_OUT: case FADE_MODE_IN: case FADE_MODE_IO: offset = 1; break; case FADE_MODE_OUT2: case FADE_MODE_IN2: case FADE_MODE_IO2: offset = 2; break; } PClip b = ColorClip(a, duration + offset, args[2] /* color */, args[4] /* color_yuv */, args[5] /* colors */, fps, env); if(fade_type == FADE_MODE_OUT0 || fade_type == FADE_MODE_OUT || fade_type == FADE_MODE_OUT2) return new Dissolve(a, b, duration, fps, env); else if (fade_type == FADE_MODE_IN0 || fade_type == FADE_MODE_IN || fade_type == FADE_MODE_IN2) return new Dissolve(b, a, duration, fps, env); else { /* IO In-Out */ AVSValue dissolve_args[] = { b, a, b, duration, fps }; return env->Invoke("Dissolve", AVSValue(dissolve_args, 5)).AsClip(); } } ================================================ FILE: avs_core/filters/edit.h ================================================ // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al. // http://avisynth.nl // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit // http://www.gnu.org/copyleft/gpl.html . // // Linking Avisynth statically or dynamically with other modules is making a // combined work based on Avisynth. Thus, the terms and conditions of the GNU // General Public License cover the whole combination. // // As a special exception, the copyright holders of Avisynth give you // permission to link Avisynth with independent modules that communicate with // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license // terms of these independent modules, and to copy and distribute the // resulting combined work under terms of your choice, provided that // every copy of the combined work is accompanied by a complete copy of // the source code of Avisynth (the version of Avisynth used to produce the // combined work), being distributed under the terms of the GNU General // Public License plus this exception. An independent module is a module // which is not derived from or based on Avisynth, such as 3rd-party filters, // import and export plugins, or graphical user interfaces. #ifndef __Edit_H__ #define __Edit_H__ #include #include "../core/internal.h" /******************************************************************** ********************************************************************/ class Trim : public GenericVideoFilter /** * Class to select a range of frames from a longer clip **/ { public: typedef enum { Invalid = 0, Default, Length, End } trim_mode_e; Trim(int _firstframe, int _lastframe, bool _padaudio, PClip _child, trim_mode_e mode, bool _cache, IScriptEnvironment* env); Trim(double starttime, double endtime, PClip _child, trim_mode_e mode, bool _cache, IScriptEnvironment* env); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) override; void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) override; bool __stdcall GetParity(int n) override; int __stdcall SetCacheHints(int cachehints, int frame_range) override { AVS_UNUSED(frame_range); switch (cachehints) { case CACHE_DONT_CACHE_ME: return cache ? 0 : 1; // adaptively cache-able case CACHE_GET_MTMODE: return MT_NICE_FILTER; case CACHE_GET_DEV_TYPE: return (child->GetVersion() >= 5) ? child->SetCacheHints(CACHE_GET_DEV_TYPE, 0) : 0; default: return 0; } } static AVSValue __cdecl Create(AVSValue args, void* mode, IScriptEnvironment* env); static AVSValue __cdecl CreateA(AVSValue args, void* mode, IScriptEnvironment* env); private: int firstframe; int64_t audio_offset; bool cache; }; class FreezeFrame : public GenericVideoFilter /** * Class to display a single frame for the duration of several **/ { public: FreezeFrame(int _first, int _last, int _source, PClip _child); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) override; bool __stdcall GetParity(int n) override; int __stdcall SetCacheHints(int cachehints, int frame_range) override { AVS_UNUSED(frame_range); return cachehints == CACHE_GET_MTMODE ? MT_NICE_FILTER : 0; } static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env); private: const int first, last, source; }; class DeleteFrame : public GenericVideoFilter /** * Class to delete a frame **/ { public: DeleteFrame(int _frame, PClip _child); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) override; bool __stdcall GetParity(int n) override; int __stdcall SetCacheHints(int cachehints, int frame_range) override { AVS_UNUSED(frame_range); return cachehints == CACHE_GET_MTMODE ? MT_NICE_FILTER : 0; } static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env); private: const int frame; }; class DuplicateFrame : public GenericVideoFilter /** * Class to duplicate a frame **/ { public: DuplicateFrame(int _frame, PClip _child); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) override; bool __stdcall GetParity(int n) override; int __stdcall SetCacheHints(int cachehints, int frame_range) override { AVS_UNUSED(frame_range); return cachehints == CACHE_GET_MTMODE ? MT_NICE_FILTER : 0; } static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env); private: const int frame; }; class Splice : public GenericVideoFilter /** * Class to splice together video clips **/ { public: Splice(PClip _child1, PClip _child2, bool realign_sound, bool passCache, IScriptEnvironment* env); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env); bool __stdcall GetParity(int n); int __stdcall SetCacheHints(int cachehints,int frame_range); static AVSValue __cdecl CreateUnaligned(AVSValue args, void*, IScriptEnvironment* env); static AVSValue __cdecl CreateAligned(AVSValue args, void*, IScriptEnvironment* env); static AVSValue __cdecl CreateUnalignedNoCache(AVSValue args, void*, IScriptEnvironment* env); static AVSValue __cdecl CreateAlignedNoCache(AVSValue args, void*, IScriptEnvironment* env); private: PClip child2; int video_switchover_point; int64_t audio_switchover_point; const bool passCache; int child_devs; }; class Dissolve : public GenericVideoFilter /** * Class to smoothly transition from one video clip to another **/ { public: Dissolve(PClip _child1, PClip _child2, int _overlap, double fps, IScriptEnvironment* env); virtual ~Dissolve(); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env); bool __stdcall GetParity(int n); static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env); private: PClip child2; const int overlap; int video_fade_start, video_fade_end; int64_t audio_fade_start, audio_fade_end; int audio_overlap; BYTE* audbuffer; size_t audbufsize; int pixelsize; int bits_per_pixel; void EnsureBuffer(int minsize); }; class AudioDub : public IClip { /** * Class to mux the audio track of one clip with the video of another **/ public: AudioDub(PClip child1, PClip child2, int mode, IScriptEnvironment* env); const VideoInfo& __stdcall GetVideoInfo(); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env); void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env); bool __stdcall GetParity(int n); int __stdcall SetCacheHints(int cachehints,int frame_range); static AVSValue __cdecl Create(AVSValue args, void* mode, IScriptEnvironment* env); private: /*const*/ PClip vchild, achild; VideoInfo vi; }; class Reverse : public GenericVideoFilter /** * Class to play a clip backwards **/ { public: Reverse(PClip _child); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) override; bool __stdcall GetParity(int n) override; void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) override; int __stdcall SetCacheHints(int cachehints, int frame_range) override { AVS_UNUSED(frame_range); return cachehints == CACHE_GET_MTMODE ? MT_NICE_FILTER : 0; } static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env); }; class Loop : public GenericVideoFilter { /** * Class to loop over a range of frames **/ public: Loop(PClip _child, int times, int _start, int _end, IScriptEnvironment* env); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) override; bool __stdcall GetParity(int n) override; void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) override; int __stdcall SetCacheHints(int cachehints, int frame_range) override { AVS_UNUSED(frame_range); return cachehints == CACHE_GET_MTMODE ? MT_NICE_FILTER : 0; } static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env); private: int frames, start, end; int64_t aud_count, aud_start, aud_end; int convert(int n); }; /**** A few factory methods ****/ AVSValue __cdecl Create_Fade(AVSValue args, void* user_data, IScriptEnvironment* env); #endif // __Edit_H__ ================================================ FILE: avs_core/filters/exprfilter/exprfilter.cpp ================================================ /* * * Avisynth+ Expression filter, ported from the VapourSynth project * Copyright (c) 2012-2015 Fredrik Mellbin * * Additions and differences to VS r39 version: * ------------------------------ * (similar features to the masktools mt_lut family syntax) * Operator aliases: * Caret (^) can be used like pow * For equality check "==" can be used like "=" * & same as and * | same as or * New operator: != (not equal) * Built-in constants * ymin, ymax (ymin_a .. ymin_z for individual clips) - the usual luma limits (16..235 or scaled equivalents) * cmin, cmax (cmin_a .. cmin_z) - chroma limits (16..240 or scaled equivalents) * range_half (range_half_a .. range_half_z) - half of the range, (128 or scaled equivalents) * range_size, range_half, range_min, range_max (range_size_a .. range_size_z , etc..) * Autoscale helper functions (operand is treated as being a 8 bit constant unless i8..i16 or f32 is specified) * scaleb (scale by bit shift - mul or div by 2, 4, 6, 8...) * scalef (scale by stretch full scale - mul or div by source_max/target_max * Keywords for modifying base bit depth for scaleb and scalef * i8, i10, i12, i14, i16, f32 * Built-in math constant * pi * Alpha plane handling. When no separate expression is supplied for alpha, plane is copied instead of reusing last expression parameter * Proper clamping when storing 10,12 or 14 bit outputs * Faster storing of results for 8 and 10-16 bit outputs * 16 pixels/cycle instead of 8 when avx2, with fallback to 8-pixel case on the right edge. Thus no need for 64 byte alignment for 32 bit float. * (Load zeros for nonvisible pixels, when simd block size goes beyond image width, to prevent garbage input for simd calculation) * Optimizations: x^0.5 is sqrt, ^1 +0 -0 *1 /1 to nothing, ^2, ^3, ^4 is done by faster and more precise multiplication * spatial input variables in expr syntax: * sx, sy (absolute x and y coordinates, 0 to width-1 and 0 to height-1) * sxr, syr (relative x and y coordinates, from 0 to 1.0) * Optimize: recognize constant plane expression: use fast memset instead of generic simd process. Approx. 3-4x (32 bits) to 10-12x (8 bits) speedup * Optimize: Recognize single clip letter in expression: use fast plane copy (BitBlt) * (e.g. for 8-16 bits: instead of load-convert_to_float-clamp-convert_to_int-store). Approx. 1.4x (32 bits), 3x (16 bits), 8-9x (8 bits) speedup * Optimize: do not call GetFrame for input clips that are not referenced or plane-copied * 20171211: Implement relative pixel indexing e.g. x[-1,-3], requires SSSE3 * Fix jitasm code generation (corrupt code when doing register reorders) * 20171212: Variables: A..Z * To store the current top value of the stack to a variable: A@ .. Z@ * To store the current top value and pop it from the top of the stack: A^.. Z^ * To use a stored variable: single uppercase letter. E.g. A * 20171214: Trig.functions (C only): sin, cos, tan, asin, acos, atan * '%' The implementation is fmod-like: x - trunc(x/d)*d. * Note: SSE2 and up is using trunc for float->integer conversion, works for usual width/height magnitude. * (A float can hold a 24 bit integer w/o losing precision) * expr constants: 'width', 'height' for current plane width and height * expr auto variable: 'frameno' holds the current frame number 0..total number of frames-1 * expr auto variable: 'time' relative time in clip, 0 <= time <= 1 * calculation: time = frameno/(total number of frames - 1) * 20180614 new parameters: scale_inputs, clamp_float * implement 'clip' three operand operator like in masktools2: x minvalue maxvalue clip -> max(min(x, maxvalue), minvalue) * 20191120 yrange_min, yrange_half, yrange_max, clamp_float_UV param, allow "float_UV" for scale_inputs * yscalef, yscaleb forcing non-chroma rules for scaling even when processing chroma planes * 202107xx round, floor, ceil, trunc (acceleration from SSE4.1 and up) * arbitrary variable names; instead of 'A' to 'Z', up to 256 of them can be used * 20210924 frame property access clip.framePropName syntax after VSAkarin idea (no array access yet) * sin and cos as SIMD (VSAkarin, port from VS) * 20211116 neg * 20211117 atan2 as SIMD * 20211118 sgn * 20211127 lutx, lutxy (lut=1 and 2) * 20211128 allow f32 for 'scale_inputs' when "int", "intf", "all", "allf" * 20250309 tan as SIMD * * Differences from masktools 2.2.15 * --------------------------------- * Up to 26 clips are allowed (x,y,z,a,b,...w). Masktools handles only up to 4 clips with its mt_lut, my_lutxy, mt_lutxyz, mt_lutxyza * Clips with different bit depths are allowed * works with 32 bit floats instead of 64 bit double internally * less functions (e.g. no bit shifts) * logical 'false' is 0 instead of -1 * avs+: ymin, ymax, etc built-in constants can have a _X suffix, where X is the corresponding clip designator letter. E.g. cmax_z, range_half_x * mt_lutspa-like functionality is available through "sx", "sy", "sxr", "syr" */ #include #include #include #include #include #include #include #include #include #include #include #include #ifdef AVS_WINDOWS #include #else #include #endif #include #include "../../core/internal.h" #include "../../convert/convert_planar.h" // fill_plane #include "../../convert/convert_helper.h" #include "avs/alignment.h" #if defined(_MSC_VER) || (defined(__clang__) && defined(_MSC_VER)) || defined(__MINGW32__) || defined(__MINGW64__) #include // For _aligned_malloc and _aligned_free #endif #if (defined(_WIN64) && (defined(_M_AMD64) || defined(_M_X64))) || defined(__x86_64__) #define JITASM64 #endif #ifdef INTEL_INTRINSICS #define VS_TARGET_CPU_X86 #endif #ifdef AVS_WINDOWS #define VS_TARGET_OS_WINDOWS #endif #include "exprfilter.h" #ifdef VS_TARGET_CPU_X86 #ifndef NOMINMAX #define NOMINMAX #endif #include "jitasm.h" #endif #ifndef VS_TARGET_OS_WINDOWS #include #endif #ifdef XP_TLS #ifdef MSVC_PURE // v141_xp workaround: disabling /O2 global optimizations reduces build time // from 56 minutes to 48 seconds. #pragma optimize("g", off) // disables global optimizations (e.g. /O2 max opt,speed) #pragma optimize("t", on) // favor speed /Ot #pragma auto_inline(on) // enable aggressive inlining, equivalent of /Ob2 #endif #endif #ifdef VS_TARGET_CPU_X86 //#define TEST_AVX2_CODEGEN_IN_AVX #include #if defined(GCC) || defined(CLANG) #include #endif // rounder constants constexpr int FROUND_TO_NEAREST_INT = 0x00; constexpr int FROUND_TO_NEG_INF = 0x01; constexpr int FROUND_TO_POS_INF = 0x02; constexpr int FROUND_TO_ZERO = 0x03; constexpr int FROUND_NO_EXC = 0x08; // normal versions work with two xmm or ymm registers (2*4 or 2*8 pixels per cycle) // _Single suffixed versions work only one xmm or ymm registers at a time (1*4 or 1*8 pixels per cycle) #define OneArgOp(instr) \ auto &t1 = stack.back(); \ instr(t1.first, t1.first); \ instr(t1.second, t1.second); #define OneArgOp_Single(instr) \ auto &t1 = stack1.back(); \ instr(t1, t1); #define TwoArgOp(instr) \ auto t1 = stack.back(); \ stack.pop_back(); \ auto &t2 = stack.back(); \ instr(t2.first, t1.first); \ instr(t2.second, t1.second); #define TwoArgOp_Single(instr) \ auto t1 = stack1.back(); \ stack1.pop_back(); \ auto &t2 = stack1.back(); \ instr(t2, t1); #define TwoArgOp_Avx(instr) \ auto t1 = stack.back(); \ stack.pop_back(); \ auto &t2 = stack.back(); \ instr(t2.first, t2.first, t1.first); \ instr(t2.second, t2.second, t1.second); #define TwoArgOp_Single_Avx(instr) \ auto t1 = stack1.back(); \ stack1.pop_back(); \ auto &t2 = stack1.back(); \ instr(t2, t2, t1); #define CmpOp(instr) \ auto t1 = stack.back(); \ stack.pop_back(); \ auto t2 = stack.back(); \ stack.pop_back(); \ instr(t1.first, t2.first); \ instr(t1.second, t2.second); \ andps(t1.first, CPTR(elfloat_one)); \ andps(t1.second, CPTR(elfloat_one)); \ stack.push_back(t1); #define CmpOp_Single(instr) \ auto t1 = stack1.back(); \ stack1.pop_back(); \ auto t2 = stack1.back(); \ stack1.pop_back(); \ instr(t1, t2); \ andps(t1, CPTR(elfloat_one)); \ stack1.push_back(t1); #define CmpOp_Avx(instr, op) \ auto t1 = stack.back(); \ stack.pop_back(); \ auto t2 = stack.back(); \ stack.pop_back(); \ instr(t1.first, t1.first, t2.first, op); \ instr(t1.second, t1.second, t2.second, op); \ vandps(t1.first, t1.first, CPTR_AVX(elfloat_one)); \ vandps(t1.second, t1.second, CPTR_AVX(elfloat_one)); \ stack.push_back(t1); #define CmpOp_Single_Avx(instr, op) \ auto t1 = stack1.back(); \ stack1.pop_back(); \ auto t2 = stack1.back(); \ stack1.pop_back(); \ instr(t1, t1, t2, op); \ vandps(t1, t1, CPTR_AVX(elfloat_one)); \ stack1.push_back(t1); #define LogicOp(instr) \ auto t1 = stack.back(); \ stack.pop_back(); \ auto t2 = stack.back(); \ stack.pop_back(); \ cmpnleps(t1.first, zero); \ cmpnleps(t1.second, zero); \ cmpnleps(t2.first, zero); \ cmpnleps(t2.second, zero); \ instr(t1.first, t2.first); \ instr(t1.second, t2.second); \ andps(t1.first, CPTR(elfloat_one)); \ andps(t1.second, CPTR(elfloat_one)); \ stack.push_back(t1); #define LogicOp_Single(instr) \ auto t1 = stack1.back(); \ stack1.pop_back(); \ auto t2 = stack1.back(); \ stack1.pop_back(); \ cmpnleps(t1, zero); \ cmpnleps(t2, zero); \ instr(t1, t2); \ andps(t1, CPTR(elfloat_one)); \ stack1.push_back(t1); #define LogicOp_Avx(instr) \ auto t1 = stack.back(); \ stack.pop_back(); \ auto t2 = stack.back(); \ stack.pop_back(); \ vcmpps(t1.first, t1.first, zero, _CMP_GT_OQ); \ vcmpps(t1.second, t1.second, zero, _CMP_GT_OQ); \ vcmpps(t2.first, t2.first, zero, _CMP_GT_OQ); \ vcmpps(t2.second, t2.second, zero, _CMP_GT_OQ); \ instr(t1.first, t1.first, t2.first); \ instr(t1.second, t1.second, t2.second); \ vandps(t1.first, t1.first, CPTR_AVX(elfloat_one)); \ vandps(t1.second, t1.second, CPTR_AVX(elfloat_one)); \ stack.push_back(t1); #define LogicOp_Single_Avx(instr) \ auto t1 = stack1.back(); \ stack1.pop_back(); \ auto t2 = stack1.back(); \ stack1.pop_back(); \ vcmpps(t1, t1, zero, _CMP_GT_OQ); \ vcmpps(t2, t2, zero, _CMP_GT_OQ); \ instr(t1, t1, t2); \ vandps(t1, t1, CPTR_AVX(elfloat_one)); \ stack1.push_back(t1); enum { elabsmask, elc7F, elmin_norm_pos, elinv_mant_mask, elfloat_one, elfloat_minusone, elfloat_half, elsignmask, elstore8, elstore10, elstore12, elstore14, elstore16, spatialX, spatialX2, loadmask1000, loadmask1100, loadmask1110, elShuffleForRight0, elShuffleForRight1, elShuffleForRight2, elShuffleForRight3, elShuffleForRight4, elShuffleForRight5, elShuffleForRight6, elShuffleForLeft0, elShuffleForLeft1, elShuffleForLeft2, elShuffleForLeft3, elShuffleForLeft4, elShuffleForLeft5, elShuffleForLeft6, elexp_hi, elexp_lo, elcephes_LOG2EF, elcephes_exp_C1, elcephes_log_q2 = elcephes_exp_C1, elcephes_exp_C2, elcephes_log_q1 = elcephes_exp_C2, elcephes_exp_p0, elcephes_exp_p1, elcephes_exp_p2, elcephes_exp_p3, elcephes_exp_p4, elcephes_exp_p5, elcephes_SQRTHF, elcephes_log_p0, elcephes_log_p1, elcephes_log_p2, elcephes_log_p3, elcephes_log_p4, elcephes_log_p5, elcephes_log_p6, elcephes_log_p7, elcephes_log_p8, float_invpi, float_rintf, float_pi1, float_pi2, float_pi3, float_pi4, float_sinC3, float_sinC5, float_sinC7, float_sinC9, float_cosC2, float_cosC4, float_cosC6, float_cosC8, float_atan2f_rmul, float_atan2f_radd, float_atan2f_tmul, float_atan2f_tadd, float_atan2f_halfpi, float_atan2f_pi, float_tan_p0, float_tan_p2, float_tan_p4, float_tan_p6, float_tan_p8, float_tan_q0, float_tan_q2, float_tan_q4, float_tan_q6, float_tan_q8, float_tan_small_limit, float_tan_asympt_a1, float_tan_asympt_a2, float_tan_asympt_limit }; // constants for xmm #define XCONST(x) { x, x, x, x } #define MAKEDWORD(ch0, ch1, ch2, ch3) \ ((uint32_t)(unsigned char)(ch0) | ((uint32_t)(unsigned char)(ch1) << 8) | \ ((uint32_t)(unsigned char)(ch2) << 16) | ((uint32_t)(unsigned char)(ch3) << 24 )) #define XBYTECONST(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15) \ { (int)MAKEDWORD(a0,a1,a2,a3), (int)MAKEDWORD(a4,a5,a6,a7), (int)MAKEDWORD(a8,a9,a10,a11), (int)MAKEDWORD(a12,a13,a14,a15) } static constexpr ExprUnion logexpconst alignas(16)[87][4] = { XCONST(0x7FFFFFFF), // absmask XCONST(0x7F), // c7F XCONST(0x00800000), // min_norm_pos XCONST(~0x7f800000), // inv_mant_mask XCONST(1.0f), // float_one XCONST(-1.0f), // float_minusone XCONST(0.5f), // float_half XCONST(0x80000000), // elsignmask XCONST(255.0f), // store8 XCONST(1023.0f), // store10 (avs+) XCONST(4095.0f), // store12 (avs+) XCONST(16383.0f), // store14 (avs+) XCONST(65535.0f), // store16 { 0.0f, 1.0f, 2.0f, 3.0f }, // spatialX { 4.0f, 5.0f, 6.0f, 7.0f }, // spatialX2 { (int)0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000 }, // loadmask1000 { (int)0xFFFFFFFF, (int)0xFFFFFFFF, 0x00000000, 0x00000000 }, // loadmask1100 { (int)0xFFFFFFFF, (int)0xFFFFFFFF, (int)0xFFFFFFFF, 0x00000000 }, // loadmask1110 XBYTECONST(0,1,2,3,4,5,6,7, 8,9,10,11,12,13,12,13), // elShuffleForRight0 XBYTECONST(0,1,2,3,4,5,6,7, 8,9,10,11,10,11,10,11), // elShuffleForRight1 XBYTECONST(0,1,2,3,4,5,6,7, 8,9,8,9,8,9,8,9), // elShuffleForRight2 XBYTECONST(0,1,2,3,4,5,6,7, 6,7,6,7,6,7,6,7), // elShuffleForRight3 XBYTECONST(0,1,2,3,4,5,4,5, 4,5,4,5,4,5,4,5), // elShuffleForRight4 XBYTECONST(0,1,2,3,2,3,2,3, 2,3,2,3,2,3,2,3), // elShuffleForRight5 XBYTECONST(0,1,0,1,0,1,0,1, 0,1,0,1,0,1,0,1), // elShuffleForRight6 XBYTECONST(2,3,2,3,4,5,6,7, 8,9,10,11,12,13,14,15), // elShuffleForLeft0 XBYTECONST(4,5,4,5,4,5,6,7, 8,9,10,11,12,13,14,15), // elShuffleForLeft1 XBYTECONST(6,7,6,7,6,7,6,7, 8,9,10,11,12,13,14,15), // elShuffleForLeft2 XBYTECONST(8,9,8,9,8,9,8,9, 8,9,10,11,12,13,14,15), // elShuffleForLeft3 XBYTECONST(10,11,10,11,10,11,10,11, 10,11,10,11,12,13,14,15), // elShuffleForLeft4 XBYTECONST(12,13,12,13,12,13,12,13, 12,13,12,13,12,13,14,15), // elShuffleForLeft5 XBYTECONST(14,15,14,15,14,15,14,15, 14,15,14,15,14,15,14,15), // elShuffleForLeft6 XCONST(88.3762626647949f), // exp_hi XCONST(-88.3762626647949f), // exp_lo XCONST(1.44269504088896341f), // cephes_LOG2EF XCONST(0.693359375f), // cephes_exp_C1 XCONST(-2.12194440e-4f), // cephes_exp_C2 XCONST(1.9875691500E-4f), // cephes_exp_p0 XCONST(1.3981999507E-3f), // cephes_exp_p1 XCONST(8.3334519073E-3f), // cephes_exp_p2 XCONST(4.1665795894E-2f), // cephes_exp_p3 XCONST(1.6666665459E-1f), // cephes_exp_p4 XCONST(5.0000001201E-1f), // cephes_exp_p5 XCONST(0.707106781186547524f), // cephes_SQRTHF XCONST(7.0376836292E-2f), // cephes_log_p0 XCONST(-1.1514610310E-1f), // cephes_log_p1 XCONST(1.1676998740E-1f), // cephes_log_p2 XCONST(-1.2420140846E-1f), // cephes_log_p3 XCONST(+1.4249322787E-1f), // cephes_log_p4 XCONST(-1.6668057665E-1f), // cephes_log_p5 XCONST(+2.0000714765E-1f), // cephes_log_p6 XCONST(-2.4999993993E-1f), // cephes_log_p7 XCONST(+3.3333331174E-1f), // cephes_log_p8 XCONST(0x3ea2f983), // float_invpi, 1/pi = 0.31830988618379067154f XCONST(0x4b400000), // float_rintf Used for rounding XCONST(0x40490000), // float_pi1 High precision part of Pi XCONST(0x3a7da000), // float_pi2 Second part of Pi for extended precision XCONST(0x34222000), // float_pi3 Third part of Pi for extended precision XCONST(0x2cb4611a), // float_pi4 Fourth part of Pi for extended precision XCONST(0xbe2aaaa6), // float_sinC3 XCONST(0x3c08876a), // float_sinC5 XCONST(0xb94fb7ff), // float_sinC7 XCONST(0x362edef8), // float_sinC9 XCONST(static_cast(0xBEFFFFE2)), // float_cosC2 XCONST(0x3D2AA73C), // float_cosC4 XCONST(static_cast(0XBAB58D50)), // float_cosC6 XCONST(0x37C1AD76), // float_cosC8 XCONST(0x3ccb7dda), // float_atan2f_rmul 0.024840285f XCONST(0x3e3f4c37), // float_atan2f_radd 0.18681418f XCONST(0xbdc0b66d), // float_atan2f_tmul -0.094097948f XCONST(0xbeaa0d0a), // float_atan2f_tadd -0.33213072f XCONST(0x3fc90fdb), // float_atan2f_halfpi 1.57079637f XCONST(0x40490fdb), // float_atan2f_pi 3.14159274f // Tangent approximation coefficients up to p8 and helpers XCONST(1.0f), // float_tan_p0 - Numerator constant term XCONST(0.3333314036f), // float_tan_p2 - Numerator x^2 coefficient XCONST(0.1333923995f), // float_tan_p4 - Numerator x^4 coefficient XCONST(0.0533740603f), // float_tan_p6 - Numerator x^6 coefficient XCONST(0.0245650893f), // float_tan_p8 - Numerator x^8 coefficient XCONST(1.0f), // float_tan_q0 - Denominator constant term XCONST(0.1333835001f), // float_tan_q2 - Denominator x^2 coefficient XCONST(0.0089270802f), // float_tan_q4 - Denominator x^4 coefficient XCONST(0.0005908960f), // float_tan_q6 - Denominator x^6 coefficient XCONST(0.0000342237f), // float_tan_q8 - Denominator x^8 coefficient XCONST(1e-4f), // float_tan_small_limit XCONST(0.97f), // float_tan_asympt_a1 XCONST(0.35f), // float_tan_asympt_a2 XCONST(0.8f), // float_tan_asympt_limit }; #define CPTR(x) (xmmword_ptr[constptr + (x) * 16]) // AVX2 stuff // constants for ymm #undef XCONST #define XCONST(x) { x, x, x, x, x, x, x, x } static constexpr ExprUnion logexpconst_avx alignas(32)[87][8] = { XCONST(0x7FFFFFFF), // absmask XCONST(0x7F), // c7F XCONST(0x00800000), // min_norm_pos XCONST(~0x7f800000), // inv_mant_mask XCONST(1.0f), // float_one XCONST(-1.0f), // float_minusone XCONST(0.5f), // float_half XCONST(0x80000000), // elsignmask XCONST(255.0f), // store8 XCONST(1023.0f), // store10 (avs+) XCONST(4095.0f), // store12 (avs+) XCONST(16383.0f), // store14 (avs+) XCONST(65535.0f), // store16 { 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f }, // spatialX { 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f }, // spatialX2 { (int)0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0, 0 }, // loadmask1000 not used, avx supports blendps { (int)0xFFFFFFFF, (int)0xFFFFFFFF, 0x00000000, 0x00000000, 0, 0, 0, 0 }, // loadmask1100 not used, avx supports blendps { (int)0xFFFFFFFF, (int)0xFFFFFFFF, (int)0xFFFFFFFF, 0x00000000, 0, 0, 0, 0 }, // loadmask1110 not used, avx supports blendps XCONST(0), // n/a elShuffleForRight0 XCONST(0), // n/a elShuffleForRight1 XCONST(0), // n/a elShuffleForRight2 XCONST(0), // n/a elShuffleForRight3 XCONST(0), // n/a elShuffleForRight4 XCONST(0), // n/a elShuffleForRight5 XCONST(0), // n/a elShuffleForRight6 XCONST(0), // n/a elShuffleForLeft0 XCONST(0), // n/a elShuffleForLeft1 XCONST(0), // n/a elShuffleForLeft2 XCONST(0), // n/a elShuffleForLeft3 XCONST(0), // n/a elShuffleForLeft4 XCONST(0), // n/a elShuffleForLeft5 XCONST(0), // n/a elShuffleForLeft6 XCONST(88.3762626647949f), // exp_hi XCONST(-88.3762626647949f), // exp_lo XCONST(1.44269504088896341f), // cephes_LOG2EF XCONST(0.693359375f), // cephes_exp_C1 XCONST(-2.12194440e-4f), // cephes_exp_C2 XCONST(1.9875691500E-4f), // cephes_exp_p0 XCONST(1.3981999507E-3f), // cephes_exp_p1 XCONST(8.3334519073E-3f), // cephes_exp_p2 XCONST(4.1665795894E-2f), // cephes_exp_p3 XCONST(1.6666665459E-1f), // cephes_exp_p4 XCONST(5.0000001201E-1f), // cephes_exp_p5 XCONST(0.707106781186547524f), // cephes_SQRTHF XCONST(7.0376836292E-2f), // cephes_log_p0 XCONST(-1.1514610310E-1f), // cephes_log_p1 XCONST(1.1676998740E-1f), // cephes_log_p2 XCONST(-1.2420140846E-1f), // cephes_log_p3 XCONST(+1.4249322787E-1f), // cephes_log_p4 XCONST(-1.6668057665E-1f), // cephes_log_p5 XCONST(+2.0000714765E-1f), // cephes_log_p6 XCONST(-2.4999993993E-1f), // cephes_log_p7 XCONST(+3.3333331174E-1f), // cephes_log_p8 XCONST(0x3ea2f983), // float_invpi, 1/pi = 0.31830988618379067154f XCONST(0x4b400000), // float_rintf Used for rounding XCONST(0x40490000), // float_pi1 High precision part of Pi XCONST(0x3a7da000), // float_pi2 Second part of Pi for extended precision XCONST(0x34222000), // float_pi3 Third part of Pi for extended precision XCONST(0x2cb4611a), // float_pi4 Fourth part of Pi for extended precision XCONST(0xbe2aaaa6), // float_sinC3 XCONST(0x3c08876a), // float_sinC5 XCONST(0xb94fb7ff), // float_sinC7 XCONST(0x362edef8), // float_sinC9 XCONST(static_cast(0xBEFFFFE2)), // float_cosC2 XCONST(0x3D2AA73C), // float_cosC4 XCONST(static_cast(0XBAB58D50)), // float_cosC6 XCONST(0x37C1AD76), // float_cosC8 XCONST(0x3ccb7dda), // float_atan2f_rmul 0.024840285f XCONST(0x3e3f4c37), // float_atan2f_radd 0.18681418f XCONST(0xbdc0b66d), // float_atan2f_tmul -0.094097948f XCONST(0xbeaa0d0a), // float_atan2f_tadd -0.33213072f XCONST(0x3fc90fdb), // float_atan2f_halfpi 1.57079637f XCONST(0x40490fdb), // float_atan2f_pi 3.14159274f // Tangent approximation coefficients up to p8 and helpers XCONST(1.0f), // float_tan_p0 - Numerator constant term XCONST(0.3333314036f), // float_tan_p2 - Numerator x^2 coefficient XCONST(0.1333923995f), // float_tan_p4 - Numerator x^4 coefficient XCONST(0.0533740603f), // float_tan_p6 - Numerator x^6 coefficient XCONST(0.0245650893f), // float_tan_p8 - Numerator x^8 coefficient XCONST(1.0f), // float_tan_q0 - Denominator constant term XCONST(0.1333835001f), // float_tan_q2 - Denominator x^2 coefficient XCONST(0.0089270802f), // float_tan_q4 - Denominator x^4 coefficient XCONST(0.0005908960f), // float_tan_q6 - Denominator x^6 coefficient XCONST(0.0000342237f), // float_tan_q8 - Denominator x^8 coefficient XCONST(1e-4f), // float_tan_small_limit XCONST(0.97f), // float_tan_asympt_a1 XCONST(0.35f), // float_tan_asympt_a2 XCONST(0.8f), // float_tan_asympt_limit }; #undef XCONST #define CPTR_AVX(x) (ymmword_ptr[constptr + (x) * 32]) #define EXP_PS(x) { \ XmmReg fx, emm0, etmp, y, mask, z; \ minps(x, CPTR(elexp_hi)); \ maxps(x, CPTR(elexp_lo)); \ movaps(fx, x); \ mulps(fx, CPTR(elcephes_LOG2EF)); \ addps(fx, CPTR(elfloat_half)); \ cvttps2dq(emm0, fx); \ cvtdq2ps(etmp, emm0); \ movaps(mask, etmp); \ cmpnleps(mask, fx); \ andps(mask, CPTR(elfloat_one)); \ movaps(fx, etmp); \ subps(fx, mask); \ movaps(etmp, fx); \ mulps(etmp, CPTR(elcephes_exp_C1)); \ movaps(z, fx); \ mulps(z, CPTR(elcephes_exp_C2)); \ subps(x, etmp); \ subps(x, z); \ movaps(z, x); \ mulps(z, z); \ movaps(y, CPTR(elcephes_exp_p0)); \ mulps(y, x); \ addps(y, CPTR(elcephes_exp_p1)); \ mulps(y, x); \ addps(y, CPTR(elcephes_exp_p2)); \ mulps(y, x); \ addps(y, CPTR(elcephes_exp_p3)); \ mulps(y, x); \ addps(y, CPTR(elcephes_exp_p4)); \ mulps(y, x); \ addps(y, CPTR(elcephes_exp_p5)); \ mulps(y, z); \ addps(y, x); \ addps(y, CPTR(elfloat_one)); \ cvttps2dq(emm0, fx); \ paddd(emm0, CPTR(elc7F)); \ pslld(emm0, 23); \ mulps(y, emm0); \ x = y; } #define LOG_PS(x) { \ XmmReg emm0, invalid_mask, mask, y, etmp, z; \ xorps(invalid_mask, invalid_mask); \ cmpnleps(invalid_mask, x); \ maxps(x, CPTR(elmin_norm_pos)); \ movaps(emm0, x); \ psrld(emm0, 23); \ andps(x, CPTR(elinv_mant_mask)); \ orps(x, CPTR(elfloat_half)); \ psubd(emm0, CPTR(elc7F)); \ cvtdq2ps(emm0, emm0); \ addps(emm0, CPTR(elfloat_one)); \ movaps(mask, x); \ cmpltps(mask, CPTR(elcephes_SQRTHF)); \ movaps(etmp, x); \ andps(etmp, mask); \ subps(x, CPTR(elfloat_one)); \ andps(mask, CPTR(elfloat_one)); \ subps(emm0, mask); \ addps(x, etmp); \ movaps(z, x); \ mulps(z, z); \ movaps(y, CPTR(elcephes_log_p0)); \ mulps(y, x); \ addps(y, CPTR(elcephes_log_p1)); \ mulps(y, x); \ addps(y, CPTR(elcephes_log_p2)); \ mulps(y, x); \ addps(y, CPTR(elcephes_log_p3)); \ mulps(y, x); \ addps(y, CPTR(elcephes_log_p4)); \ mulps(y, x); \ addps(y, CPTR(elcephes_log_p5)); \ mulps(y, x); \ addps(y, CPTR(elcephes_log_p6)); \ mulps(y, x); \ addps(y, CPTR(elcephes_log_p7)); \ mulps(y, x); \ addps(y, CPTR(elcephes_log_p8)); \ mulps(y, x); \ mulps(y, z); \ movaps(etmp, emm0); \ mulps(etmp, CPTR(elcephes_log_q1)); \ addps(y, etmp); \ mulps(z, CPTR(elfloat_half)); \ subps(y, z); \ mulps(emm0, CPTR(elcephes_log_q2)); \ addps(x, y); \ addps(x, emm0); \ orps(x, invalid_mask); } #define EXP_PS_AVX(x) { \ YmmReg fx, emm0, etmp, y, mask, z; \ vminps(x, x, CPTR_AVX(elexp_hi)); \ vmaxps(x, x, CPTR_AVX(elexp_lo)); \ vmulps(fx, x, CPTR_AVX(elcephes_LOG2EF)); \ vaddps(fx, fx, CPTR_AVX(elfloat_half)); \ vcvttps2dq(emm0, fx); \ vcvtdq2ps(etmp, emm0); \ vcmpps(mask, etmp, fx, _CMP_GT_OQ); /* cmpnleps */ \ vandps(mask, mask, CPTR_AVX(elfloat_one)); \ vsubps(fx, etmp, mask); \ vfnmadd231ps(x, fx, CPTR_AVX(elcephes_exp_C1)); \ vfnmadd231ps(x, fx, CPTR_AVX(elcephes_exp_C2)); \ vmulps(z, x, x); \ vmovaps(y, CPTR_AVX(elcephes_exp_p0)); \ vfmadd213ps(y, x, CPTR_AVX(elcephes_exp_p1)); \ vfmadd213ps(y, x, CPTR_AVX(elcephes_exp_p2)); \ vfmadd213ps(y, x, CPTR_AVX(elcephes_exp_p3)); \ vfmadd213ps(y, x, CPTR_AVX(elcephes_exp_p4)); \ vfmadd213ps(y, x, CPTR_AVX(elcephes_exp_p5)); \ vfmadd213ps(y, z, x); \ vaddps(y, y, CPTR_AVX(elfloat_one)); \ vcvttps2dq(emm0, fx); \ vpaddd(emm0, emm0, CPTR_AVX(elc7F)); \ vpslld(emm0, emm0, 23); \ vmulps(x, y, emm0); \ } #define LOG_PS_AVX(x) { \ YmmReg emm0, invalid_mask, mask, y, etmp, z; \ vcmpps(invalid_mask, zero, x, _CMP_GT_OQ); /* cmpnleps. or signalling _CMP_NLE_US? */ \ vmaxps(x, x, CPTR_AVX(elmin_norm_pos)); \ vpsrld(emm0, x, 23); \ vandps(x, x, CPTR_AVX(elinv_mant_mask)); \ vorps(x, x, CPTR_AVX(elfloat_half)); \ vpsubd(emm0, emm0, CPTR_AVX(elc7F)); \ vcvtdq2ps(emm0, emm0); \ vaddps(emm0, emm0, CPTR_AVX(elfloat_one)); \ vcmpps(mask, x, CPTR_AVX(elcephes_SQRTHF), _CMP_LT_OQ); /* cmpltps. or signalling _CMP_LT_OS? */ \ vandps(etmp, x, mask); \ vsubps(x, x, CPTR_AVX(elfloat_one)); \ vandps(mask, mask, CPTR_AVX(elfloat_one)); \ vsubps(emm0, emm0, mask); \ vaddps(x, x, etmp); \ vmulps(z, x, x); \ vmovaps(y, CPTR_AVX(elcephes_log_p0)); \ vfmadd213ps(y, x, CPTR_AVX(elcephes_log_p1)); \ vfmadd213ps(y, x, CPTR_AVX(elcephes_log_p2)); \ vfmadd213ps(y, x, CPTR_AVX(elcephes_log_p3)); \ vfmadd213ps(y, x, CPTR_AVX(elcephes_log_p4)); \ vfmadd213ps(y, x, CPTR_AVX(elcephes_log_p5)); \ vfmadd213ps(y, x, CPTR_AVX(elcephes_log_p6)); \ vfmadd213ps(y, x, CPTR_AVX(elcephes_log_p7)); \ vfmadd213ps(y, x, CPTR_AVX(elcephes_log_p8)); \ vmulps(y, y, x); \ vmulps(y, y, z); \ vfmadd231ps(y, emm0, CPTR_AVX(elcephes_log_q1)); \ vfnmadd231ps(y, z, CPTR_AVX(elfloat_half)); \ vaddps(x, x, y); \ vfmadd231ps(x, emm0, CPTR_AVX(elcephes_log_q2)); \ vorps(x, x, invalid_mask); } // Note: VS Expr changed a lot since ported to Avisynth, // Here we are using their VEX macros for easy port of new sin and cos // however we do not support VEX encoding or FMA3 in xmm register mode // Note: VEX2 cmpltps -> vcmpltps does not work so we uncomment v##op parts as well (comparisons changed in vex) #define VEX1(op, arg1, arg2) \ do { \ if constexpr(false /*cpuFlags & CPUF_AVX*/) \ /*v##op(arg1, arg2)*/; \ else \ op(arg1, arg2); \ } while (0) #define VEX1IMM(op, arg1, arg2, imm) \ do { \ if constexpr(false /*cpuFlags & CPUF_AVX*/) { \ /*v##op(arg1, arg2, imm)*/; \ } else if (arg1 == arg2) { \ op(arg2, imm); \ } else { \ movdqa(arg1, arg2); \ op(arg1, imm); \ } \ } while (0) #define VEX2(op, arg1, arg2, arg3) \ do { \ if constexpr(false /*cpuFlags & CPUF_AVX*/) { \ /*v##op(arg1, arg2, arg3)*/; \ } else if (arg1 == arg2) { \ op(arg2, arg3); \ } else if (arg1 != arg3) { \ movdqa(arg1, arg2); \ op(arg1, arg3); \ } else { \ XmmReg tmp; \ movdqa(tmp, arg2); \ op(tmp, arg3); \ movdqa(arg1, tmp); \ } \ } while (0) #define VEX2IMM(op, arg1, arg2, arg3, imm) \ do { \ if constexpr(false/*cpuFlags & CPUF_AVX*/) { \ /*v##op(arg1, arg2, arg3, imm)*/; \ } else if (arg1 == arg2) { \ op(arg2, arg3, imm); \ } else if (arg1 != arg3) { \ movdqa(arg1, arg2); \ op(arg1, arg3, imm); \ } else { \ XmmReg tmp; \ movdqa(tmp, arg2); \ op(tmp, arg3, imm); \ movdqa(arg1, tmp); \ } \ } while (0) #if 0 // Fast tangent approximation using rational function with 8th order terms float fast_tanf(float x) { // Constants for Pi approximation and range reduction const float polyPI = 3.14159265358979f; const float halfPI = polyPI * 0.5f; // Reduce to [-polyPI, polyPI] range float y = fmodf(x, polyPI); if (y > halfPI) y -= polyPI; else if (y < -halfPI) y += polyPI; // At this point y is in [-polyPI/2, polyPI/2] // For very small angles, return the angle itself // LLVM would add a small epsilon: sign(y)*2^-25 (0x1p-25f) float abs_y = fabsf(y); const float small_limit = 1e-4f; if (abs_y < small_limit) { return y; } // Check proximity to asymptotes const float asympt_limit = 0.8f; float distToAsymptote = halfPI - abs_y; // If very close to ±polyPI/2, use asymptotic approximation if (distToAsymptote < asympt_limit) { // The tangent function approaches 1/distToAsymptote as y approaches +/-polyPI/2 // Improved coefficients based on curve fitting to better match std::tan // not needed a 3rd term float asymptotic = 1.0f / (distToAsymptote * (0.9963f + distToAsymptote * (0.3642f + distToAsymptote * 0.0173f))); float asymptotic = 1.0f / (distToAsymptote * (0.97f + distToAsymptote * 0.35f)); // Preserve sign return (y < 0) ? -asymptotic : asymptotic; } float y2 = y * y; // Optimized coefficients with terms up to 8th order // Numerator coefficients const float p0 = 1.0f; const float p2 = 0.3333314036f; const float p4 = 0.1333923995f; const float p6 = 0.0533740603f; const float p8 = 0.0245650893f; // Denominator coefficients const float q0 = 1.0f; const float q2 = 0.1333835001f; const float q4 = 0.0089270802f; const float q6 = 0.0005908960f; const float q8 = 0.0000342237f; // Calculate approximation using Horner's method for efficiency float num = y * (p0 + y2 * (p2 + y2 * (p4 + y2 * (p6 + y2 * p8)))); float den = q0 + y2 * (q2 + y2 * (q4 + y2 * (q6 + y2 * q8))); return num / den; } // We are good with this, but LLVM does differently: // https://github.com/llvm/llvm-project/blob/main/libc/src/math/generic/tanf.cpp #endif // Fast tangent approximation for non-AVX version #define TAN_PS(x0) { \ XmmReg x1, x2, x3, x4, x5, x6, x7, x8, x9, x10; \ /* Normalize to [-pi, pi] using multiplication and subtraction */ \ VEX1(movaps, x1, CPTR(float_invpi)); /* 1/pi */ \ VEX2(mulps, x2, x0, x1); /* x / pi */ \ /* round to nearest integer */ \ VEX1(movaps, x3, CPTR(float_rintf)); /* round to int helper */ \ VEX2(addps, x4, x3, x2); /* x/pi + 2^23 */ \ VEX2(subps, x4, x4, x3); /* round(x/pi) */ \ VEX1(movaps, x5, CPTR(float_pi1)); /* Load pi1 (highest precision part) */ \ VEX2(mulps, x6, x4, x5); /* round(x/pi) * pi1 */ \ VEX2(subps, x7, x0, x6); /* Remainder after subtracting largest part */ \ /* Subtract remaining parts for higher precision */ \ VEX1(movaps, x3, CPTR(float_pi2)); \ VEX2(mulps, x3, x4, x3); /* round(x/pi) * pi2 */ \ VEX2(subps, x7, x7, x3); /* Further refine remainder */ \ VEX1(movaps, x3, CPTR(float_pi3)); \ VEX2(mulps, x3, x4, x3); /* round(x/pi) * pi3 */ \ VEX2(subps, x7, x7, x3); /* Further refine remainder */ \ VEX1(movaps, x3, CPTR(float_pi4)); \ VEX2(mulps, x3, x4, x3); /* round(x/pi) * pi4 */ \ VEX2(subps, x7, x7, x3); /* Final remainder, now x is in range [-pi, pi] */ \ /* Check range for symmetry, normalize to [-pi/2, pi/2] */ \ VEX2(mulps, x6, x5, CPTR(elfloat_half)); /* halfPI = pi/2 */ \ VEX2(cmpltps, x3, x6, x7); /* halfPI < y (cmpgt -> cmplt)*/ \ VEX2(subps, x4, x5, x7); /* pi - y */ \ /* blend: if y > halfPI, use pi - y */ \ VEX1(movaps, x2, x3); \ VEX2(andps, x2, x2, x4); \ VEX2(andnps, x3, x3, x7); \ VEX2(orps, x7, x3, x2); /* now y is <= pi/2 */ \ /* Check for y < -halfPI */ \ VEX1(movaps, x3, x6); \ VEX2(xorps, x3, x3, CPTR(elsignmask)); /* -halfPI */ \ VEX2(cmpltps, x2, x7, x3); /* y < -halfPI */ \ VEX2(xorps, x4, x5, CPTR(elsignmask)); /* -pi */ \ VEX2(subps, x4, x4, x7); /* -pi - y */ \ /* blend: if y < -halfPI, use -pi - y */ \ VEX1(movaps, x3, x2); \ VEX2(andps, x3, x3, x4); \ VEX2(andnps, x2, x2, x7); \ VEX2(orps, x7, x2, x3); /* now y is in [-pi/2, pi/2] */ \ /* Range reduction end */ \ \ /* Check for small values */ \ VEX1(movaps, x2, x7); \ VEX2(andps, x2, x2, CPTR(elabsmask)); /* abs_y */ \ VEX2(cmpltps, x3, x2, CPTR(float_tan_small_limit)); /* abs_y < small_limit */ \ VEX2(andps, x3, x3, x7); /* y * (abs_y < small_limit) */ \ \ /* Check for asymptotic proximity */ \ VEX1(movaps, x4, x6); /* Load halfPI */ \ VEX2(subps, x4, x4, x2); /* distToAsymptote = halfPI - abs_y */ \ VEX2(cmpltps, x5, x4, CPTR(float_tan_asympt_limit)); /* distToAsymptote < asympt_limit */ \ \ /* Calculate asymptotic approximation: 1.0f / (distToAsymptote * (0.97f + distToAsymptote * 0.35f)) */ \ VEX2(mulps, x8, x4, CPTR(float_tan_asympt_a2)); /* distToAsymptote * 0.35f */ \ VEX2(addps, x8, x8, CPTR(float_tan_asympt_a1)); /* 0.97f + distToAsymptote * 0.35f */ \ VEX2(mulps, x8, x8, x4); /* distToAsymptote * (0.97f + distToAsymptote * 0.35f) */ \ VEX1(movaps, x4, CPTR(elfloat_one)); /* 1.0f */ \ VEX2(divps, x9, x4, x8); /* 1.0f / (distToAsymptote * (0.97f + distToAsymptote * 0.35f)) */ \ \ /* Adjust sign for asymptotic approximation */ \ VEX1(movaps, x8, x7); /* original y */ \ VEX2(andps, x8, x8, CPTR(elsignmask)); /* sign of y */ \ VEX2(xorps, x9, x9, x8); /* apply sign to asymptotic result */ \ \ /* Calculate rational approximation for regular values */ \ VEX1(movaps, x2, x7); \ VEX2(mulps, x2, x2, x7); /* y^2 */ \ \ /* Compute numerator with higher order terms */ \ VEX1(movaps, x10, CPTR(float_tan_p8)); /* p8 */ \ VEX2(mulps, x10, x10, x2); /* p8*y^2 */ \ VEX2(addps, x10, x10, CPTR(float_tan_p6)); /* p6 + p8*y^2 */ \ VEX2(mulps, x10, x10, x2); /* y^2 * (p6 + p8*y^2) */ \ VEX2(addps, x10, x10, CPTR(float_tan_p4)); /* p4 + y^2 * (p6 + p8*y^2) */ \ VEX2(mulps, x10, x10, x2); /* y^2 * (p4 + y^2 * (p6 + p8*y^2)) */ \ VEX2(addps, x10, x10, CPTR(float_tan_p2)); /* p2 + y^2 * (p4 + y^2 * (p6 + p8*y^2)) */ \ VEX2(mulps, x10, x10, x2); /* y^2 * (p2 + y^2 * (p4 + y^2 * (p6 + p8*y^2))) */ \ VEX2(addps, x10, x10, CPTR(float_tan_p0)); /* p0 + y^2 * (p2 + y^2 * (p4 + y^2 * (p6 + p8*y^2))) */ \ VEX2(mulps, x10, x10, x7); /* y * (p0 + y^2 * (p2 + y^2 * (p4 + y^2 * (p6 + p8*y^2)))) */ \ \ /* Compute denominator with higher order terms */ \ VEX1(movaps, x8, CPTR(float_tan_q8)); /* q8 */ \ VEX2(mulps, x8, x8, x2); /* q8*y^2 */ \ VEX2(addps, x8, x8, CPTR(float_tan_q6)); /* q6 + q8*y^2 */ \ VEX2(mulps, x8, x8, x2); /* y^2 * (q6 + q8*y^2) */ \ VEX2(addps, x8, x8, CPTR(float_tan_q4)); /* q4 + y^2 * (q6 + q8*y^2) */ \ VEX2(mulps, x8, x8, x2); /* y^2 * (q4 + y^2 * (q6 + q8*y^2)) */ \ VEX2(addps, x8, x8, CPTR(float_tan_q2)); /* q2 + y^2 * (q4 + y^2 * (q6 + q8*y^2)) */ \ VEX2(mulps, x8, x8, x2); /* y^2 * (q2 + y^2 * (q4 + y^2 * (q6 + q8*y^2))) */ \ VEX2(addps, x8, x8, CPTR(float_tan_q0)); /* q0 + y^2 * (q2 + y^2 * (q4 + y^2 * (q6 + q8*y^2))) */ \ \ /* Division: numerator/denominator for regular case */ \ VEX2(divps, x1, x10, x8); /* Final result: tan(y) = numerator/denominator */ \ \ /* Select the appropriate result based on conditions */ \ /* If close to asymptote, use asymptotic approximation, else use rational approximation */ \ VEX1(movaps, x2, x5); /* Load asymptote condition */ \ VEX2(andps, x2, x2, x9); /* asymptotic * (distToAsymptote < asympt_limit) */ \ VEX2(andnps, x5, x5, x1); /* rational * !(distToAsymptote < asympt_limit) */ \ VEX2(orps, x1, x5, x2); /* Blend asymptotic and rational results */ \ \ /* If very small value, use y itself, otherwise use computed result */ \ VEX2(andnps, x5, x3, x1); /* result * !(abs_y < small_limit) */ \ VEX2(orps, x0, x3, x5); /* Final result with small value handling */ \ } // Fast tangent approximation for AVX version #define TAN_PS_AVX(x0) { \ YmmReg x1, x2, x3, x4, x5, x6, x7, x8, x9, x10; \ /* Normalize to [-pi, pi] using multiplication and subtraction */ \ vmovaps(x1, CPTR_AVX(float_invpi)); /* 1/pi */ \ vmulps(x2, x0, x1); /* x / pi */ \ vroundps(x3, x2, FROUND_TO_NEAREST_INT); /* round(x / pi) */ \ vmovaps(x4, CPTR_AVX(float_pi1)); /* Load pi1 (highest precision part) */ \ vmulps(x5, x3, x4); /* round(x / pi) * pi1 */ \ vsubps(x6, x0, x5); /* Remainder after subtracting largest part */ \ /* Subtract remaining parts for higher precision */ \ vmovaps(x7, CPTR_AVX(float_pi2)); \ vmulps(x7, x3, x7); /* round(x / pi) * pi2 */ \ vsubps(x6, x6, x7); /* Further refine remainder */ \ vmovaps(x7, CPTR_AVX(float_pi3)); \ vmulps(x7, x3, x7); /* round(x / pi) * pi3 */ \ vsubps(x6, x6, x7); /* Further refine remainder */ \ vmovaps(x7, CPTR_AVX(float_pi4)); \ vmulps(x7, x3, x7); /* round(x / pi) * pi4 */ \ vsubps(x6, x6, x7); /* Final remainder, now x is in range [-pi, pi] */ \ /* Check range for symmetry, normalize to [-pi/2, pi/2] */ \ vmulps(x5, x4, CPTR_AVX(elfloat_half)); /* halfPI = pi/2 */ \ vcmpps(x7, x6, x5, _CMP_GT_OQ); /* y > halfPI */ \ vsubps(x8, x4, x6); /* pi - y */ \ vblendvps(x6, x6, x8, x7); /* if (y > halfPI) y = pi - y; */ \ /* Check for y < -halfPI */ \ vxorps(x7, x5, CPTR_AVX(elsignmask)); /* -halfPI */ \ vcmpps(x8, x6, x7, _CMP_LT_OQ); /* y < -halfPI */ \ vxorps(x2, x4, CPTR_AVX(elsignmask)); /* -pi */ \ vsubps(x2, x2, x6); /* -pi - y */ \ vblendvps(x6, x6, x2, x8); /* if (y < -halfPI) y = -pi - y; */ \ /* now y is in [-pi/2, pi/2] */ \ /* Range reduction end */ \ \ /* Check for small values */ \ vandps(x2, x6, CPTR_AVX(elabsmask)); /* abs_y */ \ vcmpps(x3, x2, CPTR_AVX(float_tan_small_limit), _CMP_LT_OQ); /* abs_y < small_limit */ \ /* Save small value result for later blending */ \ vandps(x7, x6, x3); /* y * (abs_y < small_limit) */ \ \ /* Check for asymptotic proximity */ \ vmovaps(x4, x5); /* Load halfPI */ \ vsubps(x4, x4, x2); /* distToAsymptote = halfPI - abs_y */ \ vcmpps(x5, x4, CPTR_AVX(float_tan_asympt_limit), _CMP_LT_OQ); /* distToAsymptote < asympt_limit */ \ \ /* Calculate asymptotic approximation */ \ vmulps(x8, x4, CPTR_AVX(float_tan_asympt_a2)); /* distToAsymptote * 0.35f */ \ vaddps(x8, x8, CPTR_AVX(float_tan_asympt_a1)); /* 0.97f + distToAsymptote * 0.35f */ \ vmulps(x8, x8, x4); /* distToAsymptote * (0.97f + distToAsymptote * 0.35f) */ \ vmovaps(x4, CPTR_AVX(elfloat_one)); /* Load 1.0f */ \ vdivps(x9, x4, x8); /* 1.0f / (distToAsymptote * (0.97f + distToAsymptote * 0.35f)) */ \ \ /* Adjust sign for asymptotic approximation */ \ vmovaps(x8, x6); /* original y */ \ vandps(x8, x8, CPTR_AVX(elsignmask)); /* sign of y */ \ vxorps(x9, x9, x8); /* apply sign to asymptotic result */ \ \ /* Calculate rational approximation for regular values */ \ vmulps(x2, x6, x6); /* y^2 */ \ \ /* Compute numerator with higher order terms using FMA instructions */ \ vmovaps(x10, CPTR_AVX(float_tan_p8)); /* p8 */ \ vfmadd213ps(x10, x2, CPTR_AVX(float_tan_p6)); /* p6 + p8*y^2 */ \ vfmadd213ps(x10, x2, CPTR_AVX(float_tan_p4)); /* p4 + y^2 * (p6 + p8*y^2) */ \ vfmadd213ps(x10, x2, CPTR_AVX(float_tan_p2)); /* p2 + y^2 * (p4 + y^2 * (p6 + p8*y^2)) */ \ vfmadd213ps(x10, x2, CPTR_AVX(float_tan_p0)); /* p0 + y^2 * (p2 + y^2 * (p4 + y^2 * (p6 + p8*y^2))) */ \ vmulps(x10, x10, x6); /* y * (p0 + y^2 * (p2 + y^2 * (p4 + y^2 * (p6 + p8*y^2)))) */ \ \ /* Compute denominator with higher order terms using FMA instructions */ \ vmovaps(x8, CPTR_AVX(float_tan_q8)); /* q8 */ \ vfmadd213ps(x8, x2, CPTR_AVX(float_tan_q6)); /* q6 + q8*y^2 */ \ vfmadd213ps(x8, x2, CPTR_AVX(float_tan_q4)); /* q4 + y^2 * (q6 + q8*y^2) */ \ vfmadd213ps(x8, x2, CPTR_AVX(float_tan_q2)); /* q2 + y^2 * (q4 + y^2 * (q6 + q8*y^2)) */ \ vfmadd213ps(x8, x2, CPTR_AVX(float_tan_q0)); /* q0 + y^2 * (q2 + y^2 * (q4 + y^2 * (q6 + q8*y^2))) */ \ \ /* Division: numerator/denominator */ \ vdivps(x1, x10, x8); /* tan(y) = numerator/denominator */ \ \ /* Select appropriate result based on conditions */ \ /* If close to asymptote, use asymptotic approximation, else use rational approximation */ \ vblendvps(x1, x1, x9, x5); /* Blend asymptotic and rational results */ \ \ /* If very small value, use y itself, otherwise use computed result */ \ vblendvps(x0, x1, x7, x3); /* Final result with small value handling */ \ } // atan2: based on https://stackoverflow.com/questions/46210708/atan2-approximation-with-11bits-in-mantissa-on-x86with-sse2-and-armwith-vfpv4?noredirect=1&lq=1 #if 0 float fast_atan2f(float y, float x) { // max rel err = 3.53486939e-5 const float atan2f_rmul = 0.024840285f; const float atan2f_radd = 0.18681418f; const float atan2f_tmul = -0.094097948f; const float atan2f_tadd = -0.33213072f; const float atan2f_halfpi = 1.57079637f; const float atan2f_pi = 3.14159274f; float a, r, s, t, c, q, ax, ay, mx, mn; ax = fabsf(x); ay = fabsf(y); mx = fmaxf(ay, ax); mn = fminf(ay, ax); a = mn / mx; // Minimax polynomial approximation to atan(a) on [0,1] s = a * a; c = s * a; q = s * s; r = atan2f_rmul * q + atan2f_radd; t = atan2f_tmul * q + atan2f_tadd; r = r * s + t; r = r * c + a; // Map to full circle if (ay > ax) r = atan2f_halfpi - r; if (x < 0) r = atan2f_pi - r; if (y < 0) r = -r; return r; } #endif // atan2(0, 0) = 0 // ~speed: "y x atan2" C/SSE2/AVX2:52/480/1000 fps #define ATAN2_PS(x0 /*y*/, /*x*/x1) { \ XmmReg x2, x3, x4, x5, x6, x7, x8; \ /*VEX1(movaps, x1, x);*/ \ /*VEX1(movaps, x0, y);*/ \ /* Remove sign */ \ VEX1(movaps, x3, CPTR(elabsmask)); \ VEX1(movaps, x2, x1); \ VEX2(andps, x2, x2, x3); /* ax = fabsf (x); */ \ VEX2(andps, x3, x3, x0); /* ay = fabsf (y); */ \ VEX1(movaps, x4, x3); \ VEX2(maxps, x4, x4, x2); /* mx = fmaxf (ay, ax); */ \ VEX1(movaps, x5, x3); \ VEX2(minps, x5, x5, x2); /* fminf (ay, ax); */ \ VEX2(divps, x5, x5, x4); /* a = mn / mx; */ \ VEX1(movaps, x4, x5); \ VEX2(mulps, x4, x4, x5); /* s = a * a; */ \ VEX1(movaps, x6, x4); \ VEX2(mulps, x6, x6, x4); /* q = s * s; */ \ VEX1(movaps, x7, CPTR(float_atan2f_rmul)); \ VEX2(mulps, x7, x7, x6); /* r = atan2f_rmul * q (+ atan2f_radd) */ \ VEX2(addps, x7, x7, CPTR(float_atan2f_radd)); /* r = (atan2f_rmul * q) + atan2f_radd; */ \ VEX2(mulps, x7, x7, x4); /* r = r * s (+ t) */ \ VEX2(mulps, x4, x4, x5); /* c = s * a; */ \ VEX2(mulps, x6, x6, CPTR(float_atan2f_tmul)); /* t = atan2f_tmul * q (+ atan2f_tadd) */ \ VEX2(addps, x6, x6, CPTR(float_atan2f_tadd)); /* t = (atan2f_tmul * q) + atan2f_tadd; */ \ VEX2(addps, x7, x7, x6); /* r = (r * s) + t; */ \ VEX2(mulps, x7, x7, x4); /* r = r * c (+ a) */ \ VEX2(addps, x7, x7, x5); /* r = (r * c) + a */ \ /* Map to full circle */ \ /* if (ay > ax) r = atan2f_halfpi - r; */ \ /* if (x < 0) r = atan2f_pi - r; */ \ /* if (y < 0) r = -r; */ \ /* r = atan2f_halfpi - r */ \ VEX1(movaps, x4, CPTR(float_atan2f_halfpi)); \ VEX2(subps, x4, x4, x7); /* r = atan2f_halfpi - r */ \ VEX2(cmpltps, x2, x2, x3); /* if (ay > ax) */ \ /* blend */ \ VEX1(movaps, x3, x2); \ VEX2(andnps, x3, x3, x7); \ VEX2(andps, x2, x2, x4); \ VEX2(orps, x2, x2, x3); \ /* r = atan2f_pi - r; */ \ VEX1(movaps, x3, CPTR(float_atan2f_pi)); \ VEX2(subps, x3, x3, x2); /* r = atan2f_pi - r */ \ /* if (x < 0) */ \ VEX2(xorps, x4, x4, x4); /* zero */ \ VEX2(cmpltps, x1, x1, x4); /* if (x < 0) */ \ /* blend */ \ VEX1(movaps, x5, x1); \ VEX2(andnps, x5, x5, x2); \ VEX2(andps, x1, x1, x3); \ VEX2(orps, x1, x1, x5); \ /* r = -r; */ \ VEX1(movaps, x2, CPTR(elsignmask)); \ VEX2(subps, x2, x2, x1); /* r = -r */ \ /* if (y < 0) */ \ VEX2(cmpltps, x0, x0, x4); /* if (y < 0) */ \ /* blend */ \ VEX1(movaps, x3, x0); \ VEX2(andnps, x3, x3, x1); \ VEX2(andps, x0, x0, x2); \ VEX2(orps, x0, x0, x3); \ /* extra check when 0,0 given -> convert NaN to 0 */ \ VEX1(movaps, x3, x0); \ VEX2(cmpordps, x3, x3, x3);/* find NaNs. 0: NaN in either. FFFF: both non-Nan */ \ /* mask NaN to zero */ \ VEX2(andps, x0, x0, x3); \ /* return value in y */ \ /* input was "x0 for y */ \ } #define ATAN2_PS_AVX(x0 /*y*/, x1 /*x*/) { \ YmmReg x2, x3, x4, x5, x6, x7, x8; \ /* Remove sign */ \ /* vmovaps(x1, x); */ \ /* vmovaps(x0, y); */ \ vmovaps(x2, CPTR_AVX(elabsmask)); \ vandps(x8, x1, x2); /* ax = fabsf (x); */ \ vandps(x2, x0, x2); /* ay = fabsf (y); */ \ vmaxps(x4, x8, x2); /* mx = fmaxf (ay, ax); */ \ vminps(x5, x8, x2); /* fminf (ay, ax); */ \ vdivps(x4, x5, x4); /* a = mn / mx; */ \ vmulps(x5, x4, x4); /* s = a * a; */ \ vmulps(x6, x5, x5); /* q = s * s; */ \ vmovaps(x7, CPTR_AVX(float_atan2f_rmul)); \ vmovaps(x3, CPTR_AVX(float_atan2f_radd)); \ vfmadd213ps(x7, x6, CPTR_AVX(float_atan2f_radd)); /* r = atan2f_rmul * q + atan2f_radd; */ \ vmovaps(x3, CPTR_AVX(float_atan2f_tmul)); \ vfmadd213ps(x3, x6, CPTR_AVX(float_atan2f_tadd)); /* t = atan2f_tmul * q + atan2f_tadd */ \ vmulps(x6, x5, x4); \ vfmadd231ps(x3, x5, x7); /* r = r * s + t; */ \ vfmadd213ps(x3, x6, x4); /* r = (r * c) + a */ \ /* Map to full circle */ \ /* if (ay > ax) r = atan2f_halfpi - r; */ \ /* if (x < 0) r = atan2f_pi - r; */ \ /* if (y < 0) r = -r; */ \ /* r = atan2f_pi - r */ \ vmovaps(x4, CPTR_AVX(float_atan2f_halfpi)); \ vsubps(x4, x4, x3); /* r = atan2f_halfpi - r */ \ vcmpps(x2, x8, x2, _CMP_LT_OQ); /*vcmpltps(x2, x8, x2);*/ /* if (ay > ax) */ \ vblendvps(x2, x3, x4, x2); \ vmovaps(x3, CPTR_AVX(float_atan2f_pi)); \ vsubps(x3, x3, x2); /* r = atan2f_pi - r */ \ vxorps(x4, x4, x4); \ vcmpps(x1, x1, x4, _CMP_LT_OQ); /* vcmpltps(x1, x1, x4); */ /* if (x < 0) */ \ vblendvps(x1, x2, x3, x1); \ vmovaps(x2, CPTR_AVX(elsignmask)); \ vxorps(x2, x1, x2); /* r = -r */ \ vcmpps(x0, x0, x4, _CMP_LT_OQ); /* vcmpltps(x0, x0, x4); */ /* if (y < 0) */ \ vblendvps(x0, x1, x2, x0); \ /* extra check when 0,0 given -> convert NaN to 0 */ \ vcmpps(x3, x0, x0, _CMP_ORD_Q); /* vcmpordps, x3, x3, x3);*/ /* find NaNs. 0: NaN in either. FFFF: both non-Nan */ \ /* mask NaN to zero */ \ vandps(x0, x0, x3); \ /* return value in y */ \ /* no need. input was "x0" for y */ \ } #define SINCOS_PS(issin, y, x) { \ XmmReg t1, sign, t2, t3, t4; \ /* // Remove sign */ \ VEX1(movaps, t1, CPTR(elabsmask)); \ if (issin) { \ VEX1(movaps, sign, t1); \ VEX2(andnps, sign, sign, x); \ } \ else { \ VEX2(pxor, sign, sign, sign); \ } \ VEX2(andps, t1, t1, x); \ /*// Range reduction*/ \ VEX1(movaps, t3, CPTR(float_rintf)); \ VEX2(mulps, t2, t1, CPTR(float_invpi)); \ VEX2(addps, t2, t2, t3); \ VEX1IMM(pslld, t4, t2, 31); \ VEX2(xorps, sign, sign, t4); \ VEX2(subps, t2, t2, t3); \ if constexpr(false /*cpuFlags & CPUF_FMA3*/) { \ vfnmadd231ps(t1, t2, CPTR(float_pi1)); \ vfnmadd231ps(t1, t2, CPTR(float_pi2)); \ vfnmadd231ps(t1, t2, CPTR(float_pi3)); \ vfnmadd231ps(t1, t2, CPTR(float_pi4)); \ } \ else { \ VEX2(mulps, t4, t2, CPTR(float_pi1)); \ VEX2(subps, t1, t1, t4); \ VEX2(mulps, t4, t2, CPTR(float_pi2)); \ VEX2(subps, t1, t1, t4); \ VEX2(mulps, t4, t2, CPTR(float_pi3)); \ VEX2(subps, t1, t1, t4); \ VEX2(mulps, t4, t2, CPTR(float_pi4)); \ VEX2(subps, t1, t1, t4); \ } \ if (issin) { \ /* // Evaluate minimax polynomial for sin(x) in [-pi/2, pi/2] interval */ \ /* // Y <- X + X * X^2 * (C3 + X^2 * (C5 + X^2 * (C7 + X^2 * C9))) */ \ VEX2(mulps, t2, t1, t1); \ if constexpr(false /*cpuFlags & CPUF_FMA3*/) { \ vmovaps(t3, CPTR(float_sinC7)); \ vfmadd231ps(t3, t2, CPTR(float_sinC9)); \ vfmadd213ps(t3, t2, CPTR(float_sinC5)); \ vfmadd213ps(t3, t2, CPTR(float_sinC3)); \ VEX2(mulps, t3, t3, t2); \ vfmadd231ps(t1, t1, t3); \ } \ else { \ VEX2(mulps, t3, t2, CPTR(float_sinC9)); \ VEX2(addps, t3, t3, CPTR(float_sinC7)); \ VEX2(mulps, t3, t3, t2); \ VEX2(addps, t3, t3, CPTR(float_sinC5)); \ VEX2(mulps, t3, t3, t2); \ VEX2(addps, t3, t3, CPTR(float_sinC3)); \ VEX2(mulps, t3, t3, t2); \ VEX2(mulps, t3, t3, t1); \ VEX2(addps, t1, t1, t3); \ } \ } \ else { \ /* // Evaluate minimax polynomial for cos(x) in [-pi/2, pi/2] interval */ \ /* // Y <- 1 + X^2 * (C2 + X^2 * (C4 + X^2 * (C6 + X^2 * C8))) */ \ VEX2(mulps, t2, t1, t1); \ if constexpr(false /*cpuFlags & CPUF_FMA3*/) { \ vmovaps(t1, CPTR(float_cosC6)); \ vfmadd231ps(t1, t2, CPTR(float_cosC8)); \ vfmadd213ps(t1, t2, CPTR(float_cosC4)); \ vfmadd213ps(t1, t2, CPTR(float_cosC2)); \ vfmadd213ps(t1, t2, CPTR(elfloat_one)); \ } \ else { \ VEX2(mulps, t1, t2, CPTR(float_cosC8)); \ VEX2(addps, t1, t1, CPTR(float_cosC6)); \ VEX2(mulps, t1, t1, t2); \ VEX2(addps, t1, t1, CPTR(float_cosC4)); \ VEX2(mulps, t1, t1, t2); \ VEX2(addps, t1, t1, CPTR(float_cosC2)); \ VEX2(mulps, t1, t1, t2); \ VEX2(addps, t1, t1, CPTR(elfloat_one)); \ } \ } \ /*// Apply sign */ \ VEX2(xorps, y, t1, sign); \ } // y dst x src #define SINCOS_PS_AVX(issin, y, x) { \ YmmReg t1, sign, t2, t3, t4; \ /* // Remove sign */ \ vmovaps(t1, CPTR_AVX(elabsmask)); \ if (issin) { \ vmovaps(sign, t1); \ vandnps(sign, sign, x); \ } \ else { \ vxorps(sign, sign, sign); \ } \ vandps(t1, t1, x); \ /*// Range reduction*/ \ vmovaps(t3, CPTR_AVX(float_rintf)); \ vmulps(t2, t1, CPTR_AVX(float_invpi)); \ vaddps(t2, t2, t3); \ vpslld(t4, t2, 31); \ vxorps(sign, sign, t4); \ vsubps(t2, t2, t3); \ vfnmadd231ps(t1, t2, CPTR_AVX(float_pi1)); \ vfnmadd231ps(t1, t2, CPTR_AVX(float_pi2)); \ vfnmadd231ps(t1, t2, CPTR_AVX(float_pi3)); \ vfnmadd231ps(t1, t2, CPTR_AVX(float_pi4)); \ if (issin) { \ /* // Evaluate minimax polynomial for sin(x) in [-pi/2, pi/2] interval */ \ /* // Y <- X + X * X^2 * (C3 + X^2 * (C5 + X^2 * (C7 + X^2 * C9))) */ \ vmulps(t2, t1, t1); \ vmovaps(t3, CPTR_AVX(float_sinC7)); \ vfmadd231ps(t3, t2, CPTR_AVX(float_sinC9)); \ vfmadd213ps(t3, t2, CPTR_AVX(float_sinC5)); \ vfmadd213ps(t3, t2, CPTR_AVX(float_sinC3)); \ vmulps(t3, t3, t2); \ vfmadd231ps(t1, t1, t3); \ } \ else { \ /* // Evaluate minimax polynomial for cos(x) in [-pi/2, pi/2] interval */ \ /* // Y <- 1 + X^2 * (C2 + X^2 * (C4 + X^2 * (C6 + X^2 * C8))) */ \ vmulps(t2, t1, t1); \ vmovaps(t1, CPTR_AVX(float_cosC6)); \ vfmadd231ps(t1, t2, CPTR_AVX(float_cosC8)); \ vfmadd213ps(t1, t2, CPTR_AVX(float_cosC4)); \ vfmadd213ps(t1, t2, CPTR_AVX(float_cosC2)); \ vfmadd213ps(t1, t2, CPTR_AVX(elfloat_one)); \ } \ /*// Apply sign */ \ vxorps(y, t1, sign); \ } // return (x - std::round(x / d)*d); #define FMOD_PS(x, d) { \ XmmReg aTmp; \ movaps(aTmp, x); \ divps(aTmp, d); \ cvttps2dq(aTmp,aTmp); \ cvtdq2ps(aTmp,aTmp); \ mulps(aTmp, d); \ subps(x, aTmp); } #define FMOD_PS_AVX(x, d) { \ YmmReg aTmp; \ vdivps(aTmp, x, d); \ vcvttps2dq(aTmp,aTmp); \ vcvtdq2ps(aTmp,aTmp); \ vmulps(aTmp, aTmp, d); \ vsubps(x, x, aTmp); } struct ExprEval : public jitasm::function { std::vector ops; int numInputs; int cpuFlags; int planeheight; int planewidth; bool singleMode; int labelCount; // to have unique label strings std::string getLabelCount() { return std::to_string(++labelCount); } ExprEval(std::vector &ops, int numInputs, int cpuFlags, int planewidth, int planeheight, bool singleMode) : ops(ops), numInputs(numInputs), cpuFlags(cpuFlags), planeheight(planeheight), planewidth(planewidth), singleMode(singleMode), labelCount(0) {} AVS_FORCEINLINE void doMask(XmmReg &r, Reg &constptr, int _planewidth) { switch (_planewidth & 3) { case 1: andps(r, CPTR(loadmask1000)); break; case 2: andps(r, CPTR(loadmask1100)); break; case 3: andps(r, CPTR(loadmask1110)); break; } } template AVS_FORCEINLINE void processingLoop(Reg ®ptrs, XmmReg &zero, Reg &constptr, Reg &SpatialY) { std::list> stack; std::list stack1; const int pixels_per_cycle = processSingle ? 4 : 8; const bool maskIt = (maskUnused && ((planewidth & 3) != 0)); for (const auto &iter : ops) { if (iter.op == opLoadSpatialX) { if (processSingle) { XmmReg r1; movd(r1, dword_ptr[regptrs + sizeof(void *) * (RWPTR_START_OF_XCOUNTER)]); shufps(r1, r1, 0); cvtdq2ps(r1, r1); addps(r1, CPTR(spatialX)); stack1.push_back(r1); } else { XmmReg r1, r2; movd(r1, dword_ptr[regptrs + sizeof(void *) * (RWPTR_START_OF_XCOUNTER)]); shufps(r1, r1, 0); cvtdq2ps(r1, r1); movaps(r2, r1); addps(r1, CPTR(spatialX)); addps(r2, CPTR(spatialX2)); stack.push_back(std::make_pair(r1, r2)); } } else if (iter.op == opLoadSpatialY) { if (processSingle) { XmmReg r1; movd(r1, SpatialY); shufps(r1, r1, 0); cvtdq2ps(r1, r1); stack1.push_back(r1); } else { XmmReg r1, r2; movd(r1, SpatialY); shufps(r1, r1, 0); cvtdq2ps(r1, r1); movaps(r2, r1); stack.push_back(std::make_pair(r1, r2)); } } else if (iter.op == opLoadInternalVar) { if (processSingle) { XmmReg r1; movd(r1, dword_ptr[regptrs + sizeof(void *) * (iter.e.ival + RWPTR_START_OF_INTERNAL_VARIABLES)]); shufps(r1, r1, 0); stack1.push_back(r1); } else { XmmReg r1, r2; movd(r1, dword_ptr[regptrs + sizeof(void *) * (iter.e.ival + RWPTR_START_OF_INTERNAL_VARIABLES)]); shufps(r1, r1, 0); movaps(r2, r1); stack.push_back(std::make_pair(r1, r2)); } } else if (iter.op == opLoadFramePropVar) { if (processSingle) { XmmReg r1; movd(r1, dword_ptr[regptrs + sizeof(void*) * (iter.e.ival + RWPTR_START_OF_INTERNAL_FRAMEPROP_VARIABLES)]); shufps(r1, r1, 0); stack1.push_back(r1); } else { XmmReg r1, r2; movd(r1, dword_ptr[regptrs + sizeof(void*) * (iter.e.ival + RWPTR_START_OF_INTERNAL_FRAMEPROP_VARIABLES)]); shufps(r1, r1, 0); movaps(r2, r1); stack.push_back(std::make_pair(r1, r2)); } } else if (iter.op == opLoadRelSrc8 || iter.op == opLoadRelSrc16 || iter.op == opLoadRelSrcF32) { // either dx or dy is nonzero // common part follows for single 4 pixels/cycle and dual 8 pixels/cycle Reg newx; if (iter.dx != 0) { mov(newx, ptr[regptrs + sizeof(void *) * (RWPTR_START_OF_XCOUNTER)]); // original base add(newx, iter.dx); // new base } Reg a; mov(a, ptr[regptrs + sizeof(void *) * (iter.e.ival + RWPTR_START_OF_INPUTS)]); // current pixel group of current line // adjust read pointer vertically for nonzero dy, keep 0..height-1 limits if (iter.dy < 0) { // Read from above Reg dy, sy; mov(sy, SpatialY); mov(dy, -iter.dy); // dy = -dy; cmp(dy, sy); cmovg(dy, sy); // mov if greater: if (dy > SpatialY) dy = SpatialY; #ifdef JITASM64 imul(dy, qword_ptr[regptrs + sizeof(void *) * (iter.e.ival + RWPTR_START_OF_STRIDES)]); // dy * stride #else imul(dy, dword_ptr[regptrs + sizeof(void *) * (iter.e.ival + RWPTR_START_OF_STRIDES)]); // dy * stride #endif sub(a, dy); // a -= dy * stride } else if (iter.dy > 0) { // Read from bottom Reg dy, sy; mov(sy, planeheight - 1); sub(sy, SpatialY); mov(dy, iter.dy); cmp(dy, sy); cmovg(dy, sy); // mov if greater: if (dy > (planeheight - 1) - SpatialY) dy = SpatialY; #ifdef JITASM64 imul(dy, qword_ptr[regptrs + sizeof(void *) * (iter.e.ival + RWPTR_START_OF_STRIDES)]); // dy * stride #else imul(dy, dword_ptr[regptrs + sizeof(void *) * (iter.e.ival + RWPTR_START_OF_STRIDES)]); // dy * stride #endif add(a, dy); // a += dy * stride } // dy shift is done already. newx holds xcounter + dx // Cases: // ReadBefore: xcounter + dx < 0 (only when dx < 0): // FullReadBefore: dx <= pixels_per_cycle: clone leftmost pixel to each pixel posision in the group // PartialReadBefore: pixels_per_cycle < dx < 0: close leftmost pixel to -dx positions // NormalRead: 0 <= xcounter + dx < planewidth - (pixels_per_cycle - 1) (can read whole pixel group) // OverRead: // PartialOverRead when pixel at (planewidth-1) is current read position // PartialOverRead when pixel at (planewidth-1) is after current read position // FullOverRead: clone pixel at (planewidth-1) to each pixel posision in the group if (processSingle) { // LoadRel8/16/32, single register mode 1x4 pixels // Use getLabelCount: names should be unique across multiple calls to processingLoop std::string LabelNeg = "neg" + getLabelCount(); std::string LabelOver = "over" + getLabelCount(); std::string LabelEnd = "end" + getLabelCount(); XmmReg r1; if (iter.dx < 0) { // Optim: read from left is possible only for dx<0 case cmp(newx, 0); jl(LabelNeg); // newx < 0, read (partially or fully) from before the leftmost pixel } if (iter.dx != 0) { // Optim: read after rightmost pixel is possible only for dx>0 case // Also check for dx<0, because of possible memory overread // e.g.: planewidth = 64, dx = -1, 16 bit pixels, 16 bytes/cycle, reading from offsets -1(0), 15, 31, 47, then 63 // When we read 16 bytes from offset 63, we are overaddressing the 64 byte scanline, // which may give access violation when pointer is in the most bottom line. cmp(newx, planewidth - (pixels_per_cycle - 1)); // read (partially of fully) after the rightmost pixel jge(LabelOver); } // It's safe to read the whole pixel group int offset; if (iter.op == opLoadRelSrc8) offset = iter.dx; else if (iter.op == opLoadRelSrc16) offset = iter.dx * sizeof(uint16_t); else if (iter.op == opLoadRelSrcF32) offset = iter.dx * sizeof(float); if (iter.op == opLoadRelSrc8) { movd(r1, dword_ptr[a + offset]); // 4 pixels, 4 bytes punpcklbw(r1, zero); punpcklwd(r1, zero); cvtdq2ps(r1, r1); } else if (iter.op == opLoadRelSrc16) { movq(r1, mmword_ptr[a + offset]); // 4 pixels, 8 bytes punpcklwd(r1, zero); cvtdq2ps(r1, r1); } else if (iter.op == opLoadRelSrcF32) { if (iter.dx % 4 == 0) movdqa(r1, xmmword_ptr[a + offset]); // 4 pixels, 16 bytes aligned else movdqu(r1, xmmword_ptr[a + offset]); // 4 pixels, 16 bytes unaligned } if (iter.dx != 0) { jmp(LabelEnd); // generate jump only when over/negative branches exist } if (iter.dx != 0) { L(LabelOver); std::string PartialOverread = "PartialOverread" + getLabelCount(); std::string NoFullOverReadFromNewX = "NoFullOverReadFromNewX" + getLabelCount(); std::string labelDoOver = "DoOver" + getLabelCount(); if (iter.dx > 0) { // FullOverRead possible only when dx>0 cmp(newx, planewidth); jl(PartialOverread); // if newx < planewidth -> // case: FullOver // even the first pixel to read is beyond the end of line // We have to clone the rightmost pixel from (planewidth-1) if (iter.op == opLoadRelSrc8) { sub(a, ptr[regptrs + sizeof(void *) * (RWPTR_START_OF_XCOUNTER)]); add(a, planewidth - 1); // reuse newx movzx(newx, byte_ptr[a]); movd(r1, newx); punpcklbw(r1, zero); // words pshufb(r1, CPTR(elShuffleForRight6)); // duplicate last word to all punpcklwd(r1, zero); cvtdq2ps(r1, r1); } else if (iter.op == opLoadRelSrc16) { Reg tmp; mov(tmp, ptr[regptrs + sizeof(void *) * (RWPTR_START_OF_XCOUNTER)]); shl(tmp, 1); // for 16 bit 2*xcounter sub(a, tmp); add(a, (planewidth - 1) * 2); // reuse newx movzx(newx, word_ptr[a]); movd(r1, newx); pshufb(r1, CPTR(elShuffleForRight6)); // duplicate last word to all punpcklwd(r1, zero); cvtdq2ps(r1, r1); } else if (iter.op == opLoadRelSrcF32) { Reg tmp; mov(tmp, ptr[regptrs + sizeof(void *) * (RWPTR_START_OF_XCOUNTER)]); shl(tmp, 2); // for 32 bit 4*xcounter sub(a, tmp); add(a, (planewidth - 1) * 4); movd(r1, dword_ptr[a]); pshufd(r1, r1, (0 << 0) | (0 << 2) | (0 << 4) | (0 << 6)); } jmp(LabelEnd); } // full OverRead path, needed when iter.dx>0 // case: Partial overread // read the block, then clone the last valid pixel from position (planewidth-1) // problem: newx is not aligned L(PartialOverread); // planewidth == 14 dx=7 newx = 0+7=7, newx>=planewidth-7, then not newx>=planewidth => newx = 13 => planewidth-newx = 1 // sample 1: newx is in different segment than planewidth-1 // [xcounter] // [a] [newx] [pw-1] // V V V // 0 1 2 3 4 5 6 7 8 9 A B C D e f g h i j k l // P Q R S T U V w need this // 0 1 2 3 4 5 6 7 we can read this // P Q R S T U V w last pixel is beyond // P Q R S T U V V need this // sample 2: newx is in the same segment than planewidth-1 // planewidth == 13 dx=3 // [xcounter] [newx] // [a][newx][pw-1] // V V V // 0 1 2 3 4 5 6 7 8 9 A B C d e f g h i j // P Q x x x x x x need this // P Q Q Q Q Q Q Q duplicated the last valid pixel // 0 1 2 3 4 5 6 7 we can read this // when newx and (planewidth-1) are in different segments then we read from newx Reg tmp; mov(tmp, newx); and_(tmp, ~(pixels_per_cycle - 1)); cmp(tmp, (planewidth & ~(pixels_per_cycle - 1))); jle(NoFullOverReadFromNewX); // jump if (newx and ~0x07) < (planewidth & ~0x07) (in another segment) // read from current (last) pointer, if (iter.op == opLoadRelSrc8 || iter.op == opLoadRelSrc16) { if (iter.op == opLoadRelSrc8) { movd(r1, dword_ptr[a]); // 4 pixels, 4 bytes punpcklbw(r1, zero); // words } else { // opLoadRel16 movq(r1, mmword_ptr[a]); // 8 pixels, 16 bytes, here still aligned } /* psrldq(r1, ((planewidth - 1) & (pixels_per_cycle - 1)) * sizeof(uint16_t)); // Shift right by (planewidth - 1) & 7 to lose low words sub(newx, planewidth - (pixels_per_cycle - 1)); // find out shuffle pointer -1, ... -7 -> 6 ... 0 shl(newx, 4); // *16 for shuffle table // LabelDoOver copied here // reuse a : Reg shuffleTable; lea(a, CPTR(elShuffleForRight0)); // ptr for word shuffle pshufb(r1, xmmword_ptr[a + newx]); */ punpcklwd(r1, zero); cvtdq2ps(r1, r1); //jmp(LabelEnd); //jmp(labelDoOver); } else if (iter.op == opLoadRelSrcF32) { // omg it's complicated movdqa(r1, xmmword_ptr[a]); // 4 pixels, 16 bytes, here still aligned } int bytes_to_shift = ((planewidth - 1) & (pixels_per_cycle - 1)) * sizeof(float); if (bytes_to_shift > 0) { psrldq(r1, bytes_to_shift); switch (bytes_to_shift) { // 4, 8, 12 case 4: pshufd(r1, r1, (0 << 0) | (1 << 2) | (2 << 4) | (2 << 6)); break; case 8: pshufd(r1, r1, (0 << 0) | (1 << 2) | (1 << 4) | (1 << 6)); break; case 12: pshufd(r1, r1, (0 << 0) | (0 << 2) | (0 << 4) | (0 << 6)); break; } } jmp(LabelEnd); //} L(NoFullOverReadFromNewX); // read from newx if (iter.op == opLoadRelSrc8) { sub(a, ptr[regptrs + sizeof(void *) * (RWPTR_START_OF_XCOUNTER)]); // back x counter bytes to the beginning add(a, newx); // new position movd(r1, dword_ptr[a]); // 4 pixels, 4 bytes punpcklbw(r1, zero); // words /* // no shift here, just duplicate appropriate pixel into the high ones mov(newx, (6 - ((planewidth - iter.dx - 1) & (pixels_per_cycle - 1))) << 4); // find out shuffle pointer // shuffle by the pattern, table offset in newx, and finalizes // here r1 contains words // todo direct load Reg shuffleTable; lea(shuffleTable, CPTR(elShuffleForRight4)); // for dual: elShuffleForRight0 add(shuffleTable, newx); pshufb(r1, xmmword_ptr[shuffleTable]); */ punpcklwd(r1, zero); cvtdq2ps(r1, r1); } else if (iter.op == opLoadRelSrc16) { //a = a - 2 * xcounter + 2 * newx; sub(newx, ptr[regptrs + sizeof(void *) * (RWPTR_START_OF_XCOUNTER)]); shl(newx, 1); add(a, newx); movq(r1, mmword_ptr[a]); // 4 pixels, 8 bytes // no shift here, just duplicate appropriate pixel into the high ones /* // reuse newx mov(newx, (6 - ((planewidth - iter.dx - 1) & (pixels_per_cycle - 1))) << 4); // find out shuffle pointer // ((planewidth - iter.dx - 1) & (pixels_per_cycle - 1)) keep // 0 ShuffleForRight6 keep word #0, spread it to 1..7 // 1 ShuffleForRight5 keep word #0..1, spread it to 2..7 // // 6 ShuffleForRight0 keep word #0..6, spread it to 7..7 // continues on labelDoOver // todo direct load Reg shuffleTable; lea(shuffleTable, CPTR(elShuffleForRight4)); // for dual: elShuffleForRight0 add(shuffleTable, newx); pshufb(r1, xmmword_ptr[shuffleTable]); */ punpcklwd(r1, zero); cvtdq2ps(r1, r1); } else if (iter.op == opLoadRelSrcF32) { //a = a - 4 * xcounter + 4 * newx; sub(newx, ptr[regptrs + sizeof(void *) * (RWPTR_START_OF_XCOUNTER)]); shl(newx, 2); add(a, newx); // no real shift here, just duplicate appropriate pixel into the high ones. But we have two registers movdqu(r1, xmmword_ptr[a]); // 4 pixels, 16 bytes, no need for upper 4 pixels } // we have 4 floats here in r1, common part int what = ((planewidth - iter.dx - 1) & (pixels_per_cycle - 1)); // what // 0 ShuffleForRight2_32 keep r1 dword #0 , spread it to 1..3, then spread r1.3 to r2 (ShuffleForRight2_32(r2,r1) // 1 ShuffleForRight1_32 keep r1 dword #0..1, spread it to 2..3, then spread r1.3 to r2 // 2 ShuffleForRight0_32 keep r1 dword #0..2, spread it to 3 , then spread r1.3 to r2 // 3 keep r1 dword #0..3, , then spread r1.3 to r2 // 4 keep r1 dword #0..3, , keep r2 dword #0 , spread it to 1..3 // 5 keep r1 dword #0..3, , keep r2 dword #0..1, spread it to 2..3 // 6 keep r1 dword #0..3, , keep r2 dword #0..2, spread it to 3 switch (what) { case 0: pshufd(r1, r1, (0 << 0) | (0 << 2) | (0 << 4) | (0 << 6)); // fill 3 upper dwords of r1 from r1.0 break; case 1: pshufd(r1, r1, (0 << 0) | (1 << 2) | (1 << 4) | (1 << 6)); // fill 2 upper dwords of r1 from r1.1 break; case 2: pshufd(r1, r1, (0 << 0) | (1 << 2) | (2 << 4) | (2 << 6)); // fill 1 upper dwords of r1 from r1.2 break; } // continues on labelEnd //} if (iter.dx < 0) jmp(LabelEnd); } // over: iter.dx != 0 if (iter.dx < 0) { L(LabelNeg); // read from negative area on the left side, read exactly from 0th, then shift // When reading from negative x coordinates we read exactly from 0th, then shift and duplicate // For extreme minus offsets we duplicate 0th (leftmost) pixel to each position // example: dx = -1 // -1 0 1 2 3 4 5 6 7 // A A B C D E F G we need this // A B C D E F G H read [0] // 0 A B C D E F G H shift // A A B C D E F G H duplicate by shuffle if (iter.op == opLoadRelSrc8 || iter.op == opLoadRelSrc16) { if (iter.op == opLoadRelSrc8) { sub(a, ptr[regptrs + sizeof(void *) * (RWPTR_START_OF_XCOUNTER)]); // go back to the beginning movd(r1, dword_ptr[a]); // 8 pixels, 8 bytes punpcklbw(r1, zero); // bytes to words } else if (iter.op == opLoadRelSrc16) { // go back to the beginning, in 16 bit, *2 Reg tmp; mov(tmp, ptr[regptrs + sizeof(void *) * (RWPTR_START_OF_XCOUNTER)]); shl(tmp, 1); // for 16 bit 2*xcounter sub(a, tmp); movq(r1, mmword_ptr[a]); // 8 pixels, 16 bytes } punpcklwd(r1, zero); cvtdq2ps(r1, r1); } else if (iter.op == opLoadRelSrcF32) { Reg tmp; mov(tmp, ptr[regptrs + sizeof(void *) * (RWPTR_START_OF_XCOUNTER)]); shl(tmp, 2); // *4 sub(a, tmp); movdqa(r1, xmmword_ptr[a]); // 4 pixels, 16 bytes aligned } std::string PartialReadBefore = "PartialReadBefore" + getLabelCount(); cmp(newx, -pixels_per_cycle); jg(PartialReadBefore); // FullReadBefore: newx <= -pixels_per_cycle, clone 0th (leftmost) pixel to all pshufd(r1, r1, (0 << 0) | (0 << 2) | (0 << 4) | (0 << 6)); jmp(LabelEnd); L(PartialReadBefore); // -pixels_per_cycle < newx < 0 int bytes_to_shift = sizeof(float) * min(pixels_per_cycle - 1, (-iter.dx) & (pixels_per_cycle - 1)); // shift bytes // 4 r1 << 4 shuffle r1.1 to r1.0-0 // 8 r1 << 8 shuffle r1.2 to r1.0-1 // 12 r1 << 12 shuffle r1.3 to r1.0-2 pslldq(r1, bytes_to_shift); // todo: shift + shuffle = single shuffle switch (bytes_to_shift) { // 4, 8, 12 case 4: pshufd(r1, r1, (1 << 0) | (1 << 2) | (2 << 4) | (3 << 6)); // elShuffleForLeft0_32 // shuffle r1.1 to r1.0-0 break; case 8: pshufd(r1, r1, (2 << 0) | (2 << 2) | (2 << 4) | (3 << 6)); // elShuffleForLeft1_32 // shuffle r1.2 to r1.0-1 break; case 12: pshufd(r1, r1, (3 << 0) | (3 << 2) | (3 << 4) | (3 << 6)); // elShuffleForLeft2_32 // shuffle r1.3 to r1.0-2 break; } } // negative L(LabelEnd); stack1.push_back(r1); } // end of single Relative Mode else { // LoadRel8/16/32, dual register mode 2x4 pixels // Use getLabelCount: names should be unique across multiple calls to processingLoop std::string LabelNeg = "neg" + getLabelCount(); std::string LabelOver = "over" + getLabelCount(); std::string LabelEnd = "end" + getLabelCount(); XmmReg r1, r2; // damn, when the order of the two comparisons is exchanged, bad code is generated for dx=-1 (expr=x[-1]). // jitasm cannot guess the proper register for 'a', it uses register 'xcounter' instead // maybe the jump order has to match the label order? // good: LabelOver, LabelNeg. Bad: LabelNeg, LabelOver // But it's not true. Now x[-2] fails for 32 bit clip if (iter.dx < 0) { // Optim: read from left is possible only for dx<0 case cmp(newx, 0); jl(LabelNeg); // newx < 0, read (partially or fully) from before the leftmost pixel } if (iter.dx != 0) { // Also check for dx<0, because of possible memory overread // e.g.: planewidth = 64, dx = -1, 16 bit pixels, 16 bytes/cycle, reading from offsets -1(0), 15, 31, 47, then 63 // When we read 16 bytes from offset 63, we are overaddressing the 64 byte scanline, // which may give access violation when pointer is in the most bottom line. cmp(newx, planewidth - (pixels_per_cycle - 1)); // read (partially of fully) after the rightmost pixel jge(LabelOver); } /* if (iter.dx < 0) { // Optim: read from left is possible only for dx<0 case cmp(newx, 0); jl(LabelNeg); // newx < 0, read (partially or fully) from before the leftmost pixel } */ // It's safe to read the whole pixel group int offset; if (iter.op == opLoadRelSrc8) offset = iter.dx; else if (iter.op == opLoadRelSrc16) offset = iter.dx * sizeof(uint16_t); else if (iter.op == opLoadRelSrcF32) offset = iter.dx * sizeof(float); if (iter.op == opLoadRelSrc8) { movq(r1, mmword_ptr[a + offset]); // 8 pixels, 8 bytes punpcklbw(r1, zero); movdqa(r2, r1); punpcklwd(r1, zero); punpckhwd(r2, zero); cvtdq2ps(r1, r1); cvtdq2ps(r2, r2); } else if (iter.op == opLoadRelSrc16) { if (iter.dx % 8 == 0) movdqa(r1, xmmword_ptr[a + offset]); // 8 pixels 16 byte boundary, aligned else movdqu(r1, xmmword_ptr[a + offset]); movdqa(r2, r1); punpcklwd(r1, zero); punpckhwd(r2, zero); cvtdq2ps(r1, r1); cvtdq2ps(r2, r2); } else if (iter.op == opLoadRelSrcF32) { if (iter.dx % 4 == 0) { movdqa(r1, xmmword_ptr[a + offset]); // // 4 pixels 16 byte boundary, aligned movdqa(r2, xmmword_ptr[a + offset + 16]); } else { movdqu(r1, xmmword_ptr[a + offset]); // unaligned movdqu(r2, xmmword_ptr[a + offset + 16]); } } if (iter.dx != 0) { jmp(LabelEnd); // Optim: generate jump only when over/negative branches exist } if (iter.dx != 0) { L(LabelOver); // x dx newx // 8 1 8+1=9 // planewidth == 16 // 0 1 2 3 4 5 6 7 8 9 A B C D E F g h i j // P Q R S T U V x need this // P Q R S T U V V duplicated the last valid pixel // 0 1 2 3 4 5 6 7 we can read this // 1 2 3 4 5 6 7 - Shift right by dx to lose low bytes // 1 2 3 4 5 6 7 7 have to make this one from it. Only the first planewidth-newx (7) bytes valid // x dx newx // 8 3 8+3=11 // planewidth == 15 // 0 1 2 3 4 5 6 7 8 9 A B C D E f g h i j // P Q R S T x x x need this // P Q R S S S S S duplicated the last valid pixel // 0 1 2 3 4 5 6 7 we can read this // 3 4 5 6 7 - - - Shift right by dx to lose low bytes // 3 4 5 6 6 6 6 6 have to make this one from it. Only the first planewidth-newx (4) bytes valid // planewidth == 14 // 0 1 2 3 4 5 6 7 8 9 A B C D e f g h i j // P Q R x x x x x need this // P Q R R R R R R duplicated the last valid pixel // 0 1 2 3 4 5 6 7 we can read this // 3 4 5 6 7 - - - Shift right by dx to lose low bytes // 3 4 5 5 5 5 5 5 have to make this one from it. Only the first planewidth-newx (3) bytes valid // special case: full read from beyond line // planewidth == 14 dx=6 newx = 8+6=14, newx>=planewidth => newx = 13 => planewidth-newx = 1 // 0 1 2 3 4 5 6 7 8 9 A B C D e f g h i j k l // ? ? ? ? ? ? ? ? need this, but overread // ? ? ? ? ? ? ? ? duplicated the last valid pixel // 0 1 2 3 4 5 6 7 we can read this // 5 6 7 - - - - - Shift right by not dx but (planewidth-1)&7, it's 5 in this example, to lose low bytes // 5 5 5 5 5 5 5 5 case(1): duplicate very first // planewidth == 14 dx=7 newx = 0+7=7, newx>=planewidth-7, then not newx>=planewidth => newx = 13 => planewidth-newx = 1 // 0 1 2 3 4 5 6 7 8 9 A B C D e f g h i j k l // P Q R S T U V w need this // P Q R S T U V V duplicated the last valid pixel // 0 1 2 3 4 5 6 7 we can read this // 5 6 7 - - - - - Shift right by not dx but (planewidth-1)&7, it's 5 in this example, to lose low bytes // 5 5 5 5 5 5 5 5 case(1): duplicate very first // planewidth == 14 dx=7 newx = 8+7=15, newx>=planewidth => newx = 13 => planewidth-newx = 1 // ? ? ? ? ? ? ? ? need this, but overread // 0 1 2 3 4 5 6 7 we can read this // 5 - - - - - - - Shift right to have the last pixel // 5 5 5 5 5 5 5 5 case(1): duplicate very first // planewidth == 13 // 0 1 2 3 4 5 6 7 8 9 A B C d e f g h i j // P Q x x x x x x need this // P Q Q Q Q Q Q Q duplicated the last valid pixel // 0 1 2 3 4 5 6 7 we can read this // 3 4 5 6 7 - - - Shift right by dx to lose low bytes // 3 4 4 4 4 4 4 4 have to make this one from it. Only the first planewidth-newx (2) bytes valid // planewidth == 12 // 0 1 2 3 4 5 6 7 8 9 A B c d e f g h i j // P x x x x x x x need this // P P P P P P P P duplicated the last valid pixel // 0 1 2 3 4 5 6 7 we can read this // 3 4 5 6 7 - - - Shift right by dx to lose low bytes // 3 3 3 3 3 3 3 3 have to make this one from it. Only the first planewidth-newx (1) bytes valid // duplicate highest, make a shuffle table by planewidth-newx (1..7) // planewidth - newx newx-pw newx-pw+7 shuffle // newx-(pw-7) // 1 -1 6 0->0 0->1 0->2 0->3 0->4 0->5 0->6 0->7 elSuffleForRight6 (lowest to everywhere) // 2 -2 5 0->0 1->1 1->2 1->3 1->4 1->5 1->6 1->7 elSuffleForRight5 (lowest two remains then second duplicates) // 3 -3 4 0->0 1->1 2->2 2->3 2->4 2->5 2->6 2->7 elSuffleForRight4 (lowest three remains then third duplicates) // 4 -4 3 0->0 1->1 2->2 3->3 3->4 3->5 3->6 3->7 elSuffleForRight3 // 5 -5 2 0->0 1->1 2->2 3->3 4->4 4->5 4->6 4->7 elSuffleForRight2 // 6 -6 1 0->0 1->1 2->2 3->3 4->4 5->5 5->6 5->7 elSuffleForRight1 // 7 -7 0 0->0 1->1 2->2 3->3 4->4 5->5 6->6 6->7 elSuffleForRight0 (lowest seven remains then seventh duplicates) // in extreme case (read all beyond last pixel): newx >= planewidth: ==> case of elSuffleForRight6 // shuffleTable = elShuffleForRight0 + 16*(newx-(planewidth-7)) std::string PartialOverread = "PartialOverread" + getLabelCount(); std::string NoFullOverReadFromNewX = "NoFullOverReadFromNewX" + getLabelCount(); std::string labelDoOver = "DoOver" + getLabelCount(); if (iter.dx > 0) { // FullOverRead possible only when dx>0 cmp(newx, planewidth); jl(PartialOverread); // if newx < planewidth -> // case: FullOver // even the first pixel to read is beyond the end of line // We have to clone the rightmost pixel from (planewidth-1) if (iter.op == opLoadRelSrc8) { sub(a, ptr[regptrs + sizeof(void *) * (RWPTR_START_OF_XCOUNTER)]); add(a, planewidth - 1); // reuse newx movzx(newx, byte_ptr[a]); movd(r1, newx); punpcklbw(r1, zero); // words pshufb(r1, CPTR(elShuffleForRight6)); // duplicate last word to all movdqa(r2, r1); punpcklwd(r1, zero); punpckhwd(r2, zero); cvtdq2ps(r1, r1); cvtdq2ps(r2, r2); } else if (iter.op == opLoadRelSrc16) { Reg tmp; mov(tmp, ptr[regptrs + sizeof(void *) * (RWPTR_START_OF_XCOUNTER)]); shl(tmp, 1); // for 16 bit 2*xcounter sub(a, tmp); add(a, (planewidth - 1) * 2); // reuse newx movzx(newx, word_ptr[a]); movd(r1, newx); pshufb(r1, CPTR(elShuffleForRight6)); // duplicate last word to all movdqa(r2, r1); punpcklwd(r1, zero); punpckhwd(r2, zero); cvtdq2ps(r1, r1); cvtdq2ps(r2, r2); } else if (iter.op == opLoadRelSrcF32) { Reg tmp; mov(tmp, ptr[regptrs + sizeof(void *) * (RWPTR_START_OF_XCOUNTER)]); shl(tmp, 2); // for 32 bit 4*xcounter sub(a, tmp); add(a, (planewidth - 1) * 4); movd(r1, dword_ptr[a]); pshufd(r1, r1, (0 << 0) | (0 << 2) | (0 << 4) | (0 << 6)); movdqa(r2, r1); } jmp(LabelEnd); } // full OverRead path, needed when iter.dx>0 // case: Partial overread // read the block, then clone the last valid pixel from position (planewidth-1) // problem: newx is not aligned L(PartialOverread); // planewidth == 14 dx=7 newx = 0+7=7, newx>=planewidth-7, then not newx>=planewidth => newx = 13 => planewidth-newx = 1 // sample 1: newx is in different segment than planewidth-1 // [xcounter] // [a] [newx] [pw-1] // V V V // 0 1 2 3 4 5 6 7 8 9 A B C D e f g h i j k l // P Q R S T U V w need this // 0 1 2 3 4 5 6 7 we can read this // P Q R S T U V w last pixel is beyond // P Q R S T U V V need this // sample 2: newx is in the same segment than planewidth-1 // planewidth == 13 dx=3 // [xcounter] [newx] // [a][newx][pw-1] // V V V // 0 1 2 3 4 5 6 7 8 9 A B C d e f g h i j // P Q x x x x x x need this // P Q Q Q Q Q Q Q duplicated the last valid pixel // 0 1 2 3 4 5 6 7 we can read this // when newx and (planewidth-1) are in different segments then we read from newx Reg tmp; mov(tmp, newx); and_(tmp, ~(pixels_per_cycle - 1)); cmp(tmp, (planewidth & ~(pixels_per_cycle - 1))); jle(NoFullOverReadFromNewX); // jump if (newx and ~0x07) < (planewidth & ~0x07) (in another segment) // read from current (last) pointer, if (iter.op == opLoadRelSrc8 || iter.op == opLoadRelSrc16) { if (iter.op == opLoadRelSrc8) { movq(r1, mmword_ptr[a]); // 8 pixels, 8 bytes punpcklbw(r1, zero); // words } else { // opLoadRel16 movdqa(r1, xmmword_ptr[a]); // 8 pixels, 16 bytes, here still aligned } psrldq(r1, ((planewidth - 1) & (pixels_per_cycle - 1)) * sizeof(uint16_t)); // Shift right by (planewidth - 1) & 7 to lose low words sub(newx, planewidth - (pixels_per_cycle - 1)); // find out shuffle pointer -1, ... -7 -> 6 ... 0 shl(newx, 4); // *16 for shuffle table // LabelDoOver copied here // reuse a : Reg shuffleTable; lea(a/*shuffleTable*/, CPTR(elShuffleForRight0)); // ptr for word shuffle //add(a/*shuffleTable*/, newx); pshufb(r1, xmmword_ptr[a/*shuffleTable*/ + newx]); movdqa(r2, r1); punpcklwd(r1, zero); punpckhwd(r2, zero); cvtdq2ps(r1, r1); cvtdq2ps(r2, r2); jmp(LabelEnd); } else if (iter.op == opLoadRelSrcF32) { // omg it's complicated // palignr memo // temp1[255:0] ((DEST[127:0] << 128) OR SRC[127:0]) >> (imm8*8); // DEST[127:0] temp1[127:0] int bytes_to_shift = ((planewidth - 1) & (pixels_per_cycle - 1)) * sizeof(float); if (bytes_to_shift < 16) { // src dst // r2 r1 // 15 14 13.... 0 15 14 13 ... 0 // 15 14 13 1 0 15 14.... 1 palignr(dst, src, 1) // 15 14 13 ..... 15 palignr(dst, src, 15) movdqa(r1, xmmword_ptr[a]); // 4 pixels, 16 bytes, here still aligned movdqa(r2, xmmword_ptr[a + 16]); // 4 pixels, 16 bytes if (bytes_to_shift > 0) { palignr(r1, r2, bytes_to_shift); // shift right dualreg. r1 is ready. psrldq(r2, bytes_to_shift); // Shift right upper part switch (bytes_to_shift) { // 4, 8, 12 case 4: pshufd(r2, r2, (0 << 0) | (1 << 2) | (2 << 4) | (2 << 6)); // elShuffleForRight0_32 break; case 8: pshufd(r2, r2, (0 << 0) | (1 << 2) | (1 << 4) | (1 << 6)); break; case 12: pshufd(r2, r2, (0 << 0) | (0 << 2) | (0 << 4) | (0 << 6)); // elShuffleForRight2_32 break; } } } else if (bytes_to_shift == 16) { // src dst // r2 r1 // 15 14 13.... 0 15 14 13 ... 0 --> 16 bytes: r1 = r2 movdqa(r1, xmmword_ptr[a + 16]); // 4 pixels, 16 bytes, no need [a + 0], here still aligned pshufd(r2, r1, (3 << 0) | (3 << 2) | (3 << 4) | (3 << 6)); // fill r2 with highest dword of r1 } else { // bytes to shift > 16 (20, 24, 28), ignore lower 4 pixels, move and shift and spread from upper 4 pixels movdqa(r1, xmmword_ptr[a + 16]); // 4 pixels, 16 bytes, no need [a + 0], here still aligned psrldq(r1, bytes_to_shift - 16); // Shift right upper part switch (bytes_to_shift) { // 0, 4, 8, 12 case 20: pshufd(r1, r1, (0 << 0) | (1 << 2) | (2 << 4) | (2 << 6)); // elShuffleForRight0_32 break; case 24: pshufd(r1, r1, (0 << 0) | (1 << 2) | (1 << 4) | (1 << 6)); break; case 28: pshufd(r1, r1, (0 << 0) | (0 << 2) | (0 << 4) | (0 << 6)); // elShuffleForRight2_32 break; } pshufd(r2, r1, (3 << 0) | (3 << 2) | (3 << 4) | (3 << 6)); // fill r2 with highest dword of r1 } jmp(LabelEnd); } L(NoFullOverReadFromNewX); // read from newx //a = a - 1,2,4 * xcounter + 1,2,4 * newx; sub(newx, ptr[regptrs + sizeof(void *) * (RWPTR_START_OF_XCOUNTER)]); if (iter.op == opLoadRelSrc8 || iter.op == opLoadRelSrc16) { if (iter.op == opLoadRelSrc8) { add(a, newx); // new position movq(r1, mmword_ptr[a]); // 8 pixels, 8 bytes punpcklbw(r1, zero); // words } else { shl(newx, 1); //a = a - 2 * xcounter + 2 * newx; add(a, newx); movdqu(r1, xmmword_ptr[a]); // 8 pixels, 16 bytes } // no shift here, just duplicate appropriate pixel into the high ones int what = ((planewidth - iter.dx - 1) & (pixels_per_cycle - 1)); switch (what) { case 0: pshufb(r1, CPTR(elShuffleForRight6)); break; case 1: pshufb(r1, CPTR(elShuffleForRight5)); break; case 2: pshufb(r1, CPTR(elShuffleForRight4)); break; case 3: pshufb(r1, CPTR(elShuffleForRight3)); break; case 4: pshufb(r1, CPTR(elShuffleForRight2)); break; case 5: pshufb(r1, CPTR(elShuffleForRight1)); break; case 6: pshufb(r1, CPTR(elShuffleForRight0)); break; } movdqa(r2, r1); punpcklwd(r1, zero); punpckhwd(r2, zero); cvtdq2ps(r1, r1); cvtdq2ps(r2, r2); //jmp(LabelEnd); } else if (iter.op == opLoadRelSrcF32) { shl(newx, 2); // float: *4 add(a, newx); int what = ((planewidth - iter.dx - 1) & (pixels_per_cycle - 1)); // what // 0 ShuffleForRight2_32 keep r1 dword #0 , spread it to 1..3, then spread r1.3 to r2 (ShuffleForRight2_32(r2,r1) // 1 ShuffleForRight1_32 keep r1 dword #0..1, spread it to 2..3, then spread r1.3 to r2 // 2 ShuffleForRight0_32 keep r1 dword #0..2, spread it to 3 , then spread r1.3 to r2 // 3 keep r1 dword #0..3, , then spread r1.3 to r2 // 4 keep r1 dword #0..3, , keep r2 dword #0 , spread it to 1..3 // 5 keep r1 dword #0..3, , keep r2 dword #0..1, spread it to 2..3 // 6 keep r1 dword #0..3, , keep r2 dword #0..2, spread it to 3 // no real shift here, just duplicate appropriate pixel into the high ones. But we have two registers if (what <= 3) { movdqu(r1, xmmword_ptr[a]); // 4 pixels, 16 bytes, no need for upper 4 pixels switch (what) { case 0: pshufd(r1, r1, (0 << 0) | (0 << 2) | (0 << 4) | (0 << 6)); // elShuffleForRight2_32 // fill 3 upper dwords of r1 from r1.0 break; case 1: pshufd(r1, r1, (0 << 0) | (1 << 2) | (1 << 4) | (1 << 6)); // fill 2 upper dwords of r1 from r1.1 break; case 2: pshufd(r1, r1, (0 << 0) | (1 << 2) | (2 << 4) | (2 << 6)); // elShuffleForRight0_32 // fill 1 upper dwords of r1 from r1.2 break; } pshufd(r2, r1, (3 << 0) | (3 << 2) | (3 << 4) | (3 << 6)); // fill all dwords of r2 from r1.3 } else { movdqu(r1, xmmword_ptr[a]); // 4 pixels, 16 bytes, low 4 pixels keep them as is movdqu(r2, xmmword_ptr[a + 16]); // 4 pixels, 16 bytes switch (what) { case 4: pshufd(r2, r2, (0 << 0) | (0 << 2) | (0 << 4) | (0 << 6)); // elShuffleForRight2_32 // fill 3 upper dwords of r1 from r2.0 break; case 5: pshufd(r2, r2, (0 << 0) | (1 << 2) | (1 << 4) | (1 << 6)); // fill 2 upper dwords of r1 from r2.1 break; case 6: pshufd(r2, r2, (0 << 0) | (1 << 2) | (2 << 4) | (2 << 6)); // elShuffleForRight0_32 // fill 1 upper dwords of r1 from r2.2 break; } } // continues on labelEnd } if (iter.dx < 0) jmp(LabelEnd); } // over: iter.dx != 0 if (iter.dx < 0) { L(LabelNeg); // When reading from negative x coordinates we read exactly from 0th, then shift and duplicate // For extreme minus offsets we duplicate 0th (leftmost) pixel to each position // example: dx = -1 // -1 0 1 2 3 4 5 6 7 // A A B C D E F G we need this // A B C D E F G H read [0] // 0 A B C D E F G H shift // A A B C D E F G H duplicate by shuffle if (iter.op == opLoadRelSrc8 || iter.op == opLoadRelSrc16) { if (iter.op == opLoadRelSrc8) { sub(a, ptr[regptrs + sizeof(void *) * (RWPTR_START_OF_XCOUNTER)]); // go back to the beginning movq(r1, mmword_ptr[a]); // 8 pixels, 8 bytes punpcklbw(r1, zero); // bytes to words } else if (iter.op == opLoadRelSrc16) { // go back to the beginning, in 16 bit, *2 Reg tmp; mov(tmp, ptr[regptrs + sizeof(void *) * (RWPTR_START_OF_XCOUNTER)]); shl(tmp, 1); // for 16 bit 2*xcounter sub(a, tmp); movdqa(r1, xmmword_ptr[a]); // 8 pixels, 16 bytes } std::string PartialReadBefore = "PartialReadBefore" + getLabelCount(); std::string Finalize = "Finalize" + getLabelCount(); cmp(newx, -pixels_per_cycle); // pixels_per_cycle words jg(PartialReadBefore); // FullReadBefore: newx <= -pixels_per_cycle, clone 0th (leftmost) pixel to all pshufb(r1, CPTR(elShuffleForRight6)); // lowest word to all jmp(Finalize); L(PartialReadBefore); // -pixels_per_cycle < newx < 0 int toShift = min(pixels_per_cycle - 1, (-iter.dx) & (pixels_per_cycle - 1)); pslldq(r1, toShift * 2); // shift in word domain switch (toShift) { case 1: pshufb(r1, CPTR(elShuffleForLeft0)); break; case 2: pshufb(r1, CPTR(elShuffleForLeft1)); break; case 3: pshufb(r1, CPTR(elShuffleForLeft2)); break; case 4: pshufb(r1, CPTR(elShuffleForLeft3)); break; case 5: pshufb(r1, CPTR(elShuffleForLeft4)); break; case 6: pshufb(r1, CPTR(elShuffleForLeft5)); break; case 7: pshufb(r1, CPTR(elShuffleForLeft6)); break; } L(Finalize); movdqa(r2, r1); punpcklwd(r1, zero); punpckhwd(r2, zero); cvtdq2ps(r1, r1); cvtdq2ps(r2, r2); } else if (iter.op == opLoadRelSrcF32) { // negative // go back to the beginning, in 16 bit, *2 Reg tmp; mov(tmp, ptr[regptrs + sizeof(void *) * (RWPTR_START_OF_XCOUNTER)]); shl(tmp, 2); // go back to the beginning, in 32 bit, *4 sub(a, tmp); std::string PartialReadBefore = "PartialReadBefore" + getLabelCount(); cmp(newx, -pixels_per_cycle); jg(PartialReadBefore); // FullReadBefore: newx <= -pixels_per_cycle, clone 0th (leftmost) pixel to all movdqa(r1, xmmword_ptr[a]); pshufd(r1, r1, (0 << 0) | (0 << 2) | (0 << 4) | (0 << 6)); movdqa(r2, r1); jmp(LabelEnd); L(PartialReadBefore); // -pixels_per_cycle < newx < 0 int bytes_to_shift = sizeof(float) * min(pixels_per_cycle - 1, (-iter.dx) & (pixels_per_cycle - 1)); // shift bytes // 4 r2r1 << 4 shuffle r1.1 to r1.0-0 // 8 r2r1 << 8 shuffle r1.2 to r1.0-1 // 12 r2r1 << 12 shuffle r1.3 to r1.0-2 // 16 r2r1 << 16 -> r2 = r1, , shuffle r2.0 to all r1 // 20 r2r1 << 20 -> r2 = r1, r2 << (20-4), shuffle r2.1 to r2.0-0, shuffle r2.0 to all r1 // 24 r2r1 << 24 -> r2 = r1, r2 << (24-4), shuffle r2.2 to r2.0-1, shuffle r2.0 to all r1 // 28 r2r1 << 28 -> r2 = r1, r2 << (28-4), shuffle r2.3 to r2.0-2, shuffle r2.0 to all r1 if (bytes_to_shift < 16) { movdqa(r1, xmmword_ptr[a]); // 4 pixels, 16 bytes movdqa(r2, xmmword_ptr[a + 16]); // 4 pixels, 16 bytes // 4 floats // r2 r1 // H3 H2 H1 H0 L3 L2 L1 L0 << 1*4 byte // H2 H1 H0 L3 L2 L1 L0 00 // H2 H1 H0 00 or // 00 00 00 L3 L2 L1 L0 00 psrldq(r1, 16 - bytes_to_shift); pslldq(r2, bytes_to_shift); por(r2, r1); movdqa(r1, xmmword_ptr[a]); // load again pslldq(r1, bytes_to_shift); // todo: shift + shuffle = single shuffle switch (bytes_to_shift) { // 4, 8, 12 case 4: pshufd(r1, r1, (1 << 0) | (1 << 2) | (2 << 4) | (3 << 6)); // elShuffleForLeft0_32 // shuffle r1.1 to r1.0-0 break; case 8: pshufd(r1, r1, (2 << 0) | (2 << 2) | (2 << 4) | (3 << 6)); // elShuffleForLeft1_32 // shuffle r1.2 to r1.0-1 break; case 12: pshufd(r1, r1, (3 << 0) | (3 << 2) | (3 << 4) | (3 << 6)); // elShuffleForLeft2_32 // shuffle r1.3 to r1.0-2 break; } } else { // toShift >= 16 //movdqa(r1, xmmword_ptr[a]); // no need for 15..31 movdqa(r2, xmmword_ptr[a]); // 4 pixels, 16 bytes if (bytes_to_shift > 16) pslldq(r2, bytes_to_shift - 16); switch (bytes_to_shift) { // 20, 24, 28 case 20: pshufd(r2, r2, (1 << 0) | (1 << 2) | (2 << 4) | (3 << 6)); // elShuffleForLeft0_32 // shuffle r2.1 to r2.0-0 break; case 24: pshufd(r2, r2, (2 << 0) | (2 << 2) | (2 << 4) | (3 << 6)); // elShuffleForLeft1_32 // shuffle r2.2 to r2.0-1 break; case 28: pshufd(r2, r2, (3 << 0) | (3 << 2) | (3 << 4) | (3 << 6)); // elShuffleForLeft2_32 // shuffle r2.3 to r2.0-2 break; } pshufd(r1, r2, (0 << 0) | (0 << 2) | (0 << 4) | (0 << 6)); // shuffle r2.0 to all r1 } } } L(LabelEnd); stack.push_back(std::make_pair(r1, r2)); } } // oploadRel8/16/32 else if (iter.op == opLoadSrc8) { if (processSingle) { XmmReg r1; Reg a; mov(a, ptr[regptrs + sizeof(void *) * (iter.e.ival + RWPTR_START_OF_INPUTS)]); movd(r1, dword_ptr[a]); // 4 pixels, 4 bytes punpcklbw(r1, zero); punpcklwd(r1, zero); cvtdq2ps(r1, r1); if (maskIt) doMask(r1, constptr, planewidth); stack1.push_back(r1); } else { XmmReg r1, r2; Reg a; mov(a, ptr[regptrs + sizeof(void *) * (iter.e.ival + RWPTR_START_OF_INPUTS)]); movq(r1, mmword_ptr[a]); punpcklbw(r1, zero); movdqa(r2, r1); punpcklwd(r1, zero); punpckhwd(r2, zero); cvtdq2ps(r1, r1); cvtdq2ps(r2, r2); if (maskIt) doMask(r2, constptr, planewidth); stack.push_back(std::make_pair(r1, r2)); } } else if (iter.op == opLoadSrc16) { if (processSingle) { XmmReg r1; Reg a; mov(a, ptr[regptrs + sizeof(void *) * (iter.e.ival + RWPTR_START_OF_INPUTS)]); movq(r1, mmword_ptr[a]); // 4 pixels, 8 bytes punpcklwd(r1, zero); cvtdq2ps(r1, r1); if (maskIt) doMask(r1, constptr, planewidth); stack1.push_back(r1); } else { XmmReg r1, r2; Reg a; mov(a, ptr[regptrs + sizeof(void *) * (iter.e.ival + RWPTR_START_OF_INPUTS)]); movdqa(r1, xmmword_ptr[a]); movdqa(r2, r1); punpcklwd(r1, zero); punpckhwd(r2, zero); cvtdq2ps(r1, r1); cvtdq2ps(r2, r2); if (maskIt) doMask(r2, constptr, planewidth); stack.push_back(std::make_pair(r1, r2)); } } else if (iter.op == opLoadSrcF32) { if (processSingle) { XmmReg r1; Reg a; mov(a, ptr[regptrs + sizeof(void *) * (iter.e.ival + RWPTR_START_OF_INPUTS)]); movdqa(r1, xmmword_ptr[a]); if (maskIt) doMask(r1, constptr, planewidth); stack1.push_back(r1); } else { XmmReg r1, r2; Reg a; mov(a, ptr[regptrs + sizeof(void *) * (iter.e.ival + RWPTR_START_OF_INPUTS)]); movdqa(r1, xmmword_ptr[a]); movdqa(r2, xmmword_ptr[a + 16]); if (maskIt) doMask(r2, constptr, planewidth); stack.push_back(std::make_pair(r1, r2)); } } else if (iter.op == opLoadSrcF16) { // not supported in avs+ if (processSingle) { XmmReg r1; Reg a; mov(a, ptr[regptrs + sizeof(void *) * (iter.e.ival + RWPTR_START_OF_INPUTS)]); vcvtph2ps(r1, qword_ptr[a]); if (maskIt) doMask(r1, constptr, planewidth); stack1.push_back(r1); } else { XmmReg r1, r2; Reg a; mov(a, ptr[regptrs + sizeof(void *) * (iter.e.ival + RWPTR_START_OF_INPUTS)]); vcvtph2ps(r1, qword_ptr[a]); vcvtph2ps(r2, qword_ptr[a + 8]); if (maskIt) doMask(r2, constptr, planewidth); stack.push_back(std::make_pair(r1, r2)); } } else if (iter.op == opLoadVar) { if (processSingle) { XmmReg r1; // 16 bytes/variable int offset = sizeof(void *) * RWPTR_START_OF_USERVARIABLES + 16 * iter.e.ival; movdqa(r1, xmmword_ptr[regptrs + offset]); if (maskIt) doMask(r1, constptr, planewidth); stack1.push_back(r1); } else { XmmReg r1, r2; // 32 bytes/variable int offset = sizeof(void *) * RWPTR_START_OF_USERVARIABLES + 32 * iter.e.ival; movdqa(r1, xmmword_ptr[regptrs + offset]); movdqa(r2, xmmword_ptr[regptrs + offset + 16]); if (maskIt) doMask(r2, constptr, planewidth); stack.push_back(std::make_pair(r1, r2)); } } else if (iter.op == opLoadConst) { if (processSingle) { XmmReg r1; Reg a; mov(a, iter.e.ival); movd(r1, a); shufps(r1, r1, 0); if (maskIt) doMask(r1, constptr, planewidth); stack1.push_back(r1); } else { XmmReg r1, r2; Reg a; mov(a, iter.e.ival); movd(r1, a); shufps(r1, r1, 0); movaps(r2, r1); if (maskIt) doMask(r2, constptr, planewidth); stack.push_back(std::make_pair(r1, r2)); } } else if (iter.op == opDup) { if (processSingle) { auto p = std::next(stack1.rbegin(), iter.e.ival); XmmReg r1; movaps(r1, *p); stack1.push_back(r1); } else { auto p = std::next(stack.rbegin(), iter.e.ival); XmmReg r1, r2; movaps(r1, p->first); movaps(r2, p->second); stack.push_back(std::make_pair(r1, r2)); } } else if (iter.op == opSwap) { if (processSingle) { std::swap(stack1.back(), *std::next(stack1.rbegin(), iter.e.ival)); } else { std::swap(stack.back(), *std::next(stack.rbegin(), iter.e.ival)); } } else if (iter.op == opAdd) { if (processSingle) { TwoArgOp_Single(addps) } else { TwoArgOp(addps) } } else if (iter.op == opSub) { if (processSingle) { TwoArgOp_Single(subps) } else { TwoArgOp(subps) } } else if (iter.op == opMul) { if (processSingle) { TwoArgOp_Single(mulps) } else { TwoArgOp(mulps) } } else if (iter.op == opDiv) { if (processSingle) { TwoArgOp_Single(divps) } else { TwoArgOp(divps) } } else if (iter.op == opFmod) { if (processSingle) { auto t1 = stack1.back(); // despite the Intel compiler warnings, this is intentionally a copy and not a reference (valid for all such messages as well) stack1.pop_back(); auto &t2 = stack1.back(); FMOD_PS(t2, t1) } else { auto t1 = stack.back(); stack.pop_back(); auto &t2 = stack.back(); FMOD_PS(t2.first, t1.first) FMOD_PS(t2.second, t1.second) } } else if (iter.op == opMax) { if (processSingle) { TwoArgOp_Single(maxps) } else { TwoArgOp(maxps) } } else if (iter.op == opMin) { if (processSingle) { TwoArgOp_Single(minps) } else { TwoArgOp(minps) } } else if (iter.op == opSqrt) { if (processSingle) { auto &t1 = stack1.back(); maxps(t1, zero); sqrtps(t1, t1); } else { auto &t1 = stack.back(); maxps(t1.first, zero); maxps(t1.second, zero); sqrtps(t1.first, t1.first); sqrtps(t1.second, t1.second); } } // Integer store operations: Why sometimes C version differs from SSE: convert to int from .5 intermediates. // Simd version of float -> int32 (cvtps2dq) is using the SSE rounding mode "round to nearest" // C version is using: (uint8_t)(f + 0.5f) which turnes into cvttps, typecast to int uses trunc // Even for positive numbers they are not the same, when converting occurs exactly from the halfway // SSE is using Banker's rounding, which rounds to the nearest _even_ integer value. https://en.wikipedia.org/wiki/IEEE_754#Roundings_to_nearest // C SSE // 0.5 1 0 // 1.5 2 2 // 2.5 3 2 // 3.5 4 4 // 3.7.1test27: no more banker's rounding. Using cvttps and +0.5f else if (iter.op == opStore8) { if (processSingle) { auto t1 = stack1.back(); stack1.pop_back(); XmmReg r1; Reg a; addps(t1, CPTR(elfloat_half)); // rounder for truncate! no banker's rounding maxps(t1, zero); minps(t1, CPTR(elstore8)); mov(a, ptr[regptrs]); cvttps2dq(t1, t1); // 00 w3 00 w2 00 w1 00 w0 -- min/max clamp ensures that high words are zero packssdw(t1, zero); // _mm_packs_epi32: w7 w6 w5 w4 w3 w2 w1 w0 packuswb(t1, zero); // _mm_packus_epi16: 0 0 0 0 0 0 0 0 b7 b6 b5 b4 b3 b2 b1 b0 movd(dword_ptr[a], t1); } else { auto t1 = stack.back(); stack.pop_back(); XmmReg r1, r2; Reg a; addps(t1.first, CPTR(elfloat_half)); // rounder for truncate! no banker's rounding maxps(t1.first, zero); addps(t1.second, CPTR(elfloat_half)); // rounder for truncate! no banker's rounding maxps(t1.second, zero); minps(t1.first, CPTR(elstore8)); minps(t1.second, CPTR(elstore8)); mov(a, ptr[regptrs]); cvttps2dq(t1.first, t1.first); // 00 w3 00 w2 00 w1 00 w0 -- min/max clamp ensures that high words are zero cvttps2dq(t1.second, t1.second); // 00 w7 00 w6 00 w5 00 w4 // t1.second is the lo packssdw(t1.first, t1.second); // _mm_packs_epi32: w7 w6 w5 w4 w3 w2 w1 w0 packuswb(t1.first, zero); // _mm_packus_epi16: 0 0 0 0 0 0 0 0 b7 b6 b5 b4 b3 b2 b1 b0 movq(mmword_ptr[a], t1.first); } } else if (iter.op == opStore10 // avs+ || iter.op == opStore12 // avs+ || iter.op == opStore14 // avs+ || iter.op == opStore16 ) { if (processSingle) { auto t1 = stack1.back(); stack1.pop_back(); XmmReg r1; Reg a; addps(t1, CPTR(elfloat_half)); // rounder for truncate! no banker's rounding maxps(t1, zero); switch (iter.op) { case opStore10: minps(t1, CPTR(elstore10)); break; case opStore12: minps(t1, CPTR(elstore12)); break; case opStore14: minps(t1, CPTR(elstore14)); break; case opStore16: minps(t1, CPTR(elstore16)); break; } mov(a, ptr[regptrs]); cvttps2dq(t1, t1); // no cvtps, but cvttps // new switch (iter.op) { case opStore10: case opStore12: case opStore14: packssdw(t1, zero); // _mm_packs_epi32: w7 w6 w5 w4 w3 w2 w1 w0 break; case opStore16: if (cpuFlags & CPUF_SSE4_1) { packusdw(t1, zero); // _mm_packus_epi32: w7 w6 w5 w4 w3 w2 w1 w0 } else { // old, sse2 movdqa(r1, t1); // 00 w3 00 w2 00 w1 00 w0 -- min/max clamp ensures that high words are zero psrldq(t1, 6); por(t1, r1); pshuflw(t1, t1, 0b11011000); punpcklqdq(t1, zero); } break; } movq(mmword_ptr[a], t1); } else { auto t1 = stack.back(); stack.pop_back(); XmmReg r1, r2; Reg a; addps(t1.first, CPTR(elfloat_half)); // rounder for truncate! no banker's rounding maxps(t1.first, zero); addps(t1.second, CPTR(elfloat_half)); // rounder for truncate! no banker's rounding maxps(t1.second, zero); switch (iter.op) { case opStore10: minps(t1.first, CPTR(elstore10)); minps(t1.second, CPTR(elstore10)); break; case opStore12: minps(t1.first, CPTR(elstore12)); minps(t1.second, CPTR(elstore12)); break; case opStore14: minps(t1.first, CPTR(elstore14)); minps(t1.second, CPTR(elstore14)); break; case opStore16: minps(t1.first, CPTR(elstore16)); minps(t1.second, CPTR(elstore16)); break; } mov(a, ptr[regptrs]); cvttps2dq(t1.first, t1.first); // no bankers rounding cvttps2dq(t1.second, t1.second); // new switch (iter.op) { case opStore10: case opStore12: case opStore14: packssdw(t1.first, t1.second); // _mm_packs_epi32: w7 w6 w5 w4 w3 w2 w1 w0 break; case opStore16: if (cpuFlags & CPUF_SSE4_1) { packusdw(t1.first, t1.second); // _mm_packus_epi32: w7 w6 w5 w4 w3 w2 w1 w0 } else { // old, sse2 movdqa(r1, t1.first); // 00 w3 00 w2 00 w1 00 w0 -- min/max clamp ensures that high words are zero movdqa(r2, t1.second); // 00 w7 00 w6 00 w5 00 w4 psrldq(t1.first, 6); psrldq(t1.second, 6); por(t1.first, r1); por(t1.second, r2); pshuflw(t1.first, t1.first, 0b11011000); pshuflw(t1.second, t1.second, 0b11011000); punpcklqdq(t1.first, t1.second); } break; } movdqa(xmmword_ptr[a], t1.first); } } else if (iter.op == opStoreF32) { if (processSingle) { auto t1 = stack1.back(); stack1.pop_back(); Reg a; mov(a, ptr[regptrs]); movaps(xmmword_ptr[a], t1); } else { auto t1 = stack.back(); stack.pop_back(); Reg a; mov(a, ptr[regptrs]); movaps(xmmword_ptr[a], t1.first); movaps(xmmword_ptr[a + 16], t1.second); } } else if (iter.op == opStoreF16) { // not supported in avs+ if (processSingle) { auto t1 = stack1.back(); stack1.pop_back(); Reg a; mov(a, ptr[regptrs]); vcvtps2ph(qword_ptr[a], t1, 0); } else { auto t1 = stack.back(); stack.pop_back(); Reg a; mov(a, ptr[regptrs]); vcvtps2ph(qword_ptr[a], t1.first, 0); vcvtps2ph(qword_ptr[a + 8], t1.second, 0); } } else if (iter.op == opStoreVar || iter.op == opStoreVarAndDrop1) { if (processSingle) { auto t1 = stack1.back(); // 16 bytes/variable int offset = sizeof(void *) * RWPTR_START_OF_USERVARIABLES + 16 * iter.e.ival; movaps(xmmword_ptr[regptrs + offset], t1); if (iter.op == opStoreVarAndDrop1) stack1.pop_back(); } else { auto t1 = stack.back(); // 32 byte/variable int offset = sizeof(void *) * RWPTR_START_OF_USERVARIABLES + 32 * iter.e.ival; movaps(xmmword_ptr[regptrs + offset], t1.first); movaps(xmmword_ptr[regptrs + offset + 16], t1.second); if (iter.op == opStoreVarAndDrop1) stack.pop_back(); } } else if (iter.op == opAbs) { if (processSingle) { auto &t1 = stack1.back(); andps(t1, CPTR(elabsmask)); } else { auto &t1 = stack.back(); andps(t1.first, CPTR(elabsmask)); andps(t1.second, CPTR(elabsmask)); } } else if (iter.op == opSgn) { // 1, 0, -1 /* __m128 sgn(__m128 value) { const __m128 zero = _mm_set_ps1 (0.0f); __m128 p = _mm_and_ps(_mm_cmpgt_ps(value, zero), _mm_set_ps1(1.0f)); __m128 n = _mm_and_ps(_mm_cmplt_ps(value, zero), _mm_set_ps1(-1.0f)); return _mm_or_ps(p, n); } */ if (processSingle) { auto &t1 = stack1.back(); XmmReg r1, r2; xorps(r2, r2); movaps(r1, t1); movaps(t1, r2); cmpltps(t1, r1); cmpltps(r1, r2); andps(t1, CPTR(elfloat_one)); andps(r1, CPTR(elfloat_minusone)); orps(t1, r1); } else { auto &t1 = stack.back(); XmmReg r2, r3, r4, r5; xorps(r2, r2); xorps(r3, r3); cmpltps(r3, t1.first); cmpltps(t1.first, r2); movaps(r4, t1.first); andnps(r4, r3); movaps(r3, CPTR(elfloat_one)); xorps(r5, r5); cmpltps(r5, t1.second); cmpltps(t1.second, r2); movaps(r2, CPTR(elfloat_minusone)); andps(t1.first, r2); andps(r2, t1.second); andnps(t1.second, r5); andps(r4, r3); orps(t1.first, r4); andps(t1.second, r3); orps(t1.second, r2); } } else if (iter.op == opNeg) { if (processSingle) { auto &t1 = stack1.back(); cmpleps(t1, zero); andps(t1, CPTR(elfloat_one)); } else { auto &t1 = stack.back(); cmpleps(t1.first, zero); cmpleps(t1.second, zero); andps(t1.first, CPTR(elfloat_one)); andps(t1.second, CPTR(elfloat_one)); } } else if (iter.op == opNegSign) { if (processSingle) { auto& t1 = stack1.back(); xorps(t1, CPTR(elsignmask)); } else { auto& t1 = stack.back(); xorps(t1.first, CPTR(elsignmask)); xorps(t1.second, CPTR(elsignmask)); } } else if (iter.op == opAnd) { if (processSingle) { LogicOp_Single(andps) } else { LogicOp(andps) } } else if (iter.op == opOr) { if (processSingle) { LogicOp_Single(orps) } else { LogicOp(orps) } } else if (iter.op == opXor) { if (processSingle) { LogicOp_Single(xorps) } else { LogicOp(xorps) } } else if (iter.op == opGt) { // a > b (gt) -> b < (lt) a if (processSingle) { CmpOp_Single(cmpltps) } else { CmpOp(cmpltps) } } else if (iter.op == opLt) { // a < b (lt) -> b > (gt,nle) a if (processSingle) { CmpOp_Single(cmpnleps) } else { CmpOp(cmpnleps) } } else if (iter.op == opEq) { // a == b -> b == a if (processSingle) { CmpOp_Single(cmpeqps) } else { CmpOp(cmpeqps) } } else if (iter.op == opNotEq) { // a != b if (processSingle) { CmpOp_Single(cmpneqps) } else { CmpOp(cmpneqps) } } else if (iter.op == opLE) { // a <= b -> b >= (ge,nlt) a if (processSingle) { CmpOp_Single(cmpnltps) } else { CmpOp(cmpnltps) } } else if (iter.op == opGE) { // a >= b -> b <= (le) a if (processSingle) { CmpOp_Single(cmpleps) } else { CmpOp(cmpleps) } } else if (iter.op == opTernary) { if (processSingle) { auto t1 = stack1.back(); stack1.pop_back(); auto t2 = stack1.back(); stack1.pop_back(); auto t3 = stack1.back(); stack1.pop_back(); XmmReg r1; xorps(r1, r1); cmpltps(r1, t3); andps(t2, r1); andnps(r1, t1); orps(r1, t2); stack1.push_back(r1); } else { auto t1 = stack.back(); stack.pop_back(); auto t2 = stack.back(); stack.pop_back(); auto t3 = stack.back(); stack.pop_back(); XmmReg r1, r2; xorps(r1, r1); xorps(r2, r2); cmpltps(r1, t3.first); cmpltps(r2, t3.second); andps(t2.first, r1); andps(t2.second, r2); andnps(r1, t1.first); andnps(r2, t1.second); orps(r1, t2.first); orps(r2, t2.second); stack.push_back(std::make_pair(r1, r2)); } } else if (iter.op == opExp) { if (processSingle) { auto &t1 = stack1.back(); EXP_PS(t1) } else { auto &t1 = stack.back(); EXP_PS(t1.first) EXP_PS(t1.second) } } else if (iter.op == opLog) { if (processSingle) { auto &t1 = stack1.back(); LOG_PS(t1) } else { auto &t1 = stack.back(); LOG_PS(t1.first) LOG_PS(t1.second) } } else if (iter.op == opPow) { if (processSingle) { auto t1 = stack1.back(); stack1.pop_back(); auto &t2 = stack1.back(); LOG_PS(t2) mulps(t2, t1); EXP_PS(t2) } else { auto t1 = stack.back(); stack.pop_back(); auto &t2 = stack.back(); LOG_PS(t2.first) mulps(t2.first, t1.first); EXP_PS(t2.first) LOG_PS(t2.second) mulps(t2.second, t1.second); EXP_PS(t2.second) } } else if (iter.op == opSin) { if (processSingle) { auto& _t1 = stack1.back(); SINCOS_PS(true, _t1, _t1) } else { auto& _t1 = stack.back(); SINCOS_PS(true, _t1.first, _t1.first); SINCOS_PS(true, _t1.second, _t1.second); } } else if (iter.op == opCos) { if (processSingle) { auto& _t1 = stack1.back(); SINCOS_PS(false, _t1, _t1) } else { auto& _t1 = stack.back(); SINCOS_PS(false, _t1.first, _t1.first); SINCOS_PS(false, _t1.second, _t1.second); } } else if (iter.op == opTan) { if (processSingle) { auto& t1 = stack1.back(); TAN_PS(t1) } else { auto& t1 = stack.back(); TAN_PS(t1.first); TAN_PS(t1.second); } } else if (iter.op == opAtan2) { if (processSingle) { auto t1 = stack1.back(); stack1.pop_back(); auto& t2 = stack1.back(); ATAN2_PS(t2, t1); } else { auto t1 = stack.back(); stack.pop_back(); auto& t2 = stack.back(); ATAN2_PS(t2.first, t1.first); ATAN2_PS(t2.second, t1.second); } } else if (iter.op == opClip) { // clip(a, low, high) = min(max(a, low),high) if (processSingle) { auto t1 = stack1.back(); stack1.pop_back(); auto t2 = stack1.back(); stack1.pop_back(); auto &t3 = stack1.back(); maxps(t3, t2); minps(t3, t1); } else { auto t1 = stack.back(); stack.pop_back(); auto t2 = stack.back(); stack.pop_back(); auto &t3 = stack.back(); maxps(t3.first, t2.first); minps(t3.first, t1.first); maxps(t3.second, t2.second); minps(t3.second, t1.second); } } else if (iter.op == opRound || iter.op == opFloor || iter.op == opCeil || iter.op == opTrunc) { const int rounder_flag = (iter.op == opRound) ? (FROUND_TO_NEAREST_INT | FROUND_NO_EXC) : (iter.op == opFloor) ? (FROUND_TO_NEG_INF | FROUND_NO_EXC) : (iter.op == opCeil) ? (FROUND_TO_POS_INF | FROUND_NO_EXC) : (FROUND_TO_ZERO | FROUND_NO_EXC); // opTrunc if (processSingle) { auto& t1 = stack1.back(); roundps(t1, t1, rounder_flag); } else { auto& t1 = stack.back(); roundps(t1.first, t1.first, rounder_flag); roundps(t1.second, t1.second, rounder_flag); } } } } void main(Reg regptrs, Reg regoffs, Reg niter, Reg SpatialY) { XmmReg zero; pxor(zero, zero); Reg constptr; mov(constptr, (uintptr_t)logexpconst); L("wloop"); cmp(niter, 0); je("wend"); //sub(niter, 1); dec(niter); // process two sets, no partial input masking if (singleMode) processingLoop(regptrs, zero, constptr, SpatialY); else processingLoop(regptrs, zero, constptr, SpatialY); const int EXTRA = 2; // output pointer, xcounter if constexpr(sizeof(void *) == 8) { int numIter = (numInputs + EXTRA + 1) / 2; for (int i = 0; i < numIter; i++) { XmmReg r1, r2; movdqu(r1, xmmword_ptr[regptrs + 16 * i]); movdqu(r2, xmmword_ptr[regoffs + 16 * i]); paddq(r1, r2); movdqu(xmmword_ptr[regptrs + 16 * i], r1); } } else { int numIter = (numInputs + EXTRA + 3) / 4; for (int i = 0; i < numIter; i++) { XmmReg r1, r2; movdqu(r1, xmmword_ptr[regptrs + 16 * i]); movdqu(r2, xmmword_ptr[regoffs + 16 * i]); paddd(r1, r2); movdqu(xmmword_ptr[regptrs + 16 * i], r1); } } jmp("wloop"); L("wend"); int nrestpixels = planewidth & (singleMode ? 3 : 7); if (nrestpixels > 4) // dual process with masking processingLoop(regptrs, zero, constptr, SpatialY); else if (nrestpixels == 4) // single process, no masking processingLoop(regptrs, zero, constptr, SpatialY); else if (nrestpixels > 0) // single process, masking processingLoop(regptrs, zero, constptr, SpatialY); } }; // avx2 evaluator with two ymm registers struct ExprEvalAvx2 : public jitasm::function { std::vector ops; int numInputs; int cpuFlags; int planewidth; // original, lut can overwrite int planeheight; bool singleMode; ExprEvalAvx2(std::vector &ops, int numInputs, int cpuFlags, int planewidth, int planeheight, bool singleMode) : ops(ops), numInputs(numInputs), cpuFlags(cpuFlags), planewidth(planewidth), planeheight(planeheight), singleMode(singleMode) {} template AVS_FORCEINLINE void processingLoop(Reg ®ptrs, YmmReg &zero, Reg &constptr, Reg &SpatialY) { std::list> stack; std::list stack1; // reason of masking: prevent loading 'junk', out of frame pixels, which can be NaN floats for example. // If processingLoop works in dual lane mode (!processSingle), masking occurs only for the high lane, // when there is no need for dual lanes (width mod 16 is <= 8 pixels), processSingle=true is used const bool maskIt = maskUnused && ((planewidth & 7) != 0); const int mask = ((1 << (planewidth & 7)) - 1); // mask by zero when we have only 1-7 valid pixels in the lower (single-lane) or upper (dual-lane) // 1: 2-1 = 1 // 00000001 // 2: 4-1 = 3 // 00000011 // 7: 128-1 = 127 // 01111111 for (const auto &iter : ops) { if (iter.op == opLoadSpatialX) { if (processSingle) { YmmReg r1; XmmReg r1x; vmovd(r1x, dword_ptr[regptrs + sizeof(void *) * (RWPTR_START_OF_XCOUNTER)]); vcvtdq2ps(r1x, r1x); vbroadcastss(r1, r1x); vaddps(r1, r1, CPTR_AVX(spatialX)); stack1.push_back(r1); } else { YmmReg r1, r2; XmmReg r1x; vmovd(r1x, dword_ptr[regptrs + sizeof(void *) * (RWPTR_START_OF_XCOUNTER)]); vcvtdq2ps(r1x, r1x); vbroadcastss(r1, r1x); vmovaps(r2, r1); vaddps(r1, r1, CPTR_AVX(spatialX)); vaddps(r2, r2, CPTR_AVX(spatialX2)); stack.push_back(std::make_pair(r1, r2)); } } else if (iter.op == opLoadSpatialY) { if (processSingle) { YmmReg r1; XmmReg r1x; #ifdef JITASM64 vmovq(r1x, SpatialY); #else vmovd(r1x, SpatialY); #endif vcvtdq2ps(r1x, r1x); vbroadcastss(r1, r1x); stack1.push_back(r1); } else { YmmReg r1, r2; XmmReg r1x; #ifdef JITASM64 vmovq(r1x, SpatialY); #else vmovd(r1x, SpatialY); #endif vcvtdq2ps(r1x, r1x); vbroadcastss(r1, r1x); vmovaps(r2, r1); stack.push_back(std::make_pair(r1, r2)); } } else if (iter.op == opLoadInternalVar) { if (processSingle) { YmmReg r1; XmmReg r1x; vmovd(r1x, dword_ptr[regptrs + sizeof(void *) * (iter.e.ival + RWPTR_START_OF_INTERNAL_VARIABLES)]); vbroadcastss(r1, r1x); stack1.push_back(r1); } else { YmmReg r1, r2; XmmReg r1x; vmovd(r1x, dword_ptr[regptrs + sizeof(void *) * (iter.e.ival + RWPTR_START_OF_INTERNAL_VARIABLES)]); vbroadcastss(r1, r1x); vmovaps(r2, r1); stack.push_back(std::make_pair(r1, r2)); } } else if (iter.op == opLoadFramePropVar) { if (processSingle) { YmmReg r1; XmmReg r1x; vmovd(r1x, dword_ptr[regptrs + sizeof(void*) * (iter.e.ival + RWPTR_START_OF_INTERNAL_FRAMEPROP_VARIABLES)]); vbroadcastss(r1, r1x); stack1.push_back(r1); } else { YmmReg r1, r2; XmmReg r1x; vmovd(r1x, dword_ptr[regptrs + sizeof(void*) * (iter.e.ival + RWPTR_START_OF_INTERNAL_FRAMEPROP_VARIABLES)]); vbroadcastss(r1, r1x); vmovaps(r2, r1); stack.push_back(std::make_pair(r1, r2)); } } else if (iter.op == opLoadSrc8) { if (processSingle) { XmmReg r1x; YmmReg r1; Reg a; mov(a, ptr[regptrs + sizeof(void *) * (iter.e.ival + RWPTR_START_OF_INPUTS)]); // 8 bytes, 8 pixels * uint8_t vmovq(r1x, mmword_ptr[a]); // 8->32 bits like _mm256_cvtepu8_epi32 vpmovzxbd(r1, r1x); // int -> float vcvtdq2ps(r1, r1); if (maskIt) vblendps(r1, zero, r1, mask); stack1.push_back(r1); } else { XmmReg r1x; YmmReg r1, r2; Reg a; mov(a, ptr[regptrs + sizeof(void *) * (iter.e.ival + RWPTR_START_OF_INPUTS)]); // 16 bytes, 16 pixels * uint8_t vmovdqa(r1x, xmmword_ptr[a]); // 8->16 bits like _mm256_cvtepu8_epi16 vpmovzxbw(r1, r1x); // 16->32 bit like _mm256_cvtepu16_epi32 vextracti128(r1x, r1, 1); // upper 128 vpmovzxwd(r2, r1x); vextracti128(r1x, r1, 0); // lower 128 vpmovzxwd(r1, r1x); // int -> float vcvtdq2ps(r1, r1); vcvtdq2ps(r2, r2); if (maskIt) vblendps(r2, zero, r2, mask); stack.push_back(std::make_pair(r1, r2)); } } else if (iter.op == opLoadSrc16) { if (processSingle) { XmmReg r1x; YmmReg r1; Reg a; mov(a, ptr[regptrs + sizeof(void *) * (iter.e.ival + RWPTR_START_OF_INPUTS)]); // 16 bytes, 8 pixels * uint16_t vmovdqa(r1x, xmmword_ptr[a]); // 16->32 bit like _mm256_cvtepu16_epi32 vpmovzxwd(r1, r1x); // int -> float vcvtdq2ps(r1, r1); if (maskIt) vblendps(r1, zero, r1, mask); stack1.push_back(r1); } else { XmmReg r1x; YmmReg r1, r2; Reg a; mov(a, ptr[regptrs + sizeof(void *) * (iter.e.ival + RWPTR_START_OF_INPUTS)]); // 32 bytes, 16 pixels * uint16_t vmovdqa(r1, ymmword_ptr[a]); // 16->32 bit like _mm256_cvtepu16_epi32 vextracti128(r1x, r1, 1); // upper 128 vpmovzxwd(r2, r1x); vextracti128(r1x, r1, 0); // lower 128 vpmovzxwd(r1, r1x); // int -> float vcvtdq2ps(r1, r1); vcvtdq2ps(r2, r2); if (maskIt) vblendps(r2, zero, r2, mask); stack.push_back(std::make_pair(r1, r2)); } } else if (iter.op == opLoadSrcF32) { if (processSingle) { YmmReg r1; Reg a; mov(a, ptr[regptrs + sizeof(void *) * (iter.e.ival + RWPTR_START_OF_INPUTS)]); // 32 bytes, 8 * float vmovdqa(r1, ymmword_ptr[a]); if (maskIt) vblendps(r1, zero, r1, mask); stack1.push_back(r1); } else { YmmReg r1, r2; Reg a; mov(a, ptr[regptrs + sizeof(void *) * (iter.e.ival + RWPTR_START_OF_INPUTS)]); // 32 bytes, 8 * float vmovdqa(r1, ymmword_ptr[a]); vmovdqa(r2, ymmword_ptr[a + 32]); // needs 64 byte aligned data to prevent read past valid data! if (maskIt) vblendps(r2, zero, r2, mask); stack.push_back(std::make_pair(r1, r2)); } } else if (iter.op == opLoadSrcF16) { // not supported in avs+ if (processSingle) { YmmReg r1; Reg a; mov(a, ptr[regptrs + sizeof(void *) * (iter.e.ival + RWPTR_START_OF_INPUTS)]); vcvtph2ps(r1, xmmword_ptr[a]); if (maskIt) vblendps(r1, zero, r1, mask); stack1.push_back(r1); } else { YmmReg r1, r2; Reg a; mov(a, ptr[regptrs + sizeof(void *) * (iter.e.ival + RWPTR_START_OF_INPUTS)]); vcvtph2ps(r1, xmmword_ptr[a]); vcvtph2ps(r2, xmmword_ptr[a + 16]); if (maskIt) vblendps(r2, zero, r2, mask); stack.push_back(std::make_pair(r1, r2)); } } else if (iter.op == opLoadVar) { if (processSingle) { YmmReg r1; // 32 bytes/variable int offset = sizeof(void *) * RWPTR_START_OF_USERVARIABLES + 32 * iter.e.ival; // 32 bytes, 8 * float vmovdqa(r1, ymmword_ptr[regptrs + offset]); if (maskIt) vblendps(r1, zero, r1, mask); stack1.push_back(r1); } else { YmmReg r1, r2; // 64 bytes/variable int offset = sizeof(void *) * RWPTR_START_OF_USERVARIABLES + 64 * iter.e.ival; // 32 bytes, 8 * float vmovdqa(r1, ymmword_ptr[regptrs + offset]); vmovdqa(r2, ymmword_ptr[regptrs + offset + 32]); // needs 64 byte aligned data to prevent read past valid data! if (maskIt) vblendps(r2, zero, r2, mask); stack.push_back(std::make_pair(r1, r2)); } } else if (iter.op == opLoadConst) { if (processSingle) { YmmReg r1; Reg32 a; XmmReg r1x; mov(a, iter.e.ival); vmovd(r1x, a); vbroadcastss(r1, r1x); stack1.push_back(r1); } else { YmmReg r1, r2; Reg32 a; XmmReg r1x; mov(a, iter.e.ival); vmovd(r1x, a); vbroadcastss(r1, r1x); vmovaps(r2, r1); stack.push_back(std::make_pair(r1, r2)); } } else if (iter.op == opDup) { if (processSingle) { auto p = std::next(stack1.rbegin(), iter.e.ival); YmmReg r1; vmovaps(r1, *p); stack1.push_back(r1); } else { auto p = std::next(stack.rbegin(), iter.e.ival); YmmReg r1, r2; vmovaps(r1, p->first); vmovaps(r2, p->second); stack.push_back(std::make_pair(r1, r2)); } } else if (iter.op == opSwap) { if(processSingle) std::swap(stack1.back(), *std::next(stack1.rbegin(), iter.e.ival)); else std::swap(stack.back(), *std::next(stack.rbegin(), iter.e.ival)); } else if (iter.op == opAdd) { if (processSingle) { TwoArgOp_Single_Avx(vaddps); } else { TwoArgOp_Avx(vaddps); } } else if (iter.op == opSub) { if (processSingle) { TwoArgOp_Single_Avx(vsubps); } else { TwoArgOp_Avx(vsubps); } } else if (iter.op == opMul) { if (processSingle) { TwoArgOp_Single_Avx(vmulps); } else { TwoArgOp_Avx(vmulps); } } else if (iter.op == opDiv) { if (processSingle) { TwoArgOp_Single_Avx(vdivps); } else { TwoArgOp_Avx(vdivps); } } else if (iter.op == opFmod) { if (processSingle) { auto t1 = stack1.back(); stack1.pop_back(); auto &t2 = stack1.back(); FMOD_PS_AVX(t2, t1) } else { auto t1 = stack.back(); stack.pop_back(); auto &t2 = stack.back(); FMOD_PS_AVX(t2.first, t1.first) FMOD_PS_AVX(t2.second, t1.second) } } else if (iter.op == opMax) { if (processSingle) { TwoArgOp_Single_Avx(vmaxps); } else { TwoArgOp_Avx(vmaxps); } } else if (iter.op == opMin) { if (processSingle) { TwoArgOp_Single_Avx(vminps); } else { TwoArgOp_Avx(vminps); } } else if (iter.op == opSqrt) { if (processSingle) { auto &t1 = stack1.back(); vmaxps(t1, t1, zero); vsqrtps(t1, t1); } else { auto &t1 = stack.back(); vmaxps(t1.first, t1.first, zero); vmaxps(t1.second, t1.second, zero); vsqrtps(t1.first, t1.first); vsqrtps(t1.second, t1.second); } } else if (iter.op == opStore8) { if (processSingle) { auto t1 = stack1.back(); stack1.pop_back(); Reg a; vaddps(t1, t1, CPTR_AVX(elfloat_half)); // rounder for truncate! no banker's rounding vmaxps(t1, t1, zero); vminps(t1, t1, CPTR_AVX(elstore8)); mov(a, ptr[regptrs]); vcvttps2dq(t1, t1); // float to int32 no bankers rounding XmmReg r1x, r2x; // 32 -> 16 bits from ymm 8 integers to xmm 8 words // first vextracti128(r1x, t1, 0); vextracti128(r2x, t1, 1); vpackusdw(r1x, r1x, r2x); // _mm_packus_epi32: w7 w6 w5 w4 w3 w2 w1 w0 // 16 -> 8 bits vpackuswb(r1x, r1x, r1x); // _mm_packus_epi16: w3 w2 w1 w0 w3 w2 w1 w0 vmovq(mmword_ptr[a], r1x); // store 8 bytes } else { auto t1 = stack.back(); stack.pop_back(); Reg a; vaddps(t1.first, t1.first, CPTR_AVX(elfloat_half)); // rounder for truncate! no banker's rounding vmaxps(t1.first, t1.first, zero); vaddps(t1.second, t1.second, CPTR_AVX(elfloat_half)); // rounder for truncate! no banker's rounding vmaxps(t1.second, t1.second, zero); vminps(t1.first, t1.first, CPTR_AVX(elstore8)); vminps(t1.second, t1.second, CPTR_AVX(elstore8)); mov(a, ptr[regptrs]); vcvttps2dq(t1.first, t1.first); // float to int32 no bankers rounding vcvttps2dq(t1.second, t1.second); // we have 8 integers in t.first and another 8 in t.second // second first // d15 d14 d13 d12 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0 // 16x32 bit integers in two ymm registers. not really 256 bits, but 2x128 bits XmmReg r1x, r2x, r_lo_x; // 32 -> 16 bits from ymm 8 integers to xmm 8 words // first vextracti128(r1x, t1.first, 0); vextracti128(r2x, t1.first, 1); vpackusdw(r_lo_x, r1x, r2x); // _mm_packus_epi32: w7 w6 w5 w4 w3 w2 w1 w0 // second vextracti128(r1x, t1.second, 0); // not perfect, lower 128 bits of t1 could be used as xmm in packus. Cannot tell jitasm that xxmN is lower ymmN vextracti128(r2x, t1.second, 1); vpackusdw(r1x, r1x, r2x); // _mm_packus_epi32: w7 w6 w5 w4 w3 w2 w1 w0 // 16 -> 8 bits vpackuswb(r1x, r_lo_x, r1x); // _mm_packus_epi16: w3 w2 w1 w0 w3 w2 w1 w0 vmovdqa(xmmword_ptr[a], r1x); // store 16 bytes } } else if (iter.op == opStore10 // avs+ || iter.op == opStore12 // avs+ || iter.op == opStore14 // avs+ || iter.op == opStore16 ) { if (processSingle) { auto t1 = stack1.back(); stack1.pop_back(); Reg a; vaddps(t1, t1, CPTR_AVX(elfloat_half)); // rounder for truncate! no banker's rounding vmaxps(t1, t1, zero); switch (iter.op) { case opStore10: vminps(t1, t1, CPTR_AVX(elstore10)); break; case opStore12: vminps(t1, t1, CPTR_AVX(elstore12)); break; case opStore14: vminps(t1, t1, CPTR_AVX(elstore14)); break; case opStore16: vminps(t1, t1, CPTR_AVX(elstore16)); break; } mov(a, ptr[regptrs]); vcvttps2dq(t1, t1); // min / max clamp ensures that high words are zero XmmReg r1x, r2x; // 32 -> 16 bits from ymm 8 integers to xmm 8 words vextracti128(r1x, t1, 0); // not perfect, lower 128 bits of t1 could be used as xmm in packus. Cannot tell jitasm that xxmN is lower ymmN vextracti128(r2x, t1, 1); vpackusdw(r1x, r1x, r2x); // _mm_packus_epi32: w7 w6 w5 w4 w3 w2 w1 w0 vmovdqa(xmmword_ptr[a], r1x); } else { auto t1 = stack.back(); stack.pop_back(); Reg a; vaddps(t1.first, t1.first, CPTR_AVX(elfloat_half)); // rounder for truncate! no banker's rounding vmaxps(t1.first, t1.first, zero); vaddps(t1.second, t1.second, CPTR_AVX(elfloat_half)); // rounder for truncate! no banker's rounding vmaxps(t1.second, t1.second, zero); switch (iter.op) { case opStore10: vminps(t1.first, t1.first, CPTR_AVX(elstore10)); vminps(t1.second, t1.second, CPTR_AVX(elstore10)); break; case opStore12: vminps(t1.first, t1.first, CPTR_AVX(elstore12)); vminps(t1.second, t1.second, CPTR_AVX(elstore12)); break; case opStore14: vminps(t1.first, t1.first, CPTR_AVX(elstore14)); vminps(t1.second, t1.second, CPTR_AVX(elstore14)); break; case opStore16: vminps(t1.first, t1.first, CPTR_AVX(elstore16)); vminps(t1.second, t1.second, CPTR_AVX(elstore16)); break; } mov(a, ptr[regptrs]); vcvttps2dq(t1.first, t1.first); // min / max clamp ensures that high words are zero vcvttps2dq(t1.second, t1.second); // we have 8 integers in t.first and another 8 in t.second // second first // d15 d14 d13 d12 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0 // 16x32 bit integers in two ymm registers. not really 256 bits, but 2x128 bits XmmReg r1x, r2x; // 32 -> 16 bits from ymm 8 integers to xmm 8 words // first vextracti128(r1x, t1.first, 0); // not perfect, lower 128 bits of t1 could be used as xmm in packus. Cannot tell jitasm that xxmN is lower ymmN vextracti128(r2x, t1.first, 1); vpackusdw(r1x, r1x, r2x); // _mm_packus_epi32: w7 w6 w5 w4 w3 w2 w1 w0 vmovdqa(xmmword_ptr[a], r1x); // second vextracti128(r1x, t1.second, 0); vextracti128(r2x, t1.second, 1); vpackusdw(r1x, r1x, r2x); // _mm_packus_epi32: w7 w6 w5 w4 w3 w2 w1 w0 vmovdqa(xmmword_ptr[a + 16], r1x); } } else if (iter.op == opStoreF32) { if (processSingle) { auto t1 = stack1.back(); stack1.pop_back(); Reg a; mov(a, ptr[regptrs]); vmovaps(ymmword_ptr[a], t1); } else { auto t1 = stack.back(); stack.pop_back(); Reg a; mov(a, ptr[regptrs]); vmovaps(ymmword_ptr[a], t1.first); vmovaps(ymmword_ptr[a + 32], t1.second); // this needs 64 byte aligned data to prevent overwrite! } } else if (iter.op == opStoreF16) { // not supported in avs+ if (processSingle) { auto t1 = stack1.back(); stack1.pop_back(); Reg a; mov(a, ptr[regptrs]); vcvtps2ph(xmmword_ptr[a], t1, 0); } else { auto t1 = stack.back(); stack.pop_back(); Reg a; mov(a, ptr[regptrs]); vcvtps2ph(xmmword_ptr[a], t1.first, 0); vcvtps2ph(xmmword_ptr[a + 16], t1.second, 0); } } else if (iter.op == opStoreVar || iter.op == opStoreVarAndDrop1) { if (processSingle) { auto t1 = stack1.back(); // 32 bytes/variable int offset = sizeof(void *) * RWPTR_START_OF_USERVARIABLES + 32 * iter.e.ival; vmovaps(ymmword_ptr[regptrs + offset], t1); if (iter.op == opStoreVarAndDrop1) stack1.pop_back(); } else { auto t1 = stack.back(); // 64 bytes/variable int offset = sizeof(void *) * RWPTR_START_OF_USERVARIABLES + 64 * iter.e.ival; vmovaps(ymmword_ptr[regptrs + offset], t1.first); vmovaps(ymmword_ptr[regptrs + offset + 32], t1.second); // this needs 64 byte aligned data to prevent overwrite! if (iter.op == opStoreVarAndDrop1) stack.pop_back(); } } else if (iter.op == opAbs) { if (processSingle) { auto &t1 = stack1.back(); vandps(t1, t1, CPTR_AVX(elabsmask)); } else { auto &t1 = stack.back(); vandps(t1.first, t1.first, CPTR_AVX(elabsmask)); vandps(t1.second, t1.second, CPTR_AVX(elabsmask)); } } else if (iter.op == opSgn) { // 1, 0, -1 if (processSingle) { auto &t1 = stack1.back(); YmmReg r1, r2; vxorps(r2, r2, r2); vcmpps(r1, t1, r2, _CMP_GT_OQ); vcmpps(t1, t1, r2, _CMP_LT_OQ); vandps(r1, r1, CPTR_AVX(elfloat_one)); vandps(t1, t1, CPTR_AVX(elfloat_minusone)); vorps(t1, r1, t1); } else { auto &t1 = stack.back(); YmmReg r2, r3, r4, r5; vxorps(r2, r2, r2); vcmpps(r3, t1.first, r2, _CMP_GT_OQ); vcmpps(t1.first, t1.first, r2, _CMP_LT_OQ); vcmpps(r4, t1.second, r2, _CMP_GT_OQ); vcmpps(t1.second, t1.second, r2, _CMP_LT_OQ); vmovaps(r2, CPTR_AVX(elfloat_one)); vandps(r3, r3, r2); vmovaps(r5, CPTR_AVX(elfloat_minusone)); vblendvps(t1.first, r3, r5, t1.first); vandps(r2, r4, r2); vblendvps(t1.second, r2, r5, t1.second); } } else if (iter.op == opNeg) { if (processSingle) { auto &t1 = stack1.back(); vcmpps(t1, t1, zero, _CMP_LE_OQ); // cmpleps vandps(t1, t1, CPTR_AVX(elfloat_one)); } else { auto &t1 = stack.back(); vcmpps(t1.first, t1.first, zero, _CMP_LE_OQ); // cmpleps vcmpps(t1.second, t1.second, zero, _CMP_LE_OQ); vandps(t1.first, t1.first, CPTR_AVX(elfloat_one)); vandps(t1.second, t1.second, CPTR_AVX(elfloat_one)); } } else if (iter.op == opNegSign) { if (processSingle) { auto& t1 = stack1.back(); vxorps(t1, t1, CPTR_AVX(elsignmask)); } else { auto& t1 = stack.back(); vxorps(t1.first, t1.first, CPTR_AVX(elsignmask)); vxorps(t1.second, t1.second, CPTR_AVX(elsignmask)); } } else if (iter.op == opAnd) { if (processSingle) { LogicOp_Single_Avx(vandps); } else { LogicOp_Avx(vandps); } } else if (iter.op == opOr) { if (processSingle) { LogicOp_Single_Avx(vorps); } else { LogicOp_Avx(vorps); } } else if (iter.op == opXor) { if (processSingle) { LogicOp_Single_Avx(vxorps); } else { LogicOp_Avx(vxorps); } } else if (iter.op == opGt) { // a > b (gt) -> b < (lt) a if (processSingle) { CmpOp_Single_Avx(vcmpps, _CMP_LT_OQ); // cmpltps } else { CmpOp_Avx(vcmpps, _CMP_LT_OQ) // cmpltps } } else if (iter.op == opLt) { // a < b (lt) -> b > (gt,nle) a if (processSingle) { CmpOp_Single_Avx(vcmpps, _CMP_GT_OQ); // cmpnleps } else { CmpOp_Avx(vcmpps, _CMP_GT_OQ); // cmpnleps } } else if (iter.op == opEq) { if (processSingle) { CmpOp_Single_Avx(vcmpps, _CMP_EQ_OQ); } else { CmpOp_Avx(vcmpps, _CMP_EQ_OQ); } } else if (iter.op == opNotEq) { // avs+ if (processSingle) { CmpOp_Single_Avx(vcmpps, _CMP_NEQ_OQ); } else { CmpOp_Avx(vcmpps, _CMP_NEQ_OQ); } } else if (iter.op == opLE) { // a <= b -> b >= (ge,nlt) a if (processSingle) { CmpOp_Single_Avx(vcmpps, _CMP_GE_OS); // cmpnltps } else { CmpOp_Avx(vcmpps, _CMP_GE_OS) // cmpnltps } } else if (iter.op == opGE) { // a >= b -> b <= (le) a if (processSingle) { CmpOp_Single_Avx(vcmpps, _CMP_LE_OS) // cmpleps } else { CmpOp_Avx(vcmpps, _CMP_LE_OS) // cmpleps } } else if (iter.op == opTernary) { if (processSingle) { auto t1 = stack1.back(); stack1.pop_back(); auto t2 = stack1.back(); stack1.pop_back(); auto t3 = stack1.back(); stack1.pop_back(); YmmReg r1; vxorps(r1, r1, r1); vcmpps(r1, r1, t3, _CMP_LT_OQ); // cmpltps -> vcmpps ... _CMP_LT_OQ vandps(t2, t2, r1); vandnps(r1, r1, t1); vorps(r1, r1, t2); stack1.push_back(r1); } else { auto t1 = stack.back(); stack.pop_back(); auto t2 = stack.back(); stack.pop_back(); auto t3 = stack.back(); stack.pop_back(); YmmReg r1, r2; vxorps(r1, r1, r1); vxorps(r2, r2, r2); vcmpps(r1, r1, t3.first, _CMP_LT_OQ); // cmpltps -> vcmpps ... _CMP_LT_OQ vcmpps(r2, r2, t3.second, _CMP_LT_OQ); vandps(t2.first, t2.first, r1); vandps(t2.second, t2.second, r2); vandnps(r1, r1, t1.first); vandnps(r2, r2, t1.second); vorps(r1, r1, t2.first); vorps(r2, r2, t2.second); stack.push_back(std::make_pair(r1, r2)); } } else if (iter.op == opExp) { if (processSingle) { auto &t1 = stack1.back(); EXP_PS_AVX(t1); } else { auto &t1 = stack.back(); EXP_PS_AVX(t1.first); EXP_PS_AVX(t1.second); } } else if (iter.op == opLog) { if (processSingle) { auto &t1 = stack1.back(); LOG_PS_AVX(t1); } else { auto &t1 = stack.back(); LOG_PS_AVX(t1.first); LOG_PS_AVX(t1.second); } } else if (iter.op == opPow) { if (processSingle) { auto t1 = stack1.back(); stack1.pop_back(); auto &t2 = stack1.back(); LOG_PS_AVX(t2); vmulps(t2, t2, t1); EXP_PS_AVX(t2); } else { auto t1 = stack.back(); stack.pop_back(); auto &t2 = stack.back(); LOG_PS_AVX(t2.first); vmulps(t2.first, t2.first, t1.first); EXP_PS_AVX(t2.first); LOG_PS_AVX(t2.second); vmulps(t2.second, t2.second, t1.second); EXP_PS_AVX(t2.second); } } else if (iter.op == opSin) { if (processSingle) { auto& _t1 = stack1.back(); SINCOS_PS_AVX(true, _t1, _t1); } else { auto& _t1 = stack.back(); SINCOS_PS_AVX(true, _t1.first, _t1.first); SINCOS_PS_AVX(true, _t1.second, _t1.second); } } else if (iter.op == opCos) { if (processSingle) { auto& _t1 = stack1.back(); SINCOS_PS_AVX(false, _t1, _t1); } else { auto& _t1 = stack.back(); SINCOS_PS_AVX(false, _t1.first, _t1.first); SINCOS_PS_AVX(false, _t1.second, _t1.second); } } else if (iter.op == opTan) { if (processSingle) { auto& t1 = stack1.back(); TAN_PS_AVX(t1); } else { auto& t1 = stack.back(); TAN_PS_AVX(t1.first); TAN_PS_AVX(t1.second); } } else if (iter.op == opAtan2) { if (processSingle) { auto t1 = stack1.back(); stack1.pop_back(); auto &t2 = stack1.back(); ATAN2_PS_AVX(t2, t1); } else { auto t1 = stack.back(); stack.pop_back(); auto &t2 = stack.back(); ATAN2_PS_AVX(t2.first, t1.first); ATAN2_PS_AVX(t2.second, t1.second); } } else if (iter.op == opClip) { // clip(a, low, high) = min(max(a, low),high) if (processSingle) { auto t1 = stack1.back(); stack1.pop_back(); auto t2 = stack1.back(); stack1.pop_back(); auto &t3 = stack1.back(); vmaxps(t3, t3, t2); vminps(t3, t3, t1); } else { auto t1 = stack.back(); stack.pop_back(); auto t2 = stack.back(); stack.pop_back(); auto &t3 = stack.back(); vmaxps(t3.first, t3.first, t2.first); vminps(t3.first, t3.first, t1.first); vmaxps(t3.second, t3.second, t2.second); vminps(t3.second, t3.second, t1.second); } } else if (iter.op == opRound || iter.op == opFloor || iter.op == opCeil || iter.op == opTrunc) { const int rounder_flag = (iter.op == opRound) ? (FROUND_TO_NEAREST_INT | FROUND_NO_EXC) : (iter.op == opFloor) ? (FROUND_TO_NEG_INF | FROUND_NO_EXC) : (iter.op == opCeil) ? (FROUND_TO_POS_INF | FROUND_NO_EXC) : (FROUND_TO_ZERO | FROUND_NO_EXC); // opTrunc if (processSingle) { auto& t1 = stack1.back(); vroundps(t1, t1, rounder_flag); } else { auto& t1 = stack.back(); vroundps(t1.first, t1.first, rounder_flag); vroundps(t1.second, t1.second, rounder_flag); } } } } /* In brief: jitasm was modded to accept avx_epilog_=true for code generation Why: couldn't use vzeroupper because prolog/epilog was saving all xmm6:xmm15 registers even if they were not used at all Why2: movaps was generated instead of vmovaps for prolog/epilog Why3: internal register reordering/saving was non-vex encoded All these issues resulted in AVX->SSE2 penalty From MSDN: XMM6:XMM15, YMM6:YMM15 rules for x64: Nonvolatile (XMM), Volatile (upper half of YMM) XMM6:XMM15 Must be preserved as needed by callee. YMM registers must be preserved as needed by caller. (they do not need to be preserved) Problem: - Jitasm saves xmm6..xmm15 when vzeroupper is used,even if only an xmm0 is used (Why?) No problem (looking at the disassembly list): - when there is no vzeroupper, then the xmm6:xmm11 is properly saved/restored in prolog/epilog but only if ymm6:ymm11 (in this example) is used. If no register is used over xmm6/ymm6 then xmm registers are not saved at all. - question: does it have any penalty when movaps is used w/o vzeroupper? The epilog generates movaps movaps xmm11,xmmword ptr [rbx-10h] 0000000002430000 push rbp 0000000002430001 mov rbp,rsp 0000000002430004 push rbx 0000000002430005 lea rbx,[rsp-8] 000000000243000A sub rsp,0A8h 0000000002430011 movaps xmmword ptr [rbx-0A0h],xmm6 0000000002430018 movaps xmmword ptr [rbx-90h],xmm7 000000000243001F movaps xmmword ptr [rbx-80h],xmm8 0000000002430024 movaps xmmword ptr [rbx-70h],xmm9 0000000002430029 movaps xmmword ptr [rbx-60h],xmm10 000000000243002E movaps xmmword ptr [rbx-50h],xmm11 0000000002430033 movaps xmmword ptr [rbx-40h],xmm12 0000000002430038 movaps xmmword ptr [rbx-30h],xmm13 000000000243003D movaps xmmword ptr [rbx-20h],xmm14 0000000002430042 movaps xmmword ptr [rbx-10h],xmm15 -- end of jitasm generated prolog -- PF AVX+: passing avx_epilog_ = true for codegen, vmovaps is generated instead of movaps 0000000001E60010 vmovaps xmmword ptr [rbx-60h],xmm6 0000000001E60015 vmovaps xmmword ptr [rbx-50h],xmm7 0000000001E6001A vmovaps xmmword ptr [rbx-40h],xmm8 0000000001E6001F vmovaps xmmword ptr [rbx-30h],xmm9 0000000001E60024 vmovaps xmmword ptr [rbx-20h],xmm10 0000000001E60029 vmovaps xmmword ptr [rbx-10h],xmm11 // PF comment: user's code like this: YmmReg zero; vpxor(zero, zero, zero); Reg constptr; mov(constptr, (uintptr_t)logexpconst_avx); vzeroupper(); And the generated instructions: 0000000002430047 vpxor ymm0,ymm0,ymm0 000000000243004B mov rax,7FECCBD15C0h 0000000002430055 vzeroupper Note: Don't use vzeroupper manually. When vzeroupper is issued manually, jitasm is not too generous: marks all xmm6:xmm15 registers as used and epilog and prolog will save all of them, even if none of those xmm/ymm registers are used in the code. Modded jitasm: pass avx_epilog_ = true for codegen, it will issue vzeroupper automatically (and has other benefits) -- start of jitasm generated epilog (old) 0000000002430058 movaps xmm15,xmmword ptr [rbx-10h] 000000000243005D movaps xmm14,xmmword ptr [rbx-20h] 0000000002430062 movaps xmm13,xmmword ptr [rbx-30h] 0000000002430067 movaps xmm12,xmmword ptr [rbx-40h] 000000000243006C movaps xmm11,xmmword ptr [rbx-50h] 0000000002430071 movaps xmm10,xmmword ptr [rbx-60h] 0000000002430076 movaps xmm9,xmmword ptr [rbx-70h] 000000000243007B movaps xmm8,xmmword ptr [rbx-80h] 0000000002430080 movaps xmm7,xmmword ptr [rbx-90h] 0000000002430087 movaps xmm6,xmmword ptr [rbx-0A0h] 000000000243008E add rsp,0A8h 0000000002430095 pop rbx 0000000002430096 pop rbp 0000000002430097 ret -- end of jitasm generated epilog (old) PF: modded jitasm (calling codegen with avx_epilog_ = true) generates vmovaps instead of movaps and and automatic vzeroupper before the ret instruction generated epilog example (new): 0000000001E70613 vmovaps xmm11,xmmword ptr [rbx-10h] 0000000001E70618 vmovaps xmm10,xmmword ptr [rbx-20h] 0000000001E7061D vmovaps xmm9,xmmword ptr [rbx-30h] 0000000001E70622 vmovaps xmm8,xmmword ptr [rbx-40h] 0000000001E70627 vmovaps xmm7,xmmword ptr [rbx-50h] 0000000001E7062C vmovaps xmm6,xmmword ptr [rbx-60h] 0000000001E70631 add rsp,68h 0000000001E70635 pop rdi 0000000001E70636 pop rsi 0000000001E70637 pop rbx 0000000001E70638 pop rbp 0000000001E70639 vzeroupper 0000000001E7063C ret */ void main(Reg regptrs, Reg regoffs, Reg niter, Reg SpatialY) { YmmReg zero; vpxor(zero, zero, zero); Reg constptr; mov(constptr, (uintptr_t)logexpconst_avx); L("wloop"); cmp(niter, 0); // while(niter>0) je("wend"); sub(niter, 1); // process two sets, no partial input masking if(singleMode) processingLoop(regptrs, zero, constptr, SpatialY); else processingLoop(regptrs, zero, constptr, SpatialY); // increase read and write pointers by 16 pixels const int EXTRA = 2; // output pointer, xcounter if constexpr(sizeof(void *) == 8) { // x64: two 8 byte pointers in an xmm int numIter = (numInputs + EXTRA + 1) / 2; for (int i = 0; i < numIter; i++) { XmmReg r1, r2; vmovdqu(r1, xmmword_ptr[regptrs + 16 * i]); vmovdqu(r2, xmmword_ptr[regoffs + 16 * i]); vpaddq(r1, r1, r2); // pointers are 64 bits vmovdqu(xmmword_ptr[regptrs + 16 * i], r1); } } else { // x86: four 4 byte pointers in an xmm int numIter = (numInputs + EXTRA + 3) / 4; for (int i = 0; i < numIter; i++) { XmmReg r1, r2; vmovdqu(r1, xmmword_ptr[regptrs + 16 * i]); vmovdqu(r2, xmmword_ptr[regoffs + 16 * i]); vpaddd(r1, r1, r2); // pointers are 32 bits vmovdqu(xmmword_ptr[regptrs + 16 * i], r1); } } jmp("wloop"); L("wend"); int nrestpixels = planewidth & (singleMode ? 7 : 15); if(nrestpixels > 8) // dual process with masking processingLoop(regptrs, zero, constptr, SpatialY); else if (nrestpixels == 8) // single process, no masking processingLoop(regptrs, zero, constptr, SpatialY); else if (nrestpixels > 0) // single process, masking processingLoop(regptrs, zero, constptr, SpatialY); // bug in jitasm? // on x64, when this is here, debug throws an assert, that a register save/load has an // operand size 8 bit, instead of 128 (XMM) or 256 (YMM) // vzeroupper(); // don't use it directly. Generate code with avx_epilog_=true } }; #endif /******************************************************************** ***** Declare index of new filters for Avisynth's filter engine ***** ********************************************************************/ extern const AVSFunction Exprfilter_filters[] = { { "Expr", BUILTIN_FUNC_PREFIX, "c+s+[format]s[optAvx2]b[optSingleMode]b[optSSE2]b[scale_inputs]s[clamp_float]b[clamp_float_UV]b[lut]i[optVectorC]b", Exprfilter::Create }, { 0 } }; AVSValue __cdecl Exprfilter::Create(AVSValue args, void* , IScriptEnvironment* env) { std::vector children; std::vector expressions; int next_paramindex; // one or more clips if (args[0].IsArray() && args[0][0].IsClip()) { // c+s+ case children.resize(args[0].ArraySize()); for (int i = 0; i < (int)children.size(); ++i) // Copy all children[i] = args[0][i].AsClip(); next_paramindex = 1; } else if (args[1].IsArray() && args[1][0].IsClip()) { // cc+s+ case children.resize(1 + args[1].ArraySize()); children[0] = args[0].AsClip(); // Copy 1st for (int i = 1; i < (int)children.size(); ++i) // Copy rest children[i] = args[1][i - 1].AsClip(); next_paramindex = 2; } else if (args[1].IsClip()) { //cc case children.resize(2); children[0] = args[0].AsClip(); children[1] = args[1].AsClip(); next_paramindex = 2; } else if (args[0].IsClip()) { // single clip, cs+ case children.resize(1); children[0] = args[0].AsClip(); next_paramindex = 1; } else { env->ThrowError("Expr: Invalid parameter type"); } // one or more expressions: s+ if (args[next_paramindex].Defined()) { AVSValue exprarg = args[next_paramindex++]; if (exprarg.IsArray()) { int nexpr = exprarg.ArraySize(); expressions.resize(nexpr); for (int i = 0; i < nexpr; i++) expressions[i] = exprarg[i].AsString(); } else if (exprarg.IsString()) { expressions.resize(1); expressions[0] = exprarg.AsString(); } else { env->ThrowError("Expr: Invalid parameter type for expression string"); } } // optional named argument: format const char *newformat = nullptr; if (args[next_paramindex].Defined()) { // always string newformat = args[next_paramindex].AsString(); } next_paramindex++; #ifdef VS_TARGET_CPU_X86 // test parameter for avx2-less mode even with avx2 available #ifdef TEST_AVX2_CODEGEN_IN_AVX bool optAvx2 = !!(env->GetCPUFlags() & CPUF_AVX); #else bool optAvx2 = !!(env->GetCPUFlags() & CPUF_AVX2); #endif bool optSSE2 = !!(env->GetCPUFlags() & CPUF_SSE2); #else bool optAvx2 = false; bool optSSE2 = false; #endif if (args[next_paramindex].Defined()) { if (optAvx2) // disable only optAvx2 = args[next_paramindex].AsBool(); } next_paramindex++; bool optSingleMode = false; if (args[next_paramindex].Defined()) { optSingleMode = args[next_paramindex].AsBool(); } next_paramindex++; if (args[next_paramindex].Defined()) { if (optSSE2) // disable only optSSE2 = args[next_paramindex].AsBool(); } next_paramindex++; std::string scale_inputs = args[next_paramindex].Defined() ? args[next_paramindex].AsString("none") : "none"; transform(scale_inputs.begin(), scale_inputs.end(), scale_inputs.begin(), ::tolower); next_paramindex++; const bool clamp_float = args[next_paramindex].AsBool(false); next_paramindex++; const bool clamp_float_UV = args[next_paramindex].AsBool(false); next_paramindex++; // clamp_float clamp_float_uv -> clamp_float_i clamp range for Y clamp range for UV // false x 0 0..1 -0.5..+0.5 // true false 1 0..1 -0.5..+0.5 // true true 2 0..1 0..1 int clamp_float_i; if (clamp_float) clamp_float_i = clamp_float_UV ? 2 : 1; else clamp_float_i = 0; const int lutmode = args[next_paramindex].AsInt(0); // 0, 1, 2 next_paramindex++; const bool optVectorC = args[next_paramindex].AsBool(true); return new Exprfilter(children, expressions, newformat, optAvx2, optSingleMode, optSSE2, optVectorC, scale_inputs, clamp_float_i, lutmode, env); } // Base SIMD Processor interface class ISIMDProcessor { public: virtual void processVector( std::vector&srcp, uint8_t*& dstp, int x, int y) = 0; virtual ~ISIMDProcessor() = default; }; /** * Custom aligned memory allocator for STL containers like std::vector * * This allocator ensures that the underlying data pointer returned by container.data() * is aligned to the specified alignment boundary, which is critical for: * - SIMD vector operations that require aligned memory access * - Cache-friendly data structures * - Hardware-specific memory alignment requirements * * Platform-specific implementation: * - Windows (MSVC, ClangCL): Uses _aligned_malloc/_aligned_free * - MinGW: Uses _aligned_malloc/_aligned_free * - POSIX systems (Linux, Unix, macOS): Uses aligned_alloc/free * - C++17 fallback: Uses std::aligned_alloc/free * * Usage: * std::vector> aligned_vector; */ template struct aligned_allocator { // Standard allocator typedefs typedef T value_type; typedef T* pointer; typedef const T* const_pointer; typedef T& reference; typedef const T& const_reference; typedef std::size_t size_type; typedef std::ptrdiff_t difference_type; // Rebind allocator to type U template struct rebind { typedef aligned_allocator other; }; aligned_allocator() noexcept {} template aligned_allocator(const aligned_allocator&) noexcept {} T* allocate(std::size_t n) { #if defined(_MSC_VER) || (defined(__clang__) && defined(_MSC_VER)) // Both MSVC and ClangCL should use _aligned_malloc void* ptr = _aligned_malloc(n * sizeof(T), Alignment); if (!ptr) throw std::bad_alloc(); #elif defined(__MINGW32__) || defined(__MINGW64__) // MinGW/MinGW-w64 specific void* ptr = _aligned_malloc(n * sizeof(T), Alignment); if (!ptr) throw std::bad_alloc(); #elif defined(__INTEL_COMPILER) || defined(__INTEL_LLVM_COMPILER) || defined(__APPLE__) || (defined(__GNUC__) && !defined(_WIN32) && !defined(__CYGWIN__)) // POSIX-compliant systems: Intel compilers, macOS, GCC on non-Windows // aligned_alloc requires size to be a multiple of alignment size_t size = n * sizeof(T); if (size % Alignment != 0) { size = (size / Alignment + 1) * Alignment; } void* ptr = aligned_alloc(Alignment, size); if (!ptr) throw std::bad_alloc(); #else // Generic fallback for C++17 and later // std::aligned_alloc requires size to be a multiple of alignment size_t size = n * sizeof(T); if (size % Alignment != 0) { size = (size / Alignment + 1) * Alignment; } void* ptr = std::aligned_alloc(Alignment, size); if (!ptr) throw std::bad_alloc(); #endif return static_cast(ptr); } void deallocate(T* p, std::size_t) noexcept { #if defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__) || (defined(__clang__) && defined(_MSC_VER)) _aligned_free(p); #else free(p); #endif } }; // convenient type def using aligned_float_vector = std::vector>; template class SIMDProcessor : public ISIMDProcessor { int w, h; size_t maxStackSize; // Define the aligned stack with custom allocator std::vector stack; aligned_float_vector& variable_area; std::vector& internal_vars; std::vector& src_stride; std::vector& srcp_orig; const ExprOp* vops; public: SIMDProcessor(int _w, int _h, size_t _maxStackSize, aligned_float_vector& var_area, std::vector& int_vars, std::vector& src_str, std::vector& src_orig, const ExprOp* vops) : w(_w), h(_h), maxStackSize(_maxStackSize), stack(_maxStackSize, aligned_float_vector(VectorSize)), variable_area(var_area), internal_vars(int_vars), src_stride(src_str), srcp_orig(src_orig), vops(vops) { } int stackIndex = 0; alignas(32) float stacktop[VectorSize] = {}; // Broadcast a single value across the vector inline void push_and_broadcast(float val) { auto& current_stack = stack[stackIndex]; // First loop: copy stacktop to stack - help vectorization pattern for (int i = 0; i < VectorSize; ++i) current_stack[i] = stacktop[i]; for (int i = 0; i < VectorSize; ++i) stacktop[i] = val; stackIndex++; } inline void broadcast(float val) { for (int i = 0; i < VectorSize; ++i) stacktop[i] = val; } // Load spatial X coordinate inline void loadSpatialX(int x) { // Push current stacktop and fills x, x+1, x+2, x+3, ... auto& current_stack = stack[stackIndex]; for (int i = 0; i < VectorSize; ++i) current_stack[i] = stacktop[i]; for (int i = 0; i < VectorSize; ++i) stacktop[i] = static_cast(x + i); stackIndex++; } // Load vector from source from x template inline void loadSource(const T* src, int x) { auto& current_stack = stack[stackIndex]; for (int i = 0; i < VectorSize; ++i) current_stack[i] = stacktop[i]; for (int i = 0; i < VectorSize; ++i) stacktop[i] = static_cast(src[x + i]); stackIndex++; } // Load from source with relative offset template void loadRelSource(const T* src, int x, int dx, int dy, int width, int height, int stride) { auto& current_stack = stack[stackIndex]; for (int i = 0; i < VectorSize; ++i) current_stack[i] = stacktop[i]; // At edges: repeat, no mirror int newY = std::max(0, std::min(dy, height - 1)); for (int i = 0; i < VectorSize; ++i) { int newX = std::max(0, std::min(x + dx + i, width - 1)); stacktop[i] = static_cast(reinterpret_cast((uint8_t*)&src[newY * stride])[newX]); } stackIndex++; } // Load from user variable area inline void loadVar(int index) { auto& current_stack = stack[stackIndex]; for (int i = 0; i < VectorSize; ++i) current_stack[i] = stacktop[i]; // Push current stacktop and broadcast x for (int i = 0; i < VectorSize; ++i) stacktop[i] = variable_area[index * MAX_C_VECT + i]; stackIndex++; } // Vectorized duplicate inline void dup(int offset) { auto& current_stack = stack[stackIndex]; for (int i = 0; i < VectorSize; ++i) current_stack[i] = stacktop[i]; auto& prev = stack[stackIndex - offset]; for (int i = 0; i < VectorSize; ++i) stacktop[i] = prev[i]; stackIndex++; } // Vectorized swap inline void swap(int offset) { auto& prev = stack[stackIndex - offset]; for (int i = 0; i < VectorSize; ++i) std::swap(stacktop[i], prev[i]); } // Vectorized addition inline void add() { stackIndex--; auto& prev = stack[stackIndex]; for (int i = 0; i < VectorSize; ++i) stacktop[i] += prev[i]; } // Vectorized subtract inline void sub() { stackIndex--; auto& prev = stack[stackIndex]; for (int i = 0; i < VectorSize; ++i) stacktop[i] = prev[i] - stacktop[i]; } // Vectorized multiplication inline void multiply() { stackIndex--; auto& prev = stack[stackIndex]; for (int i = 0; i < VectorSize; ++i) stacktop[i] *= prev[i]; } inline void divide() { stackIndex--; auto& prev = stack[stackIndex]; for (int i = 0; i < VectorSize; ++i) stacktop[i] = prev[i] / stacktop[i]; } void fmod() { stackIndex--; auto& prev = stack[stackIndex]; for (int i = 0; i < VectorSize; ++i) stacktop[i] = std::fmod(prev[i], stacktop[i]); } inline void max() { stackIndex--; auto& prev = stack[stackIndex]; for (int i = 0; i < VectorSize; ++i) stacktop[i] = std::max(prev[i], stacktop[i]); } inline void min() { stackIndex--; auto& prev = stack[stackIndex]; for (int i = 0; i < VectorSize; ++i) stacktop[i] = std::min(prev[i], stacktop[i]); } void exp() { for (int i = 0; i < VectorSize; ++i) stacktop[i] = std::exp(stacktop[i]); } void log() { for (int i = 0; i < VectorSize; ++i) stacktop[i] = std::log(stacktop[i]); } void pow() { stackIndex--; auto& prev = stack[stackIndex]; for (int i = 0; i < VectorSize; ++i) stacktop[i] = std::pow(prev[i], stacktop[i]); } // Vectorized clip inline void clip() { stackIndex -= 2; auto& prev = stack[stackIndex]; auto& prev1 = stack[stackIndex + 1]; for (int i = 0; i < VectorSize; ++i) stacktop[i] = std::max(std::min(prev[i], stacktop[i]), prev1[i]); } // Vectorized round inline void round() { for (int i = 0; i < VectorSize; ++i) stacktop[i] = std::round(stacktop[i]); } // Vectorized floor inline void floor() { for (int i = 0; i < VectorSize; ++i) stacktop[i] = std::floor(stacktop[i]); } // Vectorized ceil void ceil() { for (int i = 0; i < VectorSize; ++i) stacktop[i] = std::ceil(stacktop[i]); } // Vectorized trunc inline void trunc() { for (int i = 0; i < VectorSize; ++i) stacktop[i] = std::trunc(stacktop[i]); } // Vectorized sqrt void sqrt() { for (int i = 0; i < VectorSize; ++i) stacktop[i] = std::sqrt(stacktop[i]); } // Vectorized abs inline void abs() { for (int i = 0; i < VectorSize; ++i) stacktop[i] = std::abs(stacktop[i]); } // Vectorized sgn inline void sgn() { for (int i = 0; i < VectorSize; ++i) stacktop[i] = stacktop[i] < 0 ? -1.0f : stacktop[i] > 0 ? 1.0f : 0.0f; } // Vectorized sin void sin() { for (int i = 0; i < VectorSize; ++i) stacktop[i] = std::sin(stacktop[i]); } // Vectorized cos void cos() { for (int i = 0; i < VectorSize; ++i) stacktop[i] = std::cos(stacktop[i]); } // Vectorized tan void tan() { for (int i = 0; i < VectorSize; ++i) stacktop[i] = std::tan(stacktop[i]); // reference of JITAsm code test: fast_tanf(stacktop[i]); } // Vectorized asin void asin() { for (int i = 0; i < VectorSize; ++i) stacktop[i] = std::asin(stacktop[i]); } // Vectorized acos void acos() { for (int i = 0; i < VectorSize; ++i) stacktop[i] = std::acos(stacktop[i]); } // Vectorized atan void atan() { for (int i = 0; i < VectorSize; ++i) stacktop[i] = std::atan(stacktop[i]); } // Vectorized atan2 void atan2() { stackIndex--; auto& prev = stack[stackIndex]; for (int i = 0; i < VectorSize; ++i) stacktop[i] = std::atan2(prev[i], stacktop[i]); // y, x -> -Pi..+Pi } // Vectorized greater than inline void gt() { stackIndex--; auto& prev = stack[stackIndex]; for (int i = 0; i < VectorSize; ++i) stacktop[i] = (prev[i] > stacktop[i]) ? 1.0f : 0.0f; } // Vectorized less than inline void lt() { stackIndex--; auto& prev = stack[stackIndex]; for (int i = 0; i < VectorSize; ++i) stacktop[i] = (prev[i] < stacktop[i]) ? 1.0f : 0.0f; } // Vectorized equal inline void eq() { stackIndex--; auto& prev = stack[stackIndex]; for (int i = 0; i < VectorSize; ++i) stacktop[i] = (prev[i] == stacktop[i]) ? 1.0f : 0.0f; // consider with not 100% match, use epsilon } // Vectorized not equal inline void notEq() { stackIndex--; auto& prev = stack[stackIndex]; for (int i = 0; i < VectorSize; ++i) stacktop[i] = (prev[i] != stacktop[i]) ? 1.0f : 0.0f; // consider with not 100% match, use epsilon } // Vectorized less than or equal inline void le() { stackIndex--; auto& prev = stack[stackIndex]; for (int i = 0; i < VectorSize; ++i) stacktop[i] = (prev[i] <= stacktop[i]) ? 1.0f : 0.0f; } // Vectorized greater than or equal inline void ge() { stackIndex--; auto& prev = stack[stackIndex]; for (int i = 0; i < VectorSize; ++i) stacktop[i] = (prev[i] >= stacktop[i]) ? 1.0f : 0.0f; } // Vectorized ternary inline void ternary() { stackIndex -= 2; auto& prev = stack[stackIndex]; auto& prev1 = stack[stackIndex + 1]; for (int i = 0; i < VectorSize; ++i) stacktop[i] = (prev[i] > 0) ? prev1[i] : stacktop[i]; } // Vectorized logical AND inline void logicalAnd() { stackIndex--; auto& prev = stack[stackIndex]; for (int i = 0; i < VectorSize; ++i) stacktop[i] = (stacktop[i] > 0 && prev[i] > 0) ? 1.0f : 0.0f; } // Vectorized logical OR inline void logicalOr() { stackIndex--; auto& prev = stack[stackIndex]; for (int i = 0; i < VectorSize; ++i) stacktop[i] = (stacktop[i] > 0 || prev[i] > 0) ? 1.0f : 0.0f; } // Vectorized logical XOR inline void logicalXor() { stackIndex--; auto& prev = stack[stackIndex]; for (int i = 0; i < VectorSize; ++i) stacktop[i] = ((stacktop[i] > 0) != (prev[i] > 0)) ? 1.0f : 0.0f; } // Vectorized logical NOT inline void logicalNot() { for (int i = 0; i < VectorSize; ++i) stacktop[i] = (stacktop[i] > 0) ? 0.0f : 1.0f; } // Vectorized negation inline void negSign() { for (int i = 0; i < VectorSize; ++i) stacktop[i] = -stacktop[i]; } // Templatized store function template inline void store(T* dst, int x) { for (int i = 0; i < VectorSize; ++i) dst[x + i] = static_cast(std::max(0.0f, std::min(stacktop[i], static_cast(MaxValue))) + 0.5f); } // Specialized store function for float inline void store(float* dst, int x) { for (int i = 0; i < VectorSize; ++i) dst[x + i] = stacktop[i]; } // Store variable inline void storeVar(int index) { for (int i = 0; i < VectorSize; ++i) variable_area[index * MAX_C_VECT + i] = stacktop[i]; } // Store variable and drop one element from the stack inline void storeVarAndDrop1(int index) { for (int i = 0; i < VectorSize; ++i) variable_area[index * MAX_C_VECT + i] = stacktop[i]; stackIndex--; if (stackIndex >= 0) { auto& prev = stack[stackIndex]; for (int i = 0; i < VectorSize; ++i) stacktop[i] = prev[i]; } } // Process a sequence of operations void processVector(std::vector& srcp, uint8_t*& dstp, int x, int y) override { // Reset stack stackIndex = 0; broadcast(0); // stacktop = 0 const ExprOp* vops_current = vops; // reset instruction pointer while (true) { // Process instruction sequence switch (vops_current->op) { case opLoadSrc8: loadSource(reinterpret_cast(srcp[vops_current->e.ival]), x); break; case opLoadSrc16: loadSource(reinterpret_cast(srcp[vops_current->e.ival]), x); break; case opLoadSrcF32: loadSource(reinterpret_cast(srcp[vops_current->e.ival]), x); break; case opLoadRelSrc8: loadRelSource(reinterpret_cast(srcp[vops_current->e.ival]), x, vops_current->dx, vops_current->dy, w, h, src_stride[vops_current->e.ival]); break; case opLoadRelSrc16: loadRelSource(reinterpret_cast(srcp[vops_current->e.ival]), x, vops_current->dx, vops_current->dy, w, h, src_stride[vops_current->e.ival]); break; case opLoadRelSrcF32: loadRelSource(reinterpret_cast(srcp[vops_current->e.ival]), x, vops_current->dx, vops_current->dy, w, h, src_stride[vops_current->e.ival]); break; case opLoadConst: push_and_broadcast(vops_current->e.fval); break; case opLoadSpatialX: loadSpatialX(x); break; case opLoadSpatialY: push_and_broadcast(static_cast(y)); break; case opLoadInternalVar: push_and_broadcast(internal_vars[vops_current->e.ival]); break; case opStore8: store(reinterpret_cast(dstp), x); goto loopend; case opStore10: store(reinterpret_cast(dstp), x); goto loopend; case opStore12: store(reinterpret_cast(dstp), x); goto loopend; case opStore14: store(reinterpret_cast(dstp), x); goto loopend; case opStore16: store(reinterpret_cast(dstp), x); goto loopend; case opStoreF32: store(reinterpret_cast(dstp), x); goto loopend; case opDup: dup(vops_current->e.ival); break; case opSwap: swap(vops_current->e.ival); break; case opAdd: add(); break; case opSub: sub(); break; case opMul: multiply(); break; case opDiv: divide(); break; case opMax: max(); break; case opMin: min(); break; case opSqrt: sqrt(); break; case opAbs: abs(); break; case opSgn: sgn(); break; case opFmod: fmod(); break; case opGt: gt(); break; case opLt: lt(); break; case opEq: eq(); break; case opNotEq: notEq(); break; case opLE: le(); break; case opGE: ge(); break; case opTernary: ternary(); break; case opAnd: logicalAnd(); break; case opOr: logicalOr(); break; case opXor: logicalXor(); break; case opNeg: logicalNot(); break; case opNegSign: negSign(); break; case opExp: exp(); break; case opLog: log(); break; case opPow: pow(); break; case opSin: sin(); break; case opCos: cos(); break; case opTan: tan(); break; case opAsin: asin(); break; case opAcos: acos(); break; case opAtan: atan(); break; case opAtan2: atan2(); break; case opClip: clip(); break; case opRound: round(); break; case opFloor: floor(); break; case opCeil: ceil(); break; case opTrunc: trunc(); break; case opStoreVar: storeVar(vops_current->e.ival); break; case opLoadVar: loadVar(vops_current->e.ival); break; case opLoadFramePropVar: push_and_broadcast(internal_vars[INTERNAL_VAR_FRAMEPROP_VARIABLES_START + vops_current->e.ival]); break; case opStoreVarAndDrop1: storeVarAndDrop1(vops_current->e.ival); break; } vops_current++; // next opcode } // store makes the sequence end, wherever it was loopend:; } }; // Factory to create appropriate SIMD processors class SIMDProcessorFactory { public: template static std::unique_ptr createProcessor( int w, int h, size_t maxStackSize, aligned_float_vector& var_area, std::vector& int_vars, std::vector& src_str, std::vector& src_orig, const ExprOp* vops) { if constexpr (MaxVectorSize >= 16) { return std::make_unique>(w, h, maxStackSize, var_area, int_vars, src_str, src_orig, vops); } if constexpr (MaxVectorSize >= 8) { return std::make_unique>(w, h, maxStackSize, var_area, int_vars, src_str, src_orig, vops); } else if constexpr (MaxVectorSize >= 4) { return std::make_unique>(w, h, maxStackSize, var_area, int_vars, src_str, src_orig, vops); } else { return std::make_unique>(w, h, maxStackSize, var_area, int_vars, src_str, src_orig, vops); } } }; template void processFrameWithDynamicVectors(int plane, int w, int h, int pixels_per_iter, float framecount, float relative_time, int numInputs, uint8_t* &dstp, int dst_stride, std::vector& srcp, std::vector& src_stride, std::vector& ptroffsets, std::vector& srcp_orig, ExprData& d) { const ExprOp* vops = d.ops[plane].data(); aligned_float_vector variable_area(MAX_USER_VARIABLES * MAX_C_VECT); // for C, place for expr variables (each is a vector) std::vector internal_vars(INTERNAL_VARIABLES + MAX_FRAMEPROP_VARIABLES); // frame dependent internal variables internal_vars[INTERNAL_VAR_CURRENT_FRAME] = (float)framecount; internal_vars[INTERNAL_VAR_RELTIME] = (float)relative_time; // followed by dynamic frame properties for (auto& framePropToRead : d.frameprops[plane]) { int whereToPut = framePropToRead.var_index; internal_vars[INTERNAL_VAR_FRAMEPROP_VARIABLES_START + whereToPut] = framePropToRead.value; }; // Create processors dynamically based on MaxVectorSize std::unique_ptr processor16 = MaxVectorSize >= 16 ? SIMDProcessorFactory::createProcessor<16>(w, h, d.maxStackSize, variable_area, internal_vars, src_stride, srcp_orig, vops) : nullptr; std::unique_ptr processor8 = MaxVectorSize >= 8 ? SIMDProcessorFactory::createProcessor<8>(w, h, d.maxStackSize, variable_area, internal_vars, src_stride, srcp_orig, vops) : nullptr; std::unique_ptr processor4 = MaxVectorSize >= 4 ? SIMDProcessorFactory::createProcessor<4>(w, h, d.maxStackSize, variable_area, internal_vars, src_stride, srcp_orig, vops) : nullptr; std::unique_ptr processor1 = SIMDProcessorFactory::createProcessor<1>(w, h, d.maxStackSize, variable_area, internal_vars, src_stride, srcp_orig, vops); for (int y = 0; y < h; y++) { int x = 0; // Conditionally process larger vector sizes if (MaxVectorSize >= 16 && processor16) { for (; x + 16 <= w; x += 16) { processor16->processVector(srcp, dstp, x, y); } } if (MaxVectorSize >= 8 && processor8) { for (; x + 8 <= w; x += 8) { processor8->processVector(srcp, dstp, x, y); } } if (MaxVectorSize >= 4 && processor4) { for (; x + 4 <= w; x += 4) { processor4->processVector(srcp, dstp, x, y); } } // Always process remaining pixels for (; x < w; x++) { processor1->processVector(srcp, dstp, x, y); } // Update destination and source pointers for next row dstp += dst_stride; if (d.lutmode == 0) { for (int i = 0; i < numInputs; i++) srcp[i] += src_stride[i]; } } } void Exprfilter::processFrame(int plane, int w, int h, int pixels_per_iter, float framecount, float relative_time, int numInputs, uint8_t*& dstp, int dst_stride, std::vector& srcp, std::vector& src_stride, std::vector& ptroffsets, std::vector& srcp_orig) { #ifdef VS_TARGET_CPU_X86 if (optSSE2 && d.planeOptSSE2[plane]) { int nfulliterations = w / pixels_per_iter; ExprData::ProcessLineProc proc = d.proc[plane]; alignas(32) intptr_t rwptrs[RWPTR_SIZE]; // should work, gcc 8.3 gives false warning *reinterpret_cast(&rwptrs[RWPTR_START_OF_INTERNAL_VARIABLES + INTERNAL_VAR_CURRENT_FRAME]) = (float)framecount; *reinterpret_cast(&rwptrs[RWPTR_START_OF_INTERNAL_VARIABLES + INTERNAL_VAR_RELTIME]) = (float)relative_time; // refresh frame properties for (auto& framePropToRead : d.frameprops[plane]) { int whereToPut = framePropToRead.var_index; *reinterpret_cast(&rwptrs[RWPTR_START_OF_INTERNAL_FRAMEPROP_VARIABLES + whereToPut]) = framePropToRead.value; }; for (int y = 0; y < h; y++) { rwptrs[RWPTR_START_OF_OUTPUT] = reinterpret_cast(dstp + dst_stride * y); rwptrs[RWPTR_START_OF_XCOUNTER] = 0; // xcounter internal variable for (int i = 0; i < numInputs; i++) { rwptrs[i + RWPTR_START_OF_INPUTS] = reinterpret_cast(srcp[i] + src_stride[i] * y); // input pointers 1..Nth rwptrs[i + RWPTR_START_OF_STRIDES] = static_cast(src_stride[i]); } // a single line at a time proc(rwptrs, ptroffsets.data(), nfulliterations, y); // parameters are put directly in registers } } else #endif // VS_TARGET_CPU_X86 if (optVectorC) { // SIMD factory, vector friendly C version 16 then 8, 4, 1 floats at a time // Even if the compiler does not vectorize, we have less overhead during the opcode flow processing // As of 2025: original:1-2.5fps, new MAX_C_VECT=16: MSVC~6fps MSVC AVX2:~6fps, LLVM-14,7fps, LLVM AVX2-19fps processFrameWithDynamicVectors( plane, w, h, pixels_per_iter, framecount, relative_time, numInputs, dstp, dst_stride, srcp, src_stride, ptroffsets, srcp_orig, d); } else { // C version, single pixel/loop reference std::vector stackVector(d.maxStackSize); const ExprOp* vops = d.ops[plane].data(); float* stack = stackVector.data(); float stacktop = 0; std::vector variable_area(MAX_USER_VARIABLES); // for C, place for expr variables A..Z std::vector internal_vars(INTERNAL_VARIABLES + MAX_FRAMEPROP_VARIABLES); internal_vars[INTERNAL_VAR_CURRENT_FRAME] = (float)framecount; internal_vars[INTERNAL_VAR_RELTIME] = (float)relative_time; // followed by dynamic frame properties for (auto& framePropToRead : d.frameprops[plane]) { int whereToPut = framePropToRead.var_index; internal_vars[INTERNAL_VAR_FRAMEPROP_VARIABLES_START + whereToPut] = framePropToRead.value; }; for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { int si = 0; int i = -1; while (true) { i++; switch (vops[i].op) { case opLoadSpatialX: stack[si] = stacktop; stacktop = (float)x; ++si; break; case opLoadSpatialY: stack[si] = stacktop; stacktop = (float)y; ++si; break; case opLoadInternalVar: stack[si] = stacktop; stacktop = internal_vars[vops[i].e.ival]; ++si; break; case opLoadFramePropVar: stack[si] = stacktop; stacktop = internal_vars[INTERNAL_VAR_FRAMEPROP_VARIABLES_START + vops[i].e.ival]; ++si; break; case opLoadSrc8: stack[si] = stacktop; stacktop = srcp[vops[i].e.ival][x]; ++si; break; case opLoadSrc16: stack[si] = stacktop; stacktop = reinterpret_cast(srcp[vops[i].e.ival])[x]; ++si; break; case opLoadSrcF32: stack[si] = stacktop; stacktop = reinterpret_cast(srcp[vops[i].e.ival])[x]; ++si; break; case opLoadRelSrc8: stack[si] = stacktop; { const int newx = x + vops[i].dx; const int newy = y + vops[i].dy; const int clipIndex = vops[i].e.ival; const uint8_t* srcp2 = srcp_orig[clipIndex] + max(0, min(newy, h - 1)) * src_stride[clipIndex]; stacktop = srcp2[max(0, min(newx, w - 1))]; } ++si; break; case opLoadRelSrc16: stack[si] = stacktop; { const int newx = x + vops[i].dx; const int newy = y + vops[i].dy; const int clipIndex = vops[i].e.ival; const uint16_t* srcp2 = reinterpret_cast(srcp_orig[clipIndex] + max(0, min(newy, h - 1)) * src_stride[clipIndex]); stacktop = srcp2[max(0, min(newx, w - 1))]; } ++si; break; case opLoadRelSrcF32: stack[si] = stacktop; { const int newx = x + vops[i].dx; const int newy = y + vops[i].dy; const int clipIndex = vops[i].e.ival; const float* srcp2 = reinterpret_cast(srcp_orig[clipIndex] + max(0, min(newy, h - 1)) * src_stride[clipIndex]); stacktop = srcp2[max(0, min(newx, w - 1))]; } ++si; break; case opLoadConst: stack[si] = stacktop; stacktop = vops[i].e.fval; ++si; break; case opLoadVar: stack[si] = stacktop; stacktop = variable_area[vops[i].e.ival]; ++si; break; case opDup: stack[si] = stacktop; stacktop = stack[si - vops[i].e.ival]; ++si; break; case opSwap: std::swap(stacktop, stack[si - vops[i].e.ival]); break; case opAdd: --si; stacktop += stack[si]; break; case opSub: --si; stacktop = stack[si] - stacktop; break; case opMul: --si; stacktop *= stack[si]; break; case opDiv: --si; stacktop = stack[si] / stacktop; break; case opFmod: --si; stacktop = std::fmod(stack[si], stacktop); break; case opMax: --si; stacktop = std::max(stacktop, stack[si]); break; case opMin: --si; stacktop = std::min(stacktop, stack[si]); break; case opExp: stacktop = std::exp(stacktop); break; case opLog: stacktop = std::log(stacktop); break; case opPow: --si; stacktop = std::pow(stack[si], stacktop); break; case opClip: // clip(a, low, high) = min(max(a, low),high) si -= 2; stacktop = std::max(std::min(stack[si], stacktop), stack[si + 1]); break; case opRound: stacktop = std::round(stacktop); break; case opFloor: stacktop = std::floor(stacktop); break; case opCeil: stacktop = std::ceil(stacktop); break; case opTrunc: stacktop = std::trunc(stacktop); break; case opSqrt: stacktop = std::sqrt(stacktop); break; case opAbs: stacktop = std::abs(stacktop); break; case opSgn: stacktop = stacktop < 0 ? -1.0f : stacktop > 0 ? 1.0f : 0.0f; break; case opSin: stacktop = std::sin(stacktop); break; case opCos: stacktop = std::cos(stacktop); break; case opTan: stacktop = std::tan(stacktop); break; case opAsin: stacktop = std::asin(stacktop); break; case opAcos: stacktop = std::acos(stacktop); break; case opAtan: stacktop = std::atan(stacktop); break; case opAtan2: --si; stacktop = std::atan2(stack[si], stacktop); // y, x -> -Pi..+Pi break; case opGt: --si; stacktop = (stack[si] > stacktop) ? 1.0f : 0.0f; break; case opLt: --si; stacktop = (stack[si] < stacktop) ? 1.0f : 0.0f; break; case opEq: --si; stacktop = (stack[si] == stacktop) ? 1.0f : 0.0f; break; case opNotEq: --si; stacktop = (stack[si] != stacktop) ? 1.0f : 0.0f; break; case opLE: --si; stacktop = (stack[si] <= stacktop) ? 1.0f : 0.0f; break; case opGE: --si; stacktop = (stack[si] >= stacktop) ? 1.0f : 0.0f; break; case opTernary: si -= 2; stacktop = (stack[si] > 0) ? stack[si + 1] : stacktop; break; case opAnd: --si; stacktop = (stacktop > 0 && stack[si] > 0) ? 1.0f : 0.0f; break; case opOr: --si; stacktop = (stacktop > 0 || stack[si] > 0) ? 1.0f : 0.0f; break; case opXor: --si; stacktop = ((stacktop > 0) != (stack[si] > 0)) ? 1.0f : 0.0f; break; case opNeg: stacktop = (stacktop > 0) ? 0.0f : 1.0f; break; case opNegSign: stacktop = -stacktop; break; case opStore8: dstp[x] = (uint8_t)(std::max(0.0f, std::min(stacktop, 255.0f)) + 0.5f); goto loopend; case opStore10: reinterpret_cast(dstp)[x] = (uint16_t)(std::max(0.0f, std::min(stacktop, 1023.0f)) + 0.5f); goto loopend; case opStore12: reinterpret_cast(dstp)[x] = (uint16_t)(std::max(0.0f, std::min(stacktop, 4095.0f)) + 0.5f); goto loopend; case opStore14: reinterpret_cast(dstp)[x] = (uint16_t)(std::max(0.0f, std::min(stacktop, 16383.0f)) + 0.5f); goto loopend; case opStore16: reinterpret_cast(dstp)[x] = (uint16_t)(std::max(0.0f, std::min(stacktop, 65535.0f)) + 0.5f); goto loopend; case opStoreF32: reinterpret_cast(dstp)[x] = stacktop; goto loopend; case opStoreVar: variable_area[vops[i].e.ival] = stacktop; break; case opStoreVarAndDrop1: variable_area[vops[i].e.ival] = stacktop; --si; if (si >= 0) stacktop = stack[si]; break; } } loopend:; } dstp += dst_stride; if (d.lutmode == 0) { for (int i = 0; i < numInputs; i++) srcp[i] += src_stride[i]; } } } } void Exprfilter::preReadFrameProps(int plane, std::vector& src, IScriptEnvironment* env) { for (auto& framePropToRead : d.frameprops[plane]) { int srcIndex = framePropToRead.srcIndex; auto fpname = framePropToRead.name; const AVSMap* avsmap = env->getFramePropsRO(src[srcIndex]); // default is 0f float varToStore = 0.0f; // std::numeric_limits::quiet_NaN(); char res = env->propGetType(avsmap, fpname.c_str()); // 'u'nset, 'i'nteger, 'f'loat, 's'string, 'c'lip, 'v'ideoframe, 'm'ethod }; int error; // only float and int are valid // cast to float: Expr supports 32 bit float, no double, if (res == 'i') { int64_t result = env->propGetInt(avsmap, fpname.c_str(), 0, &error); if (!error) varToStore = static_cast(result); } else if (res == 'f') { float result = env->propGetFloatSaturated(avsmap, fpname.c_str(), 0, &error); if (!error) varToStore = result; } framePropToRead.value = varToStore; } } void Exprfilter::calculate_lut(IScriptEnvironment* env) { // ExprData d class variable already filled // Only when there are frame props. // frame property set from GetFrame(0) is treated as Clip prop std::vector src; bool frameprops = false; for (int plane = 0; plane < d.vi.NumComponents(); plane++) { if (d.frameprops[plane].size() > 0) { frameprops = true; break; } } if (frameprops) { src.reserve(children.size()); // fetch 0th frame only when needed in lut for (size_t i = 0; i < children.size(); i++) { const auto& child = children[i]; src.emplace_back(child->GetFrame(0, env)); } } std::vector srcp(MAX_EXPR_INPUTS); std::vector srcp_orig(MAX_EXPR_INPUTS); std::vector src_stride(MAX_EXPR_INPUTS); for (int plane = 0; plane < d.vi.NumComponents(); plane++) { // calculate only if plane is processed if (d.plane[plane] != poProcess) continue; // read actually needed frame properties into the variable storage area preReadFrameProps(plane, src, env); uint8_t* dstp; int dst_stride; int h, w; // no buffer allocated yet, prepare lut target buffer, and fake input frame dimensions const int bits_per_pixel = d.vi.BitsPerComponent(); const int pixelsize = d.vi.ComponentSize(); const auto lut1d_size = (1 << bits_per_pixel); // 1 or 2 bytes per entry const auto lut1d_bytesize = lut1d_size * pixelsize; const auto lut_size = d.lutmode == 1 ? lut1d_bytesize : lut1d_bytesize * lut1d_bytesize; // buffer start must be aligned to at least 32 bytes for avx2. // Size must be mod64 but it is fulfilled always. d.luts[plane] = (uint8_t *)avs_malloc(lut_size, 32); // 256 lut_x 65536: lut_xy (8 bit) dstp = d.luts[plane]; dst_stride = lut1d_bytesize; h = lutmode == 1 ? 1 : lut1d_size; // 1x256, 256x256. 10 bit: 1024, 1024x1024 w = lut1d_size; // for simd: // same as in GetFrame const int pixels_per_iter = (optAvx2 && d.planeOptAvx2[plane]) ? (optSingleMode ? 8 : 16) : (optSingleMode ? 4 : 8); std::vector ptroffsets(1 + 1 + MAX_EXPR_INPUTS); ptroffsets[RWPTR_START_OF_OUTPUT] = d.vi.ComponentSize() * pixels_per_iter; // stepping for output pointer ptroffsets[RWPTR_START_OF_XCOUNTER] = pixels_per_iter; // stepping for xcounter // no srcp pointers in lut. Technically only inputless sx,sy relative coordinates are in there for (int i = 0; i < d.numInputs; i++) { srcp[i] = nullptr; srcp_orig[i] = nullptr; src_stride[i] = 0; ptroffsets[RWPTR_START_OF_INPUTS + i] = 0; } const int dummy_framecount = 0; const int dummy_relative_time = 0; processFrame(plane, w, h, pixels_per_iter, dummy_framecount, dummy_relative_time, d.numInputs, dstp, dst_stride, srcp, src_stride, ptroffsets, srcp_orig); } // for planes } template static void do_lut_xy(const uint8_t* lut8, uint8_t* dstp, int dst_stride, const uint8_t** srcp, const int* src_stride, int w, int h) { const int max_pixel_value = (1 << bits_per_pixel) - 1; const pixel_t* lut = reinterpret_cast(lut8); const uint8_t* src0 = srcp[0]; const uint8_t* src1 = srcp[1]; const auto pitch0 = src_stride[0]; const auto pitch1 = src_stride[1]; for (auto y = 0; y < h; y++) { for (auto x = 0; x < w; x++) { if constexpr (bits_per_pixel == 8 || bits_per_pixel == 16) { // no limit check const int pixel0 = reinterpret_cast(src0)[x]; const int pixel1 = reinterpret_cast(src1)[x]; reinterpret_cast(dstp)[x] = lut[(pixel1 << bits_per_pixel) + pixel0]; } else { const int pixel0 = min((int)reinterpret_cast(src0)[x], max_pixel_value); const int pixel1 = min((int)reinterpret_cast(src1)[x], max_pixel_value); reinterpret_cast(dstp)[x] = lut[(pixel1 << bits_per_pixel) + pixel0]; } } src0 += pitch0; src1 += pitch1; dstp += dst_stride; } } PVideoFrame __stdcall Exprfilter::GetFrame(int n, IScriptEnvironment *env) { // ExprData d class variable already filled std::vector src; src.reserve(children.size()); int first_used_clip_index = -1; for (size_t i = 0; i < children.size(); i++) { const auto &child = children[i]; src.emplace_back(d.clipsUsed[i] ? child->GetFrame(n, env) : nullptr); // GetFrame only when really referenced if (first_used_clip_index < 0) { if (d.clipsUsed[i]) first_used_clip_index = (int)i; // inherit frameprop from } } PVideoFrame dst; if (first_used_clip_index >= 0) dst = env->NewVideoFrameP(d.vi, &src[first_used_clip_index]); else dst = env->NewVideoFrame(d.vi); std::vector srcp(MAX_EXPR_INPUTS); std::vector srcp_orig(MAX_EXPR_INPUTS); std::vector src_stride(MAX_EXPR_INPUTS); const float framecount = (float)n; // max precision: 2^24 (16M) frames (32 bit float precision) const float relative_time = vi.num_frames > 1 ? (float)((double)n / (vi.num_frames - 1)) : 0.0f; // 0 <= time <= 1 const int planes_y[4] = { PLANAR_Y, PLANAR_U, PLANAR_V, PLANAR_A }; const int planes_r[4] = { PLANAR_R, PLANAR_G, PLANAR_B, PLANAR_A }; // expression string order is R G B unlike internal G B R plane order const int *plane_enums_d = (d.vi.IsYUV() || d.vi.IsYUVA()) ? planes_y : planes_r; for (int plane = 0; plane < d.vi.NumComponents(); plane++) { const int plane_enum_d = plane_enums_d[plane]; if (d.plane[plane] == poProcess) { // read actually needed frame properties into the variable storage area preReadFrameProps(plane, src, env); uint8_t* dstp; int dst_stride; int h, w; dstp = dst->GetWritePtr(plane_enum_d); dst_stride = dst->GetPitch(plane_enum_d); h = d.vi.height >> d.vi.GetPlaneHeightSubsampling(plane_enum_d); w = d.vi.width >> d.vi.GetPlaneWidthSubsampling(plane_enum_d); // for simd: const int pixels_per_iter = (optAvx2 && d.planeOptAvx2[plane]) ? (optSingleMode ? 8 : 16) : (optSingleMode ? 4 : 8); std::vector ptroffsets(1 + 1 + MAX_EXPR_INPUTS); ptroffsets[RWPTR_START_OF_OUTPUT] = d.vi.ComponentSize() * pixels_per_iter; // stepping for output pointer ptroffsets[RWPTR_START_OF_XCOUNTER] = pixels_per_iter; // stepping for xcounter for (int i = 0; i < d.numInputs; i++) { if (d.clips[i]) { if (d.clipsUsed[i]) { // when input is a single Y, use PLANAR_Y instead of the plane matching to the output const VideoInfo& vi_src = d.clips[i]->GetVideoInfo(); const int* plane_enums_s = (vi_src.IsYUV() || d.vi.IsYUVA()) ? planes_y : planes_r; const int plane_enum_s = vi_src.IsY() ? PLANAR_Y : plane_enums_s[plane]; srcp[i] = src[i]->GetReadPtr(plane_enum_s); // C only: srcp_orig[i] = srcp[i]; src_stride[i] = src[i]->GetPitch(plane_enum_s); // SIMD only ptroffsets[RWPTR_START_OF_INPUTS + i] = d.clips[i]->GetVideoInfo().ComponentSize() * pixels_per_iter; // 1..Nth: inputs } else { srcp[i] = nullptr; srcp_orig[i] = nullptr; src_stride[i] = 0; ptroffsets[RWPTR_START_OF_INPUTS + i] = 0; } } } if (lutmode == 0) { processFrame(plane, w, h, pixels_per_iter, framecount, relative_time, d.numInputs, dstp, dst_stride, srcp, src_stride, ptroffsets, srcp_orig); } else { // lut table for plane is filled, do lookup now const int bits_per_pixel = d.vi.BitsPerComponent(); if (d.lutmode == 1) { // lut_x if (bits_per_pixel == 8) { uint8_t* lut = d.luts[plane]; const uint8_t* src0 = srcp[0]; const auto pitch0 = src_stride[0]; for (auto y = 0; y < h; y++) { for (auto x = 0; x < w; x++) { const int pixel = src0[x]; dstp[x] = lut[pixel]; } src0 += pitch0; dstp += dst_stride; } } else { const int max_pixel_value = (1 << bits_per_pixel) - 1; uint16_t* lut = reinterpret_cast(d.luts[plane]); const uint8_t* src0 = srcp[0]; const auto pitch0 = src_stride[0]; if (bits_per_pixel == 16) { // no limit check for (auto y = 0; y < h; y++) { for (auto x = 0; x < w; x++) { const int pixel = reinterpret_cast(src0)[x]; reinterpret_cast(dstp)[x] = lut[pixel]; } src0 += pitch0; dstp += dst_stride; } } else { for (auto y = 0; y < h; y++) { for (auto x = 0; x < w; x++) { const int pixel = reinterpret_cast(src0)[x]; reinterpret_cast(dstp)[x] = lut[min(pixel, max_pixel_value)]; // e.g. 10 bits in 2 byte safety } src0 += pitch0; dstp += dst_stride; } } } } else if (d.lutmode == 2) { // lut_xy // templates for speed: bitshift with immediate constant const uint8_t* lut = d.luts[plane]; if (bits_per_pixel == 8) do_lut_xy(lut, dstp, dst_stride, srcp_orig.data(), src_stride.data(), w, h); else if (bits_per_pixel == 10) do_lut_xy(lut, dstp, dst_stride, srcp_orig.data(), src_stride.data(), w, h); else if (bits_per_pixel == 12) do_lut_xy(lut, dstp, dst_stride, srcp_orig.data(), src_stride.data(), w, h); else if (bits_per_pixel == 14) do_lut_xy(lut, dstp, dst_stride, srcp_orig.data(), src_stride.data(), w, h); else if (bits_per_pixel == 16) // well, this is not enabled 16bit lutxy would take a 8GB table do_lut_xy(lut, dstp, dst_stride, srcp_orig.data(), src_stride.data(), w, h); else assert(0); } else { // 1d lut, 2d lut assert(0); // no lut_xyz } } // lut branch } // avs+: copy plane here else if (d.plane[plane] == poCopy) { // avs+ copy from Nth clip const int copySource = d.planeCopySourceClip[plane]; // when input is a single Y, use PLANAR_Y instead of the plane matching to the output const VideoInfo& vi_src = d.clips[copySource]->GetVideoInfo(); const int plane_enum_s = vi_src.IsY() ? PLANAR_Y : plane_enums_d[plane]; env->BitBlt(dst->GetWritePtr(plane_enum_d), dst->GetPitch(plane_enum_d), src[copySource]->GetReadPtr(plane_enum_s), src[copySource]->GetPitch(plane_enum_s), src[copySource]->GetRowSize(plane_enum_s), src[copySource]->GetHeight(plane_enum_s) ); } else if (d.plane[plane] == poFill) { // avs+ uint8_t *dstp = dst->GetWritePtr(plane_enum_d); const int dst_rowsize = dst->GetRowSize(plane_enum_d); const int dst_stride = dst->GetPitch(plane_enum_d); const int h = dst->GetHeight(plane_enum_d); const int bits_per_pixel = vi.BitsPerComponent(); float val = d.planeFillValue[plane]; int val_i = 0; if (bits_per_pixel <= 16) { const int max_pixel_value = (1 << bits_per_pixel) - 1; val_i = (int)(std::max(0.0f, std::min(val, (float)max_pixel_value)) + 0.5f); } if(bits_per_pixel == 8) fill_plane(dstp, h, dst_rowsize, dst_stride, val_i); else if(bits_per_pixel <= 16) fill_plane(dstp, h, dst_rowsize, dst_stride, val_i); else // 32 bit float fill_plane(dstp, h, dst_rowsize, dst_stride, val); } // plane modes } // for planes return dst; } Exprfilter::~Exprfilter() { for (int i = 0; i < MAX_EXPR_INPUTS; i++) d.clips[i] = nullptr; for (int i = 0; i < 4; i++) if(d.luts[i]) avs_free(d.luts[i]); // aligned free } static SOperation getLoadOp(const VideoInfo *vi, bool relativeKind) { if (!vi) return relativeKind ? opLoadRelSrcF32 : opLoadSrcF32; if (vi->BitsPerComponent() == 32) // float, avs has no f16c float return relativeKind ? opLoadRelSrcF32 : opLoadSrcF32; else if (vi->BitsPerComponent() == 8) return relativeKind ? opLoadRelSrc8 : opLoadSrc8; else return relativeKind ? opLoadRelSrc16 : opLoadSrc16; // 10..16 bits common } static SOperation getStoreOp(const VideoInfo *vi) { // avs+ has no f16c float switch (vi->BitsPerComponent()) { case 8: return opStore8; case 10: return opStore10; // avs+ case 12: return opStore12; // avs+ case 14: return opStore14; // avs+ case 16: return opStore16; case 32: return opStoreF32; default: return opStoreF32; } } #define LOAD_OP(op,v,req) do { if (stackSize < req) env->ThrowError("Expr: Not enough elements on stack to perform operation %s", tokens[i].c_str()); ops.push_back(ExprOp(op, (v))); maxStackSize = std::max(++stackSize, maxStackSize); } while(0) #define LOAD_REL_OP(op,v,req,dx,dy) do { if (stackSize < req) env->ThrowError("Expr: Not enough elements on stack to perform operation %s", tokens[i].c_str()); ops.push_back(ExprOp(op, (v), (dx), (dy))); maxStackSize = std::max(++stackSize, maxStackSize); } while(0) #define GENERAL_OP(op, v, req, dec) do { if (stackSize < req) env->ThrowError("Expr: Not enough elements on stack to perform operation %s", tokens[i].c_str()); ops.push_back(ExprOp(op, (v))); stackSize-=(dec); } while(0) #define ONE_ARG_OP(op) GENERAL_OP(op, 0, 1, 0) #define VAR_STORE_OP(op,v) GENERAL_OP(op, v, 1, 0) #define VAR_STORE_SPEC_OP(op,v) GENERAL_OP(op, v, 1, 1) #define TWO_ARG_OP(op) GENERAL_OP(op, 0, 2, 1) #define THREE_ARG_OP(op) GENERAL_OP(op, 0, 3, 2) // defines for special scale-back-before-store where no token is in context: #define LOAD_OP_NOTOKEN(op,v,req) do { if (stackSize < req) env->ThrowError("Expr: Not enough elements on stack to perform a load operation"); ops.push_back(ExprOp(op, (v))); maxStackSize = std::max(++stackSize, maxStackSize); } while(0) #define GENERAL_OP_NOTOKEN(op, v, req, dec) do { if (stackSize < req) env->ThrowError("Expr: Not enough elements on stack to perform an operation"); ops.push_back(ExprOp(op, (v))); stackSize-=(dec); } while(0) #define TWO_ARG_OP_NOTOKEN(op) GENERAL_OP_NOTOKEN(op, 0, 2, 1) static inline bool isAlphaUnderscore(char c) { return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_'; } static inline bool isAlphaNumUnderscore(char c) { return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_'; } static bool isValidVarName(const std::string& s) { size_t len = s.length(); if (!len) return false; if (!isAlphaUnderscore(s[0])) return false; for (size_t i = 1; i < len; i++) if (!isAlphaNumUnderscore(s[i])) return false; return true; } // finds _X suffix (clip letter) and returns 0..25 for x,y,z,a,b,...w // no suffix means 0 static int getSuffix(std::string token, std::string base) { size_t len = base.length(); if (token.substr(0, len) != base) return -1; // no match if (token.length() == len) return 0; // no suffix, treat as _x // find _X suffix, where X is x,y,z,a..w if (token.length() != len + 2 || token[len] != '_') return -2; // no proper suffix char srcChar = token[len + 1]; // last char int loadIndex; if (srcChar >= 'x') loadIndex = srcChar - 'x'; else loadIndex = srcChar - 'a' + 3; return loadIndex; } // if automatic source bit depth conversion takes place, ymax, ymin, range_xxx, etc.. constants are changed accordingly static int getEffectiveBitsPerComponent(int bitsPerComponent, bool autoconv_conv_float, bool autoconv_conv_int, int autoScaleSourceBitDepth) { if ((autoconv_conv_float && bitsPerComponent == 32) || (autoconv_conv_int && bitsPerComponent != 32)) return autoScaleSourceBitDepth; return bitsPerComponent; } static size_t parseExpression(const std::string &expr, std::vector &ops, std::vector& fp, const VideoInfo **vi, const VideoInfo *vi_output, const SOperation storeOp, int numInputs, int planewidth, int planeheight, bool chroma, const bool autoconv_full_scale, const bool autoconv_conv_int, const bool autoconv_conv_float, const int clamp_float_i, const bool shift_float, const int lutmode, IScriptEnvironment *env) { // vi_output is new in avs+, and is not used yet // optional scaling, scale_from bit depth, default scale_to bitdepth, used in scaleb and scalef (yscaleb, yscalef) int targetBitDepth = vi[0]->BitsPerComponent(); // avs+ int autoScaleSourceBitDepth = 8; // avs+ scalable constants are in 8 bit range by default std::vector tokens; split(tokens, expr, " \r\n\t", split1::no_empties); std::unordered_map varnames; int varindex = 0; std::unordered_map fpnames; int fpindex = 0; size_t maxStackSize = 0; size_t stackSize = 0; for (size_t i = 0; i < tokens.size(); i++) { const size_t tokenlen = tokens[i].length(); if (tokens[i] == "+") TWO_ARG_OP(opAdd); else if (tokens[i] == "-") TWO_ARG_OP(opSub); else if (tokens[i] == "*") TWO_ARG_OP(opMul); else if (tokens[i] == "/") TWO_ARG_OP(opDiv); else if (tokens[i] == "%") TWO_ARG_OP(opFmod); else if (tokens[i] == "max") TWO_ARG_OP(opMax); else if (tokens[i] == "min") TWO_ARG_OP(opMin); else if (tokens[i] == "exp") ONE_ARG_OP(opExp); else if (tokens[i] == "log") ONE_ARG_OP(opLog); else if (tokens[i] == "pow" || tokens[i] == "^") // avs+: ^ can be used for power TWO_ARG_OP(opPow); else if (tokens[i] == "sqrt") ONE_ARG_OP(opSqrt); else if (tokens[i] == "abs") ONE_ARG_OP(opAbs); else if (tokens[i] == "sgn") ONE_ARG_OP(opSgn); else if (tokens[i] == "sin") ONE_ARG_OP(opSin); else if (tokens[i] == "cos") ONE_ARG_OP(opCos); else if (tokens[i] == "tan") ONE_ARG_OP(opTan); else if (tokens[i] == "asin") ONE_ARG_OP(opAsin); else if (tokens[i] == "acos") ONE_ARG_OP(opAcos); else if (tokens[i] == "atan") ONE_ARG_OP(opAtan); else if (tokens[i] == "atan2") TWO_ARG_OP(opAtan2); else if (tokens[i] == "clip") THREE_ARG_OP(opClip); else if (tokens[i] == "round") ONE_ARG_OP(opRound); else if (tokens[i] == "floor") ONE_ARG_OP(opFloor); else if (tokens[i] == "ceil") ONE_ARG_OP(opCeil); else if (tokens[i] == "trunc") ONE_ARG_OP(opTrunc); else if (tokens[i] == ">") TWO_ARG_OP(opGt); else if (tokens[i] == "<") TWO_ARG_OP(opLt); else if (tokens[i] == "=" || tokens[i] == "==") // avs+: == can be used to equality check TWO_ARG_OP(opEq); else if (tokens[i] == "!=") // avs+: not equal TWO_ARG_OP(opNotEq); else if (tokens[i] == ">=") TWO_ARG_OP(opGE); else if (tokens[i] == "<=") TWO_ARG_OP(opLE); else if (tokens[i] == "?") THREE_ARG_OP(opTernary); else if (tokens[i] == "and" || tokens[i] == "&") // avs+: & alias for and TWO_ARG_OP(opAnd); else if (tokens[i] == "or" || tokens[i] == "|") // avs+: | alias for or TWO_ARG_OP(opOr); else if (tokens[i] == "xor") TWO_ARG_OP(opXor); else if (tokens[i] == "not") ONE_ARG_OP(opNeg); else if (tokens[i] == "neg") ONE_ARG_OP(opNegSign); else if (tokens[i].substr(0, 3) == "dup") if (tokens[i].size() == 3) { LOAD_OP(opDup, 0, 1); } else { try { int tmp = std::stoi(tokens[i].substr(3)); if (tmp < 0) env->ThrowError("Expr: Dup suffix can't be less than 0 '%s'", tokens[i].c_str()); LOAD_OP(opDup, tmp, (size_t)(tmp + 1)); } catch (std::logic_error &) { env->ThrowError("Expr: Failed to convert dup suffix '%s' to valid index", tokens[i].c_str()); } } else if (tokens[i].substr(0, 4) == "swap") if (tokens[i].size() == 4) { GENERAL_OP(opSwap, 1, 2, 0); } else { try { int tmp = std::stoi(tokens[i].substr(4)); if (tmp < 1) env->ThrowError("Expr: Swap suffix can't be less than 1 '%s'", tokens[i].c_str()); GENERAL_OP(opSwap, tmp, (size_t)(tmp + 1), 0); } catch (std::logic_error &) { env->ThrowError("Expr: Failed to convert swap suffix '%s' to valid index", tokens[i].c_str()); } } else if (tokens[i] == "sx") { // avs+ // spatial if (lutmode > 0) env->ThrowError("Expr: 'sx' is forbidden in lut mode"); LOAD_OP(opLoadSpatialX, 0, 0); } else if (tokens[i] == "sy") { // avs+ // spatial if (lutmode > 0) env->ThrowError("Expr: 'sy' is forbidden in lut mode"); LOAD_OP(opLoadSpatialY, 0, 0); } else if (tokens[i] == "sxr") { // avs+ // spatial X relative 0..1 if (lutmode > 0) env->ThrowError("Expr: 'sxr' is forbidden in lut mode"); LOAD_OP(opLoadSpatialX, 0, 0); /* Paranoia: precision at rightmost position? Ensure that sxr == 1.0 there Multiply by 1/x is different. Test: constexpr float x = 1919.0f; constexpr float y = 1 / 1919.0f; constexpr float zz = x * y; constexpr bool b = zz == 1.0f; // false! const float p = planewidth > 1 ? 1.0f / ((float)planewidth - 1.0f) : 1.0f; LOAD_OP(opLoadConst, p, 0); TWO_ARG_OP(opMul); */ const float p = planewidth > 1 ? (float)planewidth - 1.0f : 1.0f; LOAD_OP(opLoadConst, p, 0); TWO_ARG_OP(opDiv); } else if (tokens[i] == "syr") { // avs+ // spatial Y relative 0..1 if (lutmode > 0) env->ThrowError("Expr: 'syr' is forbidden in lut mode"); LOAD_OP(opLoadSpatialY, 0, 0); /* Multiply by 1/x is different const float p = planeheight > 1 ? 1.0f / ((float)planeheight - 1.0f) : 1.0f; LOAD_OP(opLoadConst, p, 0); TWO_ARG_OP(opMul); */ const float p = planeheight > 1 ? (float)planeheight - 1.0f : 1.0f; LOAD_OP(opLoadConst, p, 0); TWO_ARG_OP(opDiv); } else if (tokens[i] == "frameno") { // avs+ if (lutmode > 0) env->ThrowError("Expr: 'frameno' is forbidden in lut mode"); LOAD_OP(opLoadInternalVar, INTERNAL_VAR_CURRENT_FRAME, 0); } else if (tokens[i] == "time") { // avs+ if (lutmode > 0) env->ThrowError("Expr: 'time' is forbidden in lut mode"); LOAD_OP(opLoadInternalVar, INTERNAL_VAR_RELTIME, 0); } else if (tokens[i] == "width") { // avs+ LOAD_OP(opLoadConst, (float)planewidth, 0); } else if (tokens[i] == "height") { // avs+ LOAD_OP(opLoadConst, (float)planeheight, 0); } else if ((tokens[i].length() == 1 || (tokens[i].length() > 1 && tokens[i][1] == '[')) && tokens[i][0] >= 'a' && tokens[i][0] <= 'z') { const bool rel = tokens[i].length() > 1; // relative pixel addressing; indexed clips e.g. x[-1,-2] // loading source clip pixels char srcChar = tokens[i][0]; int loadIndex; if (srcChar >= 'x') loadIndex = srcChar - 'x'; else loadIndex = srcChar - 'a' + 3; if (loadIndex >= numInputs) env->ThrowError("Expr: Too few input clips supplied to reference '%s'", tokens[i].c_str()); if (rel) { int dx, dy; std::string s; std::istringstream numStream(tokens[i].substr(2)); // after '[' numStream.imbue(std::locale::classic()); // first coord if (!(numStream >> dx)) env->ThrowError("Expr: Failed to convert '%s' to integer, relative index dx", tokens[i].c_str()); // separator ',' if (numStream.get() != ',') env->ThrowError("Expr: Failed to convert '%s', character ',' expected between the coordinates", tokens[i].c_str()); // second coord if (!(numStream >> dy)) env->ThrowError("Expr: Failed to convert '%s' to integer, relative index dy", tokens[i].c_str()); // ending ']' if (numStream.get() != ']') env->ThrowError("Expr: Failed to convert '%s' to [x,y], closing ']' expected ", tokens[i].c_str()); if (numStream >> s) env->ThrowError("Expr: Failed to convert '%s' to [x,y], invalid character after ']'", tokens[i].c_str()); if (lutmode > 0) env->ThrowError("Expr: relative pixel addressing is forbidden in lut mode"); if (dx <= -vi_output->width || dx >= vi_output->width) env->ThrowError("Expr: dx must be between +/- (width-1) in '%s'", tokens[i].c_str()); if (dy <= -vi_output->height || dy >= vi_output->height) env->ThrowError("Expr: dy must be between +/- (height-1) in '%s'", tokens[i].c_str()); LOAD_REL_OP(getLoadOp(vi[loadIndex], true), loadIndex, 0, dx, dy); } else { // not relative, single clip letter if (lutmode == 0) { LOAD_OP(getLoadOp(vi[loadIndex], false), loadIndex, 0); } else { // for lut we replace x and y to sx and sy to make the initialization if (loadIndex >= lutmode) // lutx env->ThrowError("Expr: more input clips than lut's dimension. Problematic clip: '%s'", tokens[i].c_str()); // spatial if (loadIndex == 0) LOAD_OP(opLoadSpatialX, 0, 0); else // if (loadIndex == 1) LOAD_OP(opLoadSpatialY, 0, 0); } } // avs+: 'scale_inputs': converts input pixels to a common specified range // Apply full or limited conversion to integer and/or float bit depths. // For integers bit-shift or full-scale-stretch method can be chosen // There is no precision loss, since the multiplication/division occurs when original pixels // are already loaded as float const int srcBitDepth = vi[loadIndex]->BitsPerComponent(); const int dstBitDepth = autoScaleSourceBitDepth; // internal precision const bool use_chroma = chroma; // && !forceNonUV; const bool isfull = autoconv_full_scale; if (autoconv_conv_int || autoconv_conv_float) { if ((srcBitDepth != 32 && autoconv_conv_int) || ((srcBitDepth == 32 && autoconv_conv_float))) { bits_conv_constants d; get_bits_conv_constants(d, use_chroma, isfull, isfull, srcBitDepth, dstBitDepth); // chroma is spec: signed. Limited:16-240 is really 128 +/-112. Full:1-255 is really 128+/-127 if (d.src_offset != 0) { LOAD_OP(opLoadConst, (float)d.src_offset, 0); TWO_ARG_OP(opSub); } if (d.mul_factor != 1.0f) { LOAD_OP(opLoadConst, d.mul_factor, 0); TWO_ARG_OP(opMul); } if (d.dst_offset != 0) { LOAD_OP(opLoadConst, (float)d.dst_offset, 0); TWO_ARG_OP(opAdd); } } } // "floatUV" - shifts -0.5 .. +0.5 chroma range to 0 .. 1.0 only when no other autoscaling is active // the effect of this pre-shift is reversed at the storage phase if ((!autoconv_conv_float || dstBitDepth == 32) && srcBitDepth == 32) { if (chroma && shift_float) { LOAD_OP(opLoadConst, 0.5f, 0); TWO_ARG_OP(opAdd); // at the end pixel exit: opSub } } } else if (tokens[i] == "pi") // avs+ { float pi = 3.141592653589793f; LOAD_OP(opLoadConst, pi, 0); } // avs+ // bitdepth: automatic silent parameter of the lut expression(clip bit depth) // clip-specific bitdepths: bitdepth_x, bitdepth_y, bitdepth_z, bitdepth_a, .. bitdepth_w, // sbitdepth : automatic silent parameter of the lut expression(bit depth of values to scale) // // pre-defined, bit depth aware constants // range_half : autoscaled 128 or 0.5 for float, (or 0.0 for chroma with zero-base float chroma version) // range_max : 255 / 1023 / 4095 / 16383 / 65535 or 1.0 for float // 0.5 for float chroma (new zero-based style) // range_min : 0 for 8-16bits, or 0 for float luma, or -0.5 for float chroma // -0.5 for float chroma (new zero-based style) // range_size : 256 / 1024...65536 // ymin, ymax : 16 / 235 autoscaled. // cmin, cmax : 16 / 240 autoscaled. For 32bits zero based chroma: (16-128)/255.0, (240-128)/255.0 // ymin or ymin_x, ymin_y, ymin_y, ymin_a.... // similarly: ymax, range_max, cmin, cmax, range_half // without clip index specifier, or with '_'+letter suffix else if (tokens[i].substr(0, 8) == "bitdepth") // avs+ { int loadIndex = -1; std::string toFind = "bitdepth"; if (tokens[i].substr(0, toFind.length()) == toFind) loadIndex = getSuffix(tokens[i], toFind); if (loadIndex < 0) env->ThrowError("Expr: Error in built-in constant expression '%s'", tokens[i].c_str()); if (loadIndex >= numInputs) env->ThrowError("Expr: Too few input clips supplied for reference '%s'", tokens[i].c_str()); int bitsPerComponent = getEffectiveBitsPerComponent(vi[loadIndex]->BitsPerComponent(), autoconv_conv_float, autoconv_conv_int, autoScaleSourceBitDepth); float q = (float)bitsPerComponent; LOAD_OP(opLoadConst, q, 0); } else if (tokens[i] == "sbitdepth") // avs+ { float q = (float)autoScaleSourceBitDepth; LOAD_OP(opLoadConst, q, 0); } else if (tokens[i].substr(0, 4) == "ymin") // avs+ { int loadIndex = -1; std::string toFind = "ymin"; if (tokens[i].substr(0, toFind.length()) == toFind) loadIndex = getSuffix(tokens[i], toFind); if (loadIndex < 0) env->ThrowError("Expr: Error in built-in constant expression '%s'", tokens[i].c_str()); if (loadIndex >= numInputs) env->ThrowError("Expr: Too few input clips supplied for reference '%s'", tokens[i].c_str()); int bitsPerComponent = getEffectiveBitsPerComponent(vi[loadIndex]->BitsPerComponent(), autoconv_conv_float, autoconv_conv_int, autoScaleSourceBitDepth); float q = bitsPerComponent == 32 ? 16.0f / 255 : (16 << (bitsPerComponent - 8)); // scale luma min 16 LOAD_OP(opLoadConst, q, 0); } else if (tokens[i].substr(0, 4) == "ymax") // avs+ { int loadIndex = -1; std::string toFind = "ymax"; if (tokens[i].substr(0, toFind.length()) == toFind) loadIndex = getSuffix(tokens[i], toFind); if (loadIndex < 0) env->ThrowError("Expr: Error in built-in constant expression '%s'", tokens[i].c_str()); if (loadIndex >= numInputs) env->ThrowError("Expr: Too few input clips supplied for reference '%s'", tokens[i].c_str()); int bitsPerComponent = getEffectiveBitsPerComponent(vi[loadIndex]->BitsPerComponent(), autoconv_conv_float, autoconv_conv_int, autoScaleSourceBitDepth); float q = bitsPerComponent == 32 ? 235.0f / 255 : (235 << (bitsPerComponent - 8)); // scale luma max 235 LOAD_OP(opLoadConst, q, 0); } else if (tokens[i].substr(0, 4) == "cmin") // avs+ { int loadIndex = -1; std::string toFind = "cmin"; if (tokens[i].substr(0, toFind.length()) == toFind) loadIndex = getSuffix(tokens[i], toFind); if (loadIndex < 0) env->ThrowError("Expr: Error in built-in constant expression '%s'", tokens[i].c_str()); if (loadIndex >= numInputs) env->ThrowError("Expr: Too few input clips supplied for reference '%s'", tokens[i].c_str()); int bitsPerComponent = getEffectiveBitsPerComponent(vi[loadIndex]->BitsPerComponent(), autoconv_conv_float, autoconv_conv_int, autoScaleSourceBitDepth); float q = bitsPerComponent == 32 ? uv8tof(16) : (16 << (bitsPerComponent - 8)); // scale chroma min 16 if (shift_float && bitsPerComponent) q += 0.5f; LOAD_OP(opLoadConst, q, 0); } else if (tokens[i].substr(0, 4) == "cmax") // avs+ { int loadIndex = -1; std::string toFind = "cmax"; if (tokens[i].substr(0, toFind.length()) == toFind) loadIndex = getSuffix(tokens[i], toFind); if (loadIndex < 0) env->ThrowError("Expr: Error in built-in constant expression '%s'", tokens[i].c_str()); if (loadIndex >= numInputs) env->ThrowError("Expr: Too few input clips supplied for reference '%s'", tokens[i].c_str()); int bitsPerComponent = getEffectiveBitsPerComponent(vi[loadIndex]->BitsPerComponent(), autoconv_conv_float, autoconv_conv_int, autoScaleSourceBitDepth); float q = bitsPerComponent == 32 ? uv8tof(240) : (240 << (bitsPerComponent - 8)); // scale chroma max 240 if (shift_float && bitsPerComponent == 32) q += 0.5f; LOAD_OP(opLoadConst, q, 0); } else if (tokens[i].substr(0, 10) == "range_size") // avs+ { int loadIndex = -1; std::string toFind = "range_size"; if (tokens[i].substr(0, toFind.length()) == toFind) loadIndex = getSuffix(tokens[i], toFind); if (loadIndex < 0) env->ThrowError("Expr: Error in built-in constant expression '%s'", tokens[i].c_str()); if (loadIndex >= numInputs) env->ThrowError("Expr: Too few input clips supplied for reference '%s'", tokens[i].c_str()); int bitsPerComponent = getEffectiveBitsPerComponent(vi[loadIndex]->BitsPerComponent(), autoconv_conv_float, autoconv_conv_int, autoScaleSourceBitDepth); float q = bitsPerComponent == 32 ? 1.0f : (1 << bitsPerComponent); // 1.0, 256, 1024,... 65536 LOAD_OP(opLoadConst, q, 0); } else if (tokens[i].substr(0, 9) == "range_min") // avs+ > r2636 { int loadIndex = -1; std::string toFind = "range_min"; if (tokens[i].substr(0, toFind.length()) == toFind) loadIndex = getSuffix(tokens[i], toFind); if (loadIndex < 0) env->ThrowError("Expr: Error in built-in constant expression '%s'", tokens[i].c_str()); if (loadIndex >= numInputs) env->ThrowError("Expr: Too few input clips supplied for reference '%s'", tokens[i].c_str()); int bitsPerComponent = getEffectiveBitsPerComponent(vi[loadIndex]->BitsPerComponent(), autoconv_conv_float, autoconv_conv_int, autoScaleSourceBitDepth); // 0.0 (or -0.5 for 32bit float chroma) float q = bitsPerComponent == 32 ? (chroma ? -0.5f : 0.0f) : 0; if (chroma && shift_float && bitsPerComponent == 32) q += 0.5f; LOAD_OP(opLoadConst, q, 0); } else if (tokens[i].substr(0, 10) == "yrange_min") { int loadIndex = -1; std::string toFind = "yrange_min"; if (tokens[i].substr(0, toFind.length()) == toFind) loadIndex = getSuffix(tokens[i], toFind); if (loadIndex < 0) env->ThrowError("Expr: Error in built-in constant expression '%s'", tokens[i].c_str()); if (loadIndex >= numInputs) env->ThrowError("Expr: Too few input clips supplied for reference '%s'", tokens[i].c_str()); int bitsPerComponent = getEffectiveBitsPerComponent(vi[loadIndex]->BitsPerComponent(), autoconv_conv_float, autoconv_conv_int, autoScaleSourceBitDepth); float q = bitsPerComponent == 32 ? 0.0f : 0; LOAD_OP(opLoadConst, q, 0); } else if (tokens[i].substr(0, 9) == "range_max") // avs+ { int loadIndex = -1; std::string toFind = "range_max"; if (tokens[i].substr(0, toFind.length()) == toFind) loadIndex = getSuffix(tokens[i], toFind); if (loadIndex < 0) env->ThrowError("Expr: Error in built-in constant expression '%s'", tokens[i].c_str()); if (loadIndex >= numInputs) env->ThrowError("Expr: Too few input clips supplied for reference '%s'", tokens[i].c_str()); int bitsPerComponent = getEffectiveBitsPerComponent(vi[loadIndex]->BitsPerComponent(), autoconv_conv_float, autoconv_conv_int, autoScaleSourceBitDepth); // 1.0 (or 0.5 for 32bit float chroma), 255, 1023,... 65535 float q = bitsPerComponent == 32 ? (chroma ? + 0.5f : 1.0f) : ((1 << bitsPerComponent) - 1); if (chroma && shift_float && bitsPerComponent == 32) q += 0.5f; LOAD_OP(opLoadConst, q, 0); } else if (tokens[i].substr(0, 10) == "yrange_max") { int loadIndex = -1; std::string toFind = "yrange_max"; if (tokens[i].substr(0, toFind.length()) == toFind) loadIndex = getSuffix(tokens[i], toFind); if (loadIndex < 0) env->ThrowError("Expr: Error in built-in constant expression '%s'", tokens[i].c_str()); if (loadIndex >= numInputs) env->ThrowError("Expr: Too few input clips supplied for reference '%s'", tokens[i].c_str()); int bitsPerComponent = getEffectiveBitsPerComponent(vi[loadIndex]->BitsPerComponent(), autoconv_conv_float, autoconv_conv_int, autoScaleSourceBitDepth); // 1.0, 255, 1023,... 65535 float q = bitsPerComponent == 32 ? 1.0f : ((1 << bitsPerComponent) - 1); LOAD_OP(opLoadConst, q, 0); } else if (tokens[i].substr(0, 10) == "range_half") // avs+ { int loadIndex = -1; std::string toFind = "range_half"; if (tokens[i].substr(0, toFind.length()) == toFind) loadIndex = getSuffix(tokens[i], toFind); if (loadIndex < 0) env->ThrowError("Expr: Error in built-in constant expression '%s'", tokens[i].c_str()); if (loadIndex >= numInputs) env->ThrowError("Expr: Too few input clips supplied for reference '%s'", tokens[i].c_str()); // for chroma: range_half is 0.0 for 32bit float (or 0.5 for old float chroma representation) int bitsPerComponent = getEffectiveBitsPerComponent(vi[loadIndex]->BitsPerComponent(), autoconv_conv_float, autoconv_conv_int, autoScaleSourceBitDepth); float q = bitsPerComponent == 32 ? (chroma ? uv8tof(128) : 0.5f) : (1 << (bitsPerComponent - 1)); // 0.5f, 128, 512, ... 32768 if (chroma && shift_float && bitsPerComponent == 32) q += 0.5f; LOAD_OP(opLoadConst, q, 0); } else if (tokens[i].substr(0, 11) == "yrange_half") // avs+ { int loadIndex = -1; std::string toFind = "yrange_half"; if (tokens[i].substr(0, toFind.length()) == toFind) loadIndex = getSuffix(tokens[i], toFind); if (loadIndex < 0) env->ThrowError("Expr: Error in built-in constant expression '%s'", tokens[i].c_str()); if (loadIndex >= numInputs) env->ThrowError("Expr: Too few input clips supplied for reference '%s'", tokens[i].c_str()); int bitsPerComponent = getEffectiveBitsPerComponent(vi[loadIndex]->BitsPerComponent(), autoconv_conv_float, autoconv_conv_int, autoScaleSourceBitDepth); float q = bitsPerComponent == 32 ? 0.5f : (1 << (bitsPerComponent - 1)); // 0.5f, 128, 512, ... 32768 LOAD_OP(opLoadConst, q, 0); } // "scaleb" and "scalef" functions scale their operand from 8 bit to the bit depth of the first clip. // "i8", "i10", "i14", "i16" and "f32" (typically at the beginning of the expression) sets the scale-base to 8..16 bits or float, respectively. // "i8".."f32" keywords can appear anywhere in the expression, but only the last occurence will be effective for the whole expression. else if (tokens[i] == "scaleb" || tokens[i] == "yscaleb" || tokens[i] == "scalef" || tokens[i] == "yscalef") // avs+, scale by bit shift { // Note: if 'scale_float' is used then all float input is automatically converted to integer // in this case the targetBitDepth is not 32 for float clips but the actual autoscaleSourceBitDepth int effectivetargetBitDepth = getEffectiveBitsPerComponent(targetBitDepth, autoconv_conv_float, autoconv_conv_int, autoScaleSourceBitDepth); // number to scale is not chroma-related one even if we are in chroma (U,V) plane const bool forceNonUV = (tokens[i] == "yscaleb") || (tokens[i] == "yscalef"); const int srcBitDepth = autoScaleSourceBitDepth; const int dstBitDepth = effectivetargetBitDepth; const bool use_chroma = chroma && !forceNonUV; const bool isfull = tokens[i] == "scalef" || tokens[i] == "yscalef"; bits_conv_constants d; get_bits_conv_constants(d, use_chroma, isfull, isfull, srcBitDepth, dstBitDepth); // chroma is spec: signed. Limited:16-240 is really 128 +/-112. Full:1-255 is really 128+/-127 // floatUV if (use_chroma && shift_float && dstBitDepth == 32 && srcBitDepth < 32) { d.dst_offset = 0.5f; // get out from -0.5..0.5 to 0..1 } if (d.src_offset != 0) { LOAD_OP(opLoadConst, (float)d.src_offset, 0); TWO_ARG_OP(opSub); } if (d.mul_factor != 1.0f) { LOAD_OP(opLoadConst, d.mul_factor, 0); TWO_ARG_OP(opMul); } if (d.dst_offset != 0) { LOAD_OP(opLoadConst, (float)d.dst_offset, 0); TWO_ARG_OP(opAdd); } } else if (tokens[i] == "i8") // avs+ { autoScaleSourceBitDepth = 8; } else if (tokens[i] == "i10") // avs+ { autoScaleSourceBitDepth = 10; } else if (tokens[i] == "i12") // avs+ { autoScaleSourceBitDepth = 12; } else if (tokens[i] == "i14") // avs+ { autoScaleSourceBitDepth = 14; } else if (tokens[i] == "i16") // avs+ { autoScaleSourceBitDepth = 16; } else if (tokens[i] == "f32") // avs+ { autoScaleSourceBitDepth = 32; } else if (tokens[i].length() > 1 && tokens[i][0] >= 'a' && tokens[i][0] <= 'z' && tokens[i][1] == '.') { // frame property access: x.framePropName syntax char srcChar = tokens[i][0]; int srcIndex; if (srcChar >= 'x') srcIndex = srcChar - 'x'; else srcIndex = srcChar - 'a' + 3; if (srcIndex >= numInputs) env->ThrowError("Expr: Too few input clips supplied to reference '%s'", tokens[i].c_str()); auto fullname = tokens[i]; auto fpname = tokens[i].substr(2); // after '.' if(fpname.length() == 0) env->ThrowError("Expr: no frame property name is specified"); if (!isValidVarName(fpname)) env->ThrowError("Expr: invalid frame property name '%s'", fpname.c_str()); // check if frame property already existed in a variable slots auto key = fullname; auto it = fpnames.find(key); int loadIndex; if (it == fpnames.end()) { // first occurance, insert name and actual index if (fpindex >= MAX_FRAMEPROP_VARIABLES) env->ThrowError("Expr: too many frame property references, maximum reached (%d)", MAX_FRAMEPROP_VARIABLES); loadIndex = fpindex++; fpnames[key] = loadIndex; // Register into the list of frame properties to read // input clip index: srcIndex // name of frame property: fpname // variable index to fill: loadindex ExprFramePropData fpData; fpData.name = fpname; fpData.srcIndex = srcIndex; fpData.var_index = loadIndex; fp.push_back(fpData); } else { loadIndex = it->second; } LOAD_OP(opLoadFramePropVar, loadIndex, 0); } else if (tokenlen >= 2 && (tokens[i][tokenlen - 1] == '^' || tokens[i][tokenlen - 1] == '@')) { // storing a variable: A@ .. Z@ // storing a variable and remove from stack: A^..Z^ auto key = tokens[i].substr(0, tokenlen - 1); auto opchar = tokens[i][tokenlen - 1]; auto it = varnames.find(key); int loadIndex; if (it == varnames.end()) { if(!isValidVarName(key)) env->ThrowError("Expr: invalid variable name '%s'", key.c_str()); // first occurance, insert name and actual index if (varindex >= MAX_USER_VARIABLES) env->ThrowError("Expr: too many variables, maximum reached (%d)", MAX_USER_VARIABLES); loadIndex = varindex++; varnames[key] = loadIndex; } else { loadIndex = it->second; } if (opchar == '^') VAR_STORE_SPEC_OP(opStoreVarAndDrop1, loadIndex); else // if (opchar == '@') VAR_STORE_OP(opStoreVar, loadIndex); } else if (isValidVarName(tokens[i])) { // variable names // the very end, all reserved expr words were processed auto key = tokens[i]; auto it = varnames.find(key); if (it == varnames.end()) env->ThrowError("Expr: keyword or variable not found: '%s'", key.c_str()); auto loadIndex = it->second; LOAD_OP(opLoadVar, loadIndex, 0); } else { // parse a number float f; std::string s; std::istringstream numStream(tokens[i]); numStream.imbue(std::locale::classic()); if (!(numStream >> f)) env->ThrowError("Expr: Failed to convert '%s' to float", tokens[i].c_str()); if (numStream >> s) env->ThrowError("Expr: Failed to convert '%s' to float, not the whole token could be converted", tokens[i].c_str()); LOAD_OP(opLoadConst, f, 0); } } if (tokens.size() > 0) { if (stackSize != 1) env->ThrowError("Expr: Stack unbalanced at end of expression (size=%zu). Need to have exactly one value on the stack to return.", stackSize); // When scale_inputs option was used for scaling input to a common internal range, // we have to scale pixels before storing them back // need any conversion? // or use effectiveTargetBitDepth instead of autoScaleSourceBitDepth const int srcBitDepth = autoScaleSourceBitDepth; const int dstBitDepth = targetBitDepth; const bool use_chroma = chroma; // && !forceNonUV; const bool isfull = autoconv_full_scale; if (autoconv_conv_int || autoconv_conv_float) { if ((targetBitDepth != 32 && autoconv_conv_int) || ((targetBitDepth == 32 && autoconv_conv_float))) { bits_conv_constants d; get_bits_conv_constants(d, use_chroma, isfull, isfull, srcBitDepth, dstBitDepth); // chroma is spec: signed. Limited:16-240 is really 128 +/-112. Full:1-255 is really 128+/-127 if (d.src_offset != 0) { LOAD_OP_NOTOKEN(opLoadConst, (float)d.src_offset, 0); TWO_ARG_OP_NOTOKEN(opSub); } if (d.mul_factor != 1.0f) { LOAD_OP_NOTOKEN(opLoadConst, d.mul_factor, 0); TWO_ARG_OP_NOTOKEN(opMul); } if (d.dst_offset != 0) { LOAD_OP_NOTOKEN(opLoadConst, (float)d.dst_offset, 0); TWO_ARG_OP_NOTOKEN(opAdd); } } } // "floatUV" - // this reverses the effect of the 0.5 float-type pre-shift is the pixel load phase // pre-shifts chroma pixels by +0.5 before applying the expression (see at pixel load), // then here the result is shifted back by -0.5 // Thus expressions, which rely on a working range of 0..1.0 will work transparently if ((!autoconv_conv_float || srcBitDepth == 32) && targetBitDepth == 32) { if (chroma && shift_float) { LOAD_OP_NOTOKEN(opLoadConst, 0.5f, 0); TWO_ARG_OP_NOTOKEN(opSub); // at pixel load it was opAdd } } if (clamp_float_i > 0 && targetBitDepth == 32) { if (chroma) { // clamp_float clamp_float_uv -> clamp_float_i clamp range for Y clamp range for UV // false x 0 0..1 -0.5..+0.5 // true false 1 0..1 -0.5..+0.5 // true true 2 0..1 0..1 LOAD_OP_NOTOKEN(opLoadConst, clamp_float_i == 2 ? 0.0f : -0.5f, 0); TWO_ARG_OP_NOTOKEN(opMax); LOAD_OP_NOTOKEN(opLoadConst, clamp_float_i == 2 ? 1.0f : 0.5f, 0); TWO_ARG_OP_NOTOKEN(opMin); } else { // luma LOAD_OP_NOTOKEN(opLoadConst, 0.0f, 0); TWO_ARG_OP_NOTOKEN(opMax); LOAD_OP_NOTOKEN(opLoadConst, 1.0f, 0); TWO_ARG_OP_NOTOKEN(opMin); } } // and finally store it ops.push_back(storeOp); } return maxStackSize; } static float calculateOneOperand(uint32_t op, float a) { switch (op) { case opSqrt: return std::sqrt(a); case opAbs: return std::abs(a); case opSgn: return (a < 0) ? -1.0f : (a > 0) ? 1.0f : 0.0f; case opNeg: // Expr "boolean": not return (a > 0) ? 0.0f : 1.0f; case opNegSign: return -a; case opExp: return std::exp(a); case opLog: return std::log(a); case opSin: return std::sin(a); case opCos: return std::cos(a); case opTan: return std::tan(a); case opAsin: return std::asin(a); case opAcos: return std::acos(a); case opAtan: return std::atan(a); case opRound: return std::round(a); case opFloor: return std::floor(a); case opCeil: return std::ceil(a); case opTrunc: return std::trunc(a); } return 0.0f; } static float calculateTwoOperands(uint32_t op, float a, float b) { switch (op) { case opAdd: return a + b; case opSub: return a - b; case opMul: return a * b; case opDiv: return a / b; case opFmod: return std::fmod(a, b); case opMax: return std::max(a, b); case opMin: return std::min(a, b); case opGt: return (a > b) ? 1.0f : 0.0f; case opLt: return (a < b) ? 1.0f : 0.0f; case opEq: return (a == b) ? 1.0f : 0.0f; case opNotEq: return (a != b) ? 1.0f : 0.0f; case opLE: return (a <= b) ? 1.0f : 0.0f; case opGE: return (a >= b) ? 1.0f : 0.0f; case opAnd: return (a > 0 && b > 0) ? 1.0f : 0.0f; case opOr: return (a > 0 || b > 0) ? 1.0f : 0.0f; case opXor: return ((a > 0) != (b > 0)) ? 1.0f : 0.0f; case opPow: return std::pow(a, b); case opAtan2: return std::atan2(a, b); } return 0.0f; } static int numOperands(uint32_t op) { switch (op) { case opLoadConst: case opLoadSrc8: case opLoadSrc16: case opLoadSrcF32: case opLoadSrcF16: case opLoadRelSrc8: case opLoadRelSrc16: case opLoadRelSrcF32: case opDup: case opLoadSpatialX: case opLoadSpatialY: case opLoadVar: case opLoadFramePropVar: case opLoadInternalVar: case opSwap: case opStoreVar: case opStoreVarAndDrop1: return 0; case opSqrt: case opAbs: case opSgn: case opNeg: case opNegSign: case opExp: case opLog: case opSin: case opCos: case opTan: case opAsin: case opAcos: case opAtan: case opRound: case opFloor: case opCeil: case opTrunc: return 1; case opAdd: case opSub: case opMul: case opDiv: case opFmod: case opMax: case opMin: case opGt: case opLt: case opEq: case opNotEq: case opLE: case opGE: case opAnd: case opOr: case opXor: case opPow: case opAtan2: return 2; case opTernary: case opClip: return 3; } return 0; } static bool isLoadOp(uint32_t op) { switch (op) { case opLoadConst: case opLoadSrc8: case opLoadSrc16: case opLoadSrcF32: case opLoadSrcF16: case opLoadRelSrc8: case opLoadRelSrc16: case opLoadRelSrcF32: case opLoadSpatialX: case opLoadSpatialY: case opLoadVar: case opLoadFramePropVar: case opLoadInternalVar: return true; } return false; } static void findBranches(std::vector& ops, size_t pos, size_t* start1, size_t* start2, size_t* start3) { int operands = numOperands(ops[pos].op); size_t temp1, temp2, temp3; if (operands == 0) { // dup loadsrc loadrel loadconst swap, storevar if (ops[pos].op == opSwap || ops[pos].op == opStoreVar || ops[pos].op == opStoreVarAndDrop1) { findBranches(ops, pos - 1, &temp1, &temp2, &temp3); *start1 = temp1; if (ops[pos].op == opStoreVarAndDrop1) { // StoreAndPopVar: opStoreVar + Ignore topmost stack. // Branch was calculated only for storing its result into var. // Leaves no trace on stack. // So we go on with next branch pos = *start1; findBranches(ops, pos - 1, &temp1, &temp2, &temp3); *start1 = temp1; } } else *start1 = pos; } else if (operands == 1) { if (isLoadOp(ops[pos - 1].op)) { *start1 = pos - 1; } else { findBranches(ops, pos - 1, &temp1, &temp2, &temp3); *start1 = temp1; } } else if (operands == 2) { if (isLoadOp(ops[pos - 1].op)) { *start2 = pos - 1; } else { findBranches(ops, pos - 1, &temp1, &temp2, &temp3); *start2 = temp1; } if (isLoadOp(ops[*start2 - 1].op)) { *start1 = *start2 - 1; } else { findBranches(ops, *start2 - 1, &temp1, &temp2, &temp3); *start1 = temp1; } } else if (operands == 3) { if (isLoadOp(ops[pos - 1].op)) { *start3 = pos - 1; } else { findBranches(ops, pos - 1, &temp1, &temp2, &temp3); *start3 = temp1; } if (isLoadOp(ops[*start3 - 1].op)) { *start2 = *start3 - 1; } else { findBranches(ops, *start3 - 1, &temp1, &temp2, &temp3); *start2 = temp1; } if (isLoadOp(ops[*start2 - 1].op)) { *start1 = *start2 - 1; } else { findBranches(ops, *start2 - 1, &temp1, &temp2, &temp3); *start1 = temp1; } } } static void foldConstants(std::vector &ops) { for (size_t i = 0; i < ops.size(); i++) { switch (ops[i].op) { // optimize pow case opPow: if (ops[i - 1].op == opLoadConst) { if (ops[i - 1].e.fval == 0.5f) { // replace pow 0.5 with sqrt ops[i].op = opSqrt; ops.erase(ops.begin() + i - 1); i--; } else if (ops[i - 1].e.fval == 1.0f) { // replace pow 1 with nothing ops.erase(ops.begin() + i - 1, ops.begin() + i + 1); i -= 2; } else if (ops[i - 1].e.fval == 2.0f) { // replace pow 2 with dup * ops[i].op = opMul; ops[i - 1].op = opDup; ops[i - 1].e.ival = 0; // dup 0 i--; } else if (ops[i - 1].e.fval == 3.0f) { // replace pow 3 with dup dup * * ops[i].op = opMul; ops[i - 1].op = opMul; ExprOp extraDup(opDup, 0); ops.insert(ops.begin() + i - 1, extraDup); ops.insert(ops.begin() + i - 1, extraDup); i--; } else if (ops[i - 1].e.fval == 4.0f) { // replace pow 4 with dup * dup * ops[i].op = opMul; ops[i - 1].op = opDup; ops[i - 1].e.ival = 0; // dup 0 ExprOp extraMul(opMul); ExprOp extraDup(opDup, 0); ops.insert(ops.begin() + i - 1, extraMul); ops.insert(ops.begin() + i - 1, extraDup); i--; } } break; // optimize Mul 1 Div 1, Mul -1, Div -1 case opMul: case opDiv: if (ops[i - 1].op == opLoadConst) { if (ops[i - 1].e.fval == 1.0f) { // replace mul 1 or div 1 with nothing ops.erase(ops.begin() + i - 1, ops.begin() + i + 1); i -= 2; } else if (ops[i - 1].e.fval == -1.0f) { // replace mul -1 or div -1 with neg ops[i].op = opNegSign; ops.erase(ops.begin() + i - 1); i--; } } break; // optimize Add 0 or Sub 0 case opAdd: case opSub: if (ops[i - 1].op == opLoadConst) { if (ops[i - 1].e.fval == 0.0f) { // replace add 0 or sub 0 with nothing ops.erase(ops.begin() + i - 1, ops.begin() + i + 1); i -= 2; } } break; } // fold constant switch (ops[i].op) { case opDup: if (ops[i - 1].op == opLoadConst && ops[i].e.ival == 0) { ops[i] = ops[i - 1]; } break; case opSqrt: case opAbs: case opSgn: case opNeg: case opNegSign: case opExp: case opLog: case opSin: case opCos: case opTan: case opAsin: case opAcos: case opAtan: case opRound: case opFloor: case opCeil: case opTrunc: if (ops[i - 1].op == opLoadConst) { ops[i].e.fval = calculateOneOperand(ops[i].op, ops[i - 1].e.fval); ops[i].op = opLoadConst; ops.erase(ops.begin() + i - 1); i--; } break; case opSwap: if (ops[i - 2].op == opLoadConst && ops[i - 1].op == opLoadConst && ops[i].e.ival == 1) { const float temp = ops[i - 2].e.fval; ops[i - 2].e.fval = ops[i - 1].e.fval; ops[i - 1].e.fval = temp; ops.erase(ops.begin() + i); i--; } break; case opAdd: case opSub: case opMul: case opDiv: case opFmod: case opMax: case opMin: case opGt: case opLt: case opEq: case opNotEq: case opLE: case opGE: case opAnd: case opOr: case opXor: case opPow: case opAtan2: if (ops[i - 2].op == opLoadConst && ops[i - 1].op == opLoadConst) { ops[i].e.fval = calculateTwoOperands(ops[i].op, ops[i - 2].e.fval, ops[i - 1].e.fval); ops[i].op = opLoadConst; ops.erase(ops.begin() + i - 2, ops.begin() + i); i -= 2; } break; case opTernary: size_t start1, start2, start3; findBranches(ops, i, &start1, &start2, &start3); // start1/2/3: condition/true/false branch if (ops[start2 - 1].op == opLoadConst) { // condition expression is a single constant ops.erase(ops.begin() + i); // erase ternary op if (ops[start1].e.fval > 0.0f) { // condition is constant 'true' // start1 is start2 - 1 ops.erase(ops.begin() + start3, ops.begin() + i); // erase 'false' branch i = start3; } else { ops.erase(ops.begin() + start2, ops.begin() + start3); // erase 'true' branch i -= start3 - start2; } ops.erase(ops.begin() + start1); // erase constant i -= 2; } break; } } } Exprfilter::Exprfilter(const std::vector& _child_array, const std::vector& _expr_array, const char *_newformat, const bool _optAvx2, const bool _optSingleMode, const bool _optSSE2, const bool _optVectorC, const std::string _scale_inputs, const int _clamp_float_i, const int _lutmode, IScriptEnvironment *env) : children(_child_array), expressions(_expr_array), optAvx2(_optAvx2), optSingleMode(_optSingleMode), optSSE2(_optSSE2), optVectorC(_optVectorC), scale_inputs(_scale_inputs), clamp_float_i(_clamp_float_i), lutmode(_lutmode) { vi = children[0]->GetVideoInfo(); d.vi = vi; if (lutmode < 0 || lutmode>2) env->ThrowError("'Expr: 'lut' can be 0 (no lut), 1 (lut_x) or 2 (lut_xy)"); if (lutmode == 1 && vi.BitsPerComponent() == 32) lutmode = 0; // fallback to realtime if (lutmode == 2 && vi.BitsPerComponent() > 14) lutmode = 0; // fallback to realtime d.lutmode = lutmode; for (int i = 0; i < 4; i++) d.luts[i] = nullptr; // parse "scale_inputs" autoconv_full_scale = false; autoconv_conv_float = false; autoconv_conv_int = false; shift_float = false; if (scale_inputs == "allf") { autoconv_full_scale = true; autoconv_conv_int = true; autoconv_conv_float = true; } else if (scale_inputs == "intf") { autoconv_full_scale = true; autoconv_conv_int = true; } else if (scale_inputs == "floatf") { autoconv_full_scale = true; autoconv_conv_float = true; } else if (scale_inputs == "all") { autoconv_conv_int = true; autoconv_conv_float = true; } else if (scale_inputs == "int") { autoconv_conv_int = true; } else if (scale_inputs == "float") { autoconv_conv_float = true; } else if (scale_inputs == "floatuv") { autoconv_conv_float = false; // !! really // like in masktools2 2.2.20+ shift_float = true; // !! } else if (scale_inputs != "none") { env->ThrowError("Expr: scale_inputs must be 'all','allf','int','intf','float','floatf','floatUV' or 'none'"); } try { d.numInputs = (int)children.size(); // d->numInputs = vsapi->propNumElements(in, "clips"); if (d.numInputs > 26) env->ThrowError("Expr: More than 26 input clips provided"); for (int i = 0; i < d.numInputs; i++) d.clips[i] = children[i]; if (d.lutmode > 0) { if(d.numInputs != d.lutmode) env->ThrowError("Expr lut: number of input clips must be the same as LUT's dimension. LUT is %dD. Passed clip(s): %d", d.lutmode, d.numInputs); } // checking formats const VideoInfo* vi_array[MAX_EXPR_INPUTS] = {}; for (int i = 0; i < d.numInputs; i++) if (d.clips[i]) vi_array[i] = &d.clips[i]->GetVideoInfo(); int planes_y[4] = { PLANAR_Y, PLANAR_U, PLANAR_V, PLANAR_A }; int planes_r[4] = { PLANAR_G, PLANAR_B, PLANAR_R, PLANAR_A }; // for checking GBR order is OK int *plane_enums = (d.vi.IsYUV() || d.vi.IsYUVA()) ? planes_y : planes_r; const int plane_enum = plane_enums[1]; // for subsampling check U only // check all clips against first one for (int i = 0; i < d.numInputs; i++) { int *plane_enums_i = (vi_array[i]->IsYUV() || vi_array[i]->IsYUVA()) ? planes_y : planes_r; const int plane_enum_i = plane_enums_i[1]; if (vi_array[0]->NumComponents() != vi_array[i]->NumComponents() // number of planes should match || ( !vi_array[0]->IsY() && ( // no subsampling for Y vi_array[0]->GetPlaneWidthSubsampling(plane_enum) != vi_array[i]->GetPlaneWidthSubsampling(plane_enum_i) || vi_array[0]->GetPlaneHeightSubsampling(plane_enum) != vi_array[i]->GetPlaneHeightSubsampling(plane_enum_i) ) ) || vi_array[0]->width != vi_array[i]->width || vi_array[0]->height != vi_array[i]->height) env->ThrowError("Expr: All inputs must have the same number of planes and the same dimensions, subsampling included"); if (vi_array[i]->IsRGB() && !vi_array[i]->IsPlanar()) env->ThrowError("Expr: No packed RGB format allowed for clip #%d, use planar RGB instead",i+1); if (vi_array[i]->IsYUY2()) env->ThrowError("Expr: YUY2 format not allowed for clip #%d", i+1); } // format override if (_newformat != nullptr) { int pixel_type = GetPixelTypeFromName(_newformat); if (pixel_type == VideoInfo::CS_UNKNOWN) env->ThrowError("Expr: Invalid video format string parameter"); d.vi.pixel_type = pixel_type; if(d.vi.IsRGB() && !d.vi.IsPlanar()) env->ThrowError("Expr: No packed RGB format allowed"); if (d.vi.IsYUY2()) env->ThrowError("Expr: YUY2 format not allowed"); const bool isSinglePlaneInput = vi_array[0]->IsY(); // input number of planes >= output planes if (!isSinglePlaneInput && vi_array[0]->NumComponents() < d.vi.NumComponents()) env->ThrowError("Expr: number of planes in input should be greater than or equal than of output"); // subsampling should match int *plane_enums_s = (vi_array[0]->IsYUV() || vi_array[0]->IsYUVA()) ? planes_y : planes_r; int *plane_enums_d = (d.vi.IsYUV() || d.vi.IsYUVA()) ? planes_y : planes_r; for (int p = 0; p < d.vi.NumComponents(); p++) { const int plane_enum_s = isSinglePlaneInput ? plane_enums_s[0] : plane_enums_s[p]; // for Y inputs, reference is Y for each output plane const int plane_enum_d = plane_enums_d[p]; if (vi_array[0]->GetPlaneWidthSubsampling(plane_enum_s) != d.vi.GetPlaneWidthSubsampling(plane_enum_d) || vi_array[0]->GetPlaneHeightSubsampling(plane_enum_s) != d.vi.GetPlaneHeightSubsampling(plane_enum_d)) { if(isSinglePlaneInput) env->ThrowError("Expr: output must not be a subsampled format for Y-only input(s)"); else env->ThrowError("Expr: inputs and output must have the same subsampling"); } } vi = d.vi; } // check expression count, duplicate omitted expressions from previous one int nexpr = (int)expressions.size(); if (nexpr > d.vi.NumComponents()) // ->numPlanes) env->ThrowError("Expr: More expressions given than there are planes"); std::string expr[4]; // 4th: alpha for (int i = 0; i < nexpr; i++) expr[i] = expressions[i]; if (nexpr == 1) { expr[1] = expr[0]; expr[2] = expr[0]; // e.g. exprU = exprV = exprY } else if (nexpr == 2) { expr[2] = expr[1]; // e.g. exprV = exprU } if(nexpr <= 3) expr[3] = ""; // do not use previous expression to alpha expr. Default: "" (copy) // default: all clips unused for (int i = 0; i < MAX_EXPR_INPUTS; i++) { d.clipsUsed[i] = false; } for (int i = 0; i < d.vi.NumComponents(); i++) { if (!expr[i].empty()) { d.plane[i] = poProcess; } else { if (d.vi.BitsPerComponent() == vi_array[0]->BitsPerComponent()) { d.plane[i] = poCopy; // copy only when target clip format bit depth == 1st clip's bit depth d.planeCopySourceClip[i] = 0; // default source clip from empty expression: first one d.clipsUsed[0] = true; // mark clip to have its GetFrame } else d.plane[i] = poUndefined; } } int* plane_enums_d = (d.vi.IsYUV() || d.vi.IsYUVA()) ? planes_y : planes_r; d.maxStackSize = 0; for (int i = 0; i < d.vi.NumComponents(); i++) { const int plane_enum_s = plane_enums[i]; const int plane_enum = plane_enums_d[i]; const int planewidth = d.vi.width >> d.vi.GetPlaneWidthSubsampling(plane_enum); const int planeheight = d.vi.height >> d.vi.GetPlaneHeightSubsampling(plane_enum); const bool chroma = (plane_enum_s == PLANAR_U || plane_enum_s == PLANAR_V); d.maxStackSize = std::max(parseExpression(expr[i], d.ops[i], d.frameprops[i], vi_array, &d.vi, getStoreOp(&d.vi), d.numInputs, planewidth, planeheight, chroma, autoconv_full_scale, autoconv_conv_int, autoconv_conv_float, clamp_float_i, shift_float, d.lutmode, env), d.maxStackSize); foldConstants(d.ops[i]); // optimize constant store, change operation to "fill" if (d.plane[i] == poProcess && d.ops[i].size() == 2 && d.ops[i][0].op == opLoadConst) { uint32_t op = d.ops[i][1].op; if (op == opStore8 || op == opStore10 || op == opStore12 || op == opStore14 || op == opStore16 || op == opStoreF32) { d.plane[i] = poFill; d.planeFillValue[i] = d.ops[i][0].e.fval; } } // optimize single clip letter in expression: Load-Store. Change operation to "copy" // no relative loads here if (d.plane[i] == poProcess && d.ops[i].size() == 2 && (d.ops[i][0].op == opLoadSrc8 || d.ops[i][0].op == opLoadSrc16 || d.ops[i][0].op == opLoadSrcF16 || d.ops[i][0].op == opLoadSrcF32) && (d.ops[i][1].op == opStore8 || d.ops[i][1].op == opStore10 || d.ops[i][1].op == opStore12 || d.ops[i][1].op == opStore14 || d.ops[i][1].op == opStore16 || d.ops[i][1].op == opStoreF16 || d.ops[i][1].op == opStoreF32)) { const int sourceClip = d.ops[i][0].e.ival; // check target vs source bit depth if(d.vi.BitsPerComponent() == vi_array[sourceClip]->BitsPerComponent()) // no 16bit float in avs+ { d.plane[i] = poCopy; d.planeCopySourceClip[i] = sourceClip; d.clipsUsed[sourceClip] = true; // mark clip to have its GetFrame } } // optimize: mark referenced input clips in order to not call GetFrame for unused inputs if (lutmode == 0) { for (size_t j = 0; j < d.ops[i].size(); j++) { const uint32_t op = d.ops[i][j].op; if (op == opLoadSrc8 || op == opLoadSrc16 || op == opLoadSrcF16 || op == opLoadSrcF32 || op == opLoadRelSrc8 || op == opLoadRelSrc16 || op == opLoadRelSrcF32) { const int sourceClip = d.ops[i][j].e.ival; d.clipsUsed[sourceClip] = true; } } // input clips with frame property access are used as well for (auto framePropToRead : d.frameprops[i]) { const int sourceClip = framePropToRead.srcIndex; d.clipsUsed[sourceClip] = true; } } if (lutmode > 0) { for (int i = 0; i < lutmode; i++) // lut: always get. Needed for the init d.clipsUsed[i] = true; // * bit depth of input clip(s) and output must match bool lut_ok = (d.numInputs == 1 && d.vi.BitsPerComponent() == vi_array[0]->BitsPerComponent()) || ( d.numInputs == 2 && d.vi.BitsPerComponent() == vi_array[0]->BitsPerComponent() && d.vi.BitsPerComponent() == vi_array[1]->BitsPerComponent() ); if(!lut_ok) env->ThrowError("Expr: error in lut mode: input bit depths and output bit depth must be the same"); } #ifdef INTEL_INTRINSICS // Check CPU instuction level constraints: // opLoadRel8/16/32: minimum SSSE3 (pshufb, alignr) for SIMD, and no AVX2 support // round, floor, ceil, trunc: minimun SSE4.1 // Trig.func: C only d.planeOptAvx2[i] = optAvx2; d.planeOptSSE2[i] = optSSE2; for (size_t j = 0; j < d.ops[i].size(); j++) { const uint32_t op = d.ops[i][j].op; if (op == opLoadRelSrc8 || op == opLoadRelSrc16 || op == opLoadRelSrcF32) { d.planeOptAvx2[i] = false; // avx2 path not implemented if(!(env->GetCPUFlags() & CPUF_SSSE3)) // required minimum (pshufb, alignr) d.planeOptSSE2[i] = false; } // some trig.functions C only, except Sin and Cos and Atan2 and tan if (op == opAsin || op == opAcos || op == opAtan) { d.planeOptAvx2[i] = false; d.planeOptSSE2[i] = false; break; } // round, trunc, ceil: minimum of SSE4.1 if (op == opRound || op == opFloor || op == opCeil || op == opTrunc ) { if (!(env->GetCPUFlags() & CPUF_SSE4_1)) // required minimum (_mm_round_ps...) d.planeOptSSE2[i] = false; break; } } #endif } #ifdef VS_TARGET_CPU_X86 // optAvx2 can only disable avx2 when available for (int i = 0; i < d.vi.NumComponents(); i++) { if (d.plane[i] == poProcess) { const int plane_enum = plane_enums_d[i]; int planewidth = d.vi.width >> d.vi.GetPlaneWidthSubsampling(plane_enum); int planeheight = d.vi.height >> d.vi.GetPlaneHeightSubsampling(plane_enum); const int planewidth_real_or_lut = (lutmode == 0) ? planewidth: (1 << d.vi.BitsPerComponent()); // to decide if partial chunk is left from the width at the end of the 4/8/16 pixel processing unit big main loops // when lut: fake width (x size of lut table) of the lut-init if (optAvx2 && d.planeOptAvx2[i]) { // avx2 ExprEvalAvx2 ExprObj(d.ops[i], d.numInputs, env->GetCPUFlags(), planewidth_real_or_lut, planeheight, optSingleMode); if (ExprObj.GetCode(true) && ExprObj.GetCodeSize()) { // PF modded jitasm. true: epilog with vmovaps, and vzeroupper #ifdef VS_TARGET_OS_WINDOWS d.proc[i] = (ExprData::ProcessLineProc)VirtualAlloc(nullptr, ExprObj.GetCodeSize(), MEM_COMMIT, PAGE_EXECUTE_READWRITE); #else d.proc[i] = (ExprData::ProcessLineProc)mmap(nullptr, ExprObj.GetCodeSize(), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, 0, 0); #endif memcpy((void *)d.proc[i], ExprObj.GetCode(), ExprObj.GetCodeSize()); } } else if (optSSE2 && d.planeOptSSE2[i]) { // sse2, sse4 ExprEval ExprObj(d.ops[i], d.numInputs, env->GetCPUFlags(), planewidth_real_or_lut, planeheight, optSingleMode); if (ExprObj.GetCode() && ExprObj.GetCodeSize()) { #ifdef VS_TARGET_OS_WINDOWS d.proc[i] = (ExprData::ProcessLineProc)VirtualAlloc(nullptr, ExprObj.GetCodeSize(), MEM_COMMIT, PAGE_EXECUTE_READWRITE); #else d.proc[i] = (ExprData::ProcessLineProc)mmap(nullptr, ExprObj.GetCodeSize(), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, 0, 0); #endif memcpy((void *)d.proc[i], ExprObj.GetCode(), ExprObj.GetCodeSize()); } } } // if plane is to be processed } #ifdef VS_TARGET_OS_WINDOWS if (optSSE2) FlushInstructionCache(GetCurrentProcess(), nullptr, 0); #endif #endif if (lutmode > 0) calculate_lut(env); } catch (std::runtime_error &e) { for (int i = 0; i < MAX_EXPR_INPUTS; i++) d.clips[i] = nullptr; // vsapi->freeNode(d->node[i]); std::string s = "Expr: "; s += e.what(); env->ThrowError(s.c_str()); return; } } #ifdef XP_TLS #ifdef MSVC_PURE // end of v141_xp toolset ultra slow build workaround #pragma optimize("", on) #endif #endif ================================================ FILE: avs_core/filters/exprfilter/exprfilter.h ================================================ #ifndef __Exprfilter_h #define __Exprfilter_h #include #include #ifdef AVS_POSIX #include #endif #define MAX_C_VECT 16 // C Expr part: 16*float has still have benefit, less interpreter overhead. #define MAX_EXPR_INPUTS 26 #define INTERNAL_VARIABLES 6 #define MAX_FRAMEPROP_VARIABLES 64 #define MAX_USER_VARIABLES 128 // indexing RWPTR array (pointer sized elements) #define RWPTR_START_OF_OUTPUT 0 // 1 #define RWPTR_START_OF_XCOUNTER 1 // 1 #define RWPTR_START_OF_INPUTS 2 // count = 26 #define RWPTR_START_OF_PADDING 4 // padding to have 32 pointers (rfu for 8 ptr/cycle ymm simd) #define RWPTR_START_OF_STRIDES 32 // count = 26 for relative_y #define RWPTR_START_OF_INTERNAL_VARIABLES 58 // count = 6 // special frame-by-frame variables (incl. frame properties) occupy only float size #define INTERNAL_VAR_CURRENT_FRAME 0 #define INTERNAL_VAR_RELTIME 1 #define INTERNAL_VAR_RFU2 2 #define INTERNAL_VAR_RFU3 3 #define INTERNAL_VAR_RFU4 4 #define INTERNAL_VAR_RFU5 5 #define INTERNAL_VAR_FRAMEPROP_VARIABLES_START 6 #define RWPTR_START_OF_INTERNAL_FRAMEPROP_VARIABLES (RWPTR_START_OF_INTERNAL_VARIABLES + INTERNAL_VAR_FRAMEPROP_VARIABLES_START) // count = 256 // pad to 32 bytes boundary in x86: 64 * sizeof(pointer) is 32 byte aligned #define RWPTR_START_OF_USERVARIABLES (RWPTR_START_OF_INTERNAL_FRAMEPROP_VARIABLES + MAX_FRAMEPROP_VARIABLES) // count = max.256 (for 2*ymm sized variables) #define RWPTR_SIZE (RWPTR_START_OF_USERVARIABLES + MAX_USER_VARIABLES * (2*32 / sizeof(void *))) struct split1 { enum empties_t { empties_ok, no_empties }; }; template Container& split( Container& result, const typename Container::value_type& s, const typename Container::value_type& delimiters, split1::empties_t empties = split1::empties_ok) { result.clear(); size_t current; size_t next = (size_t)-1; do { if (empties == split1::no_empties) { next = s.find_first_not_of(delimiters, next + 1); if (next == Container::value_type::npos) break; next -= 1; } current = next + 1; next = s.find_first_of(delimiters, current); result.push_back(s.substr(current, next - current)); } while (next != Container::value_type::npos); return result; } typedef enum { opLoadSrc8, opLoadSrc16, opLoadSrcF32, opLoadSrcF16, opLoadRelSrc8, opLoadRelSrc16, opLoadRelSrcF32, opLoadConst, opLoadSpatialX, opLoadSpatialY, opLoadInternalVar, opStore8, opStore10, opStore12, opStore14, opStore16, opStoreF32, opStoreF16, // avs+: 10,12,14 bit store opDup, opSwap, opAdd, opSub, opMul, opDiv, opMax, opMin, opSqrt, opAbs, opSgn, opFmod, opGt, opLt, opEq, opNotEq, opLE, opGE, opTernary, opAnd, opOr, opXor, opNeg, opNegSign, opExp, opLog, opPow, opSin, opCos, opTan, opAsin, opAcos, opAtan, opAtan2, opClip, opRound, opFloor, opCeil, opTrunc, opStoreVar, opLoadVar, opLoadFramePropVar, opStoreVarAndDrop1 } SOperation; union ExprUnion { float fval; int32_t ival; uint32_t uval; constexpr ExprUnion() : uval{} {} constexpr ExprUnion(int32_t _i) : ival(_i) {} constexpr ExprUnion(uint32_t _u) : uval(_u) {} constexpr ExprUnion(float _f) : fval(_f) {} } ; struct ExprOp { ExprUnion e; uint32_t op; int dx, dy; ExprOp(SOperation op, float val) : op(op), dx(0), dy(0) { e.fval = val; } ExprOp(SOperation op, int32_t val = 0) : op(op), dx(0), dy(0) { e.ival = val; } ExprOp(SOperation op, int32_t val, int dx, int dy) : op(op), dx(dx), dy(dy) { e.ival = val; } }; struct ExprFramePropData { int srcIndex; std::string name; int var_index; float value; }; enum PlaneOp { poProcess, poCopy, poUndefined, poFill }; struct ExprData { #ifdef __VAPOURSYNTH__ VSNodeRef *node[MAX_EXPR_INPUTS]; VSVideoInfo vi; #else PClip clips[MAX_EXPR_INPUTS]; VideoInfo vi; #endif bool clipsUsed[MAX_EXPR_INPUTS]; // not doing GetFrame unreferenced input clips std::vector ops[4]; // 4th: alpha std::vector frameprops[4]; int plane[4]; float planeFillValue[4]; // optimize: fill plane with const int planeCopySourceClip[4]; // optimize: copy plane from which clip bool planeOptAvx2[4]; // instruction set constraints bool planeOptSSE2[4]; int lutmode; // 0: no, 1:1D (lutx), 2:2D (lutxy) uint8_t* luts[4]; // different lut tables, reusable by multiple planes // int planeLutIndex[4]; // which luts is used by the plane. todo: when luts are the same for different planes size_t maxStackSize; int numInputs; #ifdef VS_TARGET_CPU_X86 typedef void(*ProcessLineProc)(void *rwptrs, intptr_t ptroff[RWPTR_SIZE], intptr_t niter, uint32_t spatialY); ProcessLineProc proc[4]; // 4th: alpha ExprData() : clips(), vi(), proc() {} #else ExprData() : clips(), vi() {} #endif ~ExprData() { #ifdef VS_TARGET_CPU_X86 for (int i = 0; i < 4; i++) // 4th: alpha #ifdef VS_TARGET_OS_WINDOWS VirtualFree((LPVOID)proc[i], 0, MEM_RELEASE); #else munmap((void *)proc[i], 0); #endif #endif } }; class Exprfilter : public IClip /** * **/ { private: std::vector children; std::vector expressions; VideoInfo vi; ExprData d; const bool optAvx2; // disable avx2 path const bool optSingleMode; // generate asm code using only one XMM/YMM register set instead of two const bool optSSE2; // disable simd path const bool optVectorC; // if non-SIMD C path, then this goes to a vectorization friendly implementation // scale_inputs related settings const std::string scale_inputs; bool autoconv_full_scale; bool autoconv_conv_int; bool autoconv_conv_float; const int clamp_float_i; int lutmode; // special internal flag since v2.2.20: set when scale_inputs is "floatUV" // like in masktools 2.2.20+, preshifts chroma -0.5..+0.5 to 0..1.0 range and then shifts the result back. bool shift_float; void preReadFrameProps(int plane, std::vector& src, IScriptEnvironment* env); void calculate_lut(IScriptEnvironment *env); public: Exprfilter(const std::vector& _child_array, const std::vector& _expr_array, const char *_newformat, const bool _optAvx2, const bool _optSingleMode2, const bool _optSSE2, const bool _optVectorC, const std::string _scale_inputs, const int _clamp_float, const int _lutmode, IScriptEnvironment *env); void processFrame(int plane, int w, int h, int pixels_per_iter, float framecount, float relative_time, int numInputs, uint8_t*& dstp, int dst_stride, std::vector& srcp, std::vector& src_stride, std::vector& ptroffsets, std::vector& srcp_orig); PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment *env); ~Exprfilter(); static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env); inline void __stdcall GetAudio(void* buf, int64_t start, int64_t count, IScriptEnvironment* env) { children[0]->GetAudio(buf, start, count, env); } inline const VideoInfo& __stdcall GetVideoInfo() { return vi; } inline bool __stdcall GetParity(int n) { return children[0]->GetParity(n); } int __stdcall SetCacheHints(int cachehints, int frame_range) { AVS_UNUSED(frame_range); return cachehints == CACHE_GET_MTMODE ? MT_NICE_FILTER : 0; } }; #endif //__Exprfilter_h ================================================ FILE: avs_core/filters/exprfilter/jitasm.h ================================================ // Copyright (c) 2009-2011, Hikaru Inoue, Akihiro Yamasaki, // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following // disclaimer in the documentation and/or other materials provided // with the distribution. // * The names of the contributors may not be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Changes 2017 by pinterf // - AVX friendly prolog/epilog with vzeroupper // - Aligned stack slots for ymm spill variables // - VEX encoded aligned store and load for temporary xmm/ymm registers // - Fix: false codegen when rearranging multiple working registers in MoveGenerator by // tracking real register usage for an xchg sequence #include #pragma once #ifndef JITASM_H #define JITASM_H #if defined(_WIN32) #define JITASM_WIN // Windows #endif #if (defined(_WIN64) && (defined(_M_AMD64) || defined(_M_X64))) || defined(__x86_64__) #define JITASM64 #endif #if defined(__GNUC__) #define JITASM_GCC #endif #if !defined(JITASM_MMINTRIN) #if !defined(__GNUC__) || defined(__MMX__) #define JITASM_MMINTRIN 1 #else #define JITASM_MMINTRIN 0 #endif #endif #if !defined(JITASM_XMMINTRIN) #if !defined(__GNUC__) || defined(__SSE__) #define JITASM_XMMINTRIN 1 #else #define JITASM_XMMINTRIN 0 #endif #endif #if !defined(JITASM_EMMINTRIN) #if !defined(__GNUC__) || defined(__SSE2__) #define JITASM_EMMINTRIN 1 #else #define JITASM_EMMINTRIN 0 #endif #endif #include #include #include #include #include #include #if defined(JITASM_WIN) #include #else #include #include #include #endif #if JITASM_MMINTRIN #include #endif #if JITASM_XMMINTRIN #include #endif #if JITASM_EMMINTRIN #include #endif #if _MSC_VER >= 1400 // VC8 or later #include #endif #if defined(JITASM_GCC) #define JITASM_ATTRIBUTE_WEAK // #define JITASM_ATTRIBUTE_WEAK __attribute__((weak)) // PF 20211013 remark, intentionally kept here: // Do not use weak attribute! GCC Bug? // With weak attributes mingw64 g++ 10.3 will miss a few initializations of structs during DLL load, // for example these initializations will never be called(!): // Reg8 JITASM_ATTRIBUTE_WEAK Frontend::r8b = Reg8(R8B); // YmmReg JITASM_ATTRIBUTE_WEAK Frontend::ymm8 = YmmReg(YMM8); // (list not complete). // But most horribly: after // Reg32 JITASM_ATTRIBUTE_WEAK Frontend::r13d = Reg32(R13D); // but before // Reg32 JITASM_ATTRIBUTE_WEAK Frontend::r14d = Reg32(R14D); // it will overwrite some other, already initialized variable areas at a totally different // memory space, some hundred bytes before. // Anyway, 'weak' is probably not needed, in ExprFilter use case we do not want a different // implementations of these functions. #elif defined(_MSC_VER) #define JITASM_ATTRIBUTE_WEAK __declspec(selectany) #else #define JITASM_ATTRIBUTE_WEAK #endif #if defined(_MSC_VER) #pragma warning( push ) #pragma warning( disable : 4127 ) // conditional expression is constant. #pragma warning( disable : 4201 ) // nonstandard extension used : nameless struct/union #endif #if defined(JITASM_GCC) #pragma GCC diagnostic ignored "-Wignored-attributes" #endif #ifdef ASSERT #define JITASM_ASSERT ASSERT #else #include #define JITASM_ASSERT assert #endif //#define JITASM_DEBUG_DUMP #ifdef JITASM_DEBUG_DUMP #include #if defined(JITASM_GCC) #define JITASM_TRACE printf #else #define JITASM_TRACE jitasm::detail::Trace #endif #elif defined(JITASM_GCC) #define JITASM_TRACE(...) ((void)0) #else #define JITASM_TRACE __noop #endif namespace jitasm { typedef signed char sint8; typedef signed short sint16; typedef signed int sint32; typedef unsigned char uint8; typedef unsigned short uint16; typedef unsigned int uint32; #if defined(JITASM_GCC) typedef signed long long sint64; typedef unsigned long long uint64; #else typedef signed __int64 sint64; typedef unsigned __int64 uint64; #endif template inline void avoid_unused_warn(const T&) {} namespace detail { #if defined(JITASM_GCC) inline long interlocked_increment(long *addend) { return __sync_add_and_fetch(addend, 1); } inline long interlocked_decrement(long *addend) { return __sync_sub_and_fetch(addend, 1); } inline long interlocked_exchange(long *target, long value) { return __sync_lock_test_and_set(target, value); } #elif defined(JITASM_WIN) inline long interlocked_increment(long *addend) { return _InterlockedIncrement(addend); } inline long interlocked_decrement(long *addend) { return _InterlockedDecrement(addend); } inline long interlocked_exchange(long *target, long value) { return _InterlockedExchange(target, value); } #endif } // namespace detail /// Physical register ID enum PhysicalRegID { INVALID=0x0FFFFFFF, EAX=0, ECX, EDX, EBX, ESP, EBP, ESI, EDI, R8D, R9D, R10D, R11D, R12D, R13D, R14D, R15D, AL=0, CL, DL, BL, AH, CH, DH, BH, R8B, R9B, R10B, R11B, R12B, R13B, R14B, R15B, AX=0, CX, DX, BX, SP, BP, SI, DI, R8W, R9W, R10W, R11W, R12W, R13W, R14W, R15W, RAX=0, RCX, RDX, RBX, RSP, RBP, RSI, RDI, R8, R9, R10, R11, R12, R13, R14, R15, ST0=0, ST1, ST2, ST3, ST4, ST5, ST6, ST7, MM0=0, MM1, MM2, MM3, MM4, MM5, MM6, MM7, XMM0=0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7, XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15, YMM0=0, YMM1, YMM2, YMM3, YMM4, YMM5, YMM6, YMM7, YMM8, YMM9, YMM10, YMM11, YMM12, YMM13, YMM14, YMM15, }; enum { /** \var NUM_OF_PHYSICAL_REG * Number of physical register */ /** \var SIZE_OF_GP_REG * Size of general-purpose register */ #ifdef JITASM64 NUM_OF_PHYSICAL_REG = 16, SIZE_OF_GP_REG = 8 #else NUM_OF_PHYSICAL_REG = 8, SIZE_OF_GP_REG = 4 #endif }; /// Register type enum RegType { R_TYPE_GP, ///< General purpose register R_TYPE_MMX, ///< MMX register R_TYPE_XMM, ///< XMM register R_TYPE_YMM, ///< YMM register R_TYPE_FPU, ///< FPU register R_TYPE_SYMBOLIC_GP, ///< Symbolic general purpose register R_TYPE_SYMBOLIC_MMX, ///< Symbolic MMX register R_TYPE_SYMBOLIC_XMM, ///< Symbolic XMM register R_TYPE_SYMBOLIC_YMM ///< Symbolic YMM register }; /// Register identifier struct RegID { unsigned type : 4; // RegType unsigned id : 28; ///< PhysicalRegID or symbolic register id bool operator==(const RegID& rhs) const {return type == rhs.type && id == rhs.id;} bool operator!=(const RegID& rhs) const {return !(*this == rhs);} bool operator<(const RegID& rhs) const {return type != rhs.type ? type < rhs.type : id < rhs.id;} bool IsInvalid() const {return type == R_TYPE_GP && id == INVALID;} bool IsSymbolic() const {return type == R_TYPE_SYMBOLIC_GP || type == R_TYPE_SYMBOLIC_MMX || type == R_TYPE_SYMBOLIC_XMM || type == R_TYPE_SYMBOLIC_YMM;} RegType GetType() const {return static_cast(type);} static RegID Invalid() { RegID reg; reg.type = R_TYPE_GP; reg.id = INVALID; return reg; } static RegID CreatePhysicalRegID(RegType type_, PhysicalRegID id_) { RegID reg; reg.type = type_; reg.id = id_; return reg; } static RegID CreateSymbolicRegID(RegType type_) { static long s_id = 0; RegID reg; reg.type = type_; reg.id = static_cast(detail::interlocked_increment(&s_id)); return reg; } }; /// Operand type enum OpdType { O_TYPE_NONE, O_TYPE_REG, O_TYPE_MEM, O_TYPE_IMM, O_TYPE_TYPE_MASK = 0x03, O_TYPE_DUMMY = 1 << 2, ///< The operand which has this flag is not encoded. This is for register allocator. O_TYPE_READ = 1 << 3, ///< The operand is used for reading. O_TYPE_WRITE = 1 << 4 ///< The operand is used for writing. }; /// Operand size enum OpdSize { O_SIZE_8, O_SIZE_16, O_SIZE_32, O_SIZE_64, O_SIZE_80, O_SIZE_128, O_SIZE_224, O_SIZE_256, O_SIZE_864, O_SIZE_4096 }; namespace detail { #pragma pack(push, 1) /// Operand base class struct Opd { uint8 opdtype_; // OpdType uint8 opdsize_; // OpdSize union { // REG struct { RegID reg_; uint32 reg_assignable_; }; // MEM struct { RegID base_; RegID index_; sint64 scale_; sint64 disp_; uint8 base_size_ : 4; // OpdSize uint8 index_size_ : 4; // OpdSize }; // IMM sint64 imm_; }; /// NONE Opd() : opdtype_(O_TYPE_NONE) {} /// REG Opd(OpdSize opdsize, const RegID& reg, uint32 reg_assignable = 0xFFFFFFFF) : opdtype_(O_TYPE_REG), opdsize_(static_cast(opdsize)), reg_(reg), reg_assignable_(reg_assignable) {} /// MEM Opd(OpdSize opdsize, OpdSize base_size, OpdSize index_size, const RegID& base, const RegID& index, sint64 scale, sint64 disp) : opdtype_(O_TYPE_MEM), opdsize_(static_cast(opdsize)), base_(base), index_(index), scale_(scale), disp_(disp), base_size_(static_cast(base_size)), index_size_(static_cast(index_size)) {} protected: /// IMM explicit Opd(OpdSize opdsize, sint64 imm) : opdtype_(O_TYPE_IMM), opdsize_(static_cast(opdsize)), imm_(imm) {} public: bool IsNone() const {return (opdtype_ & O_TYPE_TYPE_MASK) == O_TYPE_NONE;} bool IsReg() const {return (opdtype_ & O_TYPE_TYPE_MASK) == O_TYPE_REG;} bool IsGpReg() const {return IsReg() && (reg_.type == R_TYPE_GP || reg_.type == R_TYPE_SYMBOLIC_GP);} bool IsFpuReg() const {return IsReg() && reg_.type == R_TYPE_FPU;} bool IsMmxReg() const {return IsReg() && (reg_.type == R_TYPE_MMX || reg_.type == R_TYPE_SYMBOLIC_MMX);} bool IsXmmReg() const {return IsReg() && (reg_.type == R_TYPE_XMM || reg_.type == R_TYPE_SYMBOLIC_XMM);} bool IsYmmReg() const {return IsReg() && (reg_.type == R_TYPE_YMM || reg_.type == R_TYPE_SYMBOLIC_YMM);} bool IsMem() const {return (opdtype_ & O_TYPE_TYPE_MASK) == O_TYPE_MEM;} bool IsImm() const {return (opdtype_ & O_TYPE_TYPE_MASK) == O_TYPE_IMM;} bool IsDummy() const {return (opdtype_ & O_TYPE_DUMMY) != 0;} bool IsRead() const {return (opdtype_ & O_TYPE_READ) != 0;} bool IsWrite() const {return (opdtype_ & O_TYPE_WRITE) != 0;} OpdType GetType() const {return static_cast(opdtype_);} OpdSize GetSize() const {return static_cast(opdsize_);} OpdSize GetAddressBaseSize() const {return static_cast(base_size_);} OpdSize GetAddressIndexSize() const {return static_cast(index_size_);} RegID GetReg() const {JITASM_ASSERT(IsReg()); return reg_;} RegID GetBase() const {JITASM_ASSERT(IsMem()); return base_;} RegID GetIndex() const {JITASM_ASSERT(IsMem()); return index_;} sint64 GetScale() const {JITASM_ASSERT(IsMem()); return scale_;} sint64 GetDisp() const {JITASM_ASSERT(IsMem()); return disp_;} sint64 GetImm() const {JITASM_ASSERT(IsImm()); return imm_;} bool operator==(const Opd& rhs) const { if ((opdtype_ & O_TYPE_TYPE_MASK) != (rhs.opdtype_ & O_TYPE_TYPE_MASK) || opdsize_ != rhs.opdsize_) {return false;} if (IsReg()) {return reg_ == rhs.reg_ && reg_assignable_ == rhs.reg_assignable_;} if (IsMem()) {return base_ == rhs.base_ && index_ == rhs.index_ && scale_ == rhs.scale_ && disp_ == rhs.disp_ && base_size_ == rhs.base_size_ && index_size_ == rhs.index_size_;} if (IsImm()) {return imm_ == rhs.imm_;} return true; } bool operator!=(const Opd& rhs) const {return !(*this == rhs);} }; #pragma pack(pop) /// Add O_TYPE_DUMMY to the specified operand inline Opd Dummy(const Opd& opd) { Opd o(opd); o.opdtype_ = static_cast(static_cast(o.opdtype_) | O_TYPE_DUMMY); return o; } /// Add O_TYPE_DUMMY to the specified operand and constraint of register assignment inline Opd Dummy(const Opd& opd, const Opd& constraint) { JITASM_ASSERT(opd.IsReg() && (opd.opdtype_ & O_TYPE_TYPE_MASK) == (constraint.opdtype_ & O_TYPE_TYPE_MASK) && !constraint.GetReg().IsSymbolic()); Opd o(opd); o.opdtype_ = static_cast(static_cast(o.opdtype_) | O_TYPE_DUMMY); o.reg_assignable_ = (1 << constraint.reg_.id); return o; } /// Add O_TYPE_READ to the specified operand inline Opd R(const Opd& opd) { Opd o(opd); o.opdtype_ = static_cast(static_cast(o.opdtype_) | O_TYPE_READ); return o; } /// Add O_TYPE_WRITE to the specified operand inline Opd W(const Opd& opd) { Opd o(opd); o.opdtype_ = static_cast(static_cast(o.opdtype_) | O_TYPE_WRITE); return o; } /// Add O_TYPE_READ | O_TYPE_WRITE to the specified operand inline Opd RW(const Opd& opd) { Opd o(opd); o.opdtype_ = static_cast(static_cast(o.opdtype_) | O_TYPE_READ | O_TYPE_WRITE); return o; } template inline OpdSize ToOpdSize(); template<> inline OpdSize ToOpdSize<8>() {return O_SIZE_8;} template<> inline OpdSize ToOpdSize<16>() {return O_SIZE_16;} template<> inline OpdSize ToOpdSize<32>() {return O_SIZE_32;} template<> inline OpdSize ToOpdSize<64>() {return O_SIZE_64;} template<> inline OpdSize ToOpdSize<80>() {return O_SIZE_80;} template<> inline OpdSize ToOpdSize<128>() {return O_SIZE_128;} template<> inline OpdSize ToOpdSize<224>() {return O_SIZE_224;} template<> inline OpdSize ToOpdSize<256>() {return O_SIZE_256;} template<> inline OpdSize ToOpdSize<864>() {return O_SIZE_864;} template<> inline OpdSize ToOpdSize<4096>() {return O_SIZE_4096;} template struct OpdT : Opd { /// NONE OpdT() : Opd() {} /// REG explicit OpdT(const RegID& reg, uint32 reg_assignable = 0xFFFFFFFF) : Opd(ToOpdSize(), reg, reg_assignable) {} /// MEM OpdT(OpdSize base_size, OpdSize index_size, const RegID& base, const RegID& index, sint64 scale, sint64 disp) : Opd(ToOpdSize(), base_size, index_size, base, index, scale, disp) {} protected: /// IMM OpdT(sint64 imm) : Opd(ToOpdSize(), imm) {} }; } // namespace detail typedef detail::OpdT<8> Opd8; typedef detail::OpdT<16> Opd16; typedef detail::OpdT<32> Opd32; typedef detail::OpdT<64> Opd64; typedef detail::OpdT<80> Opd80; typedef detail::OpdT<128> Opd128; typedef detail::OpdT<224> Opd224; // FPU environment typedef detail::OpdT<256> Opd256; typedef detail::OpdT<864> Opd864; // FPU state typedef detail::OpdT<4096> Opd4096; // FPU, MMX, XMM, MXCSR state /// 8bit general purpose register struct Reg8 : Opd8 { Reg8() : Opd8(RegID::CreateSymbolicRegID(R_TYPE_SYMBOLIC_GP), 0xFFFFFF0F) {} explicit Reg8(PhysicalRegID id) : Opd8(RegID::CreatePhysicalRegID(R_TYPE_GP, id)) {} }; /// 16bit general purpose register struct Reg16 : Opd16 { Reg16() : Opd16(RegID::CreateSymbolicRegID(R_TYPE_SYMBOLIC_GP)) {} explicit Reg16(PhysicalRegID id) : Opd16(RegID::CreatePhysicalRegID(R_TYPE_GP, id)) {} }; /// 32bit general purpose register struct Reg32 : Opd32 { Reg32() : Opd32(RegID::CreateSymbolicRegID(R_TYPE_SYMBOLIC_GP)) {} explicit Reg32(PhysicalRegID id) : Opd32(RegID::CreatePhysicalRegID(R_TYPE_GP, id)) {} }; #ifdef JITASM64 /// 64bit general purpose register struct Reg64 : Opd64 { Reg64() : Opd64(RegID::CreateSymbolicRegID(R_TYPE_SYMBOLIC_GP)) {} explicit Reg64(PhysicalRegID id) : Opd64(RegID::CreatePhysicalRegID(R_TYPE_GP, id)) {} explicit Reg64(RegID reg_id) : Opd64(reg_id) {} // VS2017 /permissive- }; typedef Reg64 Reg; #else typedef Reg32 Reg; #endif /// FPU register struct FpuReg : Opd80 { explicit FpuReg(PhysicalRegID id) : Opd80(RegID::CreatePhysicalRegID(R_TYPE_FPU, id)) {} }; /// MMX register struct MmxReg : Opd64 { MmxReg() : Opd64(RegID::CreateSymbolicRegID(R_TYPE_SYMBOLIC_MMX)) {} explicit MmxReg(PhysicalRegID id) : Opd64(RegID::CreatePhysicalRegID(R_TYPE_MMX, id)) {} }; /// XMM register struct XmmReg : Opd128 { XmmReg() : Opd128(RegID::CreateSymbolicRegID(R_TYPE_SYMBOLIC_XMM)) {} explicit XmmReg(PhysicalRegID id) : Opd128(RegID::CreatePhysicalRegID(R_TYPE_XMM, id)) {} explicit XmmReg(RegID reg_id) : Opd128(reg_id) {} // VS2017 /permissive- }; /// YMM register struct YmmReg : Opd256 { YmmReg() : Opd256(RegID::CreateSymbolicRegID(R_TYPE_SYMBOLIC_YMM)) {} explicit YmmReg(PhysicalRegID id) : Opd256(RegID::CreatePhysicalRegID(R_TYPE_YMM, id)) {} XmmReg as128() const { RegID id = reg_; id.type = R_TYPE_SYMBOLIC_XMM; return XmmReg(id); } }; struct FpuReg_st0 : FpuReg {FpuReg_st0() : FpuReg(ST0) {}}; template struct MemT : OpdN { MemT(OpdSize base_size, OpdSize index_size, const RegID& base, const RegID& index, sint64 scale, sint64 disp) : OpdN(base_size, index_size, base, index, scale, disp) {} }; typedef MemT Mem8; typedef MemT Mem16; typedef MemT Mem32; typedef MemT Mem64; typedef MemT Mem80; typedef MemT Mem128; typedef MemT Mem224; // FPU environment typedef MemT Mem256; typedef MemT Mem864; // FPU state typedef MemT Mem4096; // FPU, MMX, XMM, MXCSR state template struct VecMemT : OpdN { VecMemT(OpdSize base_size, const RegID& base, const RegID& index, sint64 scale, sint64 disp) : OpdN(base_size, IndexSize, base, index, scale, disp) {} }; typedef VecMemT Mem32vxd; typedef VecMemT Mem32vyd; typedef VecMemT Mem64vxd; typedef VecMemT Mem64vyd; typedef VecMemT Mem32vxq; typedef VecMemT Mem32vyq; typedef VecMemT Mem64vxq; typedef VecMemT Mem64vyq; struct MemOffset64 { sint64 offset_; explicit MemOffset64(sint64 offset) : offset_(offset) {} sint64 GetOffset() const {return offset_;} }; template struct ImmT : OpdN { ImmT(U imm) : OpdN((S) imm) {} }; typedef ImmT Imm8; ///< 1 byte immediate typedef ImmT Imm16; ///< 2 byte immediate typedef ImmT Imm32; ///< 4 byte immediate typedef ImmT Imm64; ///< 8 byte immediate namespace detail { inline bool IsInt8(sint64 n) {return (sint8) n == n;} inline bool IsInt16(sint64 n) {return (sint16) n == n;} inline bool IsInt32(sint64 n) {return (sint32) n == n;} inline Opd ImmXor8(const Imm16& imm) {return IsInt8(imm.GetImm()) ? (Opd) Imm8((sint8) imm.GetImm()) : (Opd) imm;} inline Opd ImmXor8(const Imm32& imm) {return IsInt8(imm.GetImm()) ? (Opd) Imm8((sint8) imm.GetImm()) : (Opd) imm;} inline Opd ImmXor8(const Imm64& imm) {return IsInt8(imm.GetImm()) ? (Opd) Imm8((sint8) imm.GetImm()) : (Opd) imm;} } // namespace detail /// 32bit address (base, displacement) struct Addr32 { RegID reg_; sint64 disp_; Addr32(const Reg32& obj) : reg_(obj.reg_), disp_(0) {} // implicit Addr32(const RegID& reg, sint64 disp) : reg_(reg), disp_(disp) {} }; inline Addr32 operator+(const Reg32& lhs, sint64 rhs) {return Addr32(lhs.reg_, rhs);} inline Addr32 operator+(sint64 lhs, const Reg32& rhs) {return rhs + lhs;} inline Addr32 operator-(const Reg32& lhs, sint64 rhs) {return lhs + -rhs;} inline Addr32 operator+(const Addr32& lhs, sint64 rhs) {return Addr32(lhs.reg_, lhs.disp_ + rhs);} inline Addr32 operator+(sint64 lhs, const Addr32& rhs) {return rhs + lhs;} inline Addr32 operator-(const Addr32& lhs, sint64 rhs) {return lhs + -rhs;} /// 32bit address (base, index, displacement) struct Addr32BI { RegID base_; RegID index_; sint64 disp_; Addr32BI(const RegID& base, const RegID& index, sint64 disp) : base_(base), index_(index), disp_(disp) {} }; inline Addr32BI operator+(const Addr32& lhs, const Addr32& rhs) {return Addr32BI(rhs.reg_, lhs.reg_, lhs.disp_ + rhs.disp_);} inline Addr32BI operator+(const Addr32BI& lhs, sint64 rhs) {return Addr32BI(lhs.base_, lhs.index_, lhs.disp_ + rhs);} inline Addr32BI operator+(sint64 lhs, const Addr32BI& rhs) {return rhs + lhs;} inline Addr32BI operator-(const Addr32BI& lhs, sint64 rhs) {return lhs + -rhs;} /// 32bit address (index, scale, displacement) struct Addr32SI { RegID index_; sint64 scale_; sint64 disp_; Addr32SI(const RegID& index, sint64 scale, sint64 disp) : index_(index), scale_(scale), disp_(disp) {} }; inline Addr32SI operator*(const Reg32& lhs, sint64 rhs) {return Addr32SI(lhs.reg_, rhs, 0);} inline Addr32SI operator*(sint64 lhs, const Reg32& rhs) {return rhs * lhs;} inline Addr32SI operator*(const Addr32SI& lhs, sint64 rhs) {return Addr32SI(lhs.index_, lhs.scale_ * rhs, lhs.disp_);} inline Addr32SI operator*(sint64 lhs, const Addr32SI& rhs) {return rhs * lhs;} inline Addr32SI operator+(const Addr32SI& lhs, sint64 rhs) {return Addr32SI(lhs.index_, lhs.scale_, lhs.disp_ + rhs);} inline Addr32SI operator+(sint64 lhs, const Addr32SI& rhs) {return rhs + lhs;} inline Addr32SI operator-(const Addr32SI& lhs, sint64 rhs) {return lhs + -rhs;} /// 32bit address (base, index, scale, displacement) struct Addr32SIB { RegID base_; RegID index_; sint64 scale_; sint64 disp_; Addr32SIB(const RegID& base, const RegID& index, sint64 scale, sint64 disp) : base_(base), index_(index), scale_(scale), disp_(disp) {} }; inline Addr32SIB operator+(const Addr32& lhs, const Addr32SI& rhs) {return Addr32SIB(lhs.reg_, rhs.index_, rhs.scale_, lhs.disp_ + rhs.disp_);} inline Addr32SIB operator+(const Addr32SI& lhs, const Addr32& rhs) {return rhs + lhs;} inline Addr32SIB operator+(const Addr32SIB& lhs, sint64 rhs) {return Addr32SIB(lhs.base_, lhs.index_, lhs.scale_, lhs.disp_ + rhs);} inline Addr32SIB operator+(sint64 lhs, const Addr32SIB& rhs) {return rhs + lhs;} inline Addr32SIB operator-(const Addr32SIB& lhs, sint64 rhs) {return lhs + -rhs;} /// Address (xmm index, scale, displacement) struct AddrXmmSI { RegID index_; sint64 scale_; sint64 disp_; AddrXmmSI(const RegID& index, sint64 scale, sint64 disp) : index_(index), scale_(scale), disp_(disp) {} }; inline AddrXmmSI operator*(const XmmReg& lhs, sint64 rhs) {return AddrXmmSI(lhs.reg_, rhs, 0);} inline AddrXmmSI operator*(sint64 lhs, const XmmReg& rhs) {return rhs * lhs;} inline AddrXmmSI operator*(const AddrXmmSI& lhs, sint64 rhs) {return AddrXmmSI(lhs.index_, lhs.scale_ * rhs, lhs.disp_);} inline AddrXmmSI operator*(sint64 lhs, const AddrXmmSI& rhs) {return rhs * lhs;} inline AddrXmmSI operator+(const AddrXmmSI& lhs, sint64 rhs) {return AddrXmmSI(lhs.index_, lhs.scale_, lhs.disp_ + rhs);} inline AddrXmmSI operator+(sint64 lhs, const AddrXmmSI& rhs) {return rhs + lhs;} inline AddrXmmSI operator-(const AddrXmmSI& lhs, sint64 rhs) {return lhs + -rhs;} /// 32bit address (base, xmm index, scale, displacement) struct Addr32XmmSIB { RegID base_; RegID index_; sint64 scale_; sint64 disp_; Addr32XmmSIB(const RegID& base, const RegID& index, sint64 scale, sint64 disp) : base_(base), index_(index), scale_(scale), disp_(disp) {} }; inline Addr32XmmSIB operator+(const Addr32& lhs, const AddrXmmSI& rhs) {return Addr32XmmSIB(lhs.reg_, rhs.index_, rhs.scale_, lhs.disp_ + rhs.disp_);} inline Addr32XmmSIB operator+(const AddrXmmSI& lhs, const Addr32& rhs) {return rhs + lhs;} inline Addr32XmmSIB operator+(const Addr32XmmSIB& lhs, sint64 rhs) {return Addr32XmmSIB(lhs.base_, lhs.index_, lhs.scale_, lhs.disp_ + rhs);} inline Addr32XmmSIB operator+(sint64 lhs, const Addr32XmmSIB& rhs) {return rhs + lhs;} inline Addr32XmmSIB operator-(const Addr32XmmSIB& lhs, sint64 rhs) {return lhs + -rhs;} /// Address (ymm index, scale, displacement) struct AddrYmmSI { RegID index_; sint64 scale_; sint64 disp_; AddrYmmSI(const RegID& index, sint64 scale, sint64 disp) : index_(index), scale_(scale), disp_(disp) {} }; inline AddrYmmSI operator*(const YmmReg& lhs, sint64 rhs) {return AddrYmmSI(lhs.reg_, rhs, 0);} inline AddrYmmSI operator*(sint64 lhs, const YmmReg& rhs) {return rhs * lhs;} inline AddrYmmSI operator*(const AddrYmmSI& lhs, sint64 rhs) {return AddrYmmSI(lhs.index_, lhs.scale_ * rhs, lhs.disp_);} inline AddrYmmSI operator*(sint64 lhs, const AddrYmmSI& rhs) {return rhs * lhs;} inline AddrYmmSI operator+(const AddrYmmSI& lhs, sint64 rhs) {return AddrYmmSI(lhs.index_, lhs.scale_, lhs.disp_ + rhs);} inline AddrYmmSI operator+(sint64 lhs, const AddrYmmSI& rhs) {return rhs + lhs;} inline AddrYmmSI operator-(const AddrYmmSI& lhs, sint64 rhs) {return lhs + -rhs;} /// 32bit address (base, ymm index, scale, displacement) struct Addr32YmmSIB { RegID base_; RegID index_; sint64 scale_; sint64 disp_; Addr32YmmSIB(const RegID& base, const RegID& index, sint64 scale, sint64 disp) : base_(base), index_(index), scale_(scale), disp_(disp) {} }; inline Addr32YmmSIB operator+(const Addr32& lhs, const AddrYmmSI& rhs) {return Addr32YmmSIB(lhs.reg_, rhs.index_, rhs.scale_, lhs.disp_ + rhs.disp_);} inline Addr32YmmSIB operator+(const AddrYmmSI& lhs, const Addr32& rhs) {return rhs + lhs;} inline Addr32YmmSIB operator+(const Addr32YmmSIB& lhs, sint64 rhs) {return Addr32YmmSIB(lhs.base_, lhs.index_, lhs.scale_, lhs.disp_ + rhs);} inline Addr32YmmSIB operator+(sint64 lhs, const Addr32YmmSIB& rhs) {return rhs + lhs;} inline Addr32YmmSIB operator-(const Addr32YmmSIB& lhs, sint64 rhs) {return lhs + -rhs;} #ifdef JITASM64 /// 64bit address (base, displacement) struct Addr64 { RegID reg_; sint64 disp_; Addr64(const Reg64& obj) : reg_(obj.reg_), disp_(0) {} // implicit Addr64(const RegID& reg, sint64 disp) : reg_(reg), disp_(disp) {} }; inline Addr64 operator+(const Reg64& lhs, sint64 rhs) {return Addr64(lhs.reg_, rhs);} inline Addr64 operator+(sint64 lhs, const Reg64& rhs) {return rhs + lhs;} inline Addr64 operator-(const Reg64& lhs, sint64 rhs) {return lhs + -rhs;} inline Addr64 operator+(const Addr64& lhs, sint64 rhs) {return Addr64(lhs.reg_, lhs.disp_ + rhs);} inline Addr64 operator+(sint64 lhs, const Addr64& rhs) {return rhs + lhs;} inline Addr64 operator-(const Addr64& lhs, sint64 rhs) {return lhs + -rhs;} /// 64bit address (base, index, displacement) struct Addr64BI { RegID base_; RegID index_; sint64 disp_; Addr64BI(const RegID& base, const RegID& index, sint64 disp) : base_(base), index_(index), disp_(disp) {} }; inline Addr64BI operator+(const Addr64& lhs, const Addr64& rhs) {return Addr64BI(rhs.reg_, lhs.reg_, lhs.disp_ + rhs.disp_);} inline Addr64BI operator+(const Addr64BI& lhs, sint64 rhs) {return Addr64BI(lhs.base_, lhs.index_, lhs.disp_ + rhs);} inline Addr64BI operator+(sint64 lhs, const Addr64BI& rhs) {return rhs + lhs;} inline Addr64BI operator-(const Addr64BI& lhs, sint64 rhs) {return lhs + -rhs;} /// 64bit address (index, scale, displacement) struct Addr64SI { RegID index_; sint64 scale_; sint64 disp_; Addr64SI(const RegID& index, sint64 scale, sint64 disp) : index_(index), scale_(scale), disp_(disp) {} }; inline Addr64SI operator*(const Reg64& lhs, sint64 rhs) {return Addr64SI(lhs.reg_, rhs, 0);} inline Addr64SI operator*(sint64 lhs, const Reg64& rhs) {return rhs * lhs;} inline Addr64SI operator*(const Addr64SI& lhs, sint64 rhs) {return Addr64SI(lhs.index_, lhs.scale_ * rhs, lhs.disp_);} inline Addr64SI operator*(sint64 lhs, const Addr64SI& rhs) {return rhs * lhs;} inline Addr64SI operator+(const Addr64SI& lhs, sint64 rhs) {return Addr64SI(lhs.index_, lhs.scale_, lhs.disp_ + rhs);} inline Addr64SI operator+(sint64 lhs, const Addr64SI& rhs) {return rhs + lhs;} inline Addr64SI operator-(const Addr64SI& lhs, sint64 rhs) {return lhs + -rhs;} /// 64bit address (base, index, scale, displacement) struct Addr64SIB { RegID base_; RegID index_; sint64 scale_; sint64 disp_; Addr64SIB(const RegID& base, const RegID& index, sint64 scale, sint64 disp) : base_(base), index_(index), scale_(scale), disp_(disp) {} }; inline Addr64SIB operator+(const Addr64& lhs, const Addr64SI& rhs) {return Addr64SIB(lhs.reg_, rhs.index_, rhs.scale_, lhs.disp_ + rhs.disp_);} inline Addr64SIB operator+(const Addr64SI& lhs, const Addr64& rhs) {return rhs + lhs;} inline Addr64SIB operator+(const Addr64SIB& lhs, sint64 rhs) {return Addr64SIB(lhs.base_, lhs.index_, lhs.scale_, lhs.disp_ + rhs);} inline Addr64SIB operator+(sint64 lhs, const Addr64SIB& rhs) {return rhs + lhs;} inline Addr64SIB operator-(const Addr64SIB& lhs, sint64 rhs) {return lhs + -rhs;} /// 64bit address (base, xmm index, scale, displacement) struct Addr64XmmSIB { RegID base_; RegID index_; sint64 scale_; sint64 disp_; Addr64XmmSIB(const RegID& base, const RegID& index, sint64 scale, sint64 disp) : base_(base), index_(index), scale_(scale), disp_(disp) {} }; inline Addr64XmmSIB operator+(const Addr64& lhs, const AddrXmmSI& rhs) {return Addr64XmmSIB(lhs.reg_, rhs.index_, rhs.scale_, lhs.disp_ + rhs.disp_);} inline Addr64XmmSIB operator+(const AddrXmmSI& lhs, const Addr64& rhs) {return rhs + lhs;} inline Addr64XmmSIB operator+(const Addr64XmmSIB& lhs, sint64 rhs) {return Addr64XmmSIB(lhs.base_, lhs.index_, lhs.scale_, lhs.disp_ + rhs);} inline Addr64XmmSIB operator+(sint64 lhs, const Addr64XmmSIB& rhs) {return rhs + lhs;} inline Addr64XmmSIB operator-(const Addr64XmmSIB& lhs, sint64 rhs) {return lhs + -rhs;} /// 64bit address (base, ymm index, scale, displacement) struct Addr64YmmSIB { RegID base_; RegID index_; sint64 scale_; sint64 disp_; Addr64YmmSIB(const RegID& base, const RegID& index, sint64 scale, sint64 disp) : base_(base), index_(index), scale_(scale), disp_(disp) {} }; inline Addr64YmmSIB operator+(const Addr64& lhs, const AddrYmmSI& rhs) {return Addr64YmmSIB(lhs.reg_, rhs.index_, rhs.scale_, lhs.disp_ + rhs.disp_);} inline Addr64YmmSIB operator+(const AddrYmmSI& lhs, const Addr64& rhs) {return rhs + lhs;} inline Addr64YmmSIB operator+(const Addr64YmmSIB& lhs, sint64 rhs) {return Addr64YmmSIB(lhs.base_, lhs.index_, lhs.scale_, lhs.disp_ + rhs);} inline Addr64YmmSIB operator+(sint64 lhs, const Addr64YmmSIB& rhs) {return rhs + lhs;} inline Addr64YmmSIB operator-(const Addr64YmmSIB& lhs, sint64 rhs) {return lhs + -rhs;} typedef Addr64 Addr; typedef Addr64BI AddrBI; typedef Addr64SI AddrSI; typedef Addr64SIB AddrSIB; #else typedef Addr32 Addr; typedef Addr32BI AddrBI; typedef Addr32SI AddrSI; typedef Addr32SIB AddrSIB; #endif template struct AddressingPtr { // 32bit-Addressing MemT operator[](const Addr32& obj) {return MemT(O_SIZE_32, O_SIZE_32, obj.reg_, RegID::Invalid(), 0, obj.disp_);} MemT operator[](const Addr32BI& obj) {return MemT(O_SIZE_32, O_SIZE_32, obj.base_, obj.index_, 0, obj.disp_);} MemT operator[](const Addr32SI& obj) {return MemT(O_SIZE_32, O_SIZE_32, RegID::Invalid(), obj.index_, obj.scale_, obj.disp_);} MemT operator[](const Addr32SIB& obj) {return MemT(O_SIZE_32, O_SIZE_32, obj.base_, obj.index_, obj.scale_, obj.disp_);} VecMemT operator[](const Addr32XmmSIB& obj) {return VecMemT(O_SIZE_32, obj.base_, obj.index_, obj.scale_, obj.disp_);} VecMemT operator[](const Addr32YmmSIB& obj) {return VecMemT(O_SIZE_32, obj.base_, obj.index_, obj.scale_, obj.disp_);} #ifdef JITASM64 // 64bit-Addressing MemT operator[](const Addr64& obj) {return MemT(O_SIZE_64, O_SIZE_64, obj.reg_, RegID::Invalid(), 0, obj.disp_);} MemT operator[](const Addr64BI& obj) {return MemT(O_SIZE_64, O_SIZE_64, obj.base_, obj.index_, 0, obj.disp_);} MemT operator[](const Addr64SI& obj) {return MemT(O_SIZE_64, O_SIZE_64, RegID::Invalid(), obj.index_, obj.scale_, obj.disp_);} MemT operator[](const Addr64SIB& obj) {return MemT(O_SIZE_64, O_SIZE_64, obj.base_, obj.index_, obj.scale_, obj.disp_);} MemOffset64 operator[](sint64 offset) {return MemOffset64(offset);} MemOffset64 operator[](uint64 offset) {return MemOffset64((sint64) offset);} VecMemT operator[](const Addr64XmmSIB& obj) {return VecMemT(O_SIZE_64, obj.base_, obj.index_, obj.scale_, obj.disp_);} VecMemT operator[](const Addr64YmmSIB& obj) {return VecMemT(O_SIZE_64, obj.base_, obj.index_, obj.scale_, obj.disp_);} #endif #ifdef JITASM64 MemT operator[](sint32 disp) {return MemT(O_SIZE_64, O_SIZE_64, RegID::Invalid(), RegID::Invalid(), 0, disp);} MemT operator[](uint32 disp) {return MemT(O_SIZE_64, O_SIZE_64, RegID::Invalid(), RegID::Invalid(), 0, (sint32) disp);} #else MemT operator[](sint32 disp) {return MemT(O_SIZE_32, O_SIZE_32, RegID::Invalid(), RegID::Invalid(), 0, disp);} MemT operator[](uint32 disp) {return MemT(O_SIZE_32, O_SIZE_32, RegID::Invalid(), RegID::Invalid(), 0, (sint32) disp);} #endif }; /// Instruction ID enum InstrID { I_ADC, I_ADD, I_AND, I_BSF, I_BSR, I_BSWAP, I_BT, I_BTC, I_BTR, I_BTS, I_CALL, I_CBW, I_CLC, I_CLD, I_CLI, I_CLTS, I_CMC, I_CMOVCC, I_CMP, I_CMPS_B, I_CMPS_W, I_CMPS_D, I_CMPS_Q, I_CMPXCHG, I_CMPXCHG8B, I_CMPXCHG16B, I_CPUID, I_CWD, I_CDQ, I_CQO, I_DEC, I_DIV, I_ENTER, I_HLT, I_IDIV, I_IMUL, I_IN, I_INC, I_INS_B, I_INS_W, I_INS_D, I_INVD, I_INVLPG, I_INT3, I_INTN, I_INTO, I_IRET, I_IRETD, I_IRETQ, I_JMP, I_JCC, I_LAR, I_LEA, I_LEAVE, I_LLDT, I_LMSW, I_LSL, I_LTR, I_LODS_B, I_LODS_W, I_LODS_D, I_LODS_Q, I_LOOP, I_MOV, I_MOVBE, I_MOVS_B, I_MOVS_W, I_MOVS_D, I_MOVS_Q, I_MOVZX, I_MOVSX, I_MOVSXD, I_MUL, I_NEG, I_NOP, I_NOT, I_OR, I_OUT, I_OUTS_B, I_OUTS_W, I_OUTS_D, I_POP, I_POPAD, I_POPF, I_POPFD, I_POPFQ, I_PUSH, I_PUSHAD, I_PUSHF, I_PUSHFD, I_PUSHFQ, I_RDMSR, I_RDPMC, I_RDTSC, I_RET, I_RCL, I_RCR, I_ROL, I_ROR, I_RSM, I_SAR, I_SHL, I_SHR, I_SBB, I_SCAS_B, I_SCAS_W, I_SCAS_D, I_SCAS_Q, I_SETCC, I_SHLD, I_SHRD, I_SGDT, I_SIDT, I_SLDT, I_SMSW, I_STC, I_STD, I_STI, I_STOS_B, I_STOS_W, I_STOS_D, I_STOS_Q, I_SUB, I_SWAPGS, I_SYSCALL, I_SYSENTER, I_SYSEXIT, I_SYSRET, I_TEST, I_UD2, I_VERR, I_VERW, I_WAIT, I_WBINVD, I_WRMSR, I_XADD, I_XCHG, I_XGETBV, I_XLATB, I_XOR, I_F2XM1, I_FABS, I_FADD, I_FADDP, I_FIADD, I_FBLD, I_FBSTP, I_FCHS, I_FCLEX, I_FNCLEX, I_FCMOVCC, I_FCOM, I_FCOMP, I_FCOMPP, I_FCOMI, I_FCOMIP, I_FCOS, I_FDECSTP, I_FDIV, I_FDIVP, I_FIDIV, I_FDIVR, I_FDIVRP, I_FIDIVR, I_FFREE, I_FICOM, I_FICOMP, I_FILD, I_FINCSTP, I_FINIT, I_FNINIT, I_FIST, I_FISTP, I_FLD, I_FLD1, I_FLDCW, I_FLDENV, I_FLDL2E, I_FLDL2T, I_FLDLG2, I_FLDLN2, I_FLDPI, I_FLDZ, I_FMUL, I_FMULP, I_FIMUL, I_FNOP, I_FPATAN, I_FPREM, I_FPREM1, I_FPTAN, I_FRNDINT, I_FRSTOR, I_FSAVE, I_FNSAVE, I_FSCALE, I_FSIN, I_FSINCOS, I_FSQRT, I_FST, I_FSTP, I_FSTCW, I_FNSTCW, I_FSTENV, I_FNSTENV, I_FSTSW, I_FNSTSW, I_FSUB, I_FSUBP, I_FISUB, I_FSUBR, I_FSUBRP, I_FISUBR, I_FTST, I_FUCOM, I_FUCOMP, I_FUCOMPP, I_FUCOMI, I_FUCOMIP, I_FXAM, I_FXCH, I_FXRSTOR, I_FXSAVE, I_FXTRACT, I_FYL2X, I_FYL2XP1, I_ADDPS, I_ADDSS, I_ADDPD, I_ADDSD, I_ADDSUBPS, I_ADDSUBPD, I_ANDPS, I_ANDPD, I_ANDNPS, I_ANDNPD, I_BLENDPS, I_BLENDPD, I_BLENDVPS, I_BLENDVPD, I_CLFLUSH, I_CMPPS, I_CMPSS, I_CMPPD, I_CMPSD, I_COMISS, I_COMISD, I_CRC32, I_CVTDQ2PD, I_CVTDQ2PS, I_CVTPD2DQ, I_CVTPD2PI, I_CVTPD2PS, I_CVTPI2PD, I_CVTPI2PS, I_CVTPS2DQ, I_CVTPS2PD, I_CVTPS2PI, I_CVTSD2SI, I_CVTSD2SS, I_CVTSI2SD, I_CVTSI2SS, I_CVTSS2SD, I_CVTSS2SI, I_CVTTPD2DQ, I_CVTTPD2PI, I_CVTTPS2DQ, I_CVTTPS2PI, I_CVTTSD2SI, I_CVTTSS2SI, I_DIVPS, I_DIVSS, I_DIVPD, I_DIVSD, I_DPPS, I_DPPD, I_EMMS, I_EXTRACTPS, I_FISTTP, I_HADDPS, I_HADDPD, I_HSUBPS, I_HSUBPD, I_INSERTPS, I_LDDQU, I_LDMXCSR, I_LFENCE, I_MASKMOVDQU, I_MASKMOVQ, I_MAXPS, I_MAXSS, I_MAXPD, I_MAXSD, I_MFENCE, I_MINPS, I_MINSS, I_MINPD, I_MINSD, I_MONITOR, I_MOVAPD, I_MOVAPS, I_MOVD, I_MOVDDUP, I_MOVDQA, I_MOVDQU, I_MOVDQ2Q, I_MOVHLPS, I_MOVLHPS, I_MOVHPS, I_MOVHPD, I_MOVLPS, I_MOVLPD, I_MOVMSKPS, I_MOVMSKPD, I_MOVNTDQ, I_MOVNTDQA, I_MOVNTI, I_MOVNTPD, I_MOVNTPS, I_MOVNTQ, I_MOVQ, I_MOVQ2DQ, I_MOVSD, I_MOVSS, I_MOVSHDUP, I_MOVSLDUP, I_MOVUPS, I_MOVUPD, I_MPSADBW, I_MULPS, I_MULSS, I_MULPD, I_MULSD, I_MWAIT, I_ORPS, I_ORPD, I_PABSB, I_PABSD, I_PABSW, I_PACKSSDW, I_PACKSSWB, I_PACKUSDW, I_PACKUSWB, I_PADDB, I_PADDD, I_PADDQ, I_PADDSB, I_PADDSW, I_PADDUSB, I_PADDUSW, I_PADDW, I_PALIGNR, I_PAND, I_PANDN, I_PAUSE, I_PAVGB, I_PAVGW, I_PBLENDVB, I_PBLENDW, I_PCMPEQB, I_PCMPEQW, I_PCMPEQD, I_PCMPEQQ, I_PCMPESTRI, I_PCMPESTRM, I_PCMPISTRI, I_PCMPISTRM, I_PCMPGTB, I_PCMPGTW, I_PCMPGTD, I_PCMPGTQ, I_PEXTRB, I_PEXTRW, I_PEXTRD, I_PEXTRQ, I_PHADDW, I_PHADDD, I_PHADDSW, I_PHMINPOSUW, I_PHSUBW, I_PHSUBD, I_PHSUBSW, I_PINSRB, I_PINSRW, I_PINSRD, I_PINSRQ, I_PMADDUBSW, I_PMADDWD, I_PMAXSB, I_PMAXSW, I_PMAXSD, I_PMAXUB, I_PMAXUW, I_PMAXUD, I_PMINSB, I_PMINSW, I_PMINSD, I_PMINUB, I_PMINUW, I_PMINUD, I_PMOVMSKB, I_PMOVSXBW, I_PMOVSXBD, I_PMOVSXBQ, I_PMOVSXWD, I_PMOVSXWQ, I_PMOVSXDQ, I_PMOVZXBW, I_PMOVZXBD, I_PMOVZXBQ, I_PMOVZXWD, I_PMOVZXWQ, I_PMOVZXDQ, I_PMULDQ, I_PMULHRSW, I_PMULHUW, I_PMULHW, I_PMULLW, I_PMULLD, I_PMULUDQ, I_POPCNT, I_POR, I_PREFETCH, I_PSADBW, I_PSHUFB, I_PSHUFD, I_PSHUFHW, I_PSHUFLW, I_PSHUFW, I_PSIGNB, I_PSIGNW, I_PSIGND, I_PSLLW, I_PSLLD, I_PSLLQ, I_PSLLDQ, I_PSRAW, I_PSRAD, I_PSRLW, I_PSRLD, I_PSRLQ, I_PSRLDQ, I_PSUBB, I_PSUBW, I_PSUBD, I_PSUBQ, I_PSUBSB, I_PSUBSW, I_PSUBUSB, I_PSUBUSW, I_PTEST, I_PUNPCKHBW, I_PUNPCKHWD, I_PUNPCKHDQ, I_PUNPCKHQDQ, I_PUNPCKLBW, I_PUNPCKLWD, I_PUNPCKLDQ, I_PUNPCKLQDQ, I_PXOR, I_RCPPS, I_RCPSS, I_ROUNDPS, I_ROUNDPD, I_ROUNDSS, I_ROUNDSD, I_RSQRTPS, I_RSQRTSS, I_SFENCE, I_SHUFPS, I_SHUFPD, I_SQRTPS, I_SQRTSS, I_SQRTPD, I_SQRTSD, I_STMXCSR, I_SUBPS, I_SUBSS, I_SUBPD, I_SUBSD, I_UCOMISS, I_UCOMISD, I_UNPCKHPS, I_UNPCKHPD, I_UNPCKLPS, I_UNPCKLPD, I_XORPS, I_XORPD, I_VBROADCASTSS, I_VBROADCASTSD, I_VBROADCASTF128, I_VEXTRACTF128, I_VINSERTF128, I_VMASKMOVPS, I_VMASKMOVPD, I_VPERMILPD, I_VPERMILPS, I_VPERM2F128, I_VTESTPS, I_VTESTPD, I_VZEROALL, I_VZEROUPPER, I_AESENC, I_AESENCLAST, I_AESDEC, I_AESDECLAST, I_AESIMC, I_AESKEYGENASSIST, I_PCLMULQDQ, // FMA I_VFMADD132PD, I_VFMADD213PD, I_VFMADD231PD, I_VFMADD132PS, I_VFMADD213PS, I_VFMADD231PS, I_VFMADD132SD, I_VFMADD213SD, I_VFMADD231SD, I_VFMADD132SS, I_VFMADD213SS, I_VFMADD231SS, I_VFMADDSUB132PD, I_VFMADDSUB213PD, I_VFMADDSUB231PD, I_VFMADDSUB132PS, I_VFMADDSUB213PS, I_VFMADDSUB231PS, I_VFMSUBADD132PD, I_VFMSUBADD213PD, I_VFMSUBADD231PD, I_VFMSUBADD132PS, I_VFMSUBADD213PS, I_VFMSUBADD231PS, I_VFMSUB132PD, I_VFMSUB213PD, I_VFMSUB231PD, I_VFMSUB132PS, I_VFMSUB213PS, I_VFMSUB231PS, I_VFMSUB132SD, I_VFMSUB213SD, I_VFMSUB231SD, I_VFMSUB132SS, I_VFMSUB213SS, I_VFMSUB231SS, I_VFNMADD132PD, I_VFNMADD213PD, I_VFNMADD231PD, I_VFNMADD132PS, I_VFNMADD213PS, I_VFNMADD231PS, I_VFNMADD132SD, I_VFNMADD213SD, I_VFNMADD231SD, I_VFNMADD132SS, I_VFNMADD213SS, I_VFNMADD231SS, I_VFNMSUB132PD, I_VFNMSUB213PD, I_VFNMSUB231PD, I_VFNMSUB132PS, I_VFNMSUB213PS, I_VFNMSUB231PS, I_VFNMSUB132SD, I_VFNMSUB213SD, I_VFNMSUB231SD, I_VFNMSUB132SS, I_VFNMSUB213SS, I_VFNMSUB231SS, // F16C I_RDFSBASE, I_RDGSBASE, I_RDRAND, I_WRFSBASE, I_WRGSBASE, I_VCVTPH2PS, I_VCVTPS2PH, // BMI I_ANDN, I_BEXTR, I_BLSI, I_BLSMSK, I_BLSR, I_BZHI, I_LZCNT, I_MULX, I_PDEP, I_PEXT, I_RORX, I_SARX, I_SHLX, I_SHRX, I_TZCNT, I_INVPCID, // XOP I_VFRCZPD, I_VFRCZPS, I_VFRCZSD, I_VFRCZSS, I_VPCMOV, I_VPCOMB, I_VPCOMD, I_VPCOMQ, I_VPCOMUB, I_VPCOMUD, I_VPCOMUQ, I_VPCOMUW, I_VPCOMW, I_VPERMIL2PD, I_VPERMIL2PS, I_VPHADDBD, I_VPHADDBQ, I_VPHADDBW, I_VPHADDDQ, I_VPHADDUBD, I_VPHADDUBQ, I_VPHADDUBW, I_VPHADDUDQ, I_VPHADDUWD, I_VPHADDUWQ, I_VPHADDWD, I_VPHADDWQ, I_VPHSUBBW, I_VPHSUBDQ, I_VPHSUBWD, I_VPMACSDD, I_VPMACSDQH, I_VPMACSDQL, I_VPMACSSDD, I_VPMACSSDQH, I_VPMACSSDQL, I_VPMACSSWD, I_VPMACSSWW, I_VPMACSWD, I_VPMACSWW, I_VPMADCSSWD, I_VPMADCSWD, I_VPPERM, I_VPROTB, I_VPROTD, I_VPROTQ, I_VPROTW, I_VPSHAB, I_VPSHAD, I_VPSHAQ, I_VPSHAW, I_VPSHLB, I_VPSHLD, I_VPSHLQ, I_VPSHLW, // FMA4 I_VFMADDPD, I_VFMADDPS, I_VFMADDSD, I_VFMADDSS, I_VFMADDSUBPD, I_VFMADDSUBPS, I_VFMSUBADDPD, I_VFMSUBADDPS, I_VFMSUBPD, I_VFMSUBPS, I_VFMSUBSD, I_VFMSUBSS, I_VFNMADDPD, I_VFNMADDPS, I_VFNMADDSD, I_VFNMADDSS, I_VFNMSUBPD, I_VFNMSUBPS, I_VFNMSUBSD, I_VFNMSUBSS, // AVX2 I_VBROADCASTI128, I_VPBROADCASTB, I_VPBROADCASTW, I_VPBROADCASTD, I_VPBROADCASTQ, I_PBLENDD, I_VPERMD, I_VPERMQ, I_VPERMPS, I_VPERMPD, I_VPERM2I128, I_VEXTRACTI128, I_VINSERTI128, I_VMASKMOVD, I_VMASKMOVQ, I_VPSLLVD, I_VPSLLVQ, I_VPSRAVD, I_VPSRLVD, I_VPSRLVQ, I_VGATHERDPS, I_VGATHERQPS, I_VGATHERDPD, I_VGATHERQPD, I_VPGATHERDD, I_VPGATHERQD, I_VPGATHERDQ, I_VPGATHERQQ, // jitasm compiler instructions I_COMPILER_DECLARE_REG_ARG, ///< Declare register argument I_COMPILER_DECLARE_STACK_ARG, ///< Declare stack argument I_COMPILER_DECLARE_RESULT_REG, ///< Declare result register (eax/rax/xmm0) I_COMPILER_PROLOG, ///< Function prolog I_COMPILER_EPILOG ///< Function epilog }; enum JumpCondition { JCC_O, JCC_NO, JCC_B, JCC_AE, JCC_E, JCC_NE, JCC_BE, JCC_A, JCC_S, JCC_NS, JCC_P, JCC_NP, JCC_L, JCC_GE, JCC_LE, JCC_G, JCC_CXZ, JCC_ECXZ, JCC_RCXZ, }; enum EncodingFlags { E_SPECIAL = 1 << 0, E_OPERAND_SIZE_PREFIX = 1 << 1, ///< Operand-size override prefix E_REP_PREFIX = 1 << 2, ///< REP prefix E_REXW_PREFIX = 1 << 3, ///< REX.W E_MANDATORY_PREFIX_66 = 1 << 4, ///< Mandatory prefix 66 E_MANDATORY_PREFIX_F2 = 1 << 5, ///< Mandatory prefix F2 E_MANDATORY_PREFIX_F3 = 1 << 6, ///< Mandatory prefix F3 E_VEX = 1 << 7, E_XOP = 1 << 8, E_VEX_L = 1 << 9, E_VEX_W = 1 << 10, E_VEX_MMMMM_SHIFT = 11, E_VEX_MMMMM_MASK = 0x1F << E_VEX_MMMMM_SHIFT, E_VEX_0F = 1 << E_VEX_MMMMM_SHIFT, E_VEX_0F38 = 2 << E_VEX_MMMMM_SHIFT, E_VEX_0F3A = 3 << E_VEX_MMMMM_SHIFT, E_XOP_M00011 = 3 << E_VEX_MMMMM_SHIFT, E_XOP_M01000 = 8 << E_VEX_MMMMM_SHIFT, E_XOP_M01001 = 9 << E_VEX_MMMMM_SHIFT, E_VEX_PP_SHIFT = 16, E_VEX_PP_MASK = 0x3 << E_VEX_PP_SHIFT, E_VEX_66 = 1 << E_VEX_PP_SHIFT, E_VEX_F3 = 2 << E_VEX_PP_SHIFT, E_VEX_F2 = 3 << E_VEX_PP_SHIFT, E_XOP_P00 = 0 << E_VEX_PP_SHIFT, E_XOP_P01 = 1 << E_VEX_PP_SHIFT, E_VEX_128 = E_VEX, E_VEX_256 = E_VEX | E_VEX_L, E_VEX_LIG = E_VEX, E_VEX_LZ = E_VEX, E_VEX_66_0F = E_VEX_66 | E_VEX_0F, E_VEX_66_0F38 = E_VEX_66 | E_VEX_0F38, E_VEX_66_0F3A = E_VEX_66 | E_VEX_0F3A, E_VEX_F2_0F = E_VEX_F2 | E_VEX_0F, E_VEX_F2_0F38 = E_VEX_F2 | E_VEX_0F38, E_VEX_F2_0F3A = E_VEX_F2 | E_VEX_0F3A, E_VEX_F3_0F = E_VEX_F3 | E_VEX_0F, E_VEX_F3_0F38 = E_VEX_F3 | E_VEX_0F38, E_VEX_F3_0F3A = E_VEX_F3 | E_VEX_0F3A, E_VEX_W0 = 0, E_VEX_W1 = E_VEX_W, E_VEX_WIG = 0, E_XOP_128 = E_XOP, E_XOP_256 = E_XOP | E_VEX_L, E_XOP_W0 = 0, E_XOP_W1 = E_VEX_W, // Aliases E_VEX_128_0F_WIG = E_VEX_128 | E_VEX_0F | E_VEX_WIG, E_VEX_256_0F_WIG = E_VEX_256 | E_VEX_0F | E_VEX_WIG, E_VEX_128_66_0F_WIG = E_VEX_128 | E_VEX_66_0F | E_VEX_WIG, E_VEX_256_66_0F_WIG = E_VEX_256 | E_VEX_66_0F | E_VEX_WIG, E_VEX_128_66_0F38_WIG = E_VEX_128 | E_VEX_66_0F38 | E_VEX_WIG, E_VEX_256_66_0F38_WIG = E_VEX_256 | E_VEX_66_0F38 | E_VEX_WIG, E_VEX_128_66_0F38_W0 = E_VEX_128 | E_VEX_66_0F38 | E_VEX_W0, E_VEX_256_66_0F38_W0 = E_VEX_256 | E_VEX_66_0F38 | E_VEX_W0, E_VEX_128_66_0F38_W1 = E_VEX_128 | E_VEX_66_0F38 | E_VEX_W1, E_VEX_256_66_0F38_W1 = E_VEX_256 | E_VEX_66_0F38 | E_VEX_W1, E_VEX_128_66_0F3A_W0 = E_VEX_128 | E_VEX_66_0F3A | E_VEX_W0, E_VEX_256_66_0F3A_W0 = E_VEX_256 | E_VEX_66_0F3A | E_VEX_W0, }; /// Instruction struct Instr { static const size_t MAX_OPERAND_COUNT = 6; InstrID id_; ///< Instruction ID uint32 opcode_; ///< Opcode uint32 encoding_flag_; ///< EncodingFlags detail::Opd opd_[MAX_OPERAND_COUNT]; ///< Operands Instr(InstrID id, uint32 opcode, uint32 encoding_flag, const detail::Opd& opd1 = detail::Opd(), const detail::Opd& opd2 = detail::Opd(), const detail::Opd& opd3 = detail::Opd(), const detail::Opd& opd4 = detail::Opd(), const detail::Opd& opd5 = detail::Opd(), const detail::Opd& opd6 = detail::Opd()) : id_(id), opcode_(opcode), encoding_flag_(encoding_flag) {opd_[0] = opd1, opd_[1] = opd2, opd_[2] = opd3, opd_[3] = opd4, opd_[4] = opd5, opd_[5] = opd6;} InstrID GetID() const {return id_;} const detail::Opd& GetOpd(size_t index) const {return opd_[index];} detail::Opd& GetOpd(size_t index) {return opd_[index];} }; /// Assembler backend struct Backend { uint8* pbuff_; size_t buffsize_; size_t size_; Backend(void* pbuff = NULL, size_t buffsize = 0) : pbuff_((uint8*) pbuff), buffsize_(buffsize), size_(0) { memset(pbuff, 0xCC, buffsize); // INT3 } size_t GetSize() const { return size_; } void put_bytes(void* p, size_t n) { uint8* pb = (uint8*) p; while (n--) { if (pbuff_) { if (size_ == buffsize_) JITASM_ASSERT(0); pbuff_[size_] = *pb++; } size_++; } } void db(uint64 b) {put_bytes(&b, 1);} void dw(uint64 w) {put_bytes(&w, 2);} void dd(uint64 d) {put_bytes(&d, 4);} void dq(uint64 q) {put_bytes(&q, 8);} uint8 GetWRXB(int w, const detail::Opd& reg, const detail::Opd& r_m) { uint8 wrxb = w ? 8 : 0; if (reg.IsReg()) { if (!reg.GetReg().IsInvalid() && reg.GetReg().id >= R8) wrxb |= 4; } if (r_m.IsReg()) { if (r_m.GetReg().id >= R8) wrxb |= 1; } if (r_m.IsMem()) { if (!r_m.GetIndex().IsInvalid() && r_m.GetIndex().id >= R8) wrxb |= 2; if (!r_m.GetBase().IsInvalid() && r_m.GetBase().id >= R8) wrxb |= 1; } return wrxb; } void EncodePrefixes(uint32 flag, const detail::Opd& reg, const detail::Opd& r_m, const detail::Opd& vex) { if (flag & (E_VEX | E_XOP)) { // Encode VEX prefix #ifdef JITASM64 if (r_m.IsMem() && r_m.GetAddressBaseSize() != O_SIZE_64) db(0x67); #endif uint8 vvvv = vex.IsReg() ? 0xF - (uint8) vex.GetReg().id : 0xF; uint8 mmmmm = (flag & E_VEX_MMMMM_MASK) >> E_VEX_MMMMM_SHIFT; uint8 pp = static_cast((flag & E_VEX_PP_MASK) >> E_VEX_PP_SHIFT); uint8 wrxb = GetWRXB(flag & E_VEX_W, reg, r_m); if (flag & E_XOP) { db(0x8F); db((~wrxb & 7) << 5 | mmmmm); db((wrxb & 8) << 4 | vvvv << 3 | (flag & E_VEX_L ? 4 : 0) | pp); } else if (wrxb & 0xB || (flag & E_VEX_MMMMM_MASK) == E_VEX_0F38 || (flag & E_VEX_MMMMM_MASK) == E_VEX_0F3A) { db(0xC4); db((~wrxb & 7) << 5 | mmmmm); db((wrxb & 8) << 4 | vvvv << 3 | (flag & E_VEX_L ? 4 : 0) | pp); } else { db(0xC5); db((~wrxb & 4) << 5 | vvvv << 3 | (flag & E_VEX_L ? 4 : 0) | pp); } } else { uint8 wrxb = GetWRXB(flag & E_REXW_PREFIX, reg, r_m); if (wrxb) { // Encode REX prefix JITASM_ASSERT(!reg.IsReg() || reg.GetSize() != O_SIZE_8 || reg.GetReg().id < AH || reg.GetReg().id >= R8B); // AH, BH, CH, or DH may not be used with REX. JITASM_ASSERT(!r_m.IsReg() || r_m.GetSize() != O_SIZE_8 || r_m.GetReg().id < AH || r_m.GetReg().id >= R8B); // AH, BH, CH, or DH may not be used with REX. if (flag & E_REP_PREFIX) db(0xF3); #ifdef JITASM64 if (r_m.IsMem() && r_m.GetAddressBaseSize() != O_SIZE_64) db(0x67); #endif if (flag & E_OPERAND_SIZE_PREFIX) db(0x66); if (flag & E_MANDATORY_PREFIX_66) db(0x66); else if (flag & E_MANDATORY_PREFIX_F2) db(0xF2); else if (flag & E_MANDATORY_PREFIX_F3) db(0xF3); db(0x40 | wrxb); } else { if (flag & E_MANDATORY_PREFIX_66) db(0x66); else if (flag & E_MANDATORY_PREFIX_F2) db(0xF2); else if (flag & E_MANDATORY_PREFIX_F3) db(0xF3); if (flag & E_REP_PREFIX) db(0xF3); #ifdef JITASM64 if (r_m.IsMem() && r_m.GetAddressBaseSize() != O_SIZE_64) db(0x67); #endif if (flag & E_OPERAND_SIZE_PREFIX) db(0x66); } } } void EncodeModRM(uint8 reg, const detail::Opd& r_m) { reg &= 0x7; if (r_m.IsReg()) { db(0xC0 | (reg << 3) | (r_m.GetReg().id & 0x7)); } else if (r_m.IsMem()) { JITASM_ASSERT(r_m.GetBase().type == R_TYPE_GP && (r_m.GetIndex().type == R_TYPE_GP || r_m.GetIndex().type == R_TYPE_XMM || r_m.GetIndex().type == R_TYPE_YMM)); int base = r_m.GetBase().id; if (base != INVALID) base &= 0x7; int index = r_m.GetIndex().id; if (index != INVALID) index &= 0x7; if (base == INVALID && index == INVALID) { #ifdef JITASM64 db(reg << 3 | 4); db(0x25); #else db(reg << 3 | 5); #endif dd(r_m.GetDisp()); } else { JITASM_ASSERT(base != ESP || index != ESP); JITASM_ASSERT(index != ESP || r_m.GetScale() == 0); if (index == ESP) { index = base; base = ESP; } bool sib = index != INVALID || r_m.GetScale() || base == ESP; // ModR/M uint8 mod = 0; if (r_m.GetDisp() == 0 || (sib && base == INVALID)) mod = base != EBP ? 0 : 1; else if (detail::IsInt8(r_m.GetDisp())) mod = 1; else if (detail::IsInt32(r_m.GetDisp())) mod = 2; else JITASM_ASSERT(0); db(mod << 6 | reg << 3 | (sib ? 4 : base)); // SIB if (sib) { uint8 ss = 0; if (r_m.GetScale() == 0) ss = 0; else if (r_m.GetScale() == 2) ss = 1; else if (r_m.GetScale() == 4) ss = 2; else if (r_m.GetScale() == 8) ss = 3; else JITASM_ASSERT(0); if (index != INVALID && base != INVALID) { db(ss << 6 | index << 3 | base); } else if (base != INVALID) { db(ss << 6 | 4 << 3 | base); } else if (index != INVALID) { db(ss << 6 | index << 3 | 5); } else { JITASM_ASSERT(0); } } // Displacement if (mod == 0 && sib && base == INVALID) dd(r_m.GetDisp()); if (mod == 1) db(r_m.GetDisp()); if (mod == 2) dd(r_m.GetDisp()); } } else { JITASM_ASSERT(0); } } void EncodeOpcode(uint32 opcode) { if (opcode & 0xFF000000) db((opcode >> 24) & 0xFF); if (opcode & 0xFFFF0000) db((opcode >> 16) & 0xFF); if (opcode & 0xFFFFFF00) db((opcode >> 8) & 0xFF); db(opcode & 0xFF); } void EncodeImm(const detail::Opd& imm) { const OpdSize size = imm.GetSize(); if (size == O_SIZE_8) db(imm.GetImm()); else if (size == O_SIZE_16) dw(imm.GetImm()); else if (size == O_SIZE_32) dd(imm.GetImm()); else if (size == O_SIZE_64) dq(imm.GetImm()); else JITASM_ASSERT(0); } void Encode(const Instr& instr) { uint32 opcode = instr.opcode_; const detail::Opd& opd1 = instr.GetOpd(0).IsDummy() ? detail::Opd() : instr.GetOpd(0); JITASM_ASSERT(!(opd1.IsReg() && opd1.GetReg().IsSymbolic())); const detail::Opd& opd2 = instr.GetOpd(1).IsDummy() ? detail::Opd() : instr.GetOpd(1); JITASM_ASSERT(!(opd2.IsReg() && opd2.GetReg().IsSymbolic())); const detail::Opd& opd3 = instr.GetOpd(2).IsDummy() ? detail::Opd() : instr.GetOpd(2); JITASM_ASSERT(!(opd3.IsReg() && opd3.GetReg().IsSymbolic())); const detail::Opd& opd4 = instr.GetOpd(3).IsDummy() ? detail::Opd() : instr.GetOpd(3); JITASM_ASSERT(!(opd4.IsReg() && opd4.GetReg().IsSymbolic())); // +rb, +rw, +rd, +ro if (opd1.IsReg() && (opd2.IsNone() || opd2.IsImm())) { opcode += opd1.GetReg().id & 0x7; } if ((opd1.IsImm() || opd1.IsReg()) && (opd2.IsReg() || opd2.IsMem())) { // ModR/M const detail::Opd& reg = opd1; const detail::Opd& r_m = opd2; const detail::Opd& vex = opd3; EncodePrefixes(instr.encoding_flag_, reg, r_m, vex); EncodeOpcode(opcode); EncodeModRM((uint8) (reg.IsImm() ? reg.GetImm() : reg.GetReg().id), r_m); // /is4 if (opd4.IsReg()) { EncodeImm(Imm8(static_cast(opd4.GetReg().id << 4))); } } else { const detail::Opd& reg = detail::Opd(); const detail::Opd& r_m = opd1.IsReg() ? opd1 : detail::Opd(); const detail::Opd& vex = detail::Opd(); EncodePrefixes(instr.encoding_flag_, reg, r_m, vex); EncodeOpcode(opcode); } if (opd1.IsImm() && !opd2.IsReg() && !opd2.IsMem()) EncodeImm(opd1); if (opd2.IsImm()) EncodeImm(opd2); if (opd3.IsImm()) EncodeImm(opd3); if (opd4.IsImm()) EncodeImm(opd4); } void EncodeALU(const Instr& instr, uint32 opcode) { const detail::Opd& reg = instr.GetOpd(1); const detail::Opd& imm = instr.GetOpd(2); JITASM_ASSERT(instr.GetOpd(0).IsImm() && reg.IsReg() && imm.IsImm()); if (reg.GetReg().id == EAX && (reg.GetSize() == O_SIZE_8 || !detail::IsInt8(imm.GetImm()))) { opcode |= (reg.GetSize() == O_SIZE_8 ? 0 : 1); Encode(Instr(instr.GetID(), opcode, instr.encoding_flag_, reg, imm)); } else { Encode(instr); } } void EncodeJMP(const Instr& instr) { const detail::Opd& imm = instr.GetOpd(0); if (instr.GetID() == I_JMP) { Encode(Instr(instr.GetID(), imm.GetSize() == O_SIZE_8 ? 0xEB : 0xE9, instr.encoding_flag_, imm)); } else if (instr.GetID() == I_JCC) { #ifndef JITASM64 uint32 tttn = instr.opcode_; if (tttn == JCC_CXZ) Encode(Instr(instr.GetID(), 0x67E3, instr.encoding_flag_, imm)); else if (tttn == JCC_ECXZ) Encode(Instr(instr.GetID(), 0xE3, instr.encoding_flag_, imm)); else Encode(Instr(instr.GetID(), (imm.GetSize() == O_SIZE_8 ? 0x70 : 0x0F80) | tttn, instr.encoding_flag_, imm)); #else uint32 tttn = instr.opcode_; if (tttn == JCC_ECXZ) Encode(Instr(instr.GetID(), 0x67E3, instr.encoding_flag_, imm)); else if (tttn == JCC_RCXZ) Encode(Instr(instr.GetID(), 0xE3, instr.encoding_flag_, imm)); else Encode(Instr(instr.GetID(), (imm.GetSize() == O_SIZE_8 ? 0x70 : 0x0F80) | tttn, instr.encoding_flag_, imm)); #endif } else if (instr.GetID() == I_LOOP) { Encode(Instr(instr.GetID(), instr.opcode_, instr.encoding_flag_, imm)); } else { JITASM_ASSERT(0); } } void EncodeMOV(const Instr& instr) { #ifndef JITASM64 const detail::Opd& reg = instr.GetOpd(0); const detail::Opd& mem = instr.GetOpd(1); JITASM_ASSERT(reg.IsReg() && mem.IsMem()); if (reg.GetReg().id == EAX && mem.GetBase().IsInvalid() && mem.GetIndex().IsInvalid()) { uint32 opcode = 0xA0 | (~instr.opcode_ & 0x2) | (instr.opcode_ & 1); Encode(Instr(instr.GetID(), opcode, instr.encoding_flag_, Imm32((sint32) mem.GetDisp()))); } else { Encode(instr); } #else Encode(instr); #endif } void EncodeTEST(const Instr& instr) { const detail::Opd& reg = instr.GetOpd(1); const detail::Opd& imm = instr.GetOpd(2); JITASM_ASSERT(instr.GetOpd(0).IsImm() && reg.IsReg() && imm.IsImm()); if (reg.GetReg().id == EAX) { uint32 opcode = 0xA8 | (reg.GetSize() == O_SIZE_8 ? 0 : 1); Encode(Instr(instr.GetID(), opcode, instr.encoding_flag_, reg, imm)); } else { Encode(instr); } } void EncodeXCHG(const Instr& instr) { const detail::Opd& dst = instr.GetOpd(0); const detail::Opd& src = instr.GetOpd(1); JITASM_ASSERT(dst.IsReg() && src.IsReg()); if (dst.GetReg().id == EAX) { Encode(Instr(instr.GetID(), 0x90, instr.encoding_flag_, src)); } else if (src.GetReg().id == EAX) { Encode(Instr(instr.GetID(), 0x90, instr.encoding_flag_, dst)); } else { Encode(instr); } } void Assemble(const Instr& instr) { if (instr.encoding_flag_ & E_SPECIAL) { switch (instr.GetID()) { case I_ADD: EncodeALU(instr, 0x04); break; case I_OR: EncodeALU(instr, 0x0C); break; case I_ADC: EncodeALU(instr, 0x14); break; case I_SBB: EncodeALU(instr, 0x1C); break; case I_AND: EncodeALU(instr, 0x24); break; case I_SUB: EncodeALU(instr, 0x2C); break; case I_XOR: EncodeALU(instr, 0x34); break; case I_CMP: EncodeALU(instr, 0x3C); break; case I_JMP: EncodeJMP(instr); break; case I_JCC: EncodeJMP(instr); break; case I_LOOP: EncodeJMP(instr); break; case I_MOV: EncodeMOV(instr); break; case I_TEST: EncodeTEST(instr); break; case I_XCHG: EncodeXCHG(instr); break; default: JITASM_ASSERT(0); break; } } else { Encode(instr); } } static size_t GetInstrCodeSize(const Instr& instr) { Backend backend; backend.Assemble(instr); return backend.GetSize(); } }; namespace detail { /// Counting 1-Bits inline uint32 Count1Bits(uint32 x) { x = x - ((x >> 1) & 0x55555555); x = (x & 0x33333333) + ((x >> 2) & 0x33333333); x = (x + (x >> 4)) & 0x0F0F0F0F; x = x + (x >> 8); x = x + (x >> 16); return x & 0x0000003F; } /// The bit position of the first bit 1. inline uint32 bit_scan_forward(uint32 x) { JITASM_ASSERT(x != 0); #if defined(JITASM_GCC) return __builtin_ctz(x); #else unsigned long index; _BitScanForward(&index, x); return index; #endif } /// The bit position of the last bit 1. inline uint32 bit_scan_reverse(uint32 x) { JITASM_ASSERT(x != 0); #if defined(JITASM_GCC) return 31 - __builtin_clz(x); #else unsigned long index; _BitScanReverse(&index, x); return index; #endif } /// Prior iterator template It prior(const It &it) { It i = it; return --i; } /// Next iterator template It next(const It &it) { It i = it; return ++i; } /// Iterator range template struct Range : std::pair { typedef It Iterator; Range() : std::pair() {} Range(const It& f, const It& s) : std::pair(f, s) {} Range(T& container) : std::pair(container.begin(), container.end()) {} bool empty() const {return this->first == this->second;} size_t size() const {return std::distance(this->first, this->second);} }; /// Const iterator range template struct ConstRange : Range { ConstRange() : Range() {} ConstRange(const typename T::const_iterator& f, const typename T::const_iterator& s) : Range(f, s) {} ConstRange(const T& container) : Range(container.begin(), container.end()) {} }; inline void append_num(std::string& str, size_t num) { if (num >= 10) append_num(str, num / 10); str.append(1, static_cast('0' + num % 10)); } #if defined(JITASM_DEBUG_DUMP) && defined(JITASM_WIN) /// Debug trace inline void Trace(const char *format, ...) { char szBuf[256]; va_list args; va_start(args, format); #if _MSC_VER >= 1400 // VC8 or later _vsnprintf_s(szBuf, sizeof(szBuf) / sizeof(char), format, args); #else vsnprintf(szBuf, sizeof(szBuf) / sizeof(char), format, args); #endif va_end(args); ::OutputDebugStringA(szBuf); } #endif /// Executable code buffer class CodeBuffer { void* pbuff_; size_t codesize_; size_t buffsize_; public: CodeBuffer() : pbuff_(NULL), codesize_(0), buffsize_(0) {} ~CodeBuffer() {Reset(0);} void* GetPointer() const {return pbuff_;} size_t GetCodeSize() const {return codesize_;} size_t GetBufferSize() const {return buffsize_;} bool Reset(size_t codesize) { if (pbuff_) { #if defined(JITASM_WIN) ::VirtualFree(pbuff_, 0, MEM_RELEASE); #else munmap(pbuff_, buffsize_); #endif pbuff_ = NULL; codesize_ = 0; buffsize_ = 0; } if (codesize) { #if defined(JITASM_WIN) void* pbuff = ::VirtualAlloc(NULL, codesize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); if (!pbuff) { JITASM_ASSERT(0); return false; } MEMORY_BASIC_INFORMATION info; ::VirtualQuery(pbuff, &info, sizeof(info)); buffsize_ = info.RegionSize; #else int pagesize = getpagesize(); size_t buffsize = (codesize + pagesize - 1) / pagesize * pagesize; void* pbuff = mmap(NULL, buffsize, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANON, -1, 0); if (!pbuff) { JITASM_ASSERT(0); return false; } buffsize_ = buffsize; #endif pbuff_ = pbuff; codesize_ = codesize; } return true; } }; /// Stack manager /** * Stack layout * \verbatim * +-----------------------+ * | Caller return address | * +=======================+======== * | ebp (rbp) | * +-----------------------+ <-- ebp (rbp) * | Saved gp registers | * +-----------------------+ * | Padding for alignment | * +-----------------------+ <-- Stack base * | Spill slots and | * | local variable | * +-----------------------+ <-- esp (rsp) * \endverbatim */ class StackManager { private: Addr stack_base_; uint32 stack_size_; public: StackManager() : stack_base_(RegID::CreatePhysicalRegID(R_TYPE_GP, EBX), 0), stack_size_(0) {} /// Get allocated stack size uint32 GetSize() const {return (stack_size_ + 15) / 16 * 16; /* 16 bytes aligned*/} /// Get stack base Addr GetStackBase() const {return stack_base_;} /// Set stack base void SetStackBase(const Addr& stack_base) {stack_base_ = stack_base;} /// Allocate stack Addr Alloc(uint32 size, uint32 alignment) { stack_size_ = (stack_size_ + alignment - 1) / alignment * alignment; stack_size_ += size; return stack_base_ - stack_size_; } }; /// Spin lock class SpinLock { long lock_; public: SpinLock() : lock_(0) {} void Lock() {while (interlocked_exchange(&lock_, 1));} void Unlock() {interlocked_exchange(&lock_, 0);} }; template class ScopedLock { Ty& lock_; ScopedLock& operator=(const ScopedLock&); public: ScopedLock(Ty& lock) : lock_(lock) {lock.Lock();} ~ScopedLock() {lock_.Unlock();} }; } // namespace detail // compiler prototype declaration struct Frontend; namespace compiler { void Compile(Frontend& f); } /// jitasm frontend struct Frontend { typedef jitasm::Addr Addr; typedef jitasm::Reg Reg; typedef jitasm::Reg8 Reg8; typedef jitasm::Reg16 Reg16; typedef jitasm::Reg32 Reg32; #ifdef JITASM64 typedef jitasm::Reg64 Reg64; #endif typedef jitasm::MmxReg MmxReg; typedef jitasm::XmmReg XmmReg; typedef jitasm::YmmReg YmmReg; static Reg8 al, cl, dl, bl, ah, ch, dh, bh; static Reg16 ax, cx, dx, bx, sp, bp, si, di; static Reg32 eax, ecx, edx, ebx, esp, ebp, esi, edi; static FpuReg_st0 st0; static FpuReg st1, st2, st3, st4, st5, st6, st7; static MmxReg mm0, mm1, mm2, mm3, mm4, mm5, mm6, mm7; static XmmReg xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7; static YmmReg ymm0, ymm1, ymm2, ymm3, ymm4, ymm5, ymm6, ymm7; #ifdef JITASM64 static Reg8 r8b, r9b, r10b, r11b, r12b, r13b, r14b, r15b; static Reg16 r8w, r9w, r10w, r11w, r12w, r13w, r14w, r15w; static Reg32 r8d, r9d, r10d, r11d, r12d, r13d, r14d, r15d; static Reg64 rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi, r8, r9, r10, r11, r12, r13, r14, r15; static XmmReg xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15; static YmmReg ymm8, ymm9, ymm10, ymm11, ymm12, ymm13, ymm14, ymm15; #endif AddressingPtr byte_ptr; AddressingPtr word_ptr; AddressingPtr dword_ptr; AddressingPtr qword_ptr; AddressingPtr mmword_ptr; AddressingPtr xmmword_ptr; AddressingPtr ymmword_ptr; AddressingPtr real4_ptr; AddressingPtr real8_ptr; AddressingPtr real10_ptr; AddressingPtr m2byte_ptr; AddressingPtr m28byte_ptr; AddressingPtr m108byte_ptr; AddressingPtr m512byte_ptr; static Reg zax, zcx, zdx, zbx, zsp, zbp, zsi, zdi; #ifdef JITASM64 AddressingPtr ptr; #else AddressingPtr ptr; #endif typedef std::vector InstrList; InstrList instrs_; bool assembled_; bool avx_epilog_; // PF AVS+: avoid AVX transition penalties detail::CodeBuffer codebuff_; detail::SpinLock codelock_; detail::StackManager stack_manager_; struct Label { std::string name; size_t instr_number; explicit Label(const std::string& name_) : name(name_), instr_number(0) {} }; typedef std::deque